Befunge, 344 Bytes
&v>>>#p_:63p:43g`\!+v>/*53g+\01g:2%2*1-\2/!*63g+\0\:v
40$ v++!\`g14:p35:\<^2\-1*2%2p10::%4+g00:\g36\g35-1_v
#11^$_83p73v >1+:41g`!#v_$,1+:43g`!#v_@>->2>+00p+141^_
<p1^ vp< ^,g+7g36:<<<<1+55p36:<<<< ^1?0^#7g36g35*
8&p|!++!%9#2g+7g10\*!-g38g10!-g37:g00!!*<>3^
443>:!#v_>>1-::3%1-:53g+00p\3/1-:63g+01p^
^>^>>$#<"#"53g63g7+p41g53g-43g63g-+!#^_
Probieren Sie es online!
Wie in der MATLAB-Antwort von @flawr erwähnt, kann dies einige Zeit in Anspruch nehmen, wenn die Feldgröße nicht trivial ist. Tatsächlich ist es ziemlich einfach, in eine Situation zu geraten, in der es sich nicht lohnt, auf das Ende zu warten, da Sie mit ziemlicher Wahrscheinlichkeit bis zum Ende der Zeit warten.
Um zu verstehen, warum dies geschieht, ist es hilfreich, das Programm so zu betrachten, wie es in einem der vielen "visuellen Debugger" von Befunge ausgeführt wird. Da Daten und Code in Befunge dasselbe sind, können Sie den Pfad anzeigen, wie er sich im Laufe der Zeit ändert. Hier ist zum Beispiel eine kurze Animation, die zeigt, wie ein Teil eines Laufs auf einem langsamen Pfad aussehen könnte.
Sobald der Algorithmus diese schicksalhafte Wende nach links unten an der Feldgrenze beschließt, hat er sich im Wesentlichen zu einem Leben des ziellosen Wanderns verurteilt. Von diesem Punkt an muss es jedem einzelnen möglichen Pfad in diesem eingezäunten Bereich folgen, bevor es sich zurückziehen und die Abzweigung nach rechts versuchen kann. Und die Anzahl der möglichen Pfade in diesen Fällen kann leicht astronomisch werden.
Fazit: Wenn es lange zu dauern scheint, ist es wahrscheinlich eine gute Idee, die Ausführung abzubrechen und erneut zu beginnen.
Erläuterung
Dies ist im Grunde ein rekursiver Algorithmus, der jeden möglichen Pfad durch das Feld ausprobiert und dann Schritte abwickelt, die bereits befolgt wurden, wenn es hängen bleibt. Da Befunge nicht über das Konzept von Funktionen verfügt, kommt eine rekursive Funktion nicht in Frage, aber wir können den Prozess emulieren, indem wir den Status auf dem Stapel verfolgen.
Dies funktioniert, indem der Stapel mit potenziellen Koordinaten gefüllt wird, denen wir folgen möchten. Dann ziehen wir einen Satz vom Stapel und prüfen, ob er geeignet ist (dh in Reichweite und nicht überlappend mit einem vorhandenen Pfad). Sobald wir einen guten Platz haben, schreiben wir einen#
in das Spielfeld an diesem Ort und fügen diese Details dem Stapel hinzu, falls wir später zurückgehen müssen.
Anschließend legen wir weitere vier Sätze von Koordinaten (in zufälliger Reihenfolge) auf den Stapel und geben die möglichen Pfade an, die wir von diesem neuen Ort aus nehmen können, und springen zum Anfang der Schleife zurück. Wenn keiner der möglichen Pfade durchführbar ist, gelangen wir zu dem Punkt auf dem Stapel, an dem wir die Position der ausgeschriebenen Pfade gespeichert haben. #
Machen Sie diesen Schritt rückgängig und versuchen Sie die potenziellen Koordinaten erneut ab einem Schritt vor dem anderen.
So sieht der Code mit den verschiedenen hervorgehobenen Komponenten aus:
Lesen Sie die Breite und Höhe des Feldes und drücken Sie die Startkoordinaten zusammen mit einer 0
Typmarkierung, um einen potenziellen Pfad anstelle eines Rückverfolgungsorts anzugeben.
Suchen Sie nach Backtracking-Positionen (gekennzeichnet durch eine 1
Typmarkierung), die mit einem einfachen p
Befehl zurückgesetzt werden, da sie in dem genauen Format gespeichert sind, das zum Zurückschreiben eines Leerzeichens in das Spielfeld erforderlich ist.
Überprüfen Sie, ob sich die Koordinaten noch im Spielfeld befinden. Wenn sie außerhalb der Reichweite liegen, lassen Sie sie vom Stapel fallen und kehren Sie zurück, um die nächsten potenziellen Koordinaten zu ermitteln.
Wenn sie sich im Bereich befinden, erhalten Sie die nächsten beiden Werte vom Stapel. Dies ist der Speicherort des vorherigen Schritts (erforderlich für den folgenden Test).
Überprüfen Sie, ob die Koordinaten mit einem vorhandenen Streckenabschnitt in Kontakt kommen. Die Position des vorherigen Schritts wird bei dieser Prüfung offensichtlich ignoriert.
Wenn alle Tests erfolgreich sind, schreiben Sie eineSchieben Sie vier potenzielle Ziele, die vom aktuellen Standort aus erreicht werden können. Die Zufallszahl bestimmt die Reihenfolge, in der sie gepusht werden, und damit die Reihenfolge, in der sie befolgt werden.#
in das Spielfeld, und überprüfen Sie, ob wir den Zielort erreicht haben.
Wenn ja, schreiben Sie den endgültigen Pfad auf und beenden Sie das Programm.
Andernfalls speichern Sie die Koordinaten mit einer 1
Typmarkierung auf dem Stapel, um sie später zurückzuverfolgen.
Dies wird durch eine Zufallszahlenberechnung unterbrochen, die wir bald brauchen werden.
Gehen Sie zurück zum Anfang der Hauptschleife und verarbeiten Sie die nächsten Werte auf dem Stapel.