Le puzzle coulissant le plus reconnaissable est le puzzle de quinze . Il a une grille 4 x 4, 15 tuiles et un espace de grille vide. Les tuiles ne peuvent se déplacer que dans l'espace vide et doivent toujours être alignées avec la grille.
Nous allons définir un puzzle coulissant généralisée comme deux dimensions W large par H haute grille ( W , H les deux des nombres entiers positifs) qui contient un certain nombre de non marqués identiques tuiles (entre 0 et W × H d'entre eux) encliqueté sur la grille, disposées en de toute façon (sans se chevaucher), avec des espaces de grille vides remplissant le reste de la zone.
Par exemple, si W et H sont 3 et une tuile est T
et un espace vide est l' E
un des nombreux arrangements possibles de puzzle de parement est
TTT
TET
EET
Pour ces puzzles, il y a 4 mouvements possibles: pousser tout vers le haut , tout pousser vers le bas , tout pousser vers la gauche ou tout pousser vers la droite . «Pousser» dans une certaine direction fait que toutes les tuiles voyagent dans cette direction autant que possible jusqu'à ce qu'elles touchent une autre tuile ou la limite de la grille. Parfois, bousculer ne changera pas la disposition de la grille,
Si l'exemple de grille est poussé à droite, le résultat est
TTT
ETT
EET
Poussé à gauche le résultat est
TTT
TTE
TEE
Poussé le résultat est
EET
TET
TTT
(remarquez que les deux plus à gauche T
ont bougé)
Le fait de remonter ne modifie pas la disposition de la grille dans ce cas.
Notez que comme les tuiles sont indiscernables, ces puzzles n'ont pas d'états «résolus». Notez également qu'un casse-tête peut commencer dans une mise en page qui est impossible de revenir à une fois qu'une poussée a été faite (par exemple une tuile au milieu d'une grille 3 x 3).
Défi
En utilisant uniquement l' ASCII imprimable, écrivez deux blocs rectangulaires de code, à la fois M caractères de large et N caractères de haut (pour tout entier positif M , N ). Un bloc de code représentera une tuile d'un puzzle coulissant, l'autre bloc de code représentera un espace de grille vide.
La disposition de ces deux blocs de code dans une grille W par H créera un puzzle coulissant représenté par un code qui peut être enregistré sous forme de fichier texte et exécuté comme un programme normal. Lors de leur exécution, ce type de programmes devrait inviter l'utilisateur via stdin à saisir un nombre compris entre 1 et 4; 1 est pour haut, 2 bas, 3 gauche, 4 droite . Lorsque l'utilisateur tape son nombre et frappe, le programme calcule comment pousser ses tuiles de code source dans cette direction et enregistre la nouvelle disposition du puzzle dans un fichier (soit un nouveau fichier, soit dans le même fichier), puis se termine.
Ce processus peut être répété indéfiniment avec le nouveau fichier de code de puzzle coulissant généré après chaque poussée.
Exemple
Supposons que mon bloc de code de tuile ressemble à ceci
// my
// tile
et mon bloc de code d'espace de grille vide ressemble à ceci
//empty
//space
( M = 7, N = 2, ce n'est bien sûr pas du code réel)
Tout arrangement de puzzle coulissant valide de ces deux blocs devrait créer un programme dans la langue que j'utilise qui peut être exécuté pour permettre à l'utilisateur de pousser dans une certaine direction.
La représentation du code de l'exemple de grille est:
// my// my// my
// tile// tile// tile
// my//empty// my
// tile//space// tile
//empty//empty// my
//space//space// tile
Donc, en exécutant cela et en appuyant sur 2 (vers le bas), puis sur Entrée écrirait ceci dans un autre fichier (ou le même fichier):
//empty//empty// my
//space//space// tile
// my//empty// my
// tile//space// tile
// my// my// my
// tile// tile// tile
Ce fichier pourrait ensuite être exécuté et poussé de la même manière exacte.
Remarques
Toute représentation de code d'un puzzle coulissant W by H doit être exécutable et pouvoir se propager correctement. Cela inclut toutes les tailles de grille de 1 par 1 à un maximum raisonnable (2 16 par 2 16 ou plus).
Un programme peut lire son propre code source. Il n'y a aucune restriction basée sur le quine. Les commentaires de toute sorte sont également très bien.
Le programme doit demander une direction à enfoncer même s'il n'y a pas de tuiles à pousser ou qu'aucune tuile ne peut être poussée. L'invite est simplement un endroit pour taper un numéro, aucun message n'est requis.
Vous pouvez supposer que l'entrée est toujours valide (1, 2, 3 ou 4).
Remplir vos blocs de code avec des espaces est très bien. N'oubliez pas qu'ils ne peuvent être imprimables qu'en ASCII, cela signifie qu'il n'y a pas d'onglets ni de retours à la ligne (à part les retours à la ligne qui aident à former les blocs de code).
Si votre langue ne prend pas en charge stdin, utilisez la méthode de saisie la plus proche.
Vous pouvez exiger qu'une nouvelle ligne soit à la fin de vos fichiers de puzzle de code. (Ou exigez qu'il ne soit pas là.)
La façon dont vous nommez les nouveaux fichiers n'est pas importante.
f.txt
ou toutf
va bien.Les deux blocs de code peuvent ne pas être identiques.
Notation
L'objectif est de le faire avec la plus petite taille de code (c'est pourquoi il s'agit du code-golf balisé). La soumission avec la plus petite zone de bloc de code ( M × N ) est gagnante. Le bris d'égalité va à la réponse la plus votée.
f.txt
? Oui.