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 T
und ein leerer Raum E
eine 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 T
bewegen)
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.txt
oder ist einfachf
in 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
f.txt
? Ja.