Wydrukuj tabelę liczb w systemie dziesiętnym i 2 ** i

9

Komputery żyją w systemie binarnym. Wszyscy programiści znają binarny.

Ale 2**xpodstawy są często zaniedbywane jako niepraktyczne, podczas gdy mają piękne relacje z binarnymi.

Aby pokazać wam przykład takiego pięknego związku, 19 będzie moim świadectwem.

19 10011 103 23 13 j
  • 19 jest ułamkiem dziesiętnym, podanym dla zachowania przejrzystości.

  • 10011 ma 19 cyfr binarnych.

  • 103, w bazie 4 powstaje począwszy od binarnego w ten sposób:

    • log2 (4) == 2, pamiętajmy dwa.
    • Podkładka 10011, aby miała wielokrotność 2 długości -> 010011
    • Weź cyfry 2 na 2 od lewej do prawej i traktuj je jak dwucyfrowe liczby binarne:

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

    Sporządzono , 10011 w bazie 4 to 103.

W przypadku podstawy 8 wykonaj to samo, ale 3 na 3, co log2 (8) = 3.

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

    23, Gotowe .

Dla podstawy 16 wykonaj to samo, ale 4 na 4, jak log2 (16) = 4.

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

    13, Gotowe .

Zadanie

Biorąc pod uwagę maksymalną liczbę jako dane wejściowe, wypiszesz tabelę

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

dla i, który przechodzi od 0 do n włącznie. Liczby binarne są uosobieniem absolutnego minimum niezbędnego do działania, więc kod powinien być możliwie jak najkrótszy.

Ograniczenia i bonusy

  • Base-ten -> binarny i binarny -> Wbudowane Base-ten są uważane za luki, podobnie jak Base-a -> Base-b.

  • Jeśli wygenerujesz wszystkie 2**ibazy (dla i> 2) przy użyciu wyżej wymienionych relacji, otrzymasz *0.6bonus, ale ogólne konwersje bazy (napisane przez ciebie ) są dozwolone.

Przykładowa tabela

> 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
Caridorc
źródło
4
Odebrano ze względu na „Musisz wygenerować wszystkie 2 ** i (dla i> 2) baz przy użyciu wyżej wymienionych relacji”. Wymaganie określonego algorytmu usuwa wiele z tego, co czyni kod golfowym interesującym. Możesz zablokować wbudowane podstawowe funkcje konwersji, jednocześnie pozwalając na wybór algorytmu.
xnor
@xnor teraz, używając mojej metody, daje tylko bonus, aby dać więcej swobody
golfistom
1
Nie jestem też fanem premii. Skutecznie oznacza to, że musisz użyć wbudowanego algorytmu lub algorytmu i żaden inny algorytm nie może być wykonalny.
xnor
Wbudowane @xnor nie są dozwolone. Ogólny konwerter będzie krótszy, więc daję bonus, jeśli użyjesz moich wymyślonych zasad konwersji
Caridorc,

Odpowiedzi:

2

CJam, 54 * 0,6 = 32,4 bajtów

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

Sprawdź to tutaj.

Dla porównania, oto krótsze rozwiązanie, które nie kwalifikuje się do premii (39 bajtów):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/
Martin Ender
źródło
Zaktualizowałem wyzwanie, możesz skorzystać z premii 0,6 *, jeśli użyłeś mojej metody
Caridorc,
1

Pyth, 52 * 0,6 = 31,2 bajtów

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

Przetestuj online

Moja odpowiedź bez premii wynosi 39 bajtów

M?G+g/GHH@+jkUTG%GHkVUhQjd+N|R0gLN^L2S5
Brian Tuck
źródło
0

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

nie ma szans na pokonanie języków golfowych, ale podobało mi się to wyzwanie.

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];}
  • Wykorzystanie: poprzedzić $n=32;lub wymiany $nz 32(lub dowolny inny niż ujemna); zadzwoń przez cli
  • Jeśli to nie jest akceptowane, wymienić $nz $_GET[n](+ 6 / + 3.6) i wezwanie albo w przeglądarce
    lub na CLI zphp-cgi -f bases.php -n=32
  • Zamień <br>znak podziału wiersza na lub przejdź <pre>do testu w przeglądarce
  • może rzucać powiadomienia o niezdefiniowanych zmiennych i niezamierzonych przesunięciach ciągów w nowszych wersjach PHP.
    Usuń E_NOTICE z raportowania o błędzie (prepend error_reporting(0);), aby je ukryć.
  • testowany w 5.6

awaria:

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
}

główna edycja:

  • użył trochę magii indeksu, aby przerobić wewnętrzną pętlę -> teraz działa wstecz na całym łańcuchu (koniec wypełniania, dzielenie lub kopiowanie pliku binarnego)
  • przeniósł części korpusów pętli do głów, aby wyeliminować aparaty ortodontyczne
  • musiałem dodać 7 4 bajtów, aby naprawić wyniki dziesiętne 0 po przeróbce

wersja bez premii, 142 bajty

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 pokonuje Python?
Nawet jeśli dodam 6 (3,6) bajtów, aby uczynić fragment kodu programem, nadal bym pokonał Pythona (223 * 0,6 = 133,8 lub 148 bez premii vs. 158). Niesamowity.

Tytus
źródło
Pojawia się błąd „Niezdefiniowana zmienna: n: 1” i myślę, że można zapisać 1 bajt, usuwając spację po forsłowie kluczowym w najbardziej zewnętrznej pętli for.
Yytsi
@TuukkaX: patrz użycie: $ n musi zostać zdefiniowany przed fragmentem. Znalazłem ten bajt, ale dzięki. I jeszcze jedno: "\n"-> fizyczny podział linii.
Tytus
ale musiałem dodać 3 bajty, aby wydrukować pierwsze 0. (to lub 5 bajtów, aby zainicjować zmienną).
Tytus
0

Ruby, 80 bajtów (wersja bez premii)

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

Python 3 - 189, 167, 166 150 bajtów

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

Zapisano 16 bajtów przy pomocy @ LeakyNun !

Wersja premiowa - 296 * 0,6 = 177,6 279 * 0,6 = 167,4 bajtów

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

Nieco bardziej czytelna wersja wersji bonusowej.

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))
Yytsi
źródło
Jestem pewien, że premia nie ma zastosowania. Nie używasz pliku binarnego do tworzenia bazowych 2 ** x liczb.
Tytus
@Titus Och, wtedy źle zrozumiałem bonus. Zmienię liczbę bajtów. Dzięki!
Yytsi
Z pewnością "0123456789abcdefghijklmnopqrstuv"jest krótszy niżfrom string import* digits+ascii_lowercase
Leaky Nun
@LeakyNun Ups. Masz rację. Myślałem tylko o tym, jak krótko jest napisać digits+ascii_lowercase: D. Dzięki!
Yytsi
150 bajtów: 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))(jedna linia)
Leaky Nun