El rompecabezas
- Imprima 0 si no se puede resolver un laberinto n * m
- Imprima 1 si se puede resolver un laberinto n * m (de 1 o más formas)
(¡así que no estoy pidiendo caminos, pero si es posible resolverlos!)
Matriz de entrada (2d):
[[0,0,0,0,0,0,1],[0,0,0,0,0,1,0],[0,0,0,0,1,0,0],[1,0,0,0,0,0,0]]
XXXXXXXXX
XS XX
X X X
X X X
XX FX
XXXXXXXXX
0 = can pass through
1 = can not pass trough
[0][n] is the last block of the first line
[m][0] is the first block of the last line
Regla La posición inicial es 0,0 y la posición final es n, m Solo puede moverse horizontal y verticalmente El código más corto gana
Respuestas:
CJam,
4241393635 bytesBasado en las ideas de esta respuesta .
4 bytes gracias a Optimizer.
Formato de entrada:
fuente
q2Wts~_s,{{[{_2$+0<{e<_}*}*]}%z}*sW=
- 36. Aunque se supone que los primeros tres caracteres de la entrada serán[[0
Dyalog APL, 27 caracteres
⊃⌽∨.∧⍨⍣≡1≥+/¨|∘.-⍨,(~×⍳∘⍴)⎕
⎕
entrada evaluada APL distingue entre una matriz y un vector de vectores. Este programa supone que la entrada es una matriz.(~×⍳∘⍴)A
es un tenedor equivalente a(~A) × ⍳⍴A
. Es necesario evitar mencionar⎕
dos veces o introducir una variable.⍴A
es la forma deA
. Para una matriz de 4 por 7 la forma es4 7
.⍳
Es el generador de índice.⍳4
es1 2 3 4
.⍳4 7
son los vectores(1 1)(1 2)...(4 7)
dispuestos en una matriz de 4 por 7.~A
voltea los pedazos deA
.×
Al multiplicar⍳⍴A
por los bits invertidos, conservamos las coordenadas de todas las celdas libres y convertimos todas las paredes0 0
.,
deshilacha la matriz de pares de coordenadas, es decir, la linealiza en un vector. En este caso, el vector consistirá en pares.∘.-⍨A
oA∘.-A
resta elementos deA
pairwise. Tenga en cuenta que aquí los elementos deA
sí mismos son pares.|
valor absoluto+/¨
suma cada par de valores absolutos. Esto nos da las distancias de la cuadrícula entre cada par de celdas en el laberinto, excepto para las paredes.1≥
solo estamos interesados en vecinos a una distancia no mayor a 1, esto también excluye paredes. Ahora tenemos una matriz de adyacencia de un gráfico.∨.∧⍨⍣≡
Floyd: algoritmo de cierre transitivo de Warshall(f⍣n)A
(no se usa aquí) donden
es un número entero es el operador de potencia. Se aplicaf
aA
n
los tiempos:f f ... f A
.(f⍣g)A
dondeg
es una función, es el operador de punto fijo, también conocido como "límite de potencia". Se mantiene en el cálculo de la serieA
,f A
,f f A
, ... hasta((f⍣i)A) g ((f⍣(i+1))A)
Devuelve verdadero para algunosi
. En este caso usamos match (≡
) comog
.∨.∧⍨A
oA∨.∧A
es un paso en el algoritmo de Floyd.f.g
es una generalización de la multiplicación de matrices (+.×
), aquí usamos conjunción (∧
) y disyunción (∨
) en lugar de+
y×
.⊃⌽
Después de⍣≡
haber aplicado el paso suficientes veces y alcanzado un estado estable, debemos mirar hacia arriba en la esquina superior derecha de la matriz para obtener el resultado, así que lo volteamos (⌽
) y tomamos el primer elemento, arriba a la izquierda (⊃
).Visualización de
⍣≡
los pasos defuente
Python, 164 bytes
Era reacio a publicar esto porque es prácticamente la forma en que normalmente haría el relleno de inundación, simplemente jugando al golf. Pero aquí está de todos modos.
fuente
Perl, 73 bytes
69 bytes de código + 4 bytes para
-n0E
(no estoy seguro de cómo se contaron las etiquetas en 2014, así que las conté por 4 en lugar de 2, pero no importa mucho).Pruébalo en línea! (y si reemplaza la
1111011
línea con1111111
, el laberinto ya no se puede resolver, y la salida será en0
lugar de1
: ¡ Pruébelo en línea! )Explicaciones:
Este código encontrará todas las celdas accesibles del laberinto (y las marcará con un
A
): si una celda toca una celda marcada con unA
, es accesible y nosotros también la marcamos con unA
; y lo hacemos de nuevo (redo
). Eso se hace gracias a dos expresiones regulares:s/(^0|A)(.{@{+}})?0/A$2A/s
comprueba si hay un espacio a la derecha o en la parte inferior de aA
, mientras ques/0(.{@{+}})?A/A$1A/s
comprueba si hay un espacio a la izquierda o en la parte superior de aA
. Al final, si la última celda contiene unA
es accesible, de lo contrario no lo es (eso es lo quesay/A$/+0
verifica;+0
está aquí para asegurarse de que el resultado sea0
o en1
lugar de una cadena vacía y1
).Tenga en cuenta que
/.*/
coincidirá con una línea completa, configurando así@+
al índice del final de la primera línea, que resulta ser el tamaño de una línea, lo que permite usar para.{@{+}}
que coincidan exactamente tantos caracteres como haya en una línea. (@{+}
es equivalente a@+
, pero solo el primero se puede usar en expresiones regulares)fuente
1
.Ruby,
133130129 caracteresEntrada en STDIN, salidas
1
o0
en STDOUT.Molestamente largo. Simplemente realiza un relleno de
1
s desde(0, 0)
, y luego verifica si el cuadrado "final" es a1
.fuente
Java, 418 bytes
Mi primer código de golf. No sé por qué elegí Java, es tan malo para jugar al golf xD
El laberinto de ejemplo se ingresaría a través de stdin de esta manera:
fuente
String[]
ya
, y tome la entrada de los argumentos de la línea de comandos en lugar de StdIn, lo cual está permitido.Python 184
188Esto se hizo mucho más largo de lo que pensé que sería :( De todos modos, agregaré una explicación una vez que ya no pueda jugar más golf.
fuente
J, 75 caracteres
Alimentación de la matriz de adyacencia (muy poco tiempo y memoria ineficientes). (¿Se llama potencia en inglés?)
Algunos casos de prueba:
fuente
Python 3 , 147 bytes
Pruébalo en línea!
Puerto de mi respuesta para encontrar la ruta más corta en una carretera ASCII .
fuente
Python 3 , 184 bytes
Pruébalo en línea!
fuente