Shubbles and Smoles - Parte I

10

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.

shubbles y smoles

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, oun shubble, xun smole, y @representando el stot. Por ejemplo, la configuración de la Fig. 1 (a) está representada por la cadena [email protected]....

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 vabajo. 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. ;)

COTO
fuente
2
+1 para la especificación, pero probablemente no participaré.
John Dvorak
Esto suena divertido. Solo para asegurarme: la forma de la caja es completamente fija, ¿sí? ¿Entonces no tenemos que dar cuenta de ninguna otra forma?
Ingo Bürk
@ IngoBürk: Correcto. La forma de la caja es fija.
COTO
Para la salida de la imagen, ¿podemos usar su imagen como un recurso (o cualquier tipo de recurso) o tenemos que dibujarla completamente en el código? Si podemos usarlo, ¿cómo cuenta? Intentaré intentarlo, pero ahora estoy de vacaciones.
Ingo Bürk
1
Puede utilizar recursos gráficos externos (p. Ej., Imágenes, marcado SVG) siempre que incluya sus recuentos de bytes en el total del programa. La imagen básica no tiene que ser terriblemente complicada. 12 líneas que forman la cuadrícula; la pared; y las cajas de colores dentro de la caja. Si lo prefiere, un cuadro de color puede llenar una celda de cuadrícula completa, y el muro puede trazar exactamente a lo largo del borde de las celdas más externas. Por lo tanto, toda la imagen se puede definir dibujando rectángulos, líneas y una polilínea en una cuadrícula de coordenadas cuadradas de 6x6.
COTO

Respuestas:

2

MATLAB, aún sin golf * 0.15

Sería genial si alguien pudiera arriesgarse a adivinar si esto funciona bien.

n = @()input('', 's');
E = @()fprintf('!');
M = zeros(7,9);
G = M;
I = [9:7:44 17:7:52 18:7:46 12:7:47 20:7:55];
M0 = M;
M0(I) = 1;
M([I 49]) = 1;
G(I) = n()-46;
trot = 0;
Xtr = [0 1-10i 11-7i 8+i];
X0 ='c66++66++oozzoozzn'-i*'YYNNAA--  ++88LLYY'-22+22i;
for a = [97 n()]
    a = find('-|+a^<v>'==a);
    if a<5
        R = @(m) rot90(m, a);
        G = R(G);
        [nr,nc] = size(G);
        M = R(M);
        M0 = R(M0);
        trot = mod(trot+a,4);
        X = exp(i*pi*trot/2)*X0 + 11*Xtr(trot+1);
    else
        z = find(G==18);
        J = z + [-nr,1]*[0,-1;1,0]^(trot+a)*[1;0];
        if ~M0(J) | G(J) | G(z+1)
            E();return
        end
        G(z) = 0;
        G(J) = 18;
    end
    fall = 1; 
    while fall
        clf
        plot(X/11,'k','LineW',3);
        for x = 2:nc; for y = 2:nr
             ch = G(y,x);
             if M0(y,x) 
                 rectangle('Po',[x,-y,1,1],'F',~ch|ch==[74 1 65]);
             end
        end;end
        pause(1);
        G2 = G;
        for r = nr-1:-1:2
            s = G2 > 30;
            f = G2(r,:) .* (s(r,:) & ~s(r+1,:) & M(r+1,:) & G(r+1,:)~=18);
            if r==size(G,1)-1 & any(f==74)
                E();return
            end
            G2(r:r+1,:) = G2(r:r+1,:) + [-f;f];
        end
        G2 = G2 .* M0;
        fall = any(any(G2 ~= G));
        G = G2;
    end 
end

Ejemplo de resultado final para algunos movimientos aleatorios:

[email protected]...
+>|<-v+^+

ingrese la descripción de la imagen aquí

Feersum
fuente
1
¿Podrías mostrar un GIF de la animación?
Martin Ender
¡Frio! Lo comprobaré esta noche (y publicaré algunos casos de prueba).
COTO
No es necesario que el programa muestre un .gif animado, pero si desea generar uno, feersum, este artículo explica cómo hacerlo fácilmente.
COTO