Çıktı çeyrek-sanal temel sayıları ikilik olarak


17

İkili basamak olarak görüntülenen Quater-hayali tabanı çıkaran bir işlev veya program yazın . Sayı tabanı 2 i'dir , burada i , -1'in kare köküdür. İ hakkında daha fazla bilgi için Karmaşık Numaraya bakınız . Her gerçek ve hayali kısım, bir önceki gerçek ve hayali kısımdan -4 kat daha büyük olduğu için, her basamak konumu 0 ila 3 (kuaterner) arasında olabilir. : İkili olarak kuaterner basamak aşağıdaki gibidir , , ve .0: 001: 012: 103: 11

Rakam konumlarının dökümü:

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)

Sayı 1001100001x16 + 3x-4 = 16 + -12 = 4'tür.

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)

Sayı 1100.13x2 i + 2x-0.5 i = 6 i + - i = 5 i'dir .

Kodunuz, tamsayı veya kayan nokta olabilecek bir çift sayı alır ve karmaşık sayıyı bir ikili basamak dizesi olarak verir. İlk sayı gerçek olacak, ikinci giriş sayısı hayali değer olacaktır. İkili nokta yalnızca 1'in altında sıfır olmayan sayı konumları varsa yazdırılmalıdır (yani -0,5 i , -0,25, 0,125 i vb. Konumlardan herhangi biri sıfırdan farklı bir basamağa sahipse ). Başka bir basamak yoksa, ikili noktadan hemen önce tek bir sıfır basamağı hariç, öndeki ve sondaki sıfırlara izin verilmez. Çıkış bir ikili nokta ile başlamamalıdır (* 00.1- yanlış, 0.1- sağ, * .1- yanlış, * 0.10- yanlış). Tüm giriş numaralarının sonlu ikili gösterimlere sahip olacağını varsayabilirsiniz.

Test numaraları:

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

Not: .1Hayali kısım tekse tüm tamsayı değerlerinin çıkışı sona erer .

Standart kod golfü.


4
Bu iyi bir mücadeledir, ancak açıklama çok daha açık olabilir. Süreci açıklığa kavuşturmalısınız: karmaşık sayılardan, serpiştirilmiş bir kuaterner temsile, ikili temsil eşlemesine gider 0 → 00, 1 → 01, 2 → 10, 3 → 11.
Lynn

@Mauris Yorumunuzu ele almak için bir sürü düzenleme yaptım. Daha da geliştirebileceğimi bana bildirin.
CJ Dennis

2
Ya ikili olarak tekrarlanıyorsa?
Sızan Rahibe

1
@LeakyNun Meydan okumada şöyle diyor: "Tüm giriş numaralarının sonlu ikili temsillere sahip olacağını varsayabilirsiniz."
Mego

Yanıtlar:


2

JavaScript (ES6), 340 bayt

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

fbir sayıyı tabana dönüştürür -4( .sayı bir tam sayı ise izleyen ). gBu iki temel alır -4aynı uzunluk ve her iki uçta da pedler bunları, rakam ., konum, birlikte basamak karıştırır dönüştürür her tabanından 4tabanına 2, son olarak da ön ve arka sıfır şeritler.

Açıklama: Verilen karmaşık sayıyı değiştirilmiş bazda 2itemsil etmek için, karmaşık parçanın gerçek kısmını ve yarısını (yani hayali parçayı bölmek 2i) tabanda 2i²(yani -4) temsil etmemiz , basamakları birlikte karıştırmamız ve daha sonra bunları tabandan dönüştürmemiz gerekir. 4temel almak 2. Tabandaki gerçek bir sayıyı temsil -4etmek için taban 4dönüşümüyle başlarız . Alternatif basamaklar doğru işarete sahiptir (pozitif bir sayı olması durumunda, bunlar çift konumlardaki basamaklardır; negatif bir sayı durumunda, bunlar tek konumlardaki basamaklardır), ancak kalan basamaklar yanlış işarete sahiptir ve bir düzeltme uygulanmalıdır. Örnekler:

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

Gördüğünüz gibi, düzeltme 8eksi orijinal basamaktır, mod 8. Ancak biraz daha uygun bir hesaplama orijinal rakam, artı 3, xor 3 (gerçekten de 32-bit tam sayı aritmetiğinde +0xCCCCCCCC^0xCCCCCCCCtek bir seferde tüm sayıyı dönüştürmek için yazabiliriz ). Son olarak düzeltme, alternatif basamaklar için geçerli olduğundan 16, taban 4basamak çiftlerini otomatik olarak alan , sonra ya 3da 0xCuygun bir faktör kullanarak düzelten, tabana bir ilk dönüşüm yapmak daha kolaydır . Sadece -işareti görmezden gelmeye devam ediyor .


0

Perl - 313 bayt

Kimse bir cevap göndermediğinden henüz kendim atacağımı düşündüm.

$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

Eminim bu daha fazla golf için birçok fırsat vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.