Eres un viajero que cruza el desierto entre dos pueblos. No puede llevar suficiente agua para cruzar sin detenerse. Esta es una variación de un rompecabezas clásico.
Las normas
Un desierto se ve así: una cuadrícula WxH de espacio mayormente vacío. El espacio marcado S
es donde comienzas, E
es donde quieres terminar, y un cuadrado marcado con el número N contiene N unidades de agua. Cuadrados marcados con una .
bodega cero agua.
.....................................
........S............................
.....................................
.........7...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
Comienzas en S con 5 unidades de agua.
Puede transportar como máximo 5 unidades de agua.
Cada turno tu
- mover un cuadrado hacia arriba, abajo, izquierda o derecha,
- consume 1 unidad de agua que llevas,
- recoger o dejar caer una cierta cantidad de unidades de agua.
A su vez, está anotada así: (direction)(+|-)(units of water)
, +
indica que se está recogiendo el agua, -
que está dejarlo caer.
Ejemplo de turnos:
D+0 Move Down
R+0 Move Right
D+2 Move Down, pick up two units of water.
U-1 Move Up, drop one unit of water.
Si realiza estos movimientos comenzando en S en el ejemplo anterior, el desierto se ve así después.
.....................................
........S............................
.........1...........................
.........5...........................
.....................................
.......................3.............
.....5...............................
................................2....
.....................................
.....................................
.....................................
...............................E.....
.....................................
....................7................
.....................................
.....................................
No puedes recoger más agua de la que ya está en tu plaza. Cuando recojas el agua, deduce esa cantidad de unidades del recuento de fichas.
Solo puede recoger agua para contener un máximo de 5 unidades.
Ningún mosaico puede contener más de 9 unidades, excepto S que contiene unidades de infinito.
Solo puedes soltar tanta agua como la que tienes actualmente.
El agua en el suelo permanece sin cambios hasta que la recojas nuevamente.
Si regresa a S, puede recoger cualquier cantidad de agua sin agotarla.
Si llegas a E, entonces ganas . Aún ganas si consumes tu última unidad de agua en E.
Si, después de tu turno, tienes cero agua y no estás en E, mueres .
Entrada y salida
Su programa recibirá un mapa inicial de tamaño arbitrario STDIN
como arte ASCII en el formato anterior. Puede suponer que es rectangular, es decir, todas las líneas tienen la misma longitud, que hay exactamente uno S
y un E
cuadrado, todas las líneas están terminadas \n
y todo el STDIN se ajustará a esta expresión regular:/^[SE1-9\.\n]+$/
Su programa escribirá la siguiente salida en STDOUT:
- la lista de movimientos,
- El estado final del mapa.
Puede generar la lista de movimientos en cualquier formato conveniente.
El estado final del mapa se imprimirá en el mismo formato que la entrada, excepto que además mostrará la ruta que tomó por el desierto marcando todas las fichas visitadas #
, si esa ficha no contiene agua y no es S o E (es decir, es .
)
Ejemplo de entrada:
.....S.
.......
.......
E......
....8..
EJEMPLO resultado ganador:
D+0
D+0
D+0
D+0
L+5
L+0
L+0
L+0
L+0
U+0
.....S.
.....#.
.....#.
E....#.
####3#.
No trivialidad
Cuando publique su código, publique una entrada de mapa de muestra para la cual su código encuentre una solución que satisfaga las siguientes condiciones de no trivialidad:
- S y E están separados por al menos 10 movimientos.
- Cualquier cuadrado que inicialmente contenga N unidades de agua debe estar rodeado por un borde de ancho N en el que todos los cuadrados estén
.
(sin agua, ni S ni E)
EJEMPLO
........2.
..........
..........
S.1..2....
..........
..........
........1.
..3.......
.........E
Si aumenta la cantidad de agua en cualquier azulejo, lo anterior se vuelve trivial.
Requisitos
Presumiblemente, su programa encontrará varios intentos fallidos antes de encontrar una solución, si la hay.
- Su programa eventualmente debe resolver cualquier entrada solucionable.
- Quiero verte morir : tu programa generará los movimientos y el mapa final de la ruta a la muerte para cada intento fallido de encontrar una solución.
- Si encuentra una solución ganadora, imprima la salida completa para eso y finalice.
- Ejecute hasta que se encuentre una solución, pero no intente la misma solución dos veces : todas las muertes deben ser por rutas distintas.
- Use esto como entrada de prueba:
(requiere al menos un movimiento para dejar caer un caché de agua en algún punto medio).
S........
.........
.........
........E
El código más corto que se publica con una entrada de demostración no trivial que resuelve gana.