Donnez-moi la liste Gray Code de la largeur de bit n

11

Le code gris est une séquence de nombres binaires de largeur de bit noù les nombres successifs ne diffèrent que d'un seul bit (voir l'exemple de sortie).

Référence

Exemple d'entrée:

3

Exemple de sortie:

000
001
011
010
110
111
101
100

Remarques:

  • Cette question semble avoir une dupe mais ce n'est pas le cas, car cette question n'est pas un code-golf, et elle exige une sortie différente. Cela vous aidera cependant à vérifier ses réponses.
  • Vous pouvez supposer une variable nqui contient l'entrée.
ToonAlfrink
la source
6
Étant donné que l'autre question est un défi de code à code le plus rapide sans critère de gain objectif (comment mesurer le plus rapidement?), Je propose de fermer l'autre et de rouvrir celui-ci.
Dennis
2
Je suis d'accord avec @dennis et j'ai donc voté pour la réponse impopulaire suivante à la question d'origine. "Si la réponse que vous cherchez est strictement un résultat rapide, alors si vous déclarez un tableau (des codes gris) ..." Cependant, la question d'origine a déjà une réponse à 7 et à 4 caractères donc je ne t voir beaucoup de place pour l'amélioration. Par conséquent, je ne vote pas pour le moment à nouveau.
Level River St
3
C'est terriblement similaire à Traverse tous les nombres avec un seul flip par étape cependant ...
Dennis
La première question du code Gray n'est pas géniale, mais elle a déjà des réponses qui sont fondamentalement les mêmes que celles que cette question veut, et qui ne sont pas susceptibles d'être améliorées. Je pense qu'il aurait été plus logique de laisser celui-ci fermé et de changer l'autre en un code golf.
Peter Taylor

Réponses:

2

JavaScript (77)

for(i=0;i<1<<n;)alert((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))

Version plus conviviale pour le navigateur (console.log et prompt ()):

n=prompt();for(i=0;i<1<<n;)console.log((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))
Дамян Станчев
la source
Peut-être que ce tableau ... rejoindre est exagéréfor(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
edc65
2

Python 2 (47)

for i in range(2**n):print bin(2**n+i/2^i)[3:]

L'expression i/2^ipour le i'numéro de code gris provient de cette réponse . Pour ajouter des zéros non significatifs à la longueur n, j'ajoute 2**navant de convertir en chaîne binaire, créant une chaîne de longueur n+1. Ensuite, je tronque le 1préfixe principal et le type de numéro 0bavec [3:].

xnor
la source
2

APL (Dyalog Classic) , 11 octets

2≠/0,↑,⍳n2

Essayez-le en ligne!

n⍴2est 2 2...2- un vecteur de ndeux

est les indices d'un ntableau -dimensionnel de forme 2 2...2- c'est-à-dire un tableau 2 × 2 × ... × 2 de vecteurs imbriqués. Comme nous utilisons 0-indexing ( ⎕IO←0), ce sont tous des vecteurs binaires de longueur n.

,aplatir la forme 2 × 2 × ... × 2, nous obtenons donc un vecteur de 2 n vecteurs binaires imbriqués

"mix" - convertit le vecteur de vecteurs en une matrice solide 2 n × n. Cela ressemble à ceci:

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

0, ajoute des zéros à gauche de la matrice

2≠/calcule la paire ( 2) xor ( ) le long de la dernière dimension ( /par opposition à ); en d'autres termes, chaque élément est xor-ed avec son voisin droit, et la dernière colonne disparaît

0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0
ngn
la source
Pourriez-vous ajouter une explication rapide?
Jonah
1
@Jonah bien sûr, ajouté
ngn
très intelligent, thx
Jonah
2

Japt , 14 12 octets

2pU Ç^z)¤ùTU

Rasé de deux octets grâce à ETHproductions .

Essayez-le en ligne!

Lente
la source
Exemple parfait d' ùutilisation. Puisqu'il N.z(n)s'agit d'une division entière avec par défaut arg = 2, vous pouvez enregistrer deux octets avec 2pU Ç^z)¤ùTU: Essayez-le en ligne!
ETHproductions
@ETHproductions Merci, les arguments par défaut me manquent toujours de temps en temps. Très pratique, merci beaucoup.
Nit
1

Python - 54

Basé sur un algorithme de la référence donnée dans le défi:

for i in range(2**n):print'{1:0{0}b}'.format(n,i>>1^i)

Non golfé:

# For each of the possible 2**n numbers...
for num in range(2**n):
    gray = num>>1 ^ num

    # Print in binary and pad with n zeros.
    print '{1:0{0}b}'.format(grey)
BeetDemGuise
la source
1

PowerShell (168)

Amateur PowerShell'r de retour avec une nouvelle tentative de golf! J'espère que cela ne vous dérange pas! À tout le moins, ces questions sont amusantes et une expérience d'apprentissage pour démarrer. En supposant que n a été entré, nous avons:

$x=@('0','1');for($a=1;$a-lt$n;$a++){$x+=$x[($x.length-1)..0];$i=[Math]::Floor(($x.length-1)/2);0..$i|%{$x[$_]='0'+$x[$_]};($i+1)..($x.length-1)|%{$x[$_]='1'+$x[$_]}}$x

