Reto
Dada una matriz binaria y una cadena binaria, determine si esa cadena binaria se puede encontrar comenzando en cualquier punto de la matriz y moviéndose en cualquier dirección en cualquier punto posterior para formar la cadena binaria. Es decir, ¿se puede encontrar la cadena doblada sin embargo dentro de la matriz?
La cadena solo se puede plegar a 90 grados o 180 grados (conexiones de borde; Manhattan Distancia 1) y no puede solaparse en ningún punto.
Ejemplo
Tomemos el siguiente ejemplo:
Matrix:
010101
111011
011010
011011
Snake: 0111111100101
Este es un caso de prueba de verdad. Podemos ver la serpiente doblada en la siguiente posición:
0-1 0 1 0 1
|
1 1 1-0 1 1
| | | |
0 1 1 0-1-0
| |
0 1-1 0 1 1
Reglas
- Se aplican lagunas estándar
- Puede tomar la longitud de la cadena y el ancho y alto de la matriz como entrada si lo desea
- Puede tomar la matriz binaria y la cadena binaria como una cadena multilínea / matriz de cadenas / cadena unida a nueva línea / cualquier otra cadena unida y una cadena
- Puede tomar las dimensiones como una matriz plana en lugar de varios argumentos
- Su programa debe finalizar para cualquier matriz de 5 x 5 con cualquier cadena de hasta 10 en menos de un minuto
Limitaciones
- La matriz no es necesariamente cuadrada
- La cadena no estará vacía.
- La cadena puede ser de longitud 1
- La cadena no contendrá más cuadrados de los disponibles (es decir,
len(string) <= width(matrix) * height(matrix)
Casos de prueba
Verdad
01010
10101
01010
10101
01010
0101010101010101010101010
01110
01100
10010
10110
01101
011111000110100
0
0
10
01
1010
100
010
001
100010001
Falsa
00000
00000
00000
00000
00000
1
10101
01010
10101
01010
10101
11
100
010
001
111
10001
01010
00100
01010
10001
1000100010001000101010100
code-golf
decision-problem
binary-matrix
Hiperneutrino
fuente
fuente
Respuestas:
Python 2 ,
275271264249 bytes-1
conH
y la eliminación de una operación de rebanado ([:]
).[:]
), usando la asignación de múltiples objetivos para dar un valor a una entrada visitadav not in "01"
(S=S[1:];M[y][x]=H;
->S=M[y][x]=S[1:];
) y cambiando de un ternario if / else a un simple lógico o (any(...)if S else 1
->not S or any(...)
).ZeroDivisionError
) cuando se encuentra la serpiente y devuelve una lista vacía ([]
) cuando no se encuentra ninguna serpiente, que son dos comportamientos distintos.not S or
aS<[1]or
~S==[]or
.Pruébalo en línea!
Explicación
Función Lambda que toma la matriz como una lista bidimensional de cadenas (ya sea
"0"
o"1"
), la serpiente como una lista unidimensional y las dimensiones de la matriz como dos enteros.La función lambda busca en la matriz entradas que coincidan con el primer elemento de la serpiente. Por cada coincidencia encontrada, se llama
H
con una copia profunda de la matriz, sin copia de la serpiente, las dimensiones de la matriz y la posición de la coincidencia.Cuando
H
se llama, eliminaS
la primera entrada y establece la entrada de matriz de la posición dada en algo más que"0", "1"
. SiS
'length es cero, vuelveTrue
; Como se llama recursivamente, la serpiente fue encontrada en algún lugar de la matriz.Si
S
'la longitud no es cero, recorre las cuatro direcciones cardinales, comprueba si esa posición está en la matriz, compara el elemento de la matriz' en esa posición con el primer elementoS
y, si coincide, se llama recursivamente.H
Los valores de retorno se canalizan hacia arriba en los marcos de la pila, siempre verificando si al menos una función encontró una posible serpiente.Salida formateada
He aumentado mi programa para que también muestre la ruta que desliza la serpiente (si hay una). Utiliza el mismo diseño de salida ASCII que la pregunta. Enlace TIO .
fuente
m[:]for
~>m*1for
? Podría funcionar.JavaScript (ES6),
138134No es tan diferente de @ Neil's, pero ¿qué más podría ser?
Entrada: matriz como una cadena de varias líneas, cadena binaria, ancho (sin contar la nueva línea)
NB: la lógica en la función recursiva
r
está algo invertida para guardar un par de bytesMenos golf
Prueba
fuente
JavaScript (ES6), 149 bytes
Toma la matriz como una cadena delimitada por una nueva línea, la serpiente como una cadena y el ancho (como un entero). Basada en la respuesta de @ JonathanFrech.
fuente
Mathematica,
180156141153138136104 bytesEntrada de ejemplo
Explicación
GridGraph@{##4}
es unGraph
objeto para una cuadrícula de vértices con vértices adyacentes conectados por bordes, con dimensiones{##4}
, es decir,{#4,#5}
o{width,height}
.x
(numeradas1
a1##4 = width*height
), todos los vértices que terminay
, y todos los caminosp
de longitud a lo sumo#3
dex
ay
.""<>Part[Join@@#,p]
extrae los caracteres correspondientes de la matriz y los coloca en una cadena.s
, buscando en todos los niveles porque esta es una lista muy multidimensional que hemos construido.Nota: Reemplazar
#3
por{#3-1}
inFindPath
, de modo que solo encontremos rutas de exactamente la longitud correcta, es una gran mejora en términos de velocidad, pero cuesta 4 bytes más.-24 bytes: tomar dimensiones de cosas como entrada
-15 bytes: utilizando
StringPart
yStringJoin
correctamente+12 bytes: arreglando el caso de longitud 1
-15 bytes: ...
-2 bytes: tomar el tamaño de la matriz como entrada como una matriz
-32 bytes: el uso
Table
para iterar sobre la ruta nos permite evitar el usoFunction
, y el usoMemberQ[...,s,All]
nos permite pegar la matriz en la mesa cuando se trata de serpientes de longitud 1.fuente
C # (.NET Core) ,
346341336302297 bytesPruébalo en línea!
5 bytes ahorrados jugando al golf el
p
incremento5 bytes guardados tomando la longitud de la serpiente y comenzando en su cola, y eliminando un espacio innecesario
34 bytes guardados leyendo el desafío correctamente y viendo que puedo ver la altura y el ancho de la matriz
5 bytes guardados, el caso de prueba de un solo elemento falló y la solución fue beneficiosa
Sin golf
fuente
if(...)return true;
->return ...;
.b[y,x]
debe restablecerse en algún momento. (También lamento haber escrito mal su nombre en mi respuesta.)if(N(x,y,0)>0)return 0<1;
; La primera aparición dereturn
.Kotlin , 413 bytes
Embellecido
Prueba
fuente