Trama : Jimmy está desaparecido; Tenemos que encontrarlo. Deberíamos separarnos.
Giro de la trama : Jimmy ya está muerto.
Pero nuestro elenco no lo sabe, por lo que deben buscar en toda el área de todos modos. Hay una cuadrícula de celdas N columnas x M filas (1 <= M, N <= 256), marcadas como "S" para el punto de partida "." para espacios abiertos, o "#" para un obstáculo. Este es el mapa .
Hay 0 <= p <= 26 costeros , 0 <= q <= 26 extras y 1 estrella . Todos están inicialmente en la celda marcada con S.
Las normas
Cada persona tiene un radio de visión que se muestra a continuación:
...
.....
..@..
.....
...
La estrella se denota con "@", los costeros con letras mayúsculas, que comienzan con "A", y los extras con letras minúsculas, que comienzan con "a". Inicialmente, el radio de visión que rodea el punto de partida ya está marcado como buscado. Si esto constituye todo el espacio abierto del mapa, el juego termina. Cada turno, en el siguiente orden :
- Cada persona simultáneamente hace un movimiento real (ya sea parado o moviéndose a una de las 8 celdas vecinas).
- Todas las celdas en el radio de visión alrededor de cada persona se cuentan como buscadas.
- Si un coprotagonista no puede ver a nadie más, ella muere. Si un extra no puede ver a un coprotagonista, la estrella o al menos a otros 2 extras, él muere. Esto sucede simultáneamente , es decir, no puede haber una reacción en cadena de muertes en un solo turno; se verifican las condiciones anteriores, y todos los que van a morir mueren a la vez.
- Si se ha buscado todo el espacio abierto en el mapa, la búsqueda ha terminado.
Notas
Varias personas pueden estar en el mismo cuadrado en cualquier punto, y estas personas pueden verse entre sí.
Los obstáculos nunca impiden la vista, solo el movimiento; la gente puede verse a través de, er ... ¿lava?
Los espacios abiertos en el mapa están garantizados para estar conectados por movimientos de rey.
La "S" inicial también se considera espacio abierto, en lugar de un obstáculo.
Cualquier movimiento rey que aterrice en un espacio abierto es válido. Por ejemplo, el siguiente movimiento es legal:
.... ....
.@#. ---> ..#.
.#.. .#@.
.... ....
Entrada
La entrada estará en el formato
N M p q
[N cols x M rows grid with characters ".", "#", and "S"]
Entradas de muestra:
6 5 0 0
......
......
..S...
......
......
y
9 9 1 1
S.......#
.......##
......##.
..#####..
...##....
...##....
...#.....
....#..#.
.........
p y q son los números de costeros y extras, respectivamente.
Salida
La salida debe ser, para cada turno, los movimientos que se realizan, con direcciones indicadas por
789
456
123
El orden de los movimientos no importa, ya que todos se ejecutan simultáneamente. No enumerar un movimiento para una persona está bien, y es equivalente a moverlo en la dirección 5. Los movimientos deben estar listados en el siguiente formato:
@9 A2 a2 B7.
"." denota el final de tus movimientos por un turno.
Una vez que se ha buscado el mapa, la línea final de salida debe ser tres enteros, separados por espacios: la cantidad de turnos que le llevó a terminar de buscar en el tablero, la cantidad de costas vivas y la cantidad de extras vivos. Para el primer ejemplo de entrada
6 5 0 0
......
......
..S...
......
......
lo siguiente es salida válida:
@4.
@6.
@6.
@6.
4 0 0
Una nota final: la estrella no puede morir y se garantiza que el espacio abierto en el mapa esté conectado, por lo que la búsqueda siempre tendrá éxito.
Tanteo
Su puntaje es el número total de turnos realizados en un conjunto de pruebas de referencia; puede enviar su propio caso de prueba junto con su respuesta. La suma del número de costars vivos sobre el conjunto de referencia se usará como un desempate, y en caso de que aún haya un empate, se usará la suma del número de extras vivos.
Conjunto de prueba y controlador
Actualmente, 5 mapas están en línea en https://github.com/Tudwell/HorrorMovieSearchParty/ . Cualquier persona que envíe una respuesta también puede presentar un caso de prueba, que me reservo el derecho de rechazar por cualquier motivo (si rechazo su mapa por algún motivo, puede enviar otro). Estos se agregarán al conjunto de prueba a mi discreción.
Se proporciona un controlador Python (probado en 2.7.5) en github como controller.py . Un segundo controlador allí, controller_disp.py , es idéntico, excepto que muestra una salida gráfica durante la búsqueda (requiere la biblioteca Pygame).
Uso :
python controller.py <map file> <your execution line>
Es decir:
python controller.py map1.txt python solver.py map1.txt
El controlador tiene salida (al stdin de su programa ) del formulario
Turn 1
@:2,3 A:2,3 B:2,3.
##...##
#ooo..#
ooooo..
ooooo..
ooooo..
#ooo...
##.....
###....
----------------------------------------
Este es el número de turno (el turno 1 es antes de que te hayas movido), una lista '.'-terminada de todos los actores y sus coordenadas x, y (el carácter superior izquierdo es (0,0)), una representación de todo tablero, y una línea con 40 '-'s. Luego espera la entrada (del stdout de su programa ) del formulario
@9 A2 B7.
Este es el formato de salida especificado anteriormente. El controlador emite una 'o' para el espacio abierto que se ha buscado, '.' para espacios abiertos que no se han buscado, y '#' para obstáculos. Incluye solo personas vivas en su lista de personas y sus coordenadas, y rastrea todas las reglas del juego. El controlador saldrá si se intenta un movimiento ilegal. Si los movimientos para un turno dado finalizan la búsqueda, la salida no es como la anterior; en cambio es de la forma
Finished in 4 turns
4 1 0
"4 1 0" aquí denota 4 turnos totales, 1 costar vivo y 0 extras vivos. No necesita usar el controlador; siéntase libre de usarlo o modificarlo para su propia entrada. Si decides usarlo y tienes problemas, avísame.
Gracias a @githubphagocyte por ayudarme a escribir el controlador.
Editar: para una entrada aleatoria, puede elegir cualquier ejecución en un mapa en particular como su puntaje para ese mapa. Tenga en cuenta que debido a los requisitos de puntuación, siempre debe elegir la menor cantidad de turnos, luego la menor cantidad de costeros muertos, y la menor cantidad de extras muertos para cada mapa.
fuente
Respuestas:
Rubí, seguridad primero + BFS + aleatoriedad, puntaje ≤ 1458
No estoy seguro de cómo puntuarás las presentaciones aleatorias. Si todas las respuestas tienen que ser deterministas, avíseme y elegiré una semilla o eliminaré la aleatoriedad por completo.
Algunas características y defectos de esta solución:
map5.txt
Tarda entre 1 y 13 minutos en completarse.Algunos resultados
Ahora aquí está el código:
Hay algunas salidas de depuración comentadas allí. Especialmente el
if group['@']
bloque es bastante interesante porque imprime una visualización de los datos BFS.Editar: Mejora significativa de la velocidad, al detener el BFS si ya se ha encontrado un mejor movimiento (que fue el punto de usar BFS en primer lugar).
fuente