Вывод четвертично-мнимых базовых чисел в двоичном виде

17

Напишите функцию или программу, которая выводит четверть-мнимое основание, отображаемое в виде двоичных цифр. Числовое основание равно 2 i , где i - квадратный корень из -1. См. Комплексный номер для более подробной информации о i . Каждая позиция цифры может изменяться от 0 до 3 (четвертичная), поскольку каждая действительная и мнимая части в -4 раза больше предыдущей действительной и мнимой части. Четвертичные цифры в двоичной системе следующим образом : 0: 00, 1: 01, 2: 10и 3: 11.

Разбивка позиций цифр:

re   im       16 -8i  -4  2i   1 -0.5i, etc.
 4    0        1   0   3   0   0        (quaternary representation)
              01  00  11  00  00        (binary representation)

Число 1001100001x16 + 3x-4 = 16 + -12 = 4.

re   im       16 -8i  -4  2i   1 -0.5i, etc.
 0    5        0   0   0   3   0   2    (quaternary representation)
              00  00  00  11  00 .10    (binary representation)

Число 1100.13x2 i + 2x-0.5 i = 6 i + - i = 5 i .

Ваш код примет пару чисел, которые могут быть целыми числами или числами с плавающей запятой, и выведет комплексное число в виде строки двоичных цифр. Первое число будет действительным, второе введенное число будет мнимым значением. Двоичная точка должна быть напечатана, только если позиции с ненулевым числом меньше 1 (т. Е. Если любая из позиций для -0,5 i , -0,25, 0,125 i и т. Д. Имеет ненулевую цифру). Начальные и конечные нули не допускаются, за исключением одной нулевой цифры непосредственно перед двоичной точкой, если нет других цифр. Выход не должен начинаться с двоичной точки (* 00.1- неправильно, 0.1- правильно, * .1- неправильно, * 0.10- неправильно). Вы можете предположить, что все входные числа будут иметь конечные двоичные представления.

Тестовые номера:

re   im            output
 0    0                 0
 1    0                 1
 2    0                10
 3    0                11
 4    0         100110000
-1    0             10011
-2    0             10010
-3    0             10001
 0    1               100.1
 0    2               100
 0    3              1000.1
 0    4              1000
 0   -1                 0.1
 0   -2           1001100
 0   -3           1001100.1
 3    4              1011
 4    3         100111000.1
 6   -9         101110010.1
-6    9       10011100110.1
-9   -6           1110111
 0.5 14.125   10011001101.001001

Примечание. Вывод всех целочисленных значений закончится, .1если мнимая часть будет нечетной.

Стандартный код-гольф.

CJ Деннис
источник
4
Это хороший вызов, но объяснение может быть намного понятнее. Вы должны уточнить этот процесс: он переходит от комплексных чисел к чередующему четвертичному представлению к отображению двоичного представления 0 → 00, 1 → 01, 2 → 10, 3 → 11.
Линн
@Mauris Я сделал целую кучу правок, чтобы ответить на ваш комментарий. Дайте мне знать, если я смогу улучшить его.
CJ Деннис
2
Что если он повторяется в двоичном виде?
Утренняя монахиня,
1
@ LeakyNun Правильно сказано в задаче: «Вы можете предположить, что все входные числа будут иметь конечные двоичные представления».
Mego

Ответы:

2

JavaScript (ES6), 340 байт

f=x=>[0,...x.toString(16)].reverse().map(d=>s=d<'.'?s:d<`0`?d+s.slice(0,-1):`${(c=+`0x${d}`+(c>>4)+m^m)>>2&3}${c&3}`+s,c=s='.',m=x<0?3:12)&&s
g=(s,t,n=s.indexOf`.`,m=t.indexOf`.`)=>n<m?g(0+s,t):n>m?g(s,0+t):t[s.length]?g(s+0,t):s.replace(/\d/g,(c,i)=>`${t[i]>>1}${t[i]&1}${c>>1}${c&1}`).replace(/^0+(\d)|\.?0*$/g,'$1')
(r,i)=>g(f(r),f(i/2))

fпреобразует число в основание -4(с трейлингом, .если число является целым числом). gберет два базовых -4числа, дополняет их на обоих концах до одинаковой длины и .позиции, перетасовывает цифры вместе, преобразует все от основания 4к основанию 2, а затем, наконец, удаляет начальные и конечные нули.

Пояснение: Чтобы представить данное комплексное число в модифицированном основании, 2iнам нужно представить действительную часть и половину сложной части (то есть, разделив мнимую часть 2i) в базе 2i²(то есть -4), перемешать цифры вместе, а затем преобразовать их из базы 4на базу 2. Чтобы представить действительное число в базе, -4мы начнем с 4преобразования базы . Альтернативные цифры имеют правильный знак (в случае положительного числа это цифры в четных позициях; в случае отрицательного числа это цифры в нечетных позициях), но остальные цифры имеют неправильный знак и необходимо применить коррекцию. Примеры:

 0 -> 000 -> 000 (no correction needed)
 4 -> 010 -> 130 }
 8 -> 020 -> 120 } (correction includes carry)
12 -> 030 -> 110 }

Как видите, коррекция 8минус исходная цифра, мод 8. Однако немного более удобным вычислением является исходная цифра, плюс 3, xor 3 (действительно, в 32-разрядной целочисленной арифметике мы могли бы просто написать, +0xCCCCCCCC^0xCCCCCCCCчтобы преобразовать все число за один раз). Наконец, поскольку исправление применяется к альтернативным цифрам, проще выполнить первоначальное преобразование в основание, 16которое автоматически подбирает пары базовых 4цифр, а затем исправить с использованием коэффициента, равного 3или 0xCподходящего. Осталось просто игнорировать -знак.

Нил
источник
0

Perl - 313 байт

Поскольку никто еще не опубликовал ответ, я подумал, что скину его сам.

$r=$ARGV[0];$i=$ARGV[1]/2;$m=1;while($r!=int($r)||$i!=int($i)){$c++;$m*=-1;$i*=4;$r*=4}while($r||$i){$r-=($d[$n++]=$r/$m%4)*$m;$i-=($d[$n++]=$i/$m%4)*$m;$m*=-4}$_=join("",map({sprintf"%02b",$_}reverse splice(@d,$c*2)))||"0";@d and$_.=".".join("",map({sprintf"%02b",$_}reverse@d));s/^0+1/1/;s/(\.\d*1)0+$/$1/;print

Я уверен, что есть много возможностей для игры в гольф дальше.

CJ Деннис
источник