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.
À 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, o
représentant un shubble, x
repré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 .........@...o....ooo..xox...
.
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 v
pour 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. ;)