Desafío
Te dan dos cadenas de bits distintas de la misma longitud. (Por ejemplo, 000
y 111
.) Su objetivo es encontrar un camino de uno a otro de manera que:
- En cada paso, se cambia sólo un poco (se puede pasar de
000
cualquiera de001
,010
,100
). - No puede visitar la misma cadena de bits dos veces.
- El camino es lo más largo posible, bajo estas restricciones.
Por ejemplo, yendo de 000
a 111
, podemos tomar el camino
000, 001, 011, 010, 110, 100, 101, 111
que visita las cadenas de 8 bits de longitud 3, por lo que tiene que ser lo más largo posible.
Reglas
- Se aplican lagunas estándar.
- Puede tomar la entrada como dos cadenas de ceros y unos, o como dos matrices de ceros y unos, o como dos matrices de valores booleanos.
- Es posible que no se toma la entrada como dos números enteros con la representación binaria derecha (la escritura
000
y111
como0
y7
no es válido). - Si lo desea, puede tomar la longitud de las cadenas de bits como entrada.
- Su programa puede generar la ruta imprimiendo las cadenas de bits visitadas de una en una o devolviendo una matriz de las cadenas de bits visitadas (cada una en el mismo formato que la entrada).
- Su salida debe incluir el inicio y el final de la ruta (que son sus entradas).
- Este es el código de golf , gana el código más corto en bytes.
Ejemplos
0 1 -> 0, 1
10 01 -> 10, 00, 01 or 10, 11, 01
000 111 -> any of the following:
000, 100, 110, 010, 011, 001, 101, 111
000, 100, 101, 001, 011, 010, 110, 111
000, 010, 110, 100, 101, 001, 011, 111
000, 010, 011, 001, 101, 100, 110, 111
000, 001, 101, 100, 110, 010, 011, 111
000, 001, 011, 010, 110, 100, 101, 111
1001 1100 -> 1001, 0001, 0000, 0010, 0011, 0111, 0101, 0100, 0110, 1110, 1010, 1011, 1111, 1101, 1100 (other paths exist)
code-golf
binary
graph-theory
Misha Lavrov
fuente
fuente
Respuestas:
Casco ,
27 2624 bytesFuerza bruta, muy lenta. Pruébalo en línea!
Explicación
Husk lee naturalmente de derecha a izquierda.
fuente
Mathematica, 108 bytes
Entrada:
Salida:
fuente
Mathematica, 175 bytes
Buena primera pregunta!
Entrada
fuente
Haskell ,
212207 bytesProbablemente sea demasiado tiempo, pero finalmente funciona ahora. (¡Gracias a @Lynn por el truco cartesiano del producto !) ¡Thansk @nimi por -5 bytes!
Pruébalo en línea!
Explicación:
fuente
x<-mapM id$[1>0,1<0]<$b
[True,False]
? Si[False,True]
también funciona, puedes usarlo[0>1..]
.Bool
decirEnum
, y se me olvidó que<$
está disponible (primer tratado*>
que no está en Preludio)!Mathematica
116114bytesCon varios bytes guardados gracias a Misha Lavrov.
Entrada (8 dimensiones)
Salida (longitud = 254, después de 1.82 segundos)
Tuples[{0,1},{l=Length@#}],{2}]
& genera los números 0 ... 8 como listas binarias.El exterior
Tuples...{2}
produce todos los pares ordenados de esos números binarios.Plus@@x
suma cada uno de los pares, generando trillizos de 0, 1.Cases....Count[Plus@@x, 1]==1
devuelve todas las sumas que contienen un solo 1. Estas surgen cuando los dos números binarios originales están conectados por un borde.Rules
conecta los vértices del gráfico, cada vértice es un número binario.Graph
crea un gráfico correspondiente a dichos vértices y aristas.FindPath
encuentra hasta 2 ^ n caminos que conectan el vértice a con el vértice b, los números dados.Last
toma el más largo de estos caminos.Para tres dimensiones, el gráfico se puede representar en un plano como se muestra aquí:
Para la entrada,
{0,0,0}, {1,1,1}
se emite lo siguiente:{{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {1, 0, 1}, {1, 1, 1}}}
Esta ruta se puede encontrar en el gráfico anterior.
También se puede concebir como la siguiente ruta en 3 espacios, donde cada vértice corresponde a un punto
{x,y,z}
. {0,0,0} representa el origen y {1,1,1} representa el punto "opuesto" en un cubo unitario.Entonces, la ruta de la solución corresponde a un recorrido de bordes a lo largo del cubo de la unidad. En este caso, el camino es hamiltoniano: visita cada vértice una vez (es decir, sin cruces ni vértices omitidos).
fuente
2^(l+2)
en su código?Haskell ,
141123 bytesUtiliza listas de enteros. Pruébalo en línea!
Explicación
La función principal es
!
, y las funciones auxiliares son#
yc
. Dada una lista de bits,c
da todas las formas posibles de voltear uno de ellos, por ejemplo[0,1,1] -> [[1,1,1],[0,0,1],[0,1,0]]
.La función
#
toma una lista de listas (la "memoria") y una lista (la "cadena de bits inicial"). Construye todas las rutas de hipercubos que comienzan con el elemento inicial, contienen solo cadenas de bits distintas y no pisan las cadenas en la memoria.La función principal lo
!
une todo. Un truco que uso aquí esp*>x
(x
repetidaslength p
veces) en lugar delength p
. Dado que las repeticiones más largasx
vienen más tarde en el orden natural de las listas,maximum
elige el camino más largo en cualquier caso, ya que las primeras coordenadas de pares se comparan antes que las segundas.fuente
Jalea ,
2527 bytes+2 bytes para corregir un error con mi golf :( espero que encuentre una forma más corta sin embargo.
Un programa completo que toma las cadenas de bits usando
1
y2
* como listas. Los argumentos sonfrom
yto
. El programa imprime una lista de listas de la misma.*
0
y1
puede usarse en lugar de un byte (agregar’
entreL2ṗ
yŒ!ç€...
para disminuir).Pruébalo en línea!
¿Cómo?
actualizando ...
fuente
[1,1]
y una[2,2]
salida de[[1, 1], [2, 1], [1, 2], [2, 2]]
cuando lo pruebo en línea, que no es una ruta válida.