Geben Sie mir die Gray-Code-Liste der Bitbreite n


11

Der Gray-Code ist eine Folge von Binärzahlen mit Bitbreite, bei ndenen sich aufeinanderfolgende Zahlen nur in einem Bit unterscheiden (siehe Beispielausgabe).

Referenz

Beispieleingabe:

3

Beispielausgabe:

000
001
011
010
110
111
101
100

Anmerkungen:

  • Diese Frage scheint betrogen zu sein , ist es aber nicht, denn diese Frage ist kein Code-Golf und erfordert eine andere Ausgabe. Es wird jedoch hilfreich sein, die Antworten zu überprüfen.
  • Sie können eine Variable annehmen, ndie die Eingabe enthält.

6
In Anbetracht der Tatsache, dass die andere Frage eine Code-Herausforderung mit dem schnellsten Code ohne objektives Gewinnkriterium ist (am schnellsten gemessen wie?), Schlage ich vor, die andere zu schließen und diese erneut zu öffnen.
Dennis

2
Ich stimme @dennis zu und habe daher die folgende unpopuläre Antwort auf die ursprüngliche Frage positiv bewertet. "Wenn die Antwort, nach der Sie suchen, nur ein schnelles Ergebnis ist, dann deklarieren Sie ein Array (der Gray-Codes) ..." Die ursprüngliche Frage hat jedoch bereits eine 7-stellige und eine 4-stellige Antwort, also nicht Ich sehe nicht viel Raum für Verbesserungen. Daher gebe ich derzeit keine Wiedereröffnungsabstimmung ab.
Level River St

3
Es ist schrecklich ähnlich wie Traverse alle Zahlen mit nur einem Bit Flip pro Schritt ...
Dennis

Die früheste Gray-Code-Frage ist nicht großartig, aber sie enthält bereits Antworten, die im Wesentlichen mit den Antworten übereinstimmen, die diese Frage wünscht, und die wahrscheinlich nicht verbessert werden. Ich denke, es wäre sinnvoller gewesen, diesen geschlossen zu lassen und den anderen in einen Code-Golf zu verwandeln.
Peter Taylor

Antworten:


2

JavaScript (77)

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

Browserfreundlichere Version (console.log und prompt ()):

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

Vielleicht ist dieses Array ... Join ist übertriebenfor(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:]

Der Ausdruck i/2^ifür die i'graue Codenummer stammt aus dieser Antwort . Um führende Nullen hinzuzufügen, die die Länge auffüllen, nfüge ich 2**nvor der Konvertierung in eine Binärzeichenfolge eine Länge hinzu n+1. Dann schneide ich das 1Präfix für den führenden und den Zahlentyp 0bmit ab [3:].



2

APL (Dyalog Classic) , 11 Bytes

2≠/0,↑,⍳n2

Probieren Sie es online aus!

n⍴2ist 2 2...2- ein Vektor von nzwei

ist der Index eines neindimensionalen Arrays mit Form 2 2...2, dh eines 2 × 2 × ... × 2-Arrays verschachtelter Vektoren. Da wir 0-indexing ( ⎕IO←0) verwenden, sind dies alles binäre Vektoren der Länge n.

,Reduzieren Sie die 2 × 2 × ... × 2-Form, sodass Sie einen Vektor von 2 n verschachtelten binären Vektoren erhalten

"mix" - konvertiert den Vektorvektor in eine feste 2 n × n-Matrix. Es sieht aus wie das:

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, stellt Nullen links von der Matrix voran

2≠/berechnet das paarweise ( 2) xor ( ) entlang der letzten Dimension ( /im Gegensatz zu ); Mit anderen Worten, jedes Element wird mit seinem rechten Nachbarn xoriert und die letzte Spalte verschwindet

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

Würde es Ihnen etwas ausmachen, eine kurze Erklärung hinzuzufügen?
Jonah

1
@ Jonah sicher, hinzugefügt
ngn

sehr klug, danke
Jonah


1

Python - 54

Basierend auf einem Algorithmus aus der in der Herausforderung angegebenen Referenz:

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

Ungolfed:

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

1

PowerShell (168)

Amateur PowerShell'r zurück mit einem weiteren Versuch von GolF! Hoffe es macht dir nichts aus! Zumindest machen diese Fragen Spaß und sind eine Lernerfahrung. Unter der Annahme, dass n eingegeben wurde, haben wir:

$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

Da die PowerShell, mit der ich arbeite, nur 2.0 ist, kann ich keine Bit-Shifting-Cmdlets verwenden, die zu kürzerem Code führen könnten. Also habe ich den Vorteil einer anderen Methode nahm beschrieben in der Frage Quelle , um das Array Spiegeln und Hinzufügen zu sich selbst, eine 0 an der Vorderseite der oberen Hälfte und eine 1 in die untere Hälfte anhängt.


1

F # (86) (84) (80)

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

Dies könnte wahrscheinlich weiter verbessert werden.

Wenn Sie in FSI ausgeführt werden, müssen Sie dies zuerst tun open System;;. Wenn Sie den Import vermeiden möchten (und sich nicht für die Reihenfolge interessieren, in der die Werte gedruckt werden), können Sie diese 82-stellige Version verwenden:

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

1

Rubin - 42 39

Gleicher Algorithmus, andere Sprache:

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

Wenn Sie von #mapzu #times@voidpigeon wechseln, werden 3 Zeichen gespeichert.


1
Anstelle von können [*0...2**n].mapSie verwenden (2**n).times.
Afuous


1

MATL , 10 Bytes

W:qt2/kZ~B

Probieren Sie es online aus!

Die gute alte "XOR n mit n >> 2" Methode.

W- 2 ^ berechnen (Eingabe) (wird implizit eingegeben)
:q- Zahlenbereich von 0 bis 2 erstellen ^ n - 1
t - diesen Bereich duplizieren
2/k- MATL hat keine Bitverschiebung, also dividieren Sie (jede Zahl) durch 2 und
Z~ bodenweise XOR Dieses Ergebnis mit dem ursprünglichen Array 0 bis 2 ^ n - 1
B - Konvertieren Sie jede Zahl im Ergebnis in eine Binärzahl
(implizite Ausgabe anzeigen.)


1

K (ngn / k) , 25 Bytes

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

Probieren Sie es online aus!


  • |:\xist "Reverse Scan x". Wendet umgekehrt auf x an, bis die Ausgabe der Eingabe entspricht, und zeigt jede Iteration an. gibt beim ersten Durchgang (0 1; 1 0) zurück.
  • 0 1,''ist "0 1 jeweils verbinden". verbindet eine 0 mit jedem Wert des 1. Elems und eine 1 mit jedem Wert des 2. Elems, was ((0 0; 0 1); (1 1; 1 0)) beim ersten Durchgang ergibt
  • ,/ ist "Join Over" und wird zur Liste abgeflacht.
  • (x-1){...}/0 1ist "wende {func} über 0 1x-1 mal an". Nimmt die Ausgabe der letzten Iteration als Eingabe

0

APL (22)

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

Dies gibt eine n-mal-2 ^ n-Matrix aus, die die Bits als ihre Zeilen enthält:

      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

Erläuterung:

  • {... }⍣(n-1)⍪0 1: Führen Sie die Funktionszeiten n-1mit der ersten Eingabe der Matrix aus (0 1)T(dies ist der 1-Bit-Graucode).

    • (0,⍵): jede Zeile mit einem 0Präfix,
    • : auf,
    • 1,⊖⍵: Jede Zeile mit einem 1Präfix in umgekehrter Reihenfolge

0

Jq 1,5 , 105 100 Bytes

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

Angenommen, N liefert Eingaben. z.B

def N: 3 ;

Erweitert

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

Probieren Sie es online aus!



-1

T-SQL 134

Diese Herausforderung besteht darin, die kartesische Kraft von {(0), (1)} zurückzugeben. Dieses Snippet erstellt den Code, der das kartesische Produkt von {(0), (1)} n Mal ausführen würde.

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)

Es fragt nach der kartesischen Macht in einer bestimmten Reihenfolge. Berücksichtigt Ihr Code das?
ToonAlfrink
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.