Fondo
Este desafío es en honor a los apsillers , que ganaron la categoría No tan simple como parece en Best of PPCG 2016 con su desafío ¿Puede mi caja de música de 4 notas tocar esa canción? ¡Felicidades!
En su página "Acerca de mí", este usuario tiene un simulador realmente bueno para el autómata celular Game of Life . (En serio, ve a verlo). Por otro lado, la palabra aspillera es español para "flechas iluminadas". A la luz de estos hechos, este desafío se trata de rendijas de flechas en Game of Life.
Juego de vida en flechas
En GoL, representaremos una flecha con un planeador y una pared con una secuencia de bloques . Un planeador único se acerca a la pared desde arriba e intenta volar a través de un espacio en la pared (la luz de las flechas). Su tarea es verificar si el planeador pasa a través de las flechas o se estrella contra la pared.
Entrada
Su entrada es una cuadrícula de bits, que representa una configuración GoL. Puede tomarlo en cualquier formato razonable (cadena multilínea de dos caracteres ASCII imprimibles distintos, lista de cadenas, matriz 2D de enteros, matriz 2D de booleanos, etc.). Para mayor claridad, usaré cadenas multilínea de los caracteres .#
a continuación.
Se garantiza que la entrada tiene varias propiedades. Primero, su altura es 2N para algunos N ≥ 6 , y su ancho es al menos 2N + 2 . La entrada será todo .
s, excepto que en algún lugar de las tres filas superiores hay un planeador, y en las dos filas del medio hay una pared de bloques. El planeador se dirigirá hacia el sudoeste o sudeste, y su posición es tal que si se eliminan las paredes, no pasará por un borde lateral antes de llegar al borde inferior (pero puede llegar a una esquina de la cuadrícula). El planeador está inicialmente separado de los bordes izquierdo y derecho por al menos un paso de .
s. Puede estar en cualquier fase.
El muro consta de bloques, que están separados por una columna de .
s, excepto en un lugar, donde estarán separados por al menos dos columnas de .
s. Al igual que el planeador, los bloques más a la izquierda y a la derecha también están separados de los bordes por un paso de .
s. Siempre habrá al menos un bloque en el borde izquierdo y un bloque en el borde derecho.
Aquí hay un ejemplo de una cuadrícula de entrada válida:
....#......................
..#.#......................
...##......................
...........................
...........................
...........................
.##.##............##.##.##.
.##.##............##.##.##.
...........................
...........................
...........................
...........................
...........................
...........................
Salida
Como se indicó, su tarea es determinar si el planeador se estrella contra la pared o llega al borde sur. Para los propósitos de este desafío, se produce un bloqueo si la configuración ya no consiste en un solo planeador y la pared de bloques, independientemente de lo que ocurra más adelante en la simulación. Los siguientes diagramas muestran las brechas más pequeñas por las que puede atravesar un planeador sureste sin chocar en las dos fases distintas (la condición para los planeadores suroeste es simétrica).
...#...........
.#.#...........
..##...........
...............
...............
##...........##
##...........##
...#...........
....#..........
..###..........
...............
...............
##...........##
##...........##
Si el planeador vuela a través de la pared, deberá generar un valor verdadero y, de lo contrario, un valor falso. Para el ejemplo anterior, la salida correcta es falsa, ya que el planeador se estrellará contra la parte izquierda de la pared.
Para los propósitos de este desafío, puede suponer que si simula GoL en la entrada para 2 * (altura - 3) pasos, el planeador está en la fila inferior en la posición esperada y la pared está intacta, entonces la salida es verdadera .
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana.
Casos de prueba
He recopilado los casos de prueba en un repositorio de GitHub , ya que son bastante grandes. Aquí hay enlaces a los archivos individuales:
Respuestas:
Python 2 ,
142136135 bytes-6 bytes gracias a ElPedro
-1 byte gracias a TuukkaX
Pruébalo en línea! o Verificar todos los casos de prueba
Comprobación de orientación (este / oeste):
Utilizando
z=p[2].index(1)
para obtener el primer cuadrado en la tercera fila (representado por el cuadrado rojo), y luegom=(p[1][z]-p[1][z+1]<1)*2-1
para restar el valor de la derecha (verde) del de la izquierda (azul), de esta manera los 4 estados de planeador que van a resultado suroeste en1
(fila superior de la imagen), mientras que los que van al sureste dan como resultado0
o-1
.Luego convierta:
1 -> -1
y0,-1 -> 1
para ser usado en el parámetro para revertir las listas cuando se trata de las del oeste. De esta manera, los planeadores que van hacia el sudoeste reciben la misma amenaza que el que va hacia el sureste.Movimiento planeador
Este es el movimiento que hace el planeador que va hacia el sureste, tiene un patrón de "escalera" y el bloque más a la izquierda en la tercera línea es constante para cada patrón. Utilizándolo como punto de partida, los 3 bloques circundantes a la izquierda y a la derecha, y los 4 bloques centrales se verifican para detectar la presencia de
1
s (que sería la pared).fuente
i
a0
fuera delfor
bucle a continuación, añadir 1 a lo que cada uno pase y así deshacerse deenumerate
. Parece funcionar cuando lo probé con tu TIO. +1 para una respuesta genial si tengo razón o no.1 in
. +1.Octava,
123122108 bytesGracias a @LuisMendo ahorró 2 bytes
Pruébalo en línea!
O
Verificar todos los casos de prueba
Gracias a Rod preparando casos de prueba.
Respuesta anterior:
Primero extraiga el patrón de pared como variable
B
.Realice la simulación GoL hasta que el patrón de pared y el patrón simulado tengan más / menos de 5 celdas diferentes.
Si el planeador ha recibido la última fila, la función devuelve verdadero.
fuente
Retina ,
1019391 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Ciertamente no es óptimo todavía.
fuente