Un tablero de 2D será contener los siguientes objetos:
^
,>
,v
, O<
: un emisor láser hacia arriba, derecha, abajo, o hacia la izquierda, respectivamente. Puede haber más de uno. Los láseres viajarán en línea recta en el espacio vacío (el espacio vacío se representa con un punto.
). Los láseres no pasan a través de los emisores.*
: Un objetivo. Los láseres atraviesan objetivos. Puede haber más de uno.
El tablero también puede contener los siguientes objetos:
@
: Una pared sólida. El láser no pasará por aquí.\
: Un reflector inclinado a la izquierda . Cambia la dirección de los láseres según la siguiente tabla:Direction laser is travelling Direction of laser after hitting reflector Up Left Right Down Down Right Left Up
Debería ser bastante intuitivo en cuanto a cómo funcionan los reflectores. Imagínelos como un espejo real de dos lados y las instrucciones deben ser claras.
/
: Un reflector inclinado a la derecha . Cambia la dirección de los láseres según la siguiente tabla:Direction laser is travelling Direction of laser after hitting reflector Up Right Right Up Down Left Left Down
1
,2
,3
...9
: Un portal . El número indica el canal del portal: habrá exactamente dos portales del mismo canal (por ejemplo, no habrá tres1
). El portal cambia la posición de los láseres a la posición del otro portal del mismo canal. Por ejemplo:> 1 @ 1 *
El láser golpeará el objetivo porque cuando golpea el primero
1
, se teletransporta al segundo1
en el otro lado. Los láseres retienen la misma dirección en la que estaban antes.Un portal no teletransportará el láser a un portal de un canal diferente (es decir
1
, a no teletransportará el láser a un9
.
Su programa recibirá una representación 2D del tablero como entrada. El tablero siempre tendrá forma rectangular. La salida debería ser True
si todos los objetivos tienen láser pasando a través de ellos, o de False
otra manera.
Aquí hay algunos casos de prueba:
Entrada
>....\ ..*... >./../ ..*...
Salida
True
Entrada
>..........\ 1........../ 2..........1 3..........2 4..........3 5..........4 6..........5 7..........6 8..........7 9..........8 *..........9
Salida
True
Entrada
>.@............* >..@...........* >...@..........* >....@.........* >.....@........* >...*..@........ >.......@......*
Salida
False
Entrada
../\. >./**
Salida
False
Entrada
/.......*.......\/3..... @..............//\.\.... *.............2\.1\/\... \..............///.....< .........*...//\\/.....\ >.............\.1.///.4. 4.......*/...\2\/3/\/..^
Salida
True
Entrada
vvvvvvvvvvvvvvvvv \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// \\\\\\\\\\\\\\\\\ ///////////////// *****************
Salida (observe el objetivo en el extremo derecho)
False
Respuestas:
Pitón,
310302287278277260No es radicalmente diferente a la publicación de Python existente, pero creo que tiene uno o dos trucos notables.
También maneja la entrada "sin terminación", comoEDITAR : ¡Uy! Los emisores bloquean los láseres.1>1
.t
toma una lista de cadenas (las líneas de entrada) y devuelve un resultado booleano.Aquí hay un buen gif del código que se está jugando:
EDITAR : impresionante gif cortesía de Will. Gracias Will!
fuente
1>1
terminará. No he podido encontrar algo que no termine, aunque no he puesto mucho esfuerzo en ello y asumí que no sucede para mi implementación. Por supuesto, reconsideraré si alguien puede presentar uno..find(d)
devuelve -1 si no se encuentra. Si elimina laif-1<d:
declaración y en su lugar lo hacej+=[-1,1,w,-w,-i][d]
en la parte superior del ciclo while, un -1 no encontrado se convertirá en la adición del último elemento de esa matrizj
, lo que haráj
0, que sabemos que es@
...?Perl, 647
Este es mi primer intento en el código de golf, y estoy un poco avergonzado de que ni siquiera supere el puntaje de C #, pero pensé que sería interesante (o divertido, o simplemente masoquista) hacer todo esto como un serie de sustituciones de expresiones regulares. (También pensé que sería divertido repasar mi Perl, pero al final lamentaba profundamente no haberlo implementado en Ruby o Python).
No he hecho muchas pruebas, pero creo que debería manejar todos los casos.
La cuadrícula se ingresa a través de STDIN. Debe haber al menos una nueva línea en la entrada (es decir, una sola fila sin una nueva línea no funcionará).
Explicación: el código actualiza iterativamente la cadena de la cuadrícula a medida que los láseres pasan a través de ella.
-
representa un láser horizontal,|
un láser vertical, láser+
cruzado,K
un\
espejo con un láser que rebota en la parte superior,k
un/
espejo con un láser que rebota en la parte inferior,Z
un\
espejo con un láser que rebota en la parte inferior yW
un/
espejo con un láser que rebota la parte superior.%
es un/
espejo con láser en ambos lados, mientras queX
es un\
espejo con láser en ambos lados. (Estos distinguen entre mayúsculas y minúsculas. Intenté elegir letras que parezcan algo apropiadas, por ejemplo,k
yK
son opciones algo obvias, pero desafortunadamente el efecto realmente no es tan útil. Realmente debería poner esta información en una tabla, pero estoy agotado en este momento).El manejo de los portales de la misma manera (es decir, asignar a cada dígito un conjunto de caracteres adicionales en función de las posibles posiciones del láser de entrada / salida) requeriría 144 caracteres (incluido el 9 original), por lo tanto, cuando un láser golpea un portal de "entrada", Agrego el carácter del portal de "salida" al conjunto de caracteres que emiten un láser en la dirección correcta. (Esto requiere diferenciar entre los portales de entrada y salida; usé las letras
qwertyuio
para esto).Algo inexperto, con declaraciones impresas para que pueda ver las sustituciones que suceden (cada sustitución representa una "ronda" de progresión láser), y con la
g
bandera agregada al principals///
para que no tome tantas iteraciones:fuente
Python 338
351Mi versión no minificada en realidad traza los caminos del láser en el tablero, lo cual es bonito:
fuente
C # -
515414400 bytesPrograma completo de C #, sin resultados agradables como los de Will. Funciona siguiendo el camino del láser para cada emisión individual y manteniendo una matriz de las células que hemos visitado, para que podamos verificar que hemos visitado todas las estrellas al final. Editar: separa una gran cantidad de bytes haciendo que todo sea 1D y usando un carácter en lugar de un int para almacenar el carácter actual
w0lf me recordó que tenía un bucle for infrautilizado justo en el medio de mi código, así que pensé que sería mejor hacer un último esfuerzo y ponerlo a trabajar, y ahora estoy en el número mínimo absoluto de rizado tirantes. No pretendo que me guste el colapso del segundo bucle for, el código ahora es terriblemente desordenado, pero ahorró algunos bytes. En el proceso reescribí el manejo del portal. También encontré un método más corto para realizar el "movimiento" con una operación condicional anidada en lugar de agregada.
Código de golf:
Menos código de golf:
El nuevo código de manejo del portal utiliza el hecho de que la función String.IndexOf devuelve felizmente -1 (es decir, char no encontrado) si le pide que comience a buscar 1 carácter más allá de la cadena (arroja una excepción si le pide que comience más allá). Esto fue nuevo para mí, pero fue muy conveniente en este caso.
fuente
m+=(d>0?d-2:0)+(d<3?d-1:0)*W;
y empujarlo en elfor
, así:for(char c;i-->0;m+=(d>0?d-2:0)+(d<3?d-1:0)*W)
. De esta manera, ahorrará un carácter, porque perderá un punto y coma.