Étant donné que le PowerShell avec lequel je travaille n'est que 2.0, je ne peux utiliser aucune applet de commande de décalage de bits qui pourrait rendre le code plus court. J'ai donc profité d'une méthode différente décrite dans la source de la question , en retournant le tableau et en l'ajoutant à lui-même, en ajoutant un 0 à l'avant de la moitié supérieure et un 1 à la moitié inférieure.

Fuandon
la source
1

F # (86) (84) (80)

for i in 0..(1<<<n)-1 do printfn"%s"(Convert.ToString(i^^^i/2,2).PadLeft(n,'0'))

Cela pourrait probablement être encore amélioré.

Notez également que si vous utilisez FSI, vous devez d' open System;;abord le faire. Si vous souhaitez éviter d'importer cela (et si vous ne vous souciez pas de l'ordre dans lequel les valeurs sont imprimées), vous pouvez utiliser cette version à 82 caractères:

for i in 0..(1<<<n)-1 do(for j in 0..n-1 do printf"%i"((i^^^i/2>>>j)%2));printfn""
pswg
la source
1

Rubis - 42 39

Même algorithme, langue différente:

(2**n).times{|b|puts"%0#{n}b"%(b>>1^b)}

Passer de #mapà #timescomme @voidpigeon suggère d'enregistrer 3 caractères.

OI
la source
1
Au lieu de [*0...2**n].mapvous pouvez utiliser (2**n).times.
afuous
1

J, 24 octets

[:#:@(22 b.<.@-:)[:i.2^]

Essayez-le en ligne!

Implémentation simple de l'algorithme "XOR avec sa propre moitié au sol". Notez que 22 b.c'est XOR.

Jonas
la source
1

MATL , 10 octets

W:qt2/kZ~B

Essayez-le en ligne!

La bonne vieille méthode "XOR n avec n >> 2".

W- calculer 2 ^ (entrée) (obtient l'entrée implicitement)
:q- créer une plage de nombres de 0 à 2 ^ n - 1
t - dupliquer cette plage
2/k- MATL n'a pas de décalage de bits, donc divisez (chaque nombre) par 2 et étage
Z~ - élément XOR ce résultat avec le tableau d'origine de 0 à 2 ^ n - 1
B - convertir chaque nombre du résultat en binaire
(afficher implicitement la sortie.)

Sundar - Rétablir Monica
la source
1

K (ngn / k) , 25 octets

{(x-1){,/0 1,''|:\x}/0 1}

Essayez-le en ligne!


  • |:\xest "reverse scan x". applique inverse à x jusqu'à ce que la sortie soit égale à l'entrée et affiche chaque itération. renvoie (0 1; 1 0) lors de la première passe.
  • 0 1,''est "0 1 joindre chacun". joint un 0 à chaque valeur du 1er elem et 1 à chaque valeur du 2e elem, donnant ((0 0; 0 1); (1 1; 1 0)) au premier passage
  • ,/ est "join over" et s'aplatit à la liste.
  • (x-1){...}/0 1est "appliquer {func} plus de 0 1x-1 fois". prend la sortie de la dernière itération en entrée
griffonner
la source
0

APL (22)

{(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1

Cela génère une matrice n par 2 ^ n contenant les bits comme ses lignes:

      n←3
      {(0,⍵)⍪1,⊖⍵}⍣(n-1)⍪0 1
0 0 0
0 0 1
0 1 1
0 1 0
1 1 0
1 1 1
1 0 1
1 0 0

Explication:

  • {... }⍣(n-1)⍪0 1: exécutez les n-1temps de fonction avec l'entrée initiale de la matrice (0 1)T(qui est le code gris 1 bit)

    • (0,⍵): chaque ligne avec un 0préfixe,
    • : au dessus de,
    • 1,⊖⍵: chaque ligne avec un 1préfixe, dans l'ordre inverse
marinus
la source
0

Jq 1,5 , 105 100 octets

def g(n):if n<2then. else map([0]+.)+(reverse|map([1]+.))|g(n-1)end;[[0],[1]]|g(N)[]|map("\(.)")|add

Suppose que N fournit une entrée. par exemple

def N: 3 ;

Étendu

def g(n):  # recursively compute gray code
  if n < 2
  then .
  else map([0]+.) + (reverse|map([1]+.)) | g(n-1)
  end;

  [[0],[1]]                 # initial state
| g(N)[]                    # for each element in array of gray codes
| map("\(.)")|add           # covert to a string

Essayez-le en ligne!

jq170727
la source
-1

T-SQL 134

Ce défi demande de rendre la puissance cartésienne de {(0), (1)}. Cet extrait construit le code qui exécuterait le produit cartésien de {(0), (1)} n fois.

DECLARE @ int=4,@s varchar(max)='SELECT*FROM's:set @s+='(VALUES(0),(1))t'+ltrim(@)+'(b)'if @>1set @s+=','set @-=1if @>0goto s exec(@s)
comfortablydrei
la source
C'est demander le pouvoir cartésien dans un ordre spécifique. Votre code en tient-il compte?
ToonAlfrink