Daj mi listę Gray Code o szerokości bitu n

11

Gray Code to ciąg liczb binarnych o szerokości bitowej, w nktórym kolejne liczby różnią się tylko jednym bitem (patrz przykładowe dane wyjściowe).

Odniesienie

Przykładowe dane wejściowe:

3

Przykładowe dane wyjściowe:

000
001
011
010
110
111
101
100

Uwagi:

  • To pytanie wydaje się mieć duplikatem ale to nie jest, na to pytanie nie jest code-golf, i wymaga innego wyjścia. Pomoże to jednak sprawdzić odpowiedzi.
  • Możesz założyć zmienną, nktóra zawiera dane wejściowe.
ToonAlfrink
źródło
6
Biorąc pod uwagę, że drugie pytanie jest wyzwaniem dla kodu o najszybszym kodzie bez obiektywnego kryterium wygranej (jak najszybciej zmierzyć, jak?), Proponuję zamknięcie drugiego i ponowne otwarcie tego.
Dennis
2
Zgadzam się z @dennis i dlatego głosowałem następującą niepopularną odpowiedź na pierwotne pytanie. „Jeśli odpowiedź, której szukasz, jest szybkim rezultatem, to jeśli zadeklarujesz tablicę (szarych kodów) ...” Jednak pierwotne pytanie to 7-znakowa i 4-znakowa odpowiedź, więc nie widzę dużo miejsca na ulepszenia. Dlatego obecnie nie oddaję ponownie głosu.
Level River St
3
Jest jednak okropnie podobny do przemierzania wszystkich liczb z jednym bitem przewracania na krok ...
Dennis
Najwcześniejsze pytanie z szarego kodu nie jest świetne, ale już zawiera odpowiedzi, które są zasadniczo takie same jak odpowiedzi, których chce to pytanie i które prawdopodobnie nie zostaną poprawione. Myślę, że sensowniej byłoby zostawić ten zamknięty i zmienić drugi w golfa kodowego.
Peter Taylor

Odpowiedzi:

2

JavaScript (77)

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

Bardziej przyjazna dla przeglądarki wersja (console.log i prompt ()):

n=prompt();for(i=0;i<1<<n;)console.log((Array(n*n).join(0)+(i>>1^i++).toString(2)).substr(-n))
Дамян Станчев
źródło
Może ta tablica ... złączenie jest przesadzonefor(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:]

Wyrażenie i/2^idla i„th szarym numer kodu jest z tej odpowiedzi . Aby dodać zera wiodące, które padają na długość n, dodaję 2**nprzed konwersją na ciąg binarny, tworząc ciąg długości n+1. Następnie obcinam 1prefiks wiodący i typ numeru za 0bpomocą [3:].

xnor
źródło
2

APL (Dyalog Classic) , 11 bajtów

2≠/0,↑,⍳n2

Wypróbuj online!

n⍴2jest 2 2...2- wektor ndwójki

to indeksy n-wymiarowej tablicy o kształcie 2 2...2- to znaczy tablicy 2 × 2 × ... × 2 zagnieżdżonych wektorów. Ponieważ używamy 0-indexing ( ⎕IO←0), wszystkie są wektorami binarnymi o długości n.

,spłaszcz kształt 2 × 2 × ... × 2, więc otrzymujemy wektor 2 n zagnieżdżonych wektorów binarnych

„mix” - konwersja wektora wektorów na stałą macierz 2 n × n. To wygląda tak:

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, wstawia zera po lewej stronie matrycy

2≠/oblicza parą ( 2) xor ( ) wzdłuż ostatniego wymiaru ( /w przeciwieństwie do ); innymi słowy, każdy element zostaje przekreślony z prawym sąsiadem, a ostatnia kolumna znika

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
źródło
czy mógłbyś dodać krótkie wyjaśnienie?
Jonah
1
@Jonah pewnie, dodano
ngn
bardzo sprytny, dzięki
Jonah
2

Japt , 14 12 bajtów

2pU Ç^z)¤ùTU

Ogolono dwa bajty dzięki produktom ETH .

Wypróbuj online!

Gnida
źródło
Doskonały przykład ùzastosowania. Ponieważ N.z(n)jest to dzielenie liczb całkowitych z domyślnym arg = 2, możesz zapisać dwa bajty za pomocą 2pU Ç^z)¤ùTU: Wypróbuj online!
ETHprodukcje
@ETHproductions Dzięki, wciąż brakuje mi domyślnych argumentów od czasu do czasu. Bardzo przydatny, wielkie dzięki.
Nit
1

Python - 54

Na podstawie algorytmu z referencji podanej w wyzwaniu:

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

Nie golfowany:

# 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
źródło
1

PowerShell (168)

Amator PowerShell'r powrócił z kolejną próbą zdobycia golF! Mam nadzieję, że nie masz nic przeciwko! Przynajmniej te pytania są zabawne i umożliwiają naukę. Zakładając, że wprowadzono n, mamy:

$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

Ponieważ PowerShell, z którym pracuję, ma tylko 2.0, nie mogę używać żadnych nieco zmieniających się poleceń cmdlet, które mogłyby skrócić kod. Więc skorzystałem z innej metody opisanej w źródle pytania , odwracając tablicę i dodając ją do siebie, dodając 0 z przodu górnej połowy i 1 do dolnej połowy.

fuandon
źródło
1

F # (86) (84) (80)

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

Prawdopodobnie można to jeszcze poprawić.

Pamiętaj też, że jeśli działasz w FSI, musisz open System;;najpierw. Jeśli chcesz tego uniknąć (i nie zależy Ci na kolejności drukowania wartości), możesz użyć tej 82-znakowej wersji:

for i in 0..(1<<<n)-1 do(for j in 0..n-1 do printf"%i"((i^^^i/2>>>j)%2));printfn""
pswg
źródło
1

Rubin - 42 39

Ten sam algorytm, inny język:

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

Przełączenie z #mapna #times@ sugeruje unikanie gołębi, aby zapisać 3 znaki.

OI
źródło
1
Zamiast [*0...2**n].mapciebie możesz użyć (2**n).times.
obrzydliwy
1

J, 24 bajty

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

Wypróbuj online!

Prosta implementacja algorytmu „XOR z własnym zmiennoprzecinkową połówką”. Zauważ, że 22 b.to XOR.

Jonasz
źródło
1

MATL , 10 bajtów

W:qt2/kZ~B

Wypróbuj online!

Dobra stara metoda „XOR nz n >> 2”.

W- oblicz 2 ^ (dane wejściowe) (pobiera dane niejawnie)
:q- utwórz zakres liczb od 0 do 2 ^ n - 1 - zduplikuj ten
t zakres
2/k- MATL nie ma przesunięcia bitowego, więc podziel (każdą liczbę) przez 2 i podłogę
Z~ - elementarnie XOR które wynikają z oryginalną tablicą 0 do 2 ^ n - 1
B - konwertuj każdą liczbę w wyniku do postaci binarnej
(domyślnie wyświetlaj dane wyjściowe).

sundar - Przywróć Monikę
źródło
1

K (ngn / k) , 25 bajtów

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

Wypróbuj online!


  • |:\xto „skanowanie wsteczne x”. stosuje odwrotność do x, dopóki wyjście nie zrówna się z wejściem i pokazuje każdą iterację. zwraca (0 1; 1 0) przy pierwszym przejściu.
  • 0 1,''to „0 1 dołącz do każdego”. łączy 0 z każdą wartością pierwszego elementu i 1 z każdą wartością drugiego elementu, dając ((0 0; 0 1); (1 1; 1 0)) przy pierwszym przejściu
  • ,/ jest „dołącz do” i spłaszcza się do listy.
  • (x-1){...}/0 1to „zastosuj {func} ponad 0 1x-1 razy”. przyjmuje dane wejściowe ostatniej iteracji jako dane wejściowe
bazgranina
źródło
0

APL (22)

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

Daje to macierz n-na-2 ^ n zawierającą bity jako wiersze:

      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

Wyjaśnienie:

  • {... }⍣(n-1)⍪0 1: uruchom n-1czasy funkcji z początkowym wejściem macierzy (0 1)T(który jest 1-bitowym szarym kodem)

    • (0,⍵): każdy wiersz z 0prefiksem,
    • : na górze,
    • 1,⊖⍵: każdy wiersz z 1prefiksem, w odwrotnej kolejności
marinus
źródło
0

Jq 1,5 , 105 100 bajtów

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

Zakłada, że ​​N zapewnia dane wejściowe. na przykład

def N: 3 ;

Rozszerzony

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

Wypróbuj online!

jq170727
źródło
-1

T-SQL 134

To wyzwanie wymaga zwrotu siły kartezjańskiej z {(0), (1)}. Ten fragment kodu buduje kod, który wykonałby iloczyn kartezjański {{0), (1)} n razy.

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)
comfortlydrei
źródło
Prosi o moc kartezjańską w określonej kolejności. Czy twój kod to uwzględnia?
ToonAlfrink