Dame la lista de código gris de ancho de bits n


11

El código gris es una secuencia de números binarios de ancho de bits ndonde los números sucesivos difieren solo en un bit (ver ejemplo de salida).

Referencia

Entrada de ejemplo:

3

Salida de ejemplo:

000
001
011
010
110
111
101
100

Notas:

  • Esta pregunta parece tener un engaño, pero no lo es, porque esa pregunta no es un código de golf, y exige resultados diferentes. Sin embargo, será útil verificar sus respuestas.
  • Puede suponer una variable nque contiene la entrada.

66
Teniendo en cuenta que la otra pregunta es un desafío de código de código más rápido sin un criterio ganador objetivo (¿cómo se mide más rápido?), Propongo cerrar la otra y volver a abrir esta.
Dennis

2
Estoy de acuerdo con @dennis y, por lo tanto, he votado a favor de la siguiente respuesta impopular sobre la pregunta original. "Si la respuesta que está buscando es estrictamente un resultado rápido, entonces si declara una matriz (de los códigos grises) ..." Sin embargo, la pregunta original ya tiene una respuesta de 7 caracteres y 4 caracteres, así que no No veo mucho margen de mejora. Por lo tanto, no estoy emitiendo un voto de reapertura en este momento.
Level River St


La primera pregunta del código Gray no es excelente, pero ya tiene respuestas que son básicamente las mismas que las respuestas que esta pregunta quiere y que probablemente no se mejorarán. Creo que habría tenido más sentido dejar este cerrado y cambiar el otro a un código de golf.
Peter Taylor

Respuestas:


2

JavaScript (77)

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

Versión más amigable para el navegador (console.log y prompt ()):

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

Tal vez esta matriz ... unirse es exageradofor(i=0;i<(l=1<<n);i++)console.log((i^(i>>1)|l).toString(2).slice(1));
edc65

2

Pitón 2 (47)

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

La expresión i/2^ipara el i'número de código gris es de esta respuesta . Para agregar ceros iniciales que rellenan la longitud n, agrego 2**nantes de convertir a una cadena binaria, creando una cadena de longitud n+1. Luego, trunco ​​el 1prefijo de tipo inicial y numérico 0bcon [3:].



2

APL (Dyalog Classic) , 11 bytes

2≠/0,↑,⍳n2

Pruébalo en línea!

n⍴2es 2 2...2- un vector de ndos

son los índices de una nmatriz tridimensional con forma 2 2...2, es decir, una matriz 2 × 2 × ... × 2 de vectores anidados. Como usamos 0-indexing ( ⎕IO←0), esos son todos vectores binarios de longitud n.

,aplanar la forma 2 × 2 × ... × 2, por lo que obtenemos un vector de 2 n vectores binarios anidados

"mezclar": convierte el vector de vectores en una matriz sólida de 2 n × n. Se parece a esto:

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 ceros a la izquierda de la matriz

2≠/calcula el pairwise ( 2) xor ( ) a lo largo de la última dimensión ( /en oposición a ); en otras palabras, cada elemento se corrige con su vecino correcto, y la última columna desaparece

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

¿te importaría agregar una explicación rápida?
Jonás

1
@Jonah seguro, agregado
ngn

muy inteligente, gracias
Jonás


1

Python - 54

Basado en un algoritmo de la referencia dada en el desafío:

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

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

1

PowerShell (168)

¡El PowerShell amateur regresa con otro intento de golF! Espero que no te importe! Por lo menos, estas preguntas son divertidas y una experiencia de aprendizaje para empezar. Asumiendo que n ha sido ingresado, tenemos:

$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

Debido a que el PowerShell con el que estoy trabajando es solo 2.0, no puedo usar ningún cmdlets de desplazamiento de bits que pueda hacer que el código sea más corto. Así que aproveché un método diferente descrito en la fuente de la pregunta , volteando la matriz y agregándola a sí misma, agregando un 0 al frente de la mitad superior y un 1 a la mitad inferior.


1

F # (86) (84) (80)

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

Esto probablemente podría mejorarse aún más.

También tenga en cuenta que si se ejecuta en FSI, open System;;primero deberá hacerlo . Si desea evitar importar eso (y si no le importa el orden en que se imprimen los valores), puede usar esta versión de 82 caracteres:

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

1

Rubí - 42 39

Mismo algoritmo, idioma diferente:

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

Cambiar de #mapa #timescomo @voidpigeon sugiere guardar 3 caracteres.


1
En lugar de [*0...2**n].mapque pueda usar (2**n).times.
afuous

1

J, 24 bytes

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

Pruébalo en línea!

Implementación directa del algoritmo "XOR con su propia mitad de piso". Tenga en cuenta que 22 b.es XOR.


1

MATL , 10 bytes

W:qt2/kZ~B

Pruébalo en línea!

El viejo método "XOR n con n >> 2".

W- calcular 2 ^ (entrada) (obtiene entrada implícitamente)
:q- crear rango de números de 0 a 2 ^ n - 1
t - duplicar ese rango
2/k- MATL no tiene desplazamiento de bits, así que divide (cada número) entre 2 y piso
Z~ - elementOR XOR ese resultado con la matriz original de 0 a 2 ^ n - 1
B : convierta cada número del resultado a binario
(salida de visualización implícita)


1

K (ngn / k) , 25 bytes

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

Pruébalo en línea!


  • |:\xes "exploración inversa x". aplica inversa a x hasta que la salida es igual a la entrada y muestra cada iteración. retorna (0 1; 1 0) en el primer pase.
  • 0 1,''es "0 1 unir cada uno". une un 0 a cada valor de 1st elem, y 1 a cada valor de 2nd elem, dando ((0 0; 0 1); (1 1; 1 0)) en el primer pase
  • ,/ es "unirse" y se aplana a la lista.
  • (x-1){...}/0 1es "aplicar {func} más de 0 1x-1 veces". toma la salida de la última iteración como entrada

0

APL (22)

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

Esto genera una matriz n-por-2 ^ n que contiene los bits como sus filas:

      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

Explicación:

  • {... }⍣(n-1)⍪0 1: ejecuta los n-1tiempos de la función con la entrada inicial de la matriz (0 1)T(que es el código gris de 1 bit)

    • (0,⍵): cada fila de con un 0prefijo,
    • : encima de,
    • 1,⊖⍵: cada fila de con un 1prefijo, en orden inverso

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

Asume que N proporciona información. p.ej

def N: 3 ;

Expandido

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

Pruébalo en línea!



-1

T-SQL 134

Este desafío está pidiendo devolver el poder cartesiano de {(0), (1)}. Este fragmento construye el código que ejecutaría el producto cartesiano de {(0), (1)} n veces.

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)

Pide el poder cartesiano en un orden específico. ¿Su código tiene en cuenta eso?
ToonAlfrink
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.