Codez un code Slidey Puzzle!


12

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 Tet un espace vide est l' Eun 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 Tont 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.txtou tout fva 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.

Connexes: Code qui exécute le jeu de la vie sur lui-même


Le programme doit donc fonctionner lorsqu'il n'y a que des espaces vides et pas de blocs de tuiles (et vice versa)?
grc

@grc Oui à votre première question, et rappelez-vous qu'il doit toujours demander une valeur de poussée même si elle est totalement vide ou pleine. Non, les blocs ne peuvent pas être identiques. Je suppose que si c'était le cas, vous pourriez prétendre avoir une réponse assez banale. Je vais donc le mentionner.
Calvin's Hobbies

Puis-je spécifier le nom du fichier source d'origine?
feersum

@feersum Comme pouvez-vous supposer que c'est toujours le cas f.txt? Oui.
Calvin's Hobbies

Les blocs de code ne seront-ils pas toujours constitués d'une seule ligne? Les blocs de code multilignes me semblent vraiment complexes et les langues 2D ne prennent probablement pas en charge l'écriture de fichiers.
Def

Réponses:


5

TECO , 153

Bloc vide:

0T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Bloc de tuile:

1T@^Ux#EBx#27@:^Ux##MxA1^QUq^T%d/51%w"G153UsZ/QqUlQq/153Un|Qq%s/153UlZ/QqUn'Qd&1UhQl<.UpQn<Qh-\"F%c'TRQs:C>QpJQn<D-%c"L%c1-Qh\|Qh\'RQs:C>Qw"GC|153%pJ'>EX

Le programme, qui se modifie sur place, doit être enregistré dans un fichier nommé x. Il peut être exécuté via la commande tecoc mung x.. Le point est important; sans lui, TECO a tenté de trouver un fichier nommé x.tec. La nouvelle ligne de fin doit être présente.

La restriction ASCII imprimable était un peu pénible pour celui-ci, car la langue utilise de nombreux caractères non imprimables. La plupart d'entre eux peuvent être remplacés par une séquence de deux octets commençant par un signe d'insertion, mais "Escape" (ASCII 27) est le seul caractère qui est "incontournable", donc pour l'obtenir, j'ai dû mettre sa valeur ASCII dans une chaîne et l'exécute. Ainsi, le 4 octets a EBx<Esc>explosé @^Ux#EBx#27@:^UX##Mx.

Cela pourrait être considérablement réduit, en particulier en divisant le programme en deux parties, en les stockant sous forme de chaînes et en ne les exécutant que si les deux sont présentes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.