Output angka dasar quater-imajiner dalam biner

17

Tulis fungsi atau program yang mengeluarkan basis Quater-imajiner yang ditampilkan sebagai digit biner. Basis angka adalah 2 i , di mana i adalah akar kuadrat dari -1. Lihat Nomor Kompleks untuk rincian lebih lanjut tentang i . Setiap posisi digit dapat berubah dari 0 hingga 3 (kuartener), karena setiap bagian nyata dan imajiner adalah -4 kali lebih besar dari bagian nyata dan imajiner sebelumnya. The kuaterner digit dalam biner adalah sebagai berikut: 0: 00, 1: 01, 2: 10& 3: 11.

Perincian posisi digit:

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)

Jumlahnya 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)

Jumlahnya 1100.13x2 i + 2x-0,5 i = 6 i + - i = 5 i .

Kode Anda akan mengambil sepasang angka, yang bisa berupa bilangan bulat atau titik mengambang, dan akan menampilkan bilangan kompleks sebagai string angka biner. Angka pertama akan menjadi nyata, nomor input kedua akan menjadi nilai imajiner. Titik biner hanya boleh dicetak jika ada posisi angka bukan nol di bawah 1 (yaitu jika salah satu posisi untuk -0,5 i , -0,25, 0,125 i , dll. Memiliki angka bukan nol). Angka nol di depan dan di belakang tidak diperbolehkan, kecuali satu digit nol tepat sebelum titik biner jika tidak ada digit lainnya. Output tidak boleh dimulai dengan titik biner (* 00.1- salah, 0.1- benar, * .1- salah, * 0.10- salah). Anda dapat mengasumsikan bahwa semua angka input akan memiliki representasi biner terbatas.

Nomor tes:

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

Catatan: Output semua nilai integer akan berakhir .1jika bagian imajiner ganjil.

Golf kode standar.

CJ Dennis
sumber
4
Ini adalah tantangan yang bagus, tetapi penjelasannya bisa jauh lebih jelas. Anda harus mengklarifikasi prosesnya: mulai dari bilangan kompleks, hingga representasi kuartener yang saling terkait , hingga pemetaan representasi biner0 → 00, 1 → 01, 2 → 10, 3 → 11 .
Lynn
@Mauris Saya sudah membuat banyak suntingan untuk menanggapi komentar Anda. Beri tahu saya jika saya bisa memperbaikinya lebih lanjut.
CJ Dennis
2
Bagaimana jika itu berulang dalam biner?
Leaky Nun
1
@ LeakyNun Dikatakan tepat di tantangan: "Anda dapat mengasumsikan bahwa semua angka input akan memiliki representasi biner yang terbatas."
Mego

Jawaban:

2

JavaScript (ES6), 340 byte

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))

fmengkonversi angka menjadi basis -4(dengan membuntuti .jika nomor tersebut bilangan bulat). gmengambil dua -4angka dasar , menempatkan keduanya di kedua ujung dengan panjang dan .posisi yang sama, mengocok digit bersama-sama, mengubah segala sesuatu dari basis 4ke basis 2, lalu akhirnya strip nol memimpin dan tertinggal.

Penjelasan: Untuk merepresentasikan bilangan kompleks yang diberikan dalam basis yang dimodifikasi, 2ikita perlu merepresentasikan bagian nyata dan setengah dari bagian kompleks (yaitu, membagi bagian imajiner dengan 2i) pada basis 2i²(yaitu -4), mengocok angka-angka bersama, dan kemudian mengubahnya dari basis 4ke pangkalan 2. Untuk mewakili bilangan real dalam basis, -4kita mulai dengan 4konversi basis . Digit alternatif memiliki tanda yang benar (dalam hal angka positif, ini adalah digit di posisi genap; dalam kasus angka negatif, ini adalah digit di posisi ganjil) tetapi digit yang tersisa memiliki tanda yang salah dan koreksi perlu diterapkan. Contoh:

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

Seperti yang Anda lihat, koreksi 8minus digit asli, mod 8. Namun perhitungan yang sedikit lebih nyaman adalah digit asli, ditambah 3, xor 3 (memang dalam aritmatika integer 32-bit kita bisa menulis +0xCCCCCCCC^0xCCCCCCCCuntuk mengonversi seluruh angka dalam sekali jalan). Akhirnya karena koreksi berlaku untuk digit alternatif, lebih mudah untuk melakukan konversi awal ke basis 16yang secara otomatis mengambil pasangan 4digit basis , kemudian mengoreksi menggunakan faktor salah satu 3atau yang 0xCsesuai. Tinggal mengabaikan -tanda itu.

Neil
sumber
0

Perl - 313 byte

Karena belum ada yang mengirim jawaban, saya pikir saya akan memulai sendiri.

$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

Saya yakin ada banyak peluang untuk bermain golf lebih jauh.

CJ Dennis
sumber