Shubbles and Smoles - Part I

10

La mise en place

Considérez une boîte de forme étrange contenant 29 cellules numérotées comme le montre la figure 1 ci-dessous.

chaumes et smoles

À l'intérieur de cette boîte 2D se trouvent deux espèces d'animaux de forme carrée: les chaumes et les smoles. La figure 1 (a) montre quelques galets en bleu et quelques smoles en rouge. Chaque créature occupe exactement une cellule de grille. La boîte peut contenir entre 0 et 26 shubbles, mais contiendra toujours exactement deux smoles.

Soumis à la gravité, les galets et les smoles sont assis au fond de la boîte, s'empilant sur tout ce qui se trouve en dessous d'eux. Les deux espèces sont exceptionnellement paresseuses et restent perpétuellement immobiles.

La boîte contient également un stot, représenté comme un carré noir, qui occupe exactement une cellule de la grille. Le stot n'est pas soumis à la gravité.

La boîte a une ouverture située au bas de la cellule 28, comme illustré sur la figure.

Pour représenter textuellement la configuration des shubbles, smoles et le stot dans la boîte, nous utilisons une chaîne de 29 caractères, un caractère par cellule de grille, dans l'ordre énuméré, avec .représentant une cellule vide, oreprésentant un shubble, xreprésentant un smole, et @représentant le stot. Par exemple, la configuration de la figure 1 (a) est représentée par la chaîne [email protected]....

Manipulations

La boîte peut être tournée de n'importe quel multiple de 90 °. Pendant que la boîte tourne, les chaumes et les smoles restent immobiles dans leurs cellules de grille. Dès qu'une rotation est terminée, ils tombent directement vers le bas jusqu'à ce que i ) ils soient bloqués par un mur ci-dessous, ii ) ils soient bloqués par un chaume, smole ou stot ci-dessous, ou iii ) ils tombent à travers le trou dans la cellule 28 et quittez la boîte. Le stot ne tombe pas; il reste fixe dans sa cellule actuelle, même si des créatures reposent dessus.

La boîte ne peut plus être tournée jusqu'à ce que les créatures soient tombées et aient atteint une nouvelle configuration stable.

Textuellement, les rotations de boîte sont désignées par +pour une rotation de 90 ° dans le sens horaire, |pour une rotation de 180 ° et -pour une rotation de 90 ° dans le sens antihoraire.

De plus, le stot peut être déplacé dans les quatre directions de la boussole par incréments d'une cellule de grille. Un mouvement ne peut pas: i ) provoquer une collision entre le stot et une créature (c'est-à-dire que la cellule de la grille de destination doit être vide), ii ) provoquer une collision entre le stot et un mur, ni iii ) amener le stot à sortir de la boîte par le trou dans la cellule 28.

De plus, le stot ne peut pas bouger s'il a des créatures reposant dessus (par rapport à la gravité actuelle).

Textuellement, les mouvements de stot sont désignés par <pour gauche, >pour droite, ^pour haut et vpour bas. Les mouvements de Stot sont toujours spécifiés par rapport au cadre "standard" (non pivoté) représenté sur les figures. Autrement dit, si le stot se trouve dans la cellule 10, le déplacement le déplacera ^toujours vers la cellule 5, et le déplacement le déplacera >toujours vers la cellule 11. L'orientation de la boîte n'affecte pas la direction du déplacement.

Les séquences de manipulations sont codées à l'aide de chaînes de caractères de gauche à droite. Par exemple, la chaîne +<<^-indique que la boîte est tournée de 90 ° dans le sens des aiguilles d'une montre, puis le stot est déplacé deux fois vers la gauche et une fois vers le haut (par rapport au cadre standard), puis la boîte est pivotée de 90 ° dans le sens inverse des aiguilles d'une montre dans son orientation d'origine.

Le défi

Pour de très bonnes raisons (que je ne peux pas divulguer), nous souhaitons extraire tous les shubbles de la boîte sans extraire un seul smole. Pour ce faire, nous pouvons utiliser les manipulations spécifiquement décrites ci-dessus.

Avant de résoudre ce problème, il nous appartient de simuler comment nos différentes manipulations affecteront le contenu de la boîte, qui est au centre de ce défi.

Vous devez écrire un programme qui accepte deux arguments de stdin(ou équivalent):

  • une chaîne décrivant l'état initial de la boîte
  • une séquence de manipulations

Vous pouvez supposer que les deux arguments sont syntaxiquement valides, que la boîte démarre dans l'orientation standard et que l'état initial de la boîte est stable et légal.

Le programme doit sortir vers stdout(ou équivalent) soit:

  • ( cas 1 ) l'état final de la boîte, exprimé sous forme de chaîne, si la séquence de mouvements est légale (elle ne viole pas les règles de déplacement stot) et ne fait pas sortir de smoles la boîte. L'orientation finale de la boîte n'a pas d'importance.

  • ( cas 2 ) un seul point d'exclamation !,, si la séquence de mouvements est illégale ou fait sortir des smoles de la boîte

Notation

Le programme gagnant est le programme le plus court par nombre d'octets , soumis à des multiplicateurs de bonus extrêmement lucratifs:

  • revendiquez un multiplicateur de 0,65 si au lieu d'imprimer la sortie codée pour le cas 1, le programme génère une image ASCII de la boîte dans son état et son orientation finaux, en utilisant les caractères spécifiés pour les shubbles, les smoles, les stots et les cellules vides, et en plaçant un *dans la cellule juste à l'extérieur du trou dans la cellule 28. Les espaces blancs avant et arrière sont ignorés.

    Par exemple, si la figure 1 (a) est tournée de 90 °, la sortie serait

       .  .
      .....
      .o...
      xo.@.
     *ooo..
      x  .
    
  • revendiquez un multiplicateur de 0,22 si au lieu d'imprimer la sortie codée pour le cas 1, le programme génère un fichier image ou affiche une fenêtre GUI avec une image de la boîte dans son état et son orientation finaux. L'image doit être dans le style de la figure 1 (a), montrant les cellules de la grille, les murs et les créatures / stot en utilisant des boîtes colorées.

  • revendiquez un multiplicateur de 0,15 si, au lieu d'imprimer une sortie codée pour le cas 1, le programme génère une fenêtre .gif animée ou une interface graphique animée montrant tous les états intermédiaires de la simulation à des intervalles de 1 s. Les mêmes règles d'image que pour le multiplicateur de 0,22 s'appliquent. La première image de l'animation doit représenter l'état initial de la simulation. De plus, l'animation doit montrer des états intermédiaires "cachés", qui sont

    • les shubbles / smoles tombant dans une configuration stable d'une cellule par image d'animation après une rotation

    • l'état intermédiaire de 90 ° du boîtier dans une rotation de 180 °

  • revendiquez un multiplicateur de 0,12 si le programme produit une fenêtre .gif animée ou une interface graphique animée du style ci-dessus, mais s'exécute à 20 ips et affiche

    • animations fluides et continues de la boîte en rotation

    • animations fluides et continues du stot en mouvement et des shubbles / smoles tombant dans une configuration stable

    Les galets tombant à travers le trou de la cellule 28 doivent être montrés sortant de la boîte et doivent disparaître une fois totalement à l'extérieur. Vous pouvez choisir votre propre timing pour l'animation tant qu'il n'y a pas plus de 1 manipulation / sec.

Le score total est floor( base score * multiplier ). Un seul multiplicateur peut être réclamé.

C'est un monde fou après tout. ;)

COTO
la source
2
+1 pour la spécification, mais je ne participerai probablement pas.
John Dvorak du
Cela semble amusant. Juste pour être sûr: la forme de la boîte est entièrement fixe, oui? Nous n'avons donc pas à tenir compte d'autres formes?
Ingo Bürk,
@ IngoBürk: Correct. La forme de la boîte est fixe.
COTO
Pour la sortie d'image, pouvons-nous utiliser votre image comme ressource (ou tout autre type de ressource) ou devons-nous la dessiner entièrement dans le code? Si nous pouvons l'utiliser, comment ça compte? Je vais essayer de tenter le coup, mais je suis en vacances en ce moment.
Ingo Bürk
1
Vous pouvez utiliser des ressources graphiques externes (par exemple des images, du balisage SVG) tant que vous incluez leur nombre d'octets dans le total du programme. L'image de base ne doit pas être terriblement compliquée. 12 lignes constituant la grille; le mur; et les boîtes colorées à l'intérieur de la boîte. Si vous préférez, une boîte colorée peut remplir toute une cellule de la grille et le mur peut tracer exactement le long de la bordure des cellules les plus externes. Ainsi, l'image entière peut être définie en dessinant des rectangles, des lignes et une polyligne sur une grille de coordonnées carrées 6x6.
COTO

Réponses:

2

MATLAB, non encore golfé * 0,15

Ce serait formidable si quelqu'un pouvait risquer de deviner si cela fonctionne 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

Exemple de résultat final pour certains mouvements aléatoires:

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

entrez la description de l'image ici

feersum
la source
1
Pourriez-vous réellement montrer un GIF de l'animation?
Martin Ender
Cool! Je vais le vérifier ce soir (et poster quelques cas de test).
COTO
Le programme n'est pas obligé de produire un .gif animé, mais si vous voulez en générer un, feersum, cet article explique comment le faire facilement.
COTO