Виведіть кватер-уявні базові числа у двійковій формі


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)

Число 1001100001х16 + 3х-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якщо уявна частина непарна.

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


4
Це хороший виклик, але пояснення може бути набагато зрозумілішим. Вам слід уточнити процес: він переходить від складних чисел, до переплетеного четвертинного подання, до відображення бінарного подання 0 → 00, 1 → 01, 2 → 10, 3 → 11.
Лінн

@Mauris Я здійснив чимало змін, щоб вирішити ваш коментар. Повідомте мене, чи можу я вдосконалити це.
CJ Dennis

2
Що робити, якщо вона повторюється у двійковій?
Leaky Nun

1
@LeakyNun Це сказано прямо у виклику: "Ви можете припустити, що всі вхідні числа матимуть кінцеві двійкові представлення".
Мего

Відповіді:


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

Я впевнений, що є багато можливостей для подальшого гольфу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.