La puesta en marcha
Considere una caja de forma extraña que contiene 29 celdas numeradas como se muestra en la Fig. 1 a continuación.
Dentro de esta caja 2D hay dos especies de animales de forma cuadrada: shubbles y smoles. La figura 1 (a) muestra algunos shubbles en azul y algunos smoles en rojo. Cada criatura ocupa exactamente una celda de cuadrícula. El cuadro puede contener entre 0 y 26 shubbles, pero siempre contendrá exactamente dos smoles.
Al estar sujetos a la gravedad, los shubbles y smoles se sientan en el fondo de la caja, apilándose encima de cualquier cosa debajo de ellos. Ambas especies son excepcionalmente perezosas y permanecen permanentemente inmóviles.
El cuadro también contiene un punto, representado como un cuadrado negro, que ocupa exactamente una celda de la cuadrícula. El stot no está sujeto a la gravedad.
La caja tiene una abertura ubicada en la parte inferior de la celda 28, como se muestra en la figura.
Para representar la configuración de shubbles, smoles y el stot en el cuadro textualmente, utilizamos una cadena de 29 caracteres, un carácter por celda de cuadrícula, en el orden enumerado, con .
una celda vacía, o
un shubble, x
un smole, y @
representando el stot. Por ejemplo, la configuración de la Fig. 1 (a) está representada por la cadena .........@...o....ooo..xox...
.
Manipulaciones
La caja se puede girar por cualquier múltiplo de 90 °. Mientras se gira la caja, los shubbles y smoles permanecen estacionarios dentro de sus celdas de cuadrícula. Tan pronto como se completa una rotación, caen directamente hacia abajo hasta que i ) están bloqueados por una pared debajo, ii ) están bloqueados por un shubble, smole o stot debajo, o iii ) caen a través del agujero en la celda 28 y sal de la caja. El stot no cae; permanece fijo en su celda actual, incluso si las criaturas descansan sobre ella.
La caja no puede girarse nuevamente hasta que las criaturas terminen de caer y hayan alcanzado una nueva configuración estable.
Textualmente, las rotaciones de caja se denotan +
para una rotación de 90 ° en sentido horario, |
para una rotación de 180 ° y -
para una rotación de 90 ° en sentido antihorario.
Además, el stot se puede mover en las cuatro direcciones de la brújula en incrementos de una celda de cuadrícula. Un movimiento no puede: i ) causar una colisión entre el stot y una criatura (es decir, la celda de la cuadrícula de destino debe estar vacía), ii ) causar una colisión entre el stot y una pared, ni iii ) hacer que el stot salga de la caja El agujero en la celda 28.
Además, el stot puede no moverse si tiene criaturas descansando encima (con respecto a la gravedad actual).
Textualmente, los movimientos de stot se denotan por <
izquierda, >
derecha, ^
arriba y v
abajo. Los movimientos de puntada siempre se especifican con respecto al marco "estándar" (no girado) representado en las figuras. Es decir, si el punto está en la celda 10, el movimiento ^
siempre lo moverá a la celda 5, y el movimiento >
siempre lo moverá a la celda 11. La orientación del cuadro no afecta la dirección del movimiento.
Las secuencias de manipulaciones se codifican utilizando cadenas de caracteres de izquierda a derecha. Por ejemplo, la cadena +<<^-
indica que la caja se gira 90 ° en el sentido de las agujas del reloj, luego el punto se mueve hacia la izquierda dos veces y hacia arriba una vez (con respecto al marco estándar), luego la caja se gira 90 ° en sentido antihorario de nuevo a su orientación original.
El reto
Por razones perfectamente buenas (que no puedo revelar), deseamos extraer todos los shubbles de la caja sin extraer un solo smole. Para lograr esto, podemos usar las manipulaciones específicamente descritas anteriormente.
Antes de resolver este problema, nos corresponde simular cómo nuestras diversas manipulaciones afectarán el contenido de la caja, que es el foco de este desafío.
Debe escribir un programa que acepte dos argumentos de stdin
(o equivalente):
- una cadena que describe el estado inicial de la caja
- una secuencia de manipulaciones
Puede suponer que ambos argumentos son sintácticamente válidos, que el cuadro comienza en la orientación estándar y que el estado inicial del cuadro es estable y legal.
El programa debe generar stdout
(o equivalente):
( caso 1 ) el estado final de la caja, expresado como una cadena, si la secuencia de movimientos es legal (no viola las reglas de movimiento de stot) y no hace que ningún smole salga de la caja. La orientación final de la caja no es importante.
( caso 2 ) un solo signo de exclamación
!
, si la secuencia de movimientos es ilegal o hace que los smoles salgan del cuadro
Puntuación
El programa ganador es el programa más corto por número de bytes , sujeto a algunos multiplicadores de bonificación extremadamente lucrativos:
reclame un multiplicador de 0.65 si en lugar de imprimir la salida codificada para el caso 1, el programa emite una imagen ASCII de la caja en su estado final y orientación, usando los caracteres de especificación para shubbles, smoles, stots y celdas vacías, y colocando un
*
en la celda justo afuera del agujero en la celda 28. Se ignora el espacio en blanco inicial y final.Por ejemplo, si la Fig. 1 (a) se gira 90 °, la salida sería
. . ..... .o... xo.@. *ooo.. x .
reclame un multiplicador de 0.22 si en lugar de imprimir la salida codificada para el caso 1, el programa emite un archivo de imagen o muestra una ventana GUI con una imagen de la caja en su estado final y orientación. La imagen debe estar en el estilo de la Fig. 1 (a), mostrando las celdas de la cuadrícula, las paredes y las criaturas / puntos usando cuadros de colores.
reclame un multiplicador de 0.15 si en lugar de imprimir la salida codificada para el caso 1, el programa genera una ventana animada .gif o GUI animada que muestra todos los estados intermedios en la simulación a intervalos de 1 segundo. Se aplican las mismas reglas de imagen que para el multiplicador 0.22. El primer cuadro de la animación debe representar el estado inicial de la simulación. Además, la animación debe mostrar estados intermedios "ocultos", que son
los shubbles / smoles caen en una configuración estable por una celda por cuadro de animación después de una rotación
El estado intermedio girado a 90 ° de la caja en una rotación de 180 °
reclame un multiplicador de 0.12 si el programa produce una ventana animada .gif o GUI animada del estilo anterior, pero se ejecuta a 20 fps y muestra
animaciones suaves y continuas de la caja girando
animaciones suaves y continuas del movimiento del stot y de los shubbles / smoles que caen en una configuración estable
Los shubbles que caen a través del agujero en la celda 28 deben mostrarse saliendo de la caja, y deben desaparecer una vez totalmente afuera. Puede elegir su propio momento para la animación siempre que no se realice más de 1 manipulación / seg.
La puntuación total es floor( base score * multiplier )
. Solo se puede reclamar un multiplicador.
Es un mundo sin humo después de todo. ;)