Estás en una estación espacial intergaláctica avanzada. Un amigo tuyo que se está especializando en el Estudio de la gravedad acaba de crear un juego que implica usar la microgravedad como una forma de mover una pelota.
Te entrega un pequeño controlador con cuatro flechas direccionales y una estructura tipo laberinto con una pelota a la izquierda. Ella comienza a explicar cómo funciona el juego.
- Tienes 2 botones direccionales, izquierdo
<
y derecho>
. - También tiene 2 botones de gravedad, arriba
^
y abajov
(al menos desde su marco de referencia) - Utilizará estos botones de flecha para mover la bola en su pantalla.
"Ahora hay algunas reglas que deben seguirse". ella dice
- Todas las plataformas deben atravesarse antes de llegar a la copa.
\ /
- Las flechas
< > ^ v
se usarán para especificar el movimiento de la pelota. - La gravedad es
^ v
(arriba y abajo). Esto mueve la pelota hasta la siguiente plataforma en esa dirección. (La distancia no se calcula para arriba y abajo) - ¡Perder la pelota es malo! No caigas por el borde y no cambies la gravedad demasiado pronto para que tu pelota nunca llegue a una plataforma
- El movimiento se cuenta en pasos de
< >
- La pelota puede entrar en la copa desde cualquier dirección siempre que se siga la Regla 1
- Debes especificar la dirección de la gravedad para que tu bola no se aleje flotando
- El movimiento puede ser aleatorio siempre que se sigan las reglas 1 y 4
- Para casos que no se pueden resolver, salida Falso o Inválido
Ejemplo simple de una pelota, plataforma y copa:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Ejemplo de atravesar nuevamente la misma plataforma.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Ejemplo de cambio de gravedad
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
Tarea
Su tarea es crear un programa que tome una representación ASCII de un curso como entrada. Y genera una serie de flechas que <>^v
representan la dirección y la atracción gravitacional para mover una bola a o
través de platforms
una taza.
Aplican reglas estándar de golf de código
Casos de prueba
Entrada (una situación en la que se cambia la gravedad)
---- --/ \
--- --
o
------ -----
Salida
^>>v>>>>>^>>>>>v>>>>^>>>
Entrada (una situación donde se cambia la dirección)
---
o
----
---
-----
--\ /
Salida
v>>>>>>^>>>v<<<<<v>>>
Entrada (una situación en la que necesita atravesar la misma plataforma dos veces)
o
------
------
------
\ /------
Salida
v>>>>>><<<<<<>>>>>>><<<<<<
Casos incorrectos, el programa debería generar Falsy para estos
No hay forma de que la pelota llegue a la siguiente plataforma
o
--- ---
La bola flotaría en el espacio
---
o
---
Una situación en la que la pelota llega a la copa, pero no se atraviesan todas las plataformas.
o
----
----
\ /----
fuente
Respuestas:
Pyth, 431 bytes
Este es mi primer programa Pyth (en realidad este es mi primer programa en cualquier lenguaje de código de golf), lo que significa que probablemente todavía se puede mejorar.
Pruébelo aquí (el último caso de prueba necesita demasiado tiempo, debe probarse con una instalación local de Pyth).
Volcado hexadecimal del código (usar
xxd -r <filename>
para decodificar):Explicación
La idea principal de este programa era usar expresiones regulares para modificar la entrada. Para ahorrar espacio, todas estas expresiones regulares están contenidas en una cadena comprimida. El primer paso en el programa es descomprimir la cadena y dividirla en una sola expresión regular y las cadenas de reemplazo correspondientes.
Los contenidos de la variable
J
son entonces:La función
r
aplica sustituciones de expresiones regulares de la lista almacenada enJ
el índiceG
a todas las cadenas de la listaH
. Regresa tan pronto como se cambie cualquiera de las cadenas.La función
i
es similar a la funciónr
con 2 diferencias. Aplica las sustituciones en una lista transpuesta (vertical en lugar de horizontal). También realiza las sustituciones repetidamente siempre que se cambie algo.La función
g
verifica si la expresión regular de la lista almacenada enJ
el índiceG
puede encontrarse en cualquier cadena de la listaH
.El resto del código contiene la lógica real del programa. Realiza una búsqueda amplia de los posibles movimientos hasta encontrar una solución. La posición en el árbol de búsqueda se define únicamente por la dirección de la gravedad y una copia modificada de la entrada del programa. Para evitar el procesamiento de la misma posición una y otra vez, las posiciones procesadas se almacenan en la lista global
K
. Las posiciones que aún deben procesarse se almacenan junto con la parte correspondiente de la solución en la listaY
.La modificación de la entrada e inicialización de
K
yY
se realiza mediante el siguiente código:La modificación de entrada hace algo como lo siguiente. La entrada:
se transforma en:
Los valores tienen el siguiente significado:
-
Plataforma que aún debe visitarse=
Plataforma que ya no necesita ser visitadaM
Copa que se puede ingresar con la gravedad ajustada a "abajo"W
Copa que se puede ingresar con la gravedad configurada en "arriba"V
Es seguro mudarse a este lugar con la gravedad configurada en "abajo"A
Es seguro mudarse a este lugar con la gravedad configurada en "arriba"X
Es seguro moverse a este lugar independientemente de la configuración de gravedad6
Bola en un lugar que se marcaría comoV
9
Bola en un lugar que se marcaría comoA
0
Bola en un lugar que se marcaría comoX
La lógica es usar expresiones regulares para realizar los movimientos. En el ejemplo anterior, si la gravedad se configurara como "arriba", podemos reemplazar "9A" con "A9" con una expresión regular para mover la pelota hacia la derecha. Esto significa que al intentar aplicar la expresión regular podemos encontrar todos los movimientos posibles.
La función
X
realiza movimientos verticales de bolas en base a la configuración de la gravedad actual, almacena el resultado en las listas globalesK
yY
, y comprueba si se ha encontrado una solución.La función
(
implementa controles para los 4 botones direccionales / de gravedad. Los botones de gravedad se pueden presionar solo si la gravedad actual cambiaría y si la pelota está en un lugar seguro para cambiar la gravedad. Los botones de dirección solo se pueden presionar si es seguro moverse al lugar correspondiente.Finalmente el bucle principal. El primer elemento de
Y
se elimina repetidamente y se realizan comprobaciones de todos los movimientos posibles.fuente
Y
lista estará vacía, la ventana emergente arrojará un error y el#
ciclo finalizará.