Dammi l'elenco dei codici grigi con larghezza bit n


11

Il codice grigio è una sequenza di numeri binari di larghezza di bit in ncui i numeri successivi differiscono solo in un bit (vedere l'output di esempio).

Riferimento

Esempio di input:

3

Esempio di output:

000
001
011
010
110
111
101
100

Appunti:

  • Questa domanda sembra avere un duplex ma non lo è, poiché quella domanda non è un codice-golf e richiede un output diverso. Aiuterà a controllare le sue risposte, però.
  • Puoi assumere una variabile nche contenga l'input.

6
Considerando che l'altra domanda è una sfida del codice a codice più veloce senza un criterio vincente oggettivo (il più veloce misurato come?), Propongo di chiudere l'altro e riaprirlo.
Dennis,

2
Sono d'accordo con @dennis e quindi ho votato la seguente risposta impopolare sulla domanda originale. "Se la risposta che stai cercando è un risultato strettamente veloce, allora se dichiari un array (dei codici grigi) ..." Tuttavia la domanda originale aready ha una risposta di 7 caratteri e una di 4 caratteri, quindi non vedo molto margine di miglioramento. Pertanto al momento non sto esprimendo un voto di riapertura.
Level River St


La prima domanda sul codice Gray non è eccezionale, ma ha già risposte che sono fondamentalmente uguali alle risposte che questa domanda vuole e che probabilmente non miglioreranno. Penso che avrebbe avuto più senso lasciare questo chiuso e cambiare l'altro in un codice golf.
Peter Taylor,

Risposte:


2

JavaScript (77)

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

Versione più intuitiva per il browser (console.log e prompt ()):

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

Forse questo array ... join è eccessivofor(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'espressione i/2^iper il i"numero di codice grigio" deriva da questa risposta . Per aggiungere zeri iniziali a quel pad alla lunghezza n, aggiungo 2**nprima di convertirli in una stringa binaria, creando una stringa di lunghezza n+1. Quindi, troncare il 1prefisso iniziale e il tipo di numero 0bcon [3:].



2

APL (Dyalog Classic) , 11 byte

2≠/0,↑,⍳n2

Provalo online!

n⍴2è 2 2...2- un vettore di ndue

sono gli indici di una nmatrice tridimensionale con forma 2 2...2, ovvero una matrice 2 × 2 × ... × 2 di vettori nidificati. Poiché usiamo 0-indexing ( ⎕IO←0), questi sono tutti vettori binari di lunghezza n.

,appiattire la forma 2 × 2 × ... × 2, in modo da ottenere un vettore di 2 n binari nidificati

"mix": converte il vettore dei vettori in una matrice solida 2 n × n. Sembra così:

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, antepone gli zeri a sinistra della matrice

2≠/calcola il pairwise ( 2) xor ( ) lungo l'ultima dimensione ( /al contrario di ); in altre parole, ogni elemento viene xored con il suo vicino di destra e l'ultima colonna scompare

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

ti dispiacerebbe aggiungere una rapida spiegazione?
Giona,

1
@Jonah sicuro, ha aggiunto
ngn il

molto intelligente, grazie
Giona il


1

Python - 54

Basato su un algoritmo dal riferimento fornito nella sfida:

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 torna con un altro tentativo di golF! Spero non ti dispiaccia! Almeno queste domande sono divertenti e un'esperienza di apprendimento da avviare. Supponendo che n sia stato inserito, abbiamo:

$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

Poiché PowerShell con cui sto lavorando è solo 2.0, non posso usare alcun cmdlet di spostamento dei bit che potrebbe rendere il codice più breve. Quindi ho approfittato di un diverso metodo descritto nella fonte della domanda , capovolgendo l'array e aggiungendolo a se stesso, aggiungendo uno 0 all'inizio della metà superiore e un 1 alla metà inferiore.


1

F # (86) (84) (80)

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

Questo potrebbe probabilmente essere ulteriormente migliorato.

Inoltre, se eseguito in FSI, è necessario open System;;innanzitutto. Se desideri evitare di importarlo (e se non ti interessa l'ordine in cui i valori vengono stampati) puoi utilizzare questa versione di 82 caratteri:

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

1

Rubino - 42 39

Stesso algoritmo, lingua diversa:

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

Passare da #mapa #timescome @voidpigeon suggerisce di salvare 3 caratteri.


1
Invece di [*0...2**n].mapte puoi usare (2**n).times.
afuoso

1

J, 24 byte

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

Provalo online!

Implementazione semplice dell'algoritmo "XOR con la propria metà pavimentata". Si noti che 22 b.è XOR.


1

MATL , 10 byte

W:qt2/kZ~B

Provalo online!

Il buon vecchio metodo "XOR n con n >> 2".

W- calcola 2 ^ (input) (ottiene implicitamente l'input)
:q- crea un intervallo di numeri da 0 a 2 ^ n - 1
t - duplica quell'intervallo
2/k- MATL non ha bit-shift, quindi dividi (ogni numero) per 2 e floor
Z~ - elementally XOR quel risultato con l'array da 0 a 2 ^ n - 1 originale
B - converte ogni numero nel risultato in binario
(visualizza implicitamente l'output).


1

K (ngn / k) , 25 byte

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

Provalo online!


  • |:\xè "reverse scan x". applica inverso a x fino a quando l'output è uguale all'input e mostra ogni iterazione. ritorna (0 1; 1 0) al primo passaggio.
  • 0 1,''è "0 1 join ciascuno". unisce uno 0 a ciascun valore del 1o elem e 1 a ciascun valore del 2o elem, dando ((0 0; 0 1); (1 1; 1 0)) al primo passaggio
  • ,/ è "join over" e si appiattisce nell'elenco.
  • (x-1){...}/0 1è "applica {func} più di 0 1x-1 volte". prende l'output dell'ultima iterazione come input

0

APL (22)

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

Questo genera una matrice n-by-2 ^ n contenente i bit come righe:

      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

Spiegazione:

  • {... }⍣(n-1)⍪0 1: esegui i n-1tempi di funzione con l'input iniziale della matrice (0 1)T(che è il codice grigio a 1 bit)

    • (0,⍵): ogni riga di con a0 prefisso,
    • : sopra,
    • 1,⊖⍵: ogni riga di con un 1prefisso, in ordine inverso

0

Jq 1,5 , 105 100 byte

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

Presuppone che N fornisca input. per esempio

def N: 3 ;

allargato

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

Provalo online!



-1

T-SQL 134

Questa sfida chiede di restituire il potere cartesiano di {(0), (1)}. Questo frammento crea il codice che eseguirà il prodotto cartesiano di {(0), (1)} n volte.

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)

Chiede il potere cartesiano in un ordine specifico. Il tuo codice tiene conto di ciò?
ToonAlfrink,
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.