Stampa una tabella di numeri in base decimale e 2 ** i


9

I computer vivono in binario. Tutti i programmatori conoscono il binario.

Ma le 2**xbasi sono spesso trascurate come non pratiche, mentre hanno belle relazioni con il binario.

Per mostrarti un esempio di una relazione così bella, 19 sarà la mia testimonianza.

19 10011 103 23 13 j
  • 19 è decimale, incluso per chiarezza.

  • 10011 è 19 in binario.

  • 103, in base 4 è fatto a partire da binario in questo modo:

    • log2 (4) == 2, ricordiamone due.
    • Pad 10011 in modo che abbia un multiplo di 2 lunghezze -> 010011
    • Prendi le cifre 2 per 2 da sinistra a destra e trattale come numeri binari a 2 cifre:

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

    Fatto , 10011 in base-4 è 103.

Per la base 8, fai lo stesso ma 3 per 3 di log2 (8) = 3.

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

    23, fatto .

Per la base 16, fai lo stesso ma 4 per 4 di log2 (16) = 4.

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

    13, Fatto .

Compito

Dato un numero massimo come input, dovrai generare una tabella

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

per i che va da 0 a n compreso. I numeri binari sono l'epitome del minimo assoluto necessario per funzionare, quindi il tuo codice dovrebbe essere il più corto possibile.

Restrizioni e bonus

  • Base-dieci -> binario e binario -> Base-dieci integrati sono considerati scappatoie come Base-a -> Base-b lo sono.

  • Se si generano tutte le 2**ibasi (per i> 2) utilizzando le relazioni sopra menzionate si ottiene un *0.6bonus, ma sono consentite conversioni di base generali (scritte da soli).

Tabella di esempio

> 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
Sottovalutato a causa di "È necessario generare tutte le basi 2 ** i (per i> 2) utilizzando le relazioni sopra menzionate". La richiesta di un algoritmo specifico rimuove molto ciò che rende interessante il code golf. Puoi vietare le funzioni di conversione di base integrate pur consentendo una scelta dell'algoritmo.
xnor

@xnor ora usando il mio metodo dà solo un bonus, per dare più libertà ai golfisti
Caridorc,

1
Non sono neanche un fan del bonus. Significa effettivamente che è necessario utilizzare un algoritmo incorporato o integrato e nessun altro algoritmo può essere praticabile.
xnor

@xnor built-in non sono ammessi. Un convertitore generale sarà più corto, quindi
offro

Risposte:


2

CJam, 54 * 0.6 = 32.4 byte

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

Provalo qui.

Per riferimento, ecco una soluzione più breve che non si qualifica per il bonus (a 39 byte):

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

Ho aggiornato la sfida, potresti richiedere un bonus di 0,6 * se hai usato il mio metodo
Caridorc,

1

Pyth, 52 * 0.6 = 31.2 byte

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

Provalo online

La mia risposta non bonus è di 39 byte

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

0

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

nessuna possibilità di battere le lingue del golf, ma la sfida mi è piaciuta.

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];}
  • utilizzo: anteporre $n=32;o sostituire $ncon 32(o qualsiasi altro numero intero non negativo); chiama via cli
  • Se ciò non viene accettato, sostituirlo $ncon $_GET[n](+ 6 / + 3.6) e chiamare nel browser
    o su cli conphp-cgi -f bases.php -n=32
  • Sostituisci l'interruzione di linea <br>o anteponi <pre>per eseguire il test nel browser
  • può generare avvisi per variabili indefinite e offset di stringa non inizializzati nelle versioni PHP più recenti.
    Rimuovi E_NOTICE da error_reporting (antepone error_reporting(0);) per eliminarli.
  • testato in 5.6

abbattersi:

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
}

modifica principale:

  • usato un po 'di magia indice per rinnovare il ciclo interno -> ora funziona all'indietro sull'intera stringa (non più padding, non più divisione o copia del binario)
  • spostato parti dei corpi ad anello sulle teste per eliminare le parentesi graffe
  • ha dovuto aggiungere 7 4 byte per correggere i risultati decimali 0 dopo il rinnovo

versione non bonus, 142 byte

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 batte Python?
Anche se avessi aggiunto i 6 (3.6) byte per rendere lo snippet un programma, avrei comunque battuto Python (223 * 0.6 = 133.8 o 148 non bonus contro 158). Sorprendente.


Viene visualizzato l'errore "Variabile non definita: n: 1" e penso che sia possibile salvare 1 byte rimuovendo uno spazio dopo la forparola chiave nel for-loop più esterno.
Yytsi,

@TuukkaX: vedi utilizzo: $ n deve essere definito prima dello snippet. Ho trovato quel byte, ma grazie. E ancora uno: "\n"-> interruzione di linea fisica.
Tito

ma ho dovuto aggiungere 3 byte per stampare il primo 0. (ovvero 5 byte per iniziare la variabile).
Tito

0

Ruby, 80 byte (versione non bonus)

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, 166 150 byte

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 byte salvati con l'aiuto di @ LeakyNun !

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

Versione leggermente più leggibile della versione bonus.

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

Sono abbastanza certo che il bonus non si applica. Non si utilizza binario per produrre i numeri di base 2 ** x.
Tito

@Titus Oh, allora ho capito male il bonus. Modificherò il conteggio dei byte. Grazie!
Yytsi,

Abbastanza sicuro "0123456789abcdefghijklmnopqrstuv"è più corto difrom string import* digits+ascii_lowercase
Leaky Nun

@LeakyNun Oops. Hai ragione. Ho solo pensato a quanto è breve scrivere digits+ascii_lowercase: D. Grazie!
Yytsi,

150 byte: 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))(una riga)
Leaky Nun
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.