Ondalık ve 2 ** i bazında bir sayı tablosu yazdırın


9

Bilgisayarlar ikili olarak yaşıyor. Tüm programcılar ikili biliyor.

Ancak 2**xüsler, ikili ile güzel ilişkilere sahipken, pratik olmayan olarak genellikle ihmal edilir.

Size böyle güzel bir ilişkinin bir örneğini göstermek için 19 benim referansım olacak.

19 10011 103 23 13 j
  • 19, ondalıktır ve netlik için verilmiştir.

  • 10011, ikili dosyada 19'dur.

  • 103, taban 4'te ikili yoldan başlayarak şu şekilde yapılır:

    • log2 (4) == 2, ikisini hatırlayalım.
    • 10011 pedini 2 kattan fazla olacak şekilde doldurun -> 010011
    • Rakamları 2'den 2'ye soldan sağa alın ve 2 basamaklı ikili sayılar olarak kabul edin:

      • 01 -> 1
      • 00 -> 0
      • 11 -> 3

    Bitti , baz-4'te 10011 103'tür.

8 tabanı için, log2 (8) = 3 ile aynı fakat 3'e 3 yapın.

  • Ped 010011
  • 010 -> 2
  • 011 -> 3

    23, Tamam .

Taban 16 için, log2 (16) = 4 ile aynı, ancak 4'e 4 yapın.

  • Ped 00010011
  • 0001 -> 1
  • 0011 -> 3

    13, Bitti .

Görev

Girdi olarak maksimum sayı verildiğinde, bir tablo çıktısı alırsınız

base-ten-i base-two-i base-four-i base-eight-i base-sixteen-i base-thirtytwo-i

çünkü 0'dan n'ye dahil. İkili sayılar, çalışmak için gereken mutlak minimum değerin özetidir, bu nedenle kodunuzun mümkün olduğunca kısa olması gerekir.

Kısıtlamalar ve bonuslar

  • Base-on -> ikili ve ikili -> Base-on yerleşik, Base-a -> Base-b gibi boşluklar olarak kabul edilir.

  • 2**iBahsedilen ilişkileri kullanarak tüm (i> 2 için) üsleri oluşturursanız bir *0.6bonus kazanırsınız, ancak genel taban dönüşümlerine (kendiniz yazılır) izin verilir.

Örnek tablo

> 32
0 0 0 0 0 0
1 1 1 1 1 1
2 10 2 2 2 2
3 11 3 3 3 3
4 100 10 4 4 4
5 101 11 5 5 5
6 110 12 6 6 6
7 111 13 7 7 7
8 1000 20 10 8 8
9 1001 21 11 9 9
10 1010 22 12 a a
11 1011 23 13 b b
12 1100 30 14 c c
13 1101 31 15 d d
14 1110 32 16 e e
15 1111 33 17 f f
16 10000 100 20 10 g
17 10001 101 21 11 h
18 10010 102 22 12 i
19 10011 103 23 13 j
20 10100 110 24 14 k
21 10101 111 25 15 l
22 10110 112 26 16 m
23 10111 113 27 17 n
24 11000 120 30 18 o
25 11001 121 31 19 p
26 11010 122 32 1a q
27 11011 123 33 1b r
28 11100 130 34 1c s
29 11101 131 35 1d t
30 11110 132 36 1e u
31 11111 133 37 1f v
32 100000 200 40 20 10

4
"Bahsedilen ilişkileri kullanarak 2 ** i (i> 2 için) tabanların tümünü oluşturmalısınız" nedeniyle indirildi. Belirli bir algoritma gerektirmesi, kod golfünü ilginç kılan şeylerin çoğunu kaldırır. Hala bir algoritma seçimine izin verirken yerleşik temel dönüştürme işlevlerini yasaklayabilirsiniz.
xnor

@xnor şimdi yöntemimi kullanarak golfçüler için daha fazla özgürlük vermek için sadece bir bonus veriyor
Caridorc

1
Ben de bonusun hayranı değilim. Etkili bir şekilde, yerleşik veya algoritmanızı kullanmanız gerektiği anlamına gelir ve başka hiçbir algoritma geçerli olamaz.
xnor

@xnor yerleşiklerine izin verilmez. Genel bir dönüştürücü daha kısa olacaktır, bu yüzden benim
onaylanmış

Yanıtlar:


2

CJam, 54 * 0,6 = 32,4 bayt

q~){_5,f{)L@{2md@+\}h(%/Wf%W%{{\2*+}*_9>{'W+}&}%S\}N}/

Burada test edin.

Referans olarak, bonus için uygun olmayan daha kısa bir çözüm (39 baytta):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/

Challange'ı güncelledim, yöntemimi kullandıysanız 0.6 * bonus talep edebilirsiniz
Caridorc

1

Pyth, 52 * 0.6 = 31.2 bayt

L?b+%b2y/b2YVUhQjd+NmjkX|_uL++GGHZ_McyNd]ZUQ+jkUTGS5

Çevrimiçi test edin

Bonus olmayan cevabım 39 bayt

M?G+g/GHH@+jkUTG%GHkVUhQjd+N|R0gLN^L2S5

0

PHP, 232 230 233 217 * 0,6 = 130,2

Golf dilini yenme şansı yok ama mücadeleyi sevdim.

for(;$d<=$n;$d++){echo'
',$d|0;for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b;for($w=1;$w<6;$w++,print" $z"|' 0')for($z='',$k=strlen($b);-$w<$k-=$w;$z=($e>9?chr($e+87):$e).$z)for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k];}
  • Kullanım: başına ekleme $n=32;veya değiştirme $nile 32(ya da herhangi bir başka negatif olmayan bir tam sayı); cli ile ara
  • Kabul edilmezse, yerine $nile $_GET[n]tarayıcıda ya (+ 6 / + 3.6) ve çağrı
    veya cli üzerindephp-cgi -f bases.php -n=32
  • Satır sonunu tarayıcıda test etmek için değiştirin <br>veya başa ekleyin<pre>
  • yeni PHP sürümlerinde tanımsız değişkenler ve nitelendirilmemiş dize ofsetleri için bildirimler atabilir. Bunları bastırmak için
    E_NOTICE hata_yönlendirme (baş üstü error_reporting(0);) öğesinden kaldırın .
  • 5.6'da test edildi

Yıkmak:

for(;$d<=$n;$d++) // loop decimal $d from 0 to $n
{
    echo'
',$d|0; // print line break and decimal
    for($k=$d,$b='';$k;$k>>=1)$b=($k&1).$b; // convert $d to binary
    for($w=1;$w<6;$w++,
        print" $z"|' 0' // print number generated in inner loop (echo doesn´t work here)
    )
        for($z='',$k=strlen($b);-$w<$k-=$w; // loop from end by $w
            $z=($e>9?chr($e+87):$e).$z // prepend digit created in body
        )
            for($e=0,$y=1,$j=$w;$j--;$y*=2) $e+=$y*$b[$j+$k]; // convert chunk to 2**$w
}

büyük düzenleme:

  • iç döngüyü yenilemek için bazı dizin büyüleri kullandı -> şimdi tüm dizede geriye doğru çalışıyor (artık dolgu yok, ikili bölme veya kopyalama yok)
  • diş tellerini ortadan kaldırmak için halka gövdelerinin parçalarını kafalara taşıdı
  • yenilemeden sonra ondalık 0 sonuçlarını düzeltmek için 7 4 bayt eklemek zorunda kaldım

bonus olmayan sürüm, 142 bayt

for(;$d<=$n;$d++,print'
',$d|0)for($w=1;$w<6;$w++,print" $z"|' 0')for($k=$d,$y=1,$z='';$k&&$y<<=$w;$k>>=$w)$z=(9<($e=$k%$y)?chr($e+87):$e).$z;

PHP Python'u yeniyor mu?
Parçacığı bir program yapmak için 6 (3.6) bayt eklesem bile, yine de Python'u yenmiştim (158'e karşı 223 * 0.6 = 133.8 veya 148 bonus olmayan). İnanılmaz.


'Tanımsız değişken: n: 1' hatası alıyorum forve en dıştaki for döngüsündeki anahtar kelimenin ardından bir boşluk kaldırarak 1 bayt kaydedebileceğinizi düşünüyorum .
Yytsi

@TuukkaX: kullanıma bakın: Snippet'ten önce $ n tanımlanmalıdır. Bu baytı buldum, ama teşekkürler. Ve bir tane daha: "\n"-> fiziksel satır sonu.
Titus

ancak ilk 0'ı yazdırmak için 3 bayt eklemek zorunda kaldım (değişkeni başlatmak için bu veya 5 bayt).
Titus

0

Ruby, 80 bayt (bonus olmayan sürüm)

m=ARGV[0].to_i;(0..m).each{|n|puts [10,2,4,8,16,32].map{|b|n.to_s(b)}.join(' ')}

0

Python3-189 , 167, 166150 bayt

for i in range(int(input())+1):f=lambda b,n=i,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(b,n//b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))

@ LeakyNun yardımıyla 16 bayt kaydedildi !

Bonus sürümü - 296 * 0.6 = 177.6 279 * 0.6 = 167.4 bayt

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];v=f(i,2);d=z(v);print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

Bonus versiyonunun biraz daha okunabilir versiyonu.

p=lambda b,c:"".join(str(int(b[i:i+c],2))for i in range(0,len(b),c))
z=lambda s:len(s)%2 and s or "0"+s
for i in range(int(input())+1):
    f=lambda n,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n] or f(n//b,b) + c[n%b]
    v=f(i,2)
    d=z(v)
    print(i,v,p(d,2),p(d,3),p(d,4),p(d,5),f(i,32))

Bonusun geçerli olmadığından oldukça eminim. Taban 2 ** x sayılarını üretmek için binary kullanmıyorsunuz.
Titus

@Titus Oh, o zaman bonusu yanlış anladım. Bayt sayısını düzenleyeceğim. Teşekkürler!
Yytsi

Kesinlikle "0123456789abcdefghijklmnopqrstuv"daha kısafrom string import* digits+ascii_lowercase
Leaky Nun

@LeakyNun Hata. Haklısın. Sadece yazmanın ne kadar kısa olduğunu düşündüm digits+ascii_lowercase: D. Teşekkürler!
Yytsi

150 bayt: for i in range(int(input())+1):f=lambda n=i,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))(bir satır)
Leaky Nun
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.