Juego de vida en flechas

26

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:

Zgarb
fuente
¿Hay alguna razón para incluir las filas vacías debajo de la pared en la entrada?
Martin Ender
@MartinEnder Hacen que las soluciones donde realmente simulas GoL en la entrada sean más factibles (al menos eso espero).
Zgarb
¿El planeador siempre comenzará en la fila superior?
Rod
@ Rod Sí, estará en la fila superior en dirección suroeste o sureste.
Zgarb
Otro juego de la vida: P
Christopher

Respuestas:

15

Python 2 , 142 136 135 bytes

-6 bytes gracias a ElPedro
-1 byte gracias a TuukkaX

p=input()
z=p[2].index(1)
m=(p[1][z]-p[1][z+1]<1)*2-1
k=i=0
for b in p[3:]:x=p[2][::m].index(1)+i;k|=1in b[::m][x-2:x+8];i+=1
print 1-k

Pruébalo en línea! o Verificar todos los casos de prueba

Comprobación de orientación (este / oeste):

oeste-este
Utilizando z=p[2].index(1)para obtener el primer cuadrado en la tercera fila (representado por el cuadrado rojo), y luego m=(p[1][z]-p[1][z+1]<1)*2-1para 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 en 1(fila superior de la imagen), mientras que los que van al sureste dan como resultado 0o -1.
Luego convierta: 1 -> -1y 0,-1 -> 1para 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

deslizamiento
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 1s (que sería la pared).
flechas
arrowslits_path

Barra
fuente
Creo que se puede perder 4 bytes mediante el establecimiento de una variable ia 0fuera del forbucle a continuación, añadir 1 a lo que cada uno pase y así deshacerse de enumerate. Parece funcionar cuando lo probé con tu TIO. +1 para una respuesta genial si tengo razón o no.
ElPedro
¡Agradable! Puede guardar un byte eliminando el espacio en blanco de 1 in. +1.
Yytsi
2
+1 para "
weast
4

Octava, 123 122 108 bytes

Gracias a @LuisMendo ahorró 2 bytes

B=A=input("");B(1:3,:)=0;do;until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5;any(A(end,:))

Pruébalo en línea!

O

Verificar todos los casos de prueba

Gracias a Rod preparando casos de prueba.

B=A=input("");
B(1:3,:)=0;
do
until nnz((A=A&(s=conv2(A,(m=-1:1)|m','same'))>1&s<4|~A&s==3)-B)-5
any(A(end,:))

Respuesta anterior:

B=A=input("");
B(1:3,:)=0;
while nnz(A~=B)==5
    s=conv2(A,(m=-1:1)|m','same');
    x=~A;
    A&=~A|~(s<2|s>3);
    A|=x&s==3;
end;
any(A(end,:))

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.

rahnema1
fuente
1
hasta que el patrón de pared y el patrón simulado tengan más / menos de 5 celdas diferentes. ¡Eso es inteligente!
Luis Mendo
@LuisMendo Gracias, salvó un byted
rahnema1
3

Retina , 101 93 91 bytes

El recuento de bytes asume la codificación ISO 8859-1.

O$#^`.(?=(.*¶)*(?<=#_.\2.+##.(.*¶)\D+))
$#1
¶(?>_(_)*#+_+¶_+¶(?<1>_+¶)*)(?>(?<-1>.)+)_{11}

Pruébalo en línea!

Ciertamente no es óptimo todavía.

Martin Ender
fuente