Los laberintos de hielo han sido uno de mis productos favoritos de los juegos Pokémon desde su debut en Pokémon Oro y Plata. Su tarea será hacer un programa que resuelva este tipo de problemas.
Los laberintos de hielo consisten principalmente, como su nombre lo indica, en hielo. Una vez que el jugador se mueve en una dirección sobre hielo, continuará moviéndose en esa dirección hasta que choque con algún obstáculo. También hay tierra que se puede mover libremente y evitará que cualquier jugador se mueva sobre ella. El último obstáculo es la piedra. La piedra no puede ocupar el mismo espacio que el jugador y si el jugador intenta moverse hacia ella, dejará de moverse antes de que pueda.
Recibirá un contenedor bidimensional de valores, como una lista de listas o una cadena separada por nuevas líneas, que contiene 3 valores distintos para cada uno de los 3 tipos de pisos (Hielo, Suelo y Piedra). También recibirá dos pares (u otros contenedores de dos valores equivalentes) que indican una coordenada de inicio y meta en el laberinto. Estos pueden ser cero o uno indexado.
Debe generar una lista de movimientos (4 valores distintos con una biyección en N, E, S, W) que causarían que el jugador llegue al final cuando se lleva a cabo.
La entrada siempre tendrá un perímetro cerrado de piedra alrededor del laberinto para que no tenga que preocuparse de que el jugador salga del laberinto.
Este es el código de golf, por lo que gana la menor cantidad de bytes
Casos de prueba
Aquí .
representará el hielo, ~
representará el suelo y O
representará una piedra. Las coordenadas son 1 indexadas. Cada letra en la solución representa la dirección que comienza con esa letra (por ejemplo, N
Norte)
Entrada
OOOOO
OO.OO
O...O
OOOOO
Start : 3,3
End : 3,2
Salida
N
Entrada
OOOOOOOOOOOOOOOOO
O........O.....OO
O...O..........OO
O.........O....OO
O.O............OO
OO.......O.....OO
O.............OOO
O......O.......~O
O..O...........~O
O.............OOO
O.......O......OO
O.....O...O....OO
O..............OO
OOOOOOOOOOOOOO~~O
OOOOOOOOOOOOOOOOO
Start : 15,12
End : 16,8
Salida
N,W,N,E,N,E,S,W,N,W,S,E,S,E,N,E,N
Entrada
OOOOOOOOOOOOOOOO
O~~~~~OOOOO~~~~O
O~~O~OOOOOOO~~OO
O...O..........O
O........O.....O
O..............O
OO.............O
O.............OO
O....~....O....O
O..............O
O..............O
OOOOOOOOOOOOOOOO
Start : 2,2
End : 14,3
Salida
E,S,S,W,N,E,N
Entrada
OOOOOOOOOOOOOOOOOOO
O~~~~~~~OOOOOOOOOOO
O~~~~...OOOOOOOOOOO
OO~O~..OOOOOOOOOOOO
O..OO.............O
O..............O..O
O....O............O
O.O............~..O
O........OOOO.....O
O.......OOOOO.....O
O.......O~~~O.....O
O.......~~~~~.....O
O.......~~~~~.....O
O..........O......O
O..O..~...........O
O...............O.O
O.....O...........O
O.................O
OOOOOOOOOOOOOOOOOOO
Start : 2,2
End : 11,11
Salida
E,E,E,E,E,S,S,E,N,W,S,E,N,N,N
fuente
Respuestas:
Mathematica, 247 bytes
Con saltos de línea:
Mi idea inmediata fue representar las posiciones de hielo y tierra como nodos en un gráfico con bordes dirigidos correspondientes a movimientos legales, luego usar
FindPath
. Uno podría pensar que determinar los movimientos legales sería la parte fácil y encontrar la solución sería la parte difícil. Para mí fue todo lo contrario. Abierto a sugerencias sobre cómo calcular los bordes.El primer argumento
#
es una matriz 2D donde0
representa hielo,1
tierra y2
piedra.El segundo argumento
#2
y el tercer argumento#3
son los puntos inicial y final, respectivamente, en la forma{row,column}
.
es el carácter de uso privado de 3 bytes queU+F4A1
representa\[Function]
.Explicación
Define una función
p
que toma una listax
de la forma{row,column}
y las salidas#[[row,column]]
; es decir, el valor de hielo / suelo / piedra en esa coordenada.Define una función
m
que toma una posición inicialc
y un vector de direcciónv
y determina recursivamente dónde terminaría. Sic+v
es hielo, entonces continuamos deslizándonos desde ese punto, por lo que vuelvem[c+v,v]
. Sic+v
es tierra, entonces nos movemosc+v
y nos detenemos. De lo contrario (sic+v
es piedra o está fuera de límites), no te mueves. Tenga en cuenta que esto solo debe utilizarse en posiciones de hielo o tierra.Define la lista
g
de posiciones de hielo y suelo (p
valor menor que2
).Define una función
a
que toma una posición de partidac
y devuelve los resultados de moverse en las{1,0}
,{-1,0}
,{0,1}
, y{0,-1}
direcciones. Puede haber algo de redundancia. Nuevamente, esto supone quec
corresponde al hielo o al suelo.Define la lista
e
de aristas dirigidas que representan movimientos legales. Para cada posición#
eng
, calcular la tabla de bordes#->c
para cadac
ena@#
. Luego, como terminaremos con una sublista para cada posición#
, aplanaré el primer nivel. Puede haber algunos bucles y múltiples aristas.Graph[e]
es el gráfico donde los nodos son las posiciones legales (hielo o tierra) y los bordes representan movimientos legales (posiblemente chocando contra una piedra y sin moverse). Luego usamosFindPath
para encontrar una ruta desde#2
a#3
representada como una lista de nodos. ComoFindPath
puede tomar argumentos adicionales para encontrar más de una ruta, el resultado será en realidad una lista que contiene una sola ruta, así que tomo el primer elemento usando[[1]]
. Luego tomo las sucesivasDifferences
coordenadas yNormalize
ellas. Así, arriba es{-1,0}
, abajo es{1,0}
, derecha es{0,1}
e izquierda es{0,-1}
.Casos de prueba
fuente
JavaScript (ES6) 180
183Usando un BFS , como hice para resolver este desafío relacionado
Entrada
El mapa del laberinto es una cadena multilínea, que usa
O
o0
para piedra,8
para tierra y cualquier dígito distinto de cero menor que 8 para hielo (se7
ve bien).Las posiciones de inicio y fin están basadas en cero.
Salida
Una lista de desplazamiento, donde -1 es
W
, 1 esE
, negativo menor que -1 esN
y un positivo mayor que 1 esS
Menos golf
Prueba
fuente