Búsqueda de caminos de Roguelike
Su tarea será, dada una matriz bidimensional de los elementos descritos a continuación, que representa una mazmorra, para generar o devolver un solo número que representa la cantidad de piezas de oro que el pícaro puede recoger sin despertar a ningún monstruo.
Los elementos de la matriz son los siguientes:
- Los espacios vacíos están representados por uno
.
o un espacio, su llamada; - La posición inicial de Rogue está representada por, por supuesto
@
,; - Una pieza de oro está representada por
$
; - Las paredes están representadas por
#
; - Los monstruos están representados por los personajes de la siguiente expresión regular:
[a-zA-Z*&]
.
La matriz no debe contener ningún personaje que no esté en la lista anterior, por lo que puede suponer que cualquier cosa que no sea una pared, un espacio vacío, el pícaro o una pieza de oro es un monstruo.
Las reglas para encontrar rutas son:
- El pícaro solo puede caminar a través de celdas vacías o celdas que contienen oro;
- Se necesita un turno para moverse a una celda adyacente o diagonalmente adyacente;
- Recoger el oro es instantáneo;
- El pícaro no puede permanecer adyacente o diagonalmente adyacente a un monstruo durante más de un turno sin despertarlo, lo cual está prohibido;
- El pícaro puede ingresar al área de conciencia de un monstruo varias veces, el monstruo solo se despertará si el pícaro pasa dos turnos consecutivos cerca de él.
Reglas de entrada y salida
Puede obtener la entrada en cualquier formato razonable, incluida una matriz bidimensional, una matriz plana, una cadena o cualquier otra cosa. Si te facilita la vida, también puedes tomar las dimensiones de la matriz.
Está garantizado que el pícaro no estará cerca de un monstruo al principio.
Un programa completo o una función está bien.
Tanteo
Este es el código de golf , el puntaje es el recuento de bytes de su envío con menos siendo mejor.
Casos de prueba
Utilizo puntos para espacios vacíos aquí con fines de legibilidad, si así lo desea puede usar espacios (ver arriba). También tenga en cuenta que esta es una pura coincidencia de que el pícaro siempre está en la esquina superior izquierda, su código también debe manejar cualquier otra posición válida.
1)
@..
.$.
... -> 1
Solo una prueba de cordura.
2)
@....
...g$
..... -> 0
De nuevo, una prueba de cordura.
3)
@....
...$g
..... -> 1
El pícaro puede agarrar el oro moviéndose desde la izquierda.
4)
@....g..
.......$
........
.....h.. -> 1
El pícaro puede zigzaguear entre los monstruos, sin quedarse nunca más de un turno cerca de cada uno.
5)
@....z..
.......$
.....b.. -> 0
Las tácticas del caso de prueba anterior no funcionan aquí: las áreas de sensibilidad del monstruo se superponen.
6)
@$#.
###$
.... -> 1
Test de sanidad.
7)
@..#..
$.$g.$
...#.. -> 2
Ídem.
8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$ -> 3
De todo el oro aquí, solo se puede alcanzar tres de manera segura: el oro cerca de la posición inicial se puede obtener moviendo hacia abajo uno y luego nuevamente a la posición inicial. Para escapar de la esquina superior izquierda, el pícaro debe moverse diagonalmente hacia abajo-derecha dos veces. El oro en el medio no plantea ningún desafío. El oro exterior está protegido g
y b
puede obtenerse moviéndose en diagonal desde el lugar a la derecha del oro central y luego hacia atrás. El resto no se puede obtener: el oro superior derecho está bloqueado por paredes, y el oro inferior derecho requiere dos turnos en áreas de sensibilidad de monstruos.
Los siguientes casos de prueba fueron generosamente donados por mbomb007.
9)
12345678
a @....g.D
b .......$
c ......#.
d .....h.. -> 1
Este es complicado. Un camino es b4-b5-c6-b7-c8-b8(grab)
.
10)
12345678
a @....g.D
b .......$
c .......#
d .....h.. -> 1
Un camino es [bc]4-c5-b6-c7-b8(grab)
.
11)
12345678
a @....g.D
b ......#$
c .......#
d .....h.. -> 1
El muro adicional en realidad no cambia nada, [bc]4-c5-b6-c7-b8(grab)
sigue siendo una solución.
@
una entrada válida?