Tu vida podría depender de esto. No pestañees. Ni siquiera pestañees. Parpadea y estás muerto. Ellos son rápidos. Más rápido de lo que puedes creer. ¡No le des la espalda, no mires a otro lado y no pestañees! Buena suerte.
Los Ángeles llorones son una raza alienígena que no puede moverse mientras otro ser lo observa (incluso otro Ángel). Se alimentan enviando a sus víctimas en el tiempo. Usted ( el Doctor ) está atrapado en una habitación con algunos, y necesita llegar a su TARDIS.
Tarea
Escriba un programa que, dada una representación ASCII de una habitación rectangular, muestre un camino que lo llevará a la seguridad. Si algún ángel puede atacar, en cualquier momento durante su progreso , entonces ese camino no es seguro. Un ángel puede atacar si puede verte mientras tú u otro ángel no te ven.
Entrada
La entrada es de dos partes. Primero, la dirección que estás mirando (NSEW). Luego, en líneas sucesivas, una representación de la sala, que muestra las ubicaciones de inicio / finalización y la ubicación / orientación de todos los Ángeles.
El siguiente ejemplo muestra que hay un ángel mirando hacia el oeste, y usted comienza a mirar hacia el sur.
S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
.
- Espacio vacioD
- El Doctor (posición inicial)T
- La TARDIS (posición final)N,S,E,W
- Un ángel, mirando hacia la dirección especificada (norte, sur, este, oeste)
Línea de visión
Puede ver cualquier espacio dentro de los 45 grados de la dirección que está mirando. La línea de visión está obstruida si hay otra entidad a lo largo de una horizontal directa, vertical o diagonal de 45 grados. Cualquier otra diagonal no obstruye la vista. La línea de visión de los ángeles funciona de la misma manera. Por ejemplo, a continuación, -
representa su campo de visión, suponiendo que esté orientado hacia el sur.
........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----
Salida
La salida es una cadena que representa la ruta que tomará para salir. Si hay varias rutas seguras, elija una. Si ninguna ruta es segura, salida 0
. Si el mapa está mal formado, haga lo que quiera, incluso estrellarse. Considérelo malformado si la habitación no es rectangular, no hay salida, etc. Si no hay ángeles, no tiene malformación, simplemente es fácil.
Para cada paso, puede hacer una de dos cosas: moverse en dirección NSEW o girar en dirección NSEW (sin cambiar de posición). Para moverse, simplemente envíe la letra para esa dirección. Para girar hacia una dirección, salida F
seguida de la letra apropiada. Por ejemplo, el siguiente resultado:
SSFESSSSSSSW
es una ruta segura para la muestra dada en la sección de entrada. Te mueves hacia el sur dos veces, miras hacia el este para mantener al ángel a la vista, luego muévete hacia el sur siete veces más y hacia el oeste una vez para ingresar a la TARDIS.
Casos de prueba
1) Puedes dar la vuelta al Ángel orientado al este para llegar a la TARDIS. A menos que te pares directamente entre ellos, se bloquean entre sí en su lugar, por lo que no importa en qué punto estés mirando en cualquier momento.
W
...D....
........
........
........
.E.....W
........
........
...T....
2) Pierdes No hay forma de superarlos. Se pueden ver hasta que te pares entre ellos. En ese punto, no puedes enfrentarlos a los dos y listo. También podría cerrar los ojos y acabar de una vez.
S
...D....
........
........
........
E......W
........
........
...T....
Victorioso
Se aplican las reglas de golf estándar y las lagunas , gana menos bytes. Intentaré obtener más casos de prueba pronto, pero no dudes en sugerir los tuyos mientras tanto.
Imagen y cita del Doctor Who.
J
).Respuestas:
Python -
559 565 644633La entrada debe proporcionarse así:
Esencialmente, este enfoque se aplica para encontrar todos los estados (posición y dirección) que el Doctor puede alcanzar de forma segura, almacenando cómo llegó allí e imprimiendo el camino en caso de éxito. Las posiciones y direcciones se realizan con números complejos.
Probablemente podría guardar algunos caracteres usando la aritmética de números complejos de Sage, pero eso duraría mucho.
Primero pensé que podía salvar a seis personajes haciendo que el Doctor se volviera en una dirección específica después de llegar a la Tardis, pero me di cuenta de que esto podría dar como resultado soluciones incorrectas. También primero leí mal las reglas.
Aquí hay una versión mayormente no golfista:
Casos de prueba
Caso de prueba 1:
Caso de prueba 2:
Caso de prueba de VisualMelon:
fuente
C #
17712034196218871347bytesReescribió la comprobación de LOS bloqueante en 1 bucle, lo que lo hizo mucho más ordenado y unos 450 bytes más corto
Este es un programa completo que espera que la entrada termine con un EOF y se pase a STDIN. (Con suerte) imprime la ruta más corta a la TARDIS, o "0" si no existe una ruta. Utiliza una Breadth First Search de mala calidad para seguir todas las rutas posibles, luego retrocede desde la TARDIS hasta The Doctor para ensamblar la salida.
Código formateado:
Salida por ejemplo entrada
Salida para el caso de prueba 1)
Salida para el caso de prueba 2)
Presento, según lo solicitado, un nuevo caso de prueba:
Mis salidas de programa
Caso de prueba 1 de WozzeC:
Caso de prueba 2 de WozzeC:
fuente
C #
1454, 1396, 1373, 13031279Derecha. Así que decidí intentarlo, y vaya, me tomó un tiempo. Se construye principalmente utilizando operadores lógicos.
Para evitar tener que buscar Null, etc., decidí usar un campo de [MAX_SIZE * 3] * [MAX_SIZE] * 3 y colocar el tablero de juego cerca del centro.
Las comprobaciones de bucle se realizan por dentro y por fuera hasta 50 (MAX_SIZE). Entonces algo como esto:
Cuando se encuentra un EWS o N, hago la misma verificación de su parte. Si se encuentra algo mirando a los Ángeles (No al Doctor), devuelven 15 como paso libre. Si no son atendidos, regresan de la manera que el Doctor debe enfrentar para estar a salvo. es decir, N devolvería 2 para el sur. A menos que sea NW o NE, en cuyo caso devolvería 6 (2 + 4) y 10 (2 + 8) respectivamente.
Si dos ángeles están observando al Doctor, los valores de retorno de estos serían "AND", por lo que en el ejemplo de prueba 2 las posiciones crunch 4 y 8 se convertirían en 0. Esto significa que la posición es mala y debe evitarse.
Código ampliado:
Resultados de la prueba
1 Ejemplo: FNSSSWNNNWSSSWSSSSENNESES
2 Ejemplo: no hay salida
Ejemplo de VisualMelon: FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEE
Mi caso de prueba1: FSSENEEEFWSSFNSWWN
Mi caso de prueba2: FSEEEESFWSSSSFNWWWWNFENNFSEES
Como se puede ver, a mi doctor le encanta pavonearse como una ducha para mostrarles a los Ángeles lo divertido que es moverse. Puedo hacer que el software encuentre el camino más corto, pero lleva más tiempo y necesita más código.
Casos de prueba para ustedes
Otro:
fuente
using S=System.Console;
, o simplemente puedes eliminar el S por completo en tu código y ahorrar 6 bytesusing System
. Ahora tendré que intentar recortar mi enfoque ingenuo un poco más ...;)