Drucken Sie eine Zahlentabelle in Dezimal- und 2 ** i-Basen

9

Computer leben von binären. Alle Programmierer kennen Binär.

Aber die 2**xGrundlagen werden oft als unpraktisch vernachlässigt, während sie schöne Beziehungen zur Binärdatei haben.

Um Ihnen ein Beispiel für eine solch schöne Beziehung zu zeigen, wird 19 mein Zeugnis sein.

19 10011 103 23 13 j
  • 19 ist dezimal, der Klarheit halber enthalten.

  • 10011 ist 19 in binär.

  • 103, in Basis 4 wird ausgehend von binär wie folgt gemacht:

    • log2 (4) == 2, erinnern wir uns an zwei.
    • Pad 10011 so, dass es ein Vielfaches von 2 Länge hat -> 010011
    • Nehmen Sie die Ziffern 2 mal 2 von links nach rechts und behandeln Sie sie als zweistellige Binärzahlen:

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

    Fertig , 10011 in Base-4 ist 103.

Machen Sie für Basis 8 dasselbe, aber 3 mal 3 wie log2 (8) = 3.

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

    23, Fertig .

Machen Sie für Basis 16 dasselbe, aber 4 mal 4 wie log2 (16) = 4.

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

    13, Fertig .

Aufgabe

Bei einer maximalen Anzahl als Eingabe müssen Sie eine Tabelle ausgeben

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

für i geht das von 0 bis einschließlich n. Binärzahlen sind der Inbegriff des absoluten Minimums, das für die Arbeit benötigt wird. Daher sollte Ihr Code so kurz wie möglich sein.

Einschränkungen und Boni

  • Base-Ten -> binär und binär -> Base-Ten-Einbauten gelten als Lücken wie Base-a -> Base-b.

  • Wenn Sie alle 2**i(für i> 2) Basen unter Verwendung der oben genannten Beziehungen generieren, erhalten Sie einen *0.6Bonus, aber allgemeine Basiskonvertierungen (von Ihnen selbst geschrieben) sind zulässig.

Beispieltabelle

> 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
quelle
4
Downvoted wegen "Sie müssen alle 2 ** i (für i> 2) Basen unter Verwendung der oben genannten Relationen generieren". Das Erfordernis eines bestimmten Algorithmus entfernt viel von dem, was Code Golf interessant macht. Sie können integrierte Basiskonvertierungsfunktionen sperren und gleichzeitig eine Auswahl an Algorithmen zulassen.
xnor
@xnor jetzt mit meiner Methode gibt nur einen Bonus, um mehr Freiheit für Golfer zu geben
Caridorc
1
Ich bin auch kein Fan des Bonus. Dies bedeutet effektiv, dass Sie entweder einen integrierten Algorithmus oder Ihren Algorithmus verwenden müssen und kein anderer Algorithmus realisierbar ist.
xnor
@ xnor-Einbauten sind nicht erlaubt. Ein allgemeiner Konverter wird kürzer sein, also gebe ich einen Bonus, wenn Sie meine erfundenen Konvertierungsregeln
anwenden

Antworten:

2

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

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

Testen Sie es hier.

Als Referenz ist hier eine kürzere Lösung, die sich nicht für den Bonus qualifiziert (bei 39 Bytes):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/
Martin Ender
quelle
Ich habe die Herausforderung aktualisiert. Sie können einen Bonus von 0,6 * beanspruchen, wenn Sie meine Methode
anwenden
1

Pyth, 52 * 0,6 = 31,2 Bytes

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

Testen Sie es online

Meine Nicht-Bonus-Antwort ist 39 Bytes

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

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

Keine Chance, die Golfsprachen zu schlagen, aber ich mochte die Herausforderung.

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];}
  • Verwendung: Voranstellen $n=32;oder Ersetzen $ndurch 32(oder eine andere nicht negative Ganzzahl); Anruf über Cli
  • Wenn dies nicht akzeptiert wird, ersetzen Sie es $ndurch $_GET[n](+ 6 / + 3.6) und rufen Sie entweder im Browser
    oder auf cli mit aufphp-cgi -f bases.php -n=32
  • Ersetzen Sie den Zeilenumbruch durch <br>oder stellen Sie ihn vor <pre>, um ihn im Browser zu testen
  • kann in neueren PHP-Versionen Hinweise für undefinierte Variablen und nicht initialisierte String-Offsets auslösen.
    Entfernen Sie E_NOTICE aus error_reporting (voranstellen error_reporting(0);), um sie zu unterdrücken.
  • getestet in 5.6

Nervenzusammenbruch:

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
}

Hauptbearbeitung:

  • hat etwas Indexmagie verwendet, um die innere Schleife zu überarbeiten -> funktioniert jetzt rückwärts für die gesamte Zeichenfolge (kein Auffüllen, kein Teilen oder Kopieren der Binärdatei mehr)
  • bewegte Teile der Schlaufenkörper zu den Köpfen, um Klammern zu beseitigen
  • musste 7 4 Bytes hinzufügen , um die dezimalen 0-Ergebnisse nach der Überarbeitung zu korrigieren

Nicht-Bonus-Version, 142 Bytes

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 schlägt Python?
Selbst wenn ich die 6 (3,6) Bytes hinzugefügt hätte, um das Snippet zu einem Programm zu machen, würde ich Python immer noch schlagen (223 * 0,6 = 133,8 oder 148 Nicht-Bonus vs. 158). Tolle.

Titus
quelle
Ich erhalte die Fehlermeldung 'Undefinierte Variable: n: 1' und ich denke, dass Sie 1 Byte sparen können, indem Sie ein Leerzeichen nach dem forSchlüsselwort in der äußersten for-Schleife entfernen .
Yytsi
@ TuukkaX: siehe Verwendung: $ n muss vor dem Snippet definiert werden. Ich habe das Byte gefunden, aber danke. Und noch eins: "\n"-> physischer Zeilenumbruch.
Titus
aber ich musste 3 Bytes hinzufügen, um die erste 0 zu drucken (das oder 5 Bytes, um die Variable zu initiieren).
Titus
0

Ruby, 80 Bytes (Nicht-Bonus-Version)

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
quelle
0

Python3 - 189, 167, 166 150 Bytes

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

16 Bytes mit Hilfe von @ LeakyNun gespeichert !

Bonusversion - 296 * 0,6 = 177,6 279 * 0,6 = 167,4 Byte

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

Etwas besser lesbare Version der Bonusversion.

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
quelle
Ich bin mir ziemlich sicher, dass der Bonus nicht gilt. Sie verwenden keine Binärdatei, um die Basis 2 ** x-Zahlen zu erzeugen.
Titus
@Titus Oh, ich habe den Bonus damals falsch verstanden. Ich werde die Byteanzahl bearbeiten. Vielen Dank!
Yytsi
Ziemlich sicher "0123456789abcdefghijklmnopqrstuv"ist kürzer alsfrom string import* digits+ascii_lowercase
Leaky Nun
@LeakyNun Ups. Du hast recht. Ich dachte nur daran, wie kurz es ist zu schreiben digits+ascii_lowercase: D. Vielen Dank!
Yytsi
150 Bytes: 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))(eine Zeile)
Leaky Nun