Imprimer un tableau de nombres en décimal et 2 ** i bases

9

Les ordinateurs vivent en binaire. Tous les programmeurs connaissent le binaire.

Mais les 2**xbases sont souvent négligées car non pratiques, alors qu'elles ont de belles relations avec le binaire.

Pour vous montrer un exemple d'une relation aussi belle, 19 sera mon témoignage.

19 10011 103 23 13 j
  • 19 est décimal, inclus pour plus de clarté.

  • 10011 est 19 en binaire.

  • 103, en base 4 se fait à partir du binaire de cette façon:

    • log2 (4) == 2, rappelons-nous deux.
    • Pad 10011 pour qu'il ait un multiple de 2 longueurs -> 010011
    • Prenez les chiffres 2 par 2 de gauche à droite et traitez-les comme des nombres binaires à 2 chiffres:

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

    Fait , 10011 en base 4 est 103.

Pour la base 8, faites la même chose mais 3 par 3 comme log2 (8) = 3.

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

    23, terminé .

Pour la base 16, faites la même chose mais 4 x 4 comme log2 (16) = 4.

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

    13, terminé .

Tâche

Étant donné un nombre maximum en entrée, vous devez générer un tableau

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

pour i cela va de 0 à n inclus. Les nombres binaires sont la quintessence du minimum absolu nécessaire pour fonctionner, donc votre code doit être aussi court que possible.

Restrictions et bonus

  • Base-ten -> binaire et binaire -> Les composants intégrés de base-dix sont considérés comme des failles comme Base-a -> Base-b.

  • Si vous générez toutes les 2**ibases (pour i> 2) en utilisant les relations mentionnées ci-dessus, vous obtenez un *0.6bonus, mais les conversions de base générales (écrites par vous-même) sont autorisées.

Exemple de tableau

> 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
la source
4
Downvoted en raison de "Vous devez générer toutes les 2 ** i (pour i> 2) bases en utilisant les relations mentionnées ci-dessus". Exiger un algorithme spécifique supprime beaucoup de ce qui rend le golf de code intéressant. Vous pouvez interdire les fonctions de conversion de base intégrées tout en permettant un choix d'algorithme.
xnor
@xnor utilisant maintenant ma méthode ne donne qu'un bonus, pour donner plus de liberté aux golfeurs
Caridorc
1
Je ne suis pas non plus fan du bonus. Cela signifie effectivement que vous devez utiliser un algorithme intégré ou votre algorithme, et aucun autre algorithme ne peut être viable.
xnor
Les fonctions intégrées @xnor ne sont pas autorisées. Un convertisseur général sera plus court, donc je donne un bonus si vous utilisez mes règles de conversion artificielles
Caridorc

Réponses:

2

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

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

Testez-le ici.

Pour référence, voici une solution plus courte qui ne donne pas droit au bonus (à 39 octets):

q~){:X5{SLX{2I)#md_9>{'W+}&@+\}h;}fIN}/
Martin Ender
la source
J'ai mis à jour le défi, vous pouvez réclamer un bonus de 0,6 * si vous avez utilisé ma méthode
Caridorc
1

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

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

Testez-le en ligne

Ma réponse non bonus est de 39 octets

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

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

aucune chance de battre les langues de golf, mais j'ai aimé le défi.

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];}
  • utilisation: ajouter $n=32;ou remplacer $npar 32(ou tout autre entier non négatif); appeler via cli
  • Si cela n'est pas accepté, remplacez $npar $_GET[n](+ 6 / + 3.6) et appelez soit dans le navigateur
    soit sur cli avecphp-cgi -f bases.php -n=32
  • Remplacer le saut de ligne par <br>ou préfixer <pre>pour tester dans le navigateur
  • peut émettre des notifications pour les variables non définies et les décalages de chaîne non initialisés dans les versions PHP plus récentes.
    Supprimez E_NOTICE de error_reporting (prepend error_reporting(0);) pour les supprimer.
  • testé en 5.6

panne:

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
}

édition majeure:

  • utilisé un peu de magie d'index pour réorganiser la boucle interne -> fonctionne maintenant à l'envers sur toute la chaîne (plus de remplissage, plus de division ou de copie du binaire)
  • pièces déplacées des corps de boucle vers les têtes pour éliminer les accolades
  • a dû ajouter 7 4 octets pour corriger les résultats décimaux 0 après la refonte

version non bonus, 142 octets

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 bat Python?
Même si j'ai ajouté les 6 (3,6) octets pour faire de l'extrait de code un programme, je battre toujours Python (223 * 0,6 = 133,8 ou 148 sans bonus contre 158). Incroyable.

Titus
la source
J'obtiens une erreur «Variable non définie: n: 1» et je pense que vous pouvez enregistrer 1 octet en supprimant un espace après le formot - clé dans la boucle for la plus à l'extérieur.
Yytsi
@TuukkaX: voir usage: $ n doit être défini avant l'extrait. J'ai trouvé cet octet, mais merci. Et encore: "\n"-> rupture de ligne physique.
Titus
mais j'ai dû ajouter 3 octets pour imprimer le premier 0. (cela ou 5 octets pour initier la variable).
Titus
0

Ruby, 80 octets (version 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(' ')}
jose_castro_arnaud
la source
0

Python3 - 189, 167, 166 150 octets

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 octets enregistrés avec l'aide de @ LeakyNun !

Version bonus - 296 * 0,6 = 177,6 279 * 0,6 = 167,4 octets

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

Version légèrement plus lisible de la version 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))
Yytsi
la source
Je suis presque certain que le bonus ne s'applique pas. Vous n'utilisez pas le binaire pour produire les nombres de base 2 ** x.
Titus
@Titus Oh, j'ai alors mal compris le bonus. Je vais modifier le nombre d'octets. Merci!
Yytsi
Je suis sûr que "0123456789abcdefghijklmnopqrstuv"c'est plus court quefrom string import* digits+ascii_lowercase
Leaky Nun
@LeakyNun Oups. Tu as raison. Je pensais seulement à la longueur de l'écriture digits+ascii_lowercase: D. Merci!
Yytsi
150 octets: 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))(une ligne)
Leaky Nun