Eingang:
Ein Labyrinth mit den Zeichen:
--
(horizontale Wand);|
(vertikale Wand);+
(Verbindung);(Gehfläche);
I
(Eingang);U
(Ausfahrt).
Dh eine Eingabe könnte so aussehen:
+--+--+--+--+--+--+--+--+--+--+
I | | |
+ +--+--+--+ + + + +--+ +
| | | | | |
+--+--+--+ +--+--+ + + +--+
| | | | |
+ +--+--+ + +--+--+ +--+ +
| | | | | |
+--+ + +--+--+ +--+--+ + +
| | | | | |
+ +--+--+--+ +--+--+ + + +
| | | | | |
+--+ + +--+--+ +--+--+--+--+
| | | | |
+ + +--+--+--+ +--+ + + +
| | | | | | | |
+--+--+ + +--+ + + +--+ +
| | | | | |
+ +--+--+--+ + + + + +--+
| | | | U
+--+--+--+--+--+--+--+--+--+--+
Ausgabe:
Der effizienteste Weg vom Eingang zu bekommen , um den Ausgang des Labyrinths (durch das Labyrinth), angedeutet durch die Zeichen anzeigt , links, rechts, oben und unten gehen sollte (dh >
; <
; ^
; v
).
Herausforderungsregeln:
- Sie können die Eingabe in jedem vernünftigen Format vornehmen. String-Array, Single-String mit Zeilenumbrüchen, 2D-Char-Array usw. sind mögliche Eingabeformate.
- Die Ausgabe kann aus vier verschiedenen Zeichen bestehen. Das heißt
><^v
;→←↑↓
;⇒⇐⇑⇓
;RLUD
;0123
;ABCD
; etc.). - Sie können Leerzeichen oder Zeilenumbrüche in die Ausgabe einfügen, wenn Sie dies bevorzugen. Dies ist optional.
- Die Schritte werden pro Quadrat gezählt (siehe vier
+
Symbole für die Quadrate) und nicht pro Zeichen. - Das Labyrinth kann eine Größe von 5 x 5 bis 15 x 15 haben und wird immer ein Quadrat sein (es gibt also keine Testfälle für 5 x 10 Labyrinthe).
- Sie können davon ausgehen, dass jedes Labyrinth von Anfang bis Ende einen oder mehrere gültige Pfade hat, und Sie geben immer den kürzesten aus (siehe Testfälle 4 und 5).
- Wenn es mehrere Pfade mit derselben Länge gibt, können Sie auswählen, welche ausgegeben werden sollen (siehe Testfall 6).
- Sie können die Grenzen des Labyrinths nicht überschreiten (siehe Testfälle 7 und 8).
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle:
1. Input:
+--+--+--+--+--+--+--+--+--+--+
I | | |
+ +--+--+--+ + + + +--+ +
| | | | | |
+--+--+--+ +--+--+ + + +--+
| | | | |
+ +--+--+ + +--+--+ +--+ +
| | | | | |
+--+ + +--+--+ +--+--+ + +
| | | | | |
+ +--+--+--+ +--+--+ + + +
| | | | | |
+--+ + +--+--+ +--+--+--+--+
| | | | |
+ + +--+--+--+ +--+ + + +
| | | | | | | |
+--+--+ + +--+ + + +--+ +
| | | | | |
+ +--+--+--+ + + + + +--+
| | | | U
+--+--+--+--+--+--+--+--+--+--+
1. Output:
>v>>>vv<v>>v>v>>vvv>>>
2. Input:
+--+--+--+--+--+
I | | |
+ +--+--+ + +
| | | |
+ +--+ + + +
| | | | |
+ + +--+ + +
| | |
+--+ + +--+--+
| | U
+--+--+--+--+--+
2. Output:
>vvv>>v>>>
3. Input:
+--+--+--+--+--+
U | |
+ + +--+--+ +
| | | |
+--+--+ + +--+
| | |
+ +--+--+--+ +
| | | |
+ + + + +--+
| | I
+--+--+--+--+--+
3. Output:
<<<^<v<^^>>^<^<<
4. Input (test case with two valid paths):
+--+--+--+--+--+
U | |
+ + +--+--+ +
| | |
+--+--+ + +--+
| | |
+ +--+--+--+ +
| | | |
+ + + + +--+
| | I
+--+--+--+--+--+
4. Output:
<<^>^<^<<^<< (<<<^<v<^^>>^<^<< is less efficient, and therefore not a valid output)
5. Input (test case with two valid paths):
I
+--+--+--+--+--+--+--+--+--+--+ +--+--+--+--+
| | | | |
+ + + +--+--+--+ + +--+--+ +--+--+ + +
| | | | | | | |
+--+--+--+ +--+ + +--+--+--+--+ +--+--+--+
| | | | | | | | |
+ + + + + +--+ + + + +--+--+ +--+ +
| | | | | | | |
+ +--+--+--+ +--+--+ + +--+ +--+--+ +--+
| | | | | | | | |
+ +--+ + +--+ +--+--+ +--+--+ + +--+ +
| | | | | | |
+ + +--+--+--+--+ + +--+--+--+ +--+ +--+
| | | | | | | |
+--+--+--+ + +--+--+ +--+ + +--+ +--+ +
| | | | | | | |
+ +--+--+--+--+ + + +--+--+--+ + + + +
| | | | | | | | | |
+--+ + + + + + +--+--+ + + +--+ + +
| | | | | | | | | |
+--+ +--+--+ + + + +--+--+--+ + + + +
| | | | | | | | | |
+ +--+ +--+--+ + +--+--+ + +--+ + + +
| | | | | | | | | |
+--+--+--+ + + +--+ + +--+--+ +--+ + +
| | | | | | | |
+ + +--+--+--+--+ +--+--+ +--+--+ +--+ +
| | | | | |
+ + + +--+--+--+--+--+--+--+--+ +--+ +--+
| | | |
+--+--+--+--+--+--+--+--+--+ +--+--+--+--+--+
U
5. Output:
v<<<v<vv<<v<v>>^>>^^>vvv>>>v>vv<vv<<v<v<^<^^^^<vvvvv<^<v<<v>v>>>>>>>v (v<<<v<vv<<v<v>>^>>^^>vvv>>>v>vv<vv<<v<v<^<^^^^<vvvvv>v>>>^>>^>^^>vvv<v<v<<v is less efficient, and therefore not a valid output)
6. Input:
+--+--+--+--+--+
I |
+ + + + + +
| |
+ + + + + +
| |
+ + + + + +
| |
+ + + + + +
| U
+--+--+--+--+--+
6. Output:
>>v>v>v>v> or >v>v>v>v>> or >>>>>vvvv> or etc. (all are equally efficient, so all 10-length outputs are valid)
7. Input:
I U
+ + +--+--+--+
| | | |
+ +--+--+ + +
| | | |
+--+ + +--+ +
| | | |
+ +--+ + + +
| | |
+--+ +--+--+ +
| | |
+--+--+--+--+--+
7. Output:
vv>v>^>^<<^
8. Input:
+--+--+--+--+--+
| | |
+ +--+ +--+ +
I | | | |
+ + +--+ + +
U | | | |
+--+--+ + + +
| | | |
+ +--+--+--+ +
|
+--+--+--+--+--+
8. Output:
>v<
Labyrinthe, die mit diesem Tool erstellt wurden (und in einigen Fällen geringfügig geändert wurden).
code-golf
path-finding
maze
Kevin Cruijssen
quelle
quelle
v<<<<<<^^^^^
(Denken Sie immer über den Tellerrand hinaus)>v>>>vv<v>>v>v>>vvv>>>
.Antworten:
Retina ,
338281275273261 BytesProbieren Sie es online!
Anmerkungen
0x20
)·
sowohl in dieser Antwort als auch in der TIO-Verknüpfung durch interpunct ( ) ersetzt . Das Programm funktioniert einwandfrei, wenn die Leerzeichen wiederhergestellt sind.AvKr
für oben, unten, links und rechts. Diese können außer durch beliebige Buchstaben ersetzt werdenI
.Für den 15 × 15-Testfall benötigt TIO ungefähr 40 Sekunden. Sei geduldig.Überarbeitung des Teils, um den kürzesten Weg zu finden, sobald der Weg den Ausgang erreicht. Es stellte sich heraus, dass das viel Zeit in Anspruch nahm.Erläuterung
Das Programm besteht aus 3 Phasen:
Format
Da das ursprüngliche Labyrinthformat ziemlich unhandlich ist, konvertiert der erste Teil des Programms es in ein anderes Format.
Zellen
Im Originalformat wird jede Zelle als 2 × 3-Region dargestellt:
Da die rechte Spalte keine Informationen enthält, identifiziert das Programm Zellen als 2 × 2-Bereiche mit einem
+
oben links.Dies lässt uns mit 3 Arten von Zellen:
U
in Testfall 1 in einer R-Zelle.Im neuen Format werden Zellen als Zeichenfolge variabler Länge dargestellt:
Die linke und obere Wand werden aus dem Originalformat kopiert. Die Spaltennummer basiert auf der horizontalen Position der Zelle und dient zur Ausrichtung (Identifizierung von Zellen direkt übereinander / untereinander). Pfad ist eine alphabetische Zeichenfolge, die während der Füllphase verwendet wird, um den kürzesten Pfad zum Erreichen dieser Zelle zu speichern. Pfad- und Ausgangsmarkierung werden weiter erläutert.
Halbzellen
Obwohl die meisten Labyrinthe Zellen sind, gibt es Regionen im Labyrinth, die keine Zellen sind:
+
s entlang der rechten Wand keine Zellen, da sie sich in der letzten Spalte befinden.+
links von ihnen keine vorhanden sind . Beispielsweise befindet sich der EingangI
in Testfall 1 in einer L-Halbzelle.Technisch gesehen befinden sich T-Halbzellen oberhalb des Labyrinths (wenn es einen oberen Abstand gibt) und B-Halbzellen (entlang der unteren Wand, wenn es keinen unteren Abstand gibt), aber sie werden nicht im neuen Format dargestellt.
Die oberste Zeile einer Halbzelle wird entfernt, wenn Vollzellen in derselben Zeile erstellt werden. Daher werden Halbzellen im neuen Format wie dargestellt
Eine R-Halbzelle ist eben
|
. Eine L-Halbzelle hat genauI
wie der Pfad nur die Ausgangsmarkierung und einen leeren Pfad oder nur eine leere Wand.Ein- und Ausgänge
Befindet sich der Eingang links, rechts oder unten im Labyrinth, wird die Eingangsmarkierung
I
natürlich als Pfad in die (Halb-) Zelle eingefügt, die bei der Rückkehr zum endgültigen Pfad entfernt werden kann.Befindet sich der Eingang oberhalb des Labyrinths, wird während der Bauphase der erste Schritt (nach unten) unternommen, da T-Halbzellen während der Bauphase entfernt werden. Auf diese Weise bleibt ein funktionsfähiger Pfad in einer vollen Zelle erhalten. Die obere Wand wird danach geschlossen.
Wenn sich der Ausgang links, rechts oder unten im Labyrinth befindet, wird er
U
natürlich in die (Halb-) Zelle aufgenommen. Um nicht als Pfad verwechselt zu werden,&
wird anstelle von die Nicht-Alphanum-Ausgangsmarkierung verwendetU
. Die Ausgangsmarkierung ist in eine Zelle oder Halbzelle eingebettet (wie oben angegeben).Befindet sich der Ausgang oberhalb des Labyrinths, ist dies das einzige Loch, das über der obersten Zellenreihe liegen kann (da das Loch für den Eingang, falls vorhanden, bereits geschlossen ist). Jeder Pfad, der dieses Loch erreicht, kann das Labyrinth durch einen Aufwärtsschritt verlassen.
Schließlich muss jede B-Zelle, die den Eingang oder Ausgang enthält, ihre linke Wand schließen, um zu verhindern, dass das Labyrinth durch Gehen entlang der B-Zellen "aufgelöst" wird. Ein- und Ausgänge in R-Zellen oder L-Halbzellen müssen nicht weiter verarbeitet werden, da der Flood-Fill-Algorithmus keine vertikalen Bewegungen zu / von ihnen zulässt.
Beispiel
Als Beispiel der erste Testfall
ist
im neuen Format. Sie können andere Labyrinthe konvertieren hier .
Konstruktionsphase
Die Bauphase umfasst die ersten 13 Programmzeilen.
Konvertiert Exit in L-Halbzelle in Exit-Marker
Fügt links vom Eingang und Ausgang Wände in B-Zellen hinzu
Macht den ersten Schritt, wenn der Eingang über dem Labyrinth liegt
Führt die eigentliche Konvertierung durch
Schließt das obere Eingangsloch
Behält nur Zeilen mit einem
1
. Da Labyrinthe mindestens 5 Zellen breit sind und Spaltennummern in Schritten von 3 auftreten, muss eine Zeile mit Zellen neuen Formats eine Spaltennummer zwischen 10 und 19 enthalten.Konvertiert Exit in R-Zelle oder B-Zelle in Exit-Marker
Phase füllen
Die Füllphase setzt sich aus den nächsten 8 Zeilen des Programms zusammen. Es verwendet einen Flood-Fill-Algorithmus, um alle Zellen mit dem kürzesten Weg zu füllen, der vom Eingang dorthin führt.
Versetzt die gesamte Füllphase in eine Schleife, um das gesamte Labyrinth zu füllen.
Jede Zelle, die sich nach links bewegen kann, tut dies. Eine Zelle kann sich nach links bewegen, wenn
Dann tut dies jede Zelle, die sich nach rechts bewegen kann. Eine Zelle kann sich nach rechts bewegen, wenn
Dann tut dies jede Zelle, die sich nach unten bewegen kann. Eine Zelle kann sich nach unten bewegen, wenn
Beachten Sie, dass L-Halbzellen nicht nach unten verschoben werden können, da sie keine Spaltennummern haben.
Dann tut dies jede Zelle, die in der Lage ist, sich nach oben zu bewegen. Eine Zelle kann aufsteigen, wenn
Rückkehrphase
Die Rückkehrphase besteht aus den letzten 5 Zeilen des Programms. Diese Phase sucht nach dem in die Ausgangszelle gefüllten Pfad und gibt ihn zurück.
Das Pfadmuster am Ausgang hängt davon ab, wo sich der Ausgang befindet:
& <path>
<left wall> <column number> & <path>
<left wall> <column number> · <path>
in der obersten Reihe.Findet eine Zelle in der obersten Zeile mit einer leeren oberen Wand und einem nicht leeren Pfad. Dies erledigt den letzten Fall, indem der letzte Schritt und die Ausgangsmarkierung hinzugefügt werden.
Stimmt mit einem nicht leeren Pfad überein und gibt ihn nach einer Ausgangsmarkierung zurück.
Entfernt die Ausgangsmarkierung und das
I
Präfix des Pfads.quelle
AvKr
? Haben sie eine Bedeutung / sind sie Abkürzungen für oben, unten, links und rechts in Ihrer Muttersprache oder gibt es einen anderen Grund, warum Sie diese bestimmten Zeichen gewählt haben?AvKr
die Pfeile in Alphanum am nächsten sind.Perl 6 ,
259295 BytesWie es funktioniert
Dies drückt das Labyrinth zusammen, so dass das Innere jeder Zelle 1x1 statt 2x1 Leerzeichen enthält:
Dies ist die rekursive Pfadfindungsfunktion. Es werden drei Parameter benötigt: Die aktuelle Koordinate
c=(y,x)
, die Liste der bereits besuchten Koordinatenv
und der bisher zurückgelegte Pfadp
(als Liste der Pfeilzeichen).Wenn das Zeichen an der aktuellen Koordinate ein Leerzeichen ist, kehrt es zu seinen vier Nachbarn zurück.
Wenn das Zeichen an der aktuellen Koordinate a ist
I
, wird auf die beiden Nachbarn zurückgegriffen, die nicht "am Rande" liegen, um Lösungen zu zwingen, durch das Labyrinth und nicht um dieses herum zu gehen.Wenn das Zeichen an der aktuellen Koordinate a ist
U
, wirdtake
die akkumulierte Pfadzeichenfolge aufgerufen.Die rekursive Funktion wird zunächst mit der Koordinate des Buchstabens aufgerufen
I
, die mit einem regulären Ausdruck gefunden wird.Das
gather
Schlüsselwort sammelt alle Werte, dietake
innerhalb der Funktion aufgerufen wurden, dh alle gültigen nichtzyklischen Pfade durch das Labyrinth.Der kürzeste Weg wird gewählt, jeder zweite Pfeil wird fallengelassen, um der Tatsache Rechnung zu tragen, dass zwei identische Bewegungen erforderlich sind, um von einer Zelle zur nächsten zu gelangen, und die verbleibenden Pfeile werden verkettet, um die Zeichenfolge zu bilden, die vom Lambda zurückgegeben wird.
quelle
Python 2: 302 Bytes
Übernimmt die Eingabe als ein Array von Zeichenfolgen mit derselben Länge. Druckt
0
für rechts,1
für unten,2
für links und3
für oben.Erläuterung
Ich habe einen anderen Ansatz gewählt als die anderen Antworten. Allgemeine Idee: Suchen Sie rekursiv, indem Sie den kürzesten Weg zwischen der Geradeausfahrt und dem Drehen des Boards um 90 Grad finden.
Probieren Sie es online!
quelle
I
zu verhindern, dass der Weg außerhalb des Labyrinths verläuft. Genießen Sie Ihren Aufenthalt und +1 von mir. :)JavaScript (ES6), 356 Byte
Übernimmt die Eingabe als 2D-Zeichenfeld. Jede Zeile muss links mit einem Leerzeichen aufgefüllt sein und darf kein Leerzeichen am Ende enthalten, unabhängig davon, wo sich die Start- / Endpunkte befinden.
Verwendet die Idee von smls, das Labyrinth zu zerquetschen, um jede Zelle 1x1 zu machen und wiederholte Pfeile aus der Ausgabe zu entfernen.
Ungolfed und erklärt
Testschnipsel
Code-Snippet anzeigen
quelle
Retina , 416 Bytes
Probieren Sie es online! Wenn ich diese Frage gesehen hätte, als sie ursprünglich veröffentlicht wurde, ist dies wahrscheinlich die Antwort, die ich gegeben hätte. Ich schreibe sie trotzdem, obwohl es in Retina eine viel bessere Antwort gibt. Erläuterung:
Füllen Sie den Rand aus. Dadurch wird vermieden, dass Sie außerhalb des Labyrinths herumlaufen (z. B. für Testfall 7).
Platzieren Sie eine nicht alphabetische Markierung am Eingang.
Überschwemmung vom Ausgang bis zum Eingang. Verwenden Sie bei jedem Schritt einen Buchstaben, um die beste Richtung anzugeben (wasd - das ist Gamern vielleicht vertraut; ich hatte auch über hjkl nachgedacht, fand es aber zu verwirrend). Ziehen Sie es außerdem vor, die gleiche Richtung zu wiederholen. Dadurch wird vermieden, dass zwei vertikal benachbarte Zellen nach links / rechts verschoben werden.
Angenommen, der erste Schritt ist unten.
Wenn sich jedoch links oder rechts vom Eingang ein Buchstabe befindet, ändern Sie diesen in den ersten Schritt.
Bewegen Sie den Marker in die Richtung des letzten Zuges, lesen Sie die Richtung des nächsten Zuges von dem Feld ab, in das sich der Marker bewegt, und fügen Sie diese zur Liste der Richtungen hinzu. Dies wiederholt sich, bis das
U
erreicht ist.Löschen Sie alles nach den Anweisungen, da es nicht mehr benötigt wird.
Das ursprüngliche Raster ist auf einem 3 × 2-Layout. Während wir uns vertikal bewegen, wenn wir horizontal im Zick-Zack verfahren, optimiert die Überflutungsfüllung die Bewegung und bewegt nur 3n-1-Zeichen horizontal. Wenn wir also durch drei teilen, müssen wir aufrunden. Vertikal teilen wir einfach durch 2.
Ich habe auch eine echte quadratische Rasterlösung untersucht, bei der die Zeichenmatrix selbst quadratisch ist und kein 3 × 2-Layout mit optionalem Rand. Wahrscheinlich nicht konform mit der Frage, reduzierte die Fähigkeit zu transponieren die Anzahl der Bytes auf 350: Probieren Sie es online aus!
quelle
-
um die Eingangs- und Ausgangszeichen hinzugefügt haben. Da die Herausforderung hauptsächlich darin besteht, durch das Labyrinth zu gehen, denke ich, ist das in Ordnung, aber ich bin gespannt: Was waren die Probleme, als Sie diese Wände nicht über / unter demI
und platziert hattenU
? Können Sie auch überprüfen, ob dies für Testfall 7 mitI
undU
oben anstelle von Seiten funktioniert ? TIO überschreitet das 60-Sekunden-Limit, daher kann ich es nicht selbst testen. Obwohl ich Ihre Erklärung gelesen habe, wie man zuerst versucht, standardmäßig herunterzufahren, gehe ich davon aus, dass es gut funktionieren sollte.