Sie befinden sich auf einer fortgeschrittenen intergalaktischen Raumstation. Ein Freund von Ihnen, der in der Studie der Schwerkraft mitspielt, hat soeben ein Spiel entwickelt, bei dem die Schwerelosigkeit zum Bewegen eines Balls verwendet wird.
Sie gibt Ihnen einen kleinen Controller mit vier Richtungspfeilen und einer labyrinthartigen Struktur, auf der links eine Kugel sitzt. Sie beginnt zu erklären, wie das Spiel funktioniert.
- Sie haben 2 Richtungstasten, links
<
und rechts>
. - Sie haben auch 2 Schwerkrafttasten nach oben
^
und untenv
(zumindest von Ihrem Bezugsrahmen) - Mit diesen Pfeiltasten bewegen Sie den Ball auf Ihrem Bildschirm.
"Nun gibt es einige Regeln, die befolgt werden müssen." Sie sagt
- Alle Plattformen müssen vor dem Erreichen des Bechers überquert werden
\ /
- Pfeile
< > ^ v
werden verwendet, um die Bewegung des Balls festzulegen - Die Schwerkraft ist
^ v
(auf und ab). Dies bewegt den Ball bis zur nächsten Plattform in dieser Richtung. (Die Entfernung wird nicht für Auf und Ab berechnet.) - Den Ball zu verlieren ist schlecht! Fallen Sie nicht über die Kante und wechseln Sie die Schwerkraft nicht zu früh, sodass Ihr Ball niemals eine Plattform erreicht
- Die Bewegung wird in Schritten von gezählt
< >
- Der Ball kann aus jeder Richtung in den Pokal gelangen, solange Regel 1 befolgt wird
- Sie müssen die Richtung der Schwerkraft angeben, damit Ihr Ball nicht wegschwimmt
- Die Bewegung kann zufällig sein, solange Regel 1 und Regel 4 befolgt werden
- Für Fälle, die nicht gelöst werden können, geben Sie False oder Invalid aus
Einfaches Beispiel für einen Ball, eine Plattform und eine Tasse:
v
o
---\ /
v>
o
---\ /
v>>
o
---\ /
v>>>
o
---\ /
v>>>>
---\o/
Beispiel für ein erneutes Überqueren derselben Plattform.
v
o
----
\ /-------
v>
o
----
\ /-------
v>>
o
----
\ /-------
v>>>
o
----
\ /-------
v>>>>
----
o
\ /-------
v>>>>>
----
o
\ /-------
v>>>>>>
----
o
\ /-------
v>>>>>>>
----
o
\ /-------
v>>>>>>>>
----
o
\ /-------
v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup
----
\o/-------
Beispiel für das Umschalten der Schwerkraft
v
--/ \
o
----
v>
--/ \
o
----
v>>
--/ \
o
----
v>>>
--/ \
o
----
v>>>^
--/ \
o
----
v>>>^>
--/ \
o
----
v>>>^>>
--/ \
o
----
v>>>^>>>
--/o\
----
Aufgabe
Ihre Aufgabe ist es, ein Programm zu erstellen, das eine ASCII-Darstellung eines Kurses als Eingabe verwendet. Geben Sie eine Reihe von Pfeilen aus, <>^v
die die Richtung und die Anziehungskraft darstellen, um einen Ball o
über alle platforms
in eine Tasse zu bewegen .
Es gelten die Standard-Code-Golfregeln
Testfälle
Eingabe (Eine Situation, in der die Schwerkraft umgeschaltet wird)
---- --/ \
--- --
o
------ -----
Ausgabe
^>>v>>>>>^>>>>>v>>>>^>>>
Eingang (Eine Situation, in der die Richtung gewechselt wird)
---
o
----
---
-----
--\ /
Ausgabe
v>>>>>>^>>>v<<<<<v>>>
Eingabe (Eine Situation, in der Sie zweimal über dieselbe Plattform fahren müssen)
o
------
------
------
\ /------
Ausgabe
v>>>>>><<<<<<>>>>>>><<<<<<
In schlimmen Fällen sollte das Programm für diese Fälle Falsy ausgeben
Keine Möglichkeit für den Ball, zur nächsten Plattform zu gelangen
o
--- ---
Der Ball würde in den Weltraum fliegen
---
o
---
Eine Situation, in der der Ball zum Pokal gelangt, aber nicht alle Plattformen überquert werden.
o
----
----
\ /----
quelle
Antworten:
Pyth, 431 Bytes
Dies ist mein erstes Pyth-Programm (tatsächlich ist dies mein erstes Programm in einer Code-Golf-Sprache), was bedeutet, dass es wahrscheinlich noch verbessert werden kann.
Probieren Sie es hier aus (der letzte Testfall dauert zu lange, er muss mit einer lokalen Pyth-Installation getestet werden).
Hex-Dump des Codes (
xxd -r <filename>
zum Dekodieren verwenden):Erläuterung
Die Hauptidee für dieses Programm bestand darin, reguläre Ausdrücke zu verwenden, um die Eingabe zu ändern. Aus Platzgründen sind alle diese regulären Ausdrücke in einer komprimierten Zeichenfolge enthalten. Der erste Schritt im Programm besteht darin, die Zeichenfolge zu dekomprimieren und in einzelne reguläre Ausdrücke und die entsprechenden Ersatzzeichenfolgen aufzuteilen.
Der Inhalt der Variablen
J
ist dann:Die Funktion
r
wendet Regex-Ersetzungen aus der imJ
Index gespeicherten ListeG
auf alle Zeichenfolgen in der Liste anH
. Es wird zurückgegeben, sobald eine der Zeichenfolgen geändert wurde.Die Funktion
i
ähnelt der Funktionr
mit 2 Unterschieden. Er wendet die Ersetzungen auf eine transponierte Liste an (vertikal statt horizontal). Es führt die Ersetzungen auch wiederholt durch, solange etwas geändert wird.Die Funktion
g
prüft, ob der reguläre Ausdruck aus der imJ
Index gespeicherten ListeG
in einer beliebigen Zeichenfolge in der Liste gefunden werden kannH
.Der Rest des Codes enthält die eigentliche Programmlogik. Es führt eine Breitensuche nach möglichen Bewegungen durch, bis eine Lösung gefunden wird. Die Position im Suchbaum wird eindeutig durch die Richtung der Schwerkraft und eine geänderte Kopie der Programmeingabe definiert. Um zu vermeiden, dass immer wieder dieselbe Position bearbeitet wird, werden bearbeitete Positionen in der globalen Liste gespeichert
K
. Positionen, die noch bearbeitet werden müssen, werden zusammen mit dem entsprechenden Teil der Lösung in der Liste gespeichertY
.Die Änderung der Eingabe und Initialisierung von
K
undY
wird mit folgendem Code durchgeführt:Die Eingabemodifikation macht ungefähr das Folgende. Die Eingabe:
wird umgewandelt in:
Die Werte haben folgende Bedeutung:
-
Plattform, die noch besucht werden muss=
Plattform, die nicht mehr besucht werden mussM
Tasse, die mit der Schwerkraft auf "unten" eingegeben werden kannW
Tasse, die mit der Schwerkraft auf "up" gestellt werden kannV
Sicher, an diesen Ort zu gelangen, wenn die Schwerkraft auf "down" gestellt istA
Sicher, an diesen Ort zu gelangen, wenn die Schwerkraft auf "hoch" eingestellt istX
Sie können sich sicher an diesen Ort bewegen, unabhängig von der Schwerkrafteinstellung6
Ball an einer Stelle, die als markiert wäreV
9
Ball an einer Stelle, die als markiert wäreA
0
Ball an einer Stelle, die als markiert wäreX
Die Logik verwendet reguläre Ausdrücke, um die Bewegungen auszuführen. Im obigen Beispiel können wir "9A" durch "A9" durch eine Regex ersetzen, um den Ball nach rechts zu bewegen. Das heißt, wenn wir versuchen, die Regex anzuwenden, können wir alle möglichen Bewegungen finden.
Die Funktion
X
führt vertikale Kugelbewegungen basierend auf der aktuellen Schwerkrafteinstellung aus, speichert das Ergebnis in globalen ListenK
undY
und prüft, ob eine Lösung gefunden wurde.Die Funktion führt
(
Überprüfungen für die 4 Richtungs- / Schwerkrafttasten durch. Die Schwerkrafttasten können nur gedrückt werden, wenn sich die aktuelle Schwerkraft ändern würde und wenn sich der Ball an einem sicheren Ort befindet, um die Schwerkraft zu ändern. Die Richtungstasten können nur gedrückt werden, wenn es sicher ist, an die entsprechende Stelle zu gelangen.Endlich die Hauptschleife. Das erste Element von
Y
wird wiederholt entfernt und es werden alle möglichen Züge überprüft.quelle
Y
Liste leer, der Popup wirft einen Fehler und die#
Schleife endet.