Code ein Code Slidey Puzzle!

12

Das bekannteste Schiebepuzzle ist das Fünfzehn-Puzzle . Es hat ein 4 x 4-Raster, 15 Kacheln und ein leeres Rasterfeld. Die Kacheln können sich nur in den leeren Raum bewegen und müssen immer im Raster liegen.

Lassen Sie uns definieren eine verallgemeinerte Schiebepuzzle als zweidimensionale W breit durch H hohe Gitter ( W , H beide positive ganze Zahlen sind ), die eine gewisse Anzahl von enthält identischen unmarkierten Kacheln (zwischen 0 und W × H von ihnen) aufgeschnappt zu dem Gitter, angeordnet in auf irgendeine Weise (ohne Überlappung), wobei leere Gitterräume den Rest des Bereichs ausfüllen.

Zum Beispiel, wenn W und H 3 sind und eine Kachel ist Tund ein leerer Raum Eeine von vielen möglichen Nebengleis-Puzzle-Anordnungen ist

TTT
TET
EET

Für diese Puzzles gibt es 4 mögliche Züge: Schübe alles nach oben , shove alles nach unten , shove alles links oder Schub alles richtig . Wenn Sie in eine Richtung „schieben“, bewegen sich alle Kacheln so weit wie möglich in diese Richtung, bis sie auf eine andere Kachel oder die Gittergrenze treffen. Manchmal ändert das Schieben nicht das Layout des Gitters,

Wenn das Beispielraster nach rechts verschoben wird, ist das Ergebnis

TTT
ETT
EET

Links geschoben ist das Ergebnis

TTT
TTE
TEE

Heruntergeschoben ist das Ergebnis

EET
TET
TTT

(Beachten Sie, dass sich beide ganz links Tbewegen)

Durch das Hochschieben wird in diesem Fall das Rasterlayout nicht geändert.

Beachten Sie, dass diese Rätsel keine gelösten Zustände haben, da die Kacheln nicht zu unterscheiden sind. Beachten Sie auch, dass ein Rätsel möglicherweise in einem Layout beginnt, zu dem Sie nicht mehr zurückkehren können, nachdem Sie einen Stoß ausgeführt haben (z. B. eine Kachel in der Mitte eines 3 x 3-Rasters).

Herausforderung

Verwenden Sie nur druckbares ASCII, und schreiben Sie zwei rechteckige Codeblöcke mit einer Breite von M Zeichen und einer Höhe von N Zeichen (für alle positiven ganzen Zahlen M , N ). Ein Codeblock repräsentiert eine Kachel eines Schiebepuzzles, der andere Codeblock repräsentiert ein leeres Gitterfeld.

Durch die Anordnung dieser beiden Codeblöcke in einem W- by- H- Raster wird ein Code-dargestelltes Schiebepuzzle erstellt, das als Textdatei gespeichert und als normales Programm ausgeführt werden kann. Beim Ausführen sollten solche Programme den Benutzer über stdin zur Eingabe einer Zahl von 1 bis 4 auffordern. 1 ist für oben, 2 unten, 3 links, 4 rechts . Wenn der Benutzer die Anzahl und die Treffer eingibt, berechnet das Programm, wie die Quellcode-Kacheln in diese Richtung verschoben werden, speichert das neue Puzzle-Layout in einer Datei (entweder in einer neuen Datei oder in derselben Datei) und endet dann.

Dieser Vorgang kann mit der neuen Schiebepuzzle-Codedatei, die nach jedem Stoß generiert wird, auf unbestimmte Zeit wiederholt werden.

Beispiel

Angenommen, mein Kachelcodeblock sieht so aus

//   my
// tile

und mein leerer Gitterraum-Codeblock sieht so aus

//empty
//space

( M = 7, N = 2, das ist natürlich kein tatsächlicher Code)

Jede gültige Schiebepuzzle-Anordnung dieser beiden Blöcke sollte ein Programm in der von mir verwendeten Sprache erstellen, das ausgeführt werden kann, um den Benutzer in eine Richtung zu bewegen.

Die Codedarstellung des Beispielgitters lautet:

//   my//   my//   my
// tile// tile// tile
//   my//empty//   my
// tile//space// tile
//empty//empty//   my
//space//space// tile

Wenn Sie dies ausführen und 2 (nach unten) drücken, schreibt die Eingabetaste dies in eine andere Datei (oder dieselbe Datei):

//empty//empty//   my
//space//space// tile
//   my//empty//   my
// tile//space// tile
//   my//   my//   my
// tile// tile// tile

Diese Datei könnte dann genauso ausgeführt und verschoben werden.

Anmerkungen

  • Jede Code-Darstellung eines W- durch- H- Schiebepuzzles sollte ausführbar sein und sich selbst richtig schieben können. Dies schließt alle Rastergrößen von 1 zu 1 bis zu einem angemessenen Maximum (2 zu 16 zu 2 zu 16 oder mehr) ein.

  • Ein Programm kann seinen eigenen Quellcode lesen. Es gibt keine quine-basierten Einschränkungen. Kommentare jeglicher Art sind ebenfalls in Ordnung.

  • Das Programm muss nach einer Richtung fragen, in die es sich schieben lässt, auch wenn keine Kacheln zu schieben sind oder keine Kacheln geschoben werden können. Die Eingabeaufforderung ist einfach ein Ort, an dem Sie eine Nummer eingeben können. Es ist keine Nachricht erforderlich.

  • Sie können davon ausgehen, dass die Eingabe immer gültig ist (1, 2, 3 oder 4).

  • Das Auffüllen Ihrer Codeblöcke mit Leerzeichen ist in Ordnung. Denken Sie daran, dass sie nur druckbares ASCII sein können, dh keine Tabulatoren und keine Zeilenumbrüche (außer den Zeilenumbrüchen, die zur Bildung der Codeblöcke beitragen).

  • Wenn Ihre Sprache stdin nicht unterstützt, verwenden Sie die Eingabemethode, die Ihnen am nächsten erscheint.

  • Sie können verlangen, dass eine neue Zeile am Ende Ihrer Code-Puzzle-Dateien steht. (Oder verlangen, dass es nicht da ist.)

  • Wie Sie neue Dateien benennen, ist nicht wichtig. f.txtoder ist einfach fin Ordnung.

  • Die beiden Codeblöcke dürfen nicht identisch sein.

Wertung

Das Ziel ist es, dies mit der kleinsten Codegröße zu tun (weshalb dies mit Code-Golf gekennzeichnet ist). Die Einsendung mit der kleinsten Codeblockfläche ( M × N ) ist der Gewinner. Tie-Breaker geht an die am höchsten bewertete Antwort.

Verwandte: Code, der das Spiel des Lebens auf sich selbst ausführt

Calvins Hobbys
quelle
Das Programm muss also funktionieren, wenn nur Leerzeichen und keine Kachelblöcke vorhanden sind (und umgekehrt)?
Grc
@grc Ja zu Ihrer ersten Frage, und denken Sie daran, dass Sie immer noch zur Eingabe eines Schubwerts aufgefordert werden müssen, auch wenn dieser leer oder voll ist. Nein, die Blöcke können nicht identisch sein. Ich denke, wenn sie es wären, könnten Sie behaupten, eine ziemlich triviale Antwort zu haben. Also werde ich das erwähnen.
Calvins Hobbys
Kann ich den Namen der ursprünglichen Quelldatei angeben?
Feersum
@feersum Wie kannst du davon ausgehen, dass es immer so ist f.txt? Ja.
Calvins Hobbys
Sind Codeblöcke nicht immer eine Zeile? Mehrzeilige Codeblöcke erscheinen mir sehr komplex und 2D-Sprachen unterstützen das Schreiben von Dateien wahrscheinlich nicht.
Def

Antworten:

5

TECO , 153

Leerer Block:

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

Fliesenblock:

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

Das Programm, das sich selbst ändert, muss in einer Datei mit dem Namen gespeichert werden x. Es kann über den Befehl ausgeführt werden tecoc mung x.. Der Punkt ist wichtig; ohne sie hat TECO versucht, eine Datei mit dem Namen zu finden x.tec. Die nachfolgende Newline muss vorhanden sein.

Die Einschränkung für druckbare ASCII-Zeichen war für dieses Beispiel etwas schwierig, da in der Sprache viele nicht druckbare Zeichen verwendet werden. Die meisten können durch eine Zwei-Byte-Sequenz ersetzt werden, die mit einem Caret beginnt, aber "Escape" (ASCII 27) ist das einzige Zeichen, das "unvermeidlich" ist. Um dies zu erreichen, musste ich den ASCII-Wert in einen String und eingeben führe es aus. So EBx<Esc>explodierte das 4-Byte in @^Ux#EBx#27@:^UX##Mx.

Dies kann erheblich reduziert werden, indem das Programm in zwei Teile aufgeteilt, als Zeichenfolgen gespeichert und nur ausgeführt wird, wenn beide vorhanden sind.

Feersum
quelle