Inspiriert von We do Tower Hopping und verwandt mit 2D Maze Minus 1D
Einführung
Ihre Aufgabe ist es, den kürzesten Weg zu finden, um ein Array-Labyrinth nach festgelegten Regeln zu verlassen.
Herausforderung
Ein 1D-Array a mit n Elementen kann als Labyrinth aus n Punkten betrachtet werden, wobei Punkt mit Index k einseitig mit den Punkten mit k + a [ k ] und k - a [ k ] verbunden ist. Mit anderen Worten, können Sie vorwärts oder rückwärts springen genau ein [ k ] Schritte vom Punkt mit dem Index k . Punkte mit einem Index außerhalb der Grenzen des Arrays werden außerhalb des Labyrinths betrachtet.
Betrachten Sie zur Veranschaulichung das folgende Array:
[0,8,5,9,4,1,1,1,2,1,2]
Wenn wir uns gerade am 5. Element befinden, da das Element 4 ist, können wir 4 Schritte vorwärts zum 9. Element oder 4 Schritte rückwärts zum 1. Element springen. Wenn wir Letzteres tun, erhalten wir das Element 0, was darauf hinweist, dass keine weiteren Bewegungen möglich sind. Wenn wir das erstere machen, da das 9. Element 2 ist, können wir uns dafür entscheiden, zum 11. Element zu springen, das wiederum eine 2 ist, und dann können wir erneut zum "13. Element" springen, das außerhalb der Grenzen des ist Array und betrachtet einen Ausgang zum Labyrinth.
Wenn wir also von dem Element in der Mitte ausgehen, besteht ein Weg, das Labyrinth zu verlassen, darin, 1 Schritt zurück, 4 Schritte vorwärts, 2 Schritte vorwärts und erneut 2 Schritte vorwärts zu hüpfen, was als Array ausgedrückt werden kann [-1,4,2,2]
. Alternativ können Sie es mit dem Array ausdrücken, [4,8,10,12]
das den auf Null basierenden Index aller Zwischen- und Endpunkte aufzeichnet (der auf 1 basierende Index ist ebenfalls in Ordnung), oder nur mit den Zeichen [-1,1,1,1]
.
Es ist auch in Ordnung, das Labyrinth vom Ende mit dem niedrigen Index zu verlassen.
Die erste Notation zu verwenden und vom selben Element aus zu beginnen, [1,1,1,2,2]
ist ebenfalls eine Lösung, aber nicht optimal, da es 5 statt 4 Schritte gibt.
Die Aufgabe besteht darin, den kürzesten Weg zu finden, um aus dem Array-Labyrinth herauszukommen und den Weg auszugeben. Wenn es mehr als einen optimalen Pfad gibt, können Sie einen oder alle Pfade ausgeben. Wenn es keine Lösung gibt, sollten Sie einen von Ihnen gewählten falschen Wert ausgeben, der aus einem gültigen Pfad erkennbar ist (es ist auch in Ordnung, überhaupt keine Ausgabe zu erstellen).
Der Einfachheit halber ist die Anzahl der Elemente im Array immer ungerade und wir beginnen immer mit dem Element in der Mitte.
Testfälle
Die Testfälle veranschaulichen verschiedene Ausgabeformen, auf die Sie jedoch nicht beschränkt sind.
Input
Output
[0,8,5,9,4,1,1,1,2,1,2]
[-1,4,2,2]
[2,3,7,1,2,0,2,8,9]
[2,9] (or [2,-5] or [[2,9],[2,-5]])
[0,1,2,2,3,4,4,4,3,2,2,3,0]
[1,-1,1,1]
[0,1,2,2,4,4,6,6,6,6,6,4,2,1,2,2,0]
[]
Technische Daten
Sie können eine Funktion oder ein vollständiges Programm schreiben.
Das Array enthält nur nichtnegative Ganzzahlen.
Sie können Eingaben und Ausgaben über jedes Standardformular vornehmen . Bitte geben Sie in Ihrer Antwort an, welches Formular Sie verwenden.
Dies ist Code-Golf , die niedrigste Anzahl von Bytes gewinnt.
Wie üblich gelten hier Standardlücken .
[1,1,1,-1]
statt [-1,1,1,1]
?
[0,8,5,9,4,1,1,1,2,1,2]
Ausgabe[[-1,4,2,2]]
)