Bestimmen Sie bei einer gegebenen Zahlenfolge die Mindestanzahl der Sprünge von der Startposition bis zum Ende und kehren Sie wieder zur Startposition zurück.
Jedes Element der Sequenz gibt die maximale Anzahl von Zügen an, die man von dieser Position aus ausführen kann.
An jeder Position können Sie einen Sprung von maximal k Zügen ausführen, wobei k der Wert ist, der an dieser Position gespeichert ist. Nach Erreichen des Endes können Sie nur die Positionen zum Springen verwenden, die zuvor nicht zum Springen verwendet wurden.
Die Eingabe erfolgt als Folge von Zahlen, die durch einzelne Leerzeichen voneinander getrennt sind. Die Ausgabe sollte eine einzelne Zahl sein, die die Mindestanzahl der verwendeten Sprünge darstellt. Wenn es nicht möglich ist, bis zum Ende zu gehen und zur Startposition zurückzukehren, drucken Sie -1
Eingang:
2 4 2 2 3 4 2 2
Ausgabe:
6 (3, um das Ende zu erreichen und 3, um zurückzukommen)
Eingang
1 0
Ausgabe
-1
Hinweis
- Angenommen, alle Zahlen der Sequenz sind nicht negativ
EDIT 1
Die Zeile "Somit sollte klar sein, dass man immer von der letzten Position springen kann." könnte verwirrend sein, also habe ich es von der Frage entfernt. Es wird keine Auswirkung auf die Frage haben.
Gewinnkriterien:
Der Gewinner ist der mit dem kürzesten Code.
quelle
Thus, it should be clear that one can always jump from the last position.
- Ist das kein1 0
Gegenbeispiel?Antworten:
APL (Dyalog), 116
Testfälle
Ansatz
Der Ansatz ist eine Brute-Force-Suche unter Verwendung einer rekursiven Funktion.
Setzen Sie ab Position 1 den Wert an der aktuellen Position auf 0 und generieren Sie eine Reihe von Positionen, die von der aktuellen Position aus angesprungen werden können. Übergeben Sie die neue Position und das geänderte Array an sich selbst. Basisfälle sind, wenn der Wert an der aktuellen Position 0 ist (kann nicht springen) oder das Ende erreicht.
Kehren Sie dann für jedes erzeugte Array es um und führen Sie die Suche erneut durch. Da Sprungpositionen auf 0 gesetzt sind, können wir von dort nicht mehr springen.
Für das Array, das wir am Ende erreicht haben, finden Sie diejenigen, die die Mindestanzahl von Nullen haben. Das Subtrahieren der Anzahl der Nullen in dem anfänglichen Array ergibt die tatsächliche Anzahl der durchgeführten Sprünge.
quelle
Mathematica,
197–193ZeichenRohe Gewalt.
quelle
Mathematica 351
[Hinweis: Dies ist noch nicht vollständig Golf; Außerdem muss die Eingabe an das erforderliche Format angepasst werden. Und die Regel, dass nicht zweimal auf dieselbe Position gesprungen wird, muss implementiert werden. Es gibt auch einige Probleme bei der Code-Formatierung, die behoben werden müssen. Aber es ist ein Anfang.]
Ein Graph wird mit Knoten konstruiert, die jeder Position entsprechen, dh jede eingegebene Ziffer repräsentiert einen Sprung.
DirectedEdge[node1, node2]
bedeutet, dass es möglich ist, von Knoten 1 zu Knoten 2 zu springen. Die kürzesten Pfade werden von Anfang bis Ende und dann von Ende bis Anfang gefunden.Verwendung
quelle
Python 304
Ich denke, dieser neue Ansatz löst (ich hoffe!) Alle Probleme im Zusammenhang mit dem [2,0] -Fall und ähnlichem:
In dieser Version wird die Eingabereihenfolge (wenn möglich) bis zum Ende durchlaufen und dann der Vorgang mit der umgekehrten Reihenfolge erneut gestartet. Jetzt können wir garantieren, dass für jede gültige Lösung einer der Sprünge auf dem letzten Element landet.
Dies sind die Golf-Versionen:
Und einige Beispiele:
quelle
R - 195
Simulation:
Entgolft:
quelle
Python 271
Das ist meine Lösung:
Beispiele:
Und das sind die (teilweise mittlerweile) Golf-Versionen:
Einige Beispiele:
quelle
Rubin - 246
Simulation:
quelle
Ruby - etwa 700 Golfer. Ich begann eine Golf-Version mit Namen aus einem Zeichen für Variablen und Methoden, aber nach einer Weile interessierte ich mich mehr für den Algorithmus als für das Golfspiel, also hörte ich auf, zu versuchen, die Codelänge zu optimieren. Ich habe mich auch nicht darum gekümmert, die Eingabezeichenfolge zu bekommen. Meine Anstrengung ist unten.
Um Ihnen das Verständnis der Funktionsweise zu erleichtern, habe ich Kommentare hinzugefügt, die zeigen, wie eine bestimmte Zeichenfolge (u = "2 1 4 3 0 3 4 4 3 5 0 3") manipuliert wird. Ich zähle Kombinationen von "Felsen im Bach" auf, auf die man springen kann. Diese werden mit einer Binärzeichenfolge dargestellt. Ich gebe das Beispiel 0b0101101010 in den Kommentaren an und zeige, wie es verwendet werden würde. Die Einsen entsprechen den Positionen der Steine, die für die erste Reise zur Verfügung stehen. die 0en für die Rückfahrt. Für jede dieser Zuordnungen verwende ich dynamische Programmierung, um die minimale Anzahl von Hops zu bestimmen, die in jeder Richtung erforderlich sind. Ich führe auch ein paar einfache Optimierungen durch, um einige Kombinationen frühzeitig zu eliminieren.
Ich habe es mit den in anderen Antworten angegebenen Zeichenfolgen ausgeführt und erhalte die gleichen Ergebnisse. Hier sind einige andere Ergebnisse, die ich erhalten habe:
Mich würde interessieren, ob andere für diese Saiten die gleichen Ergebnisse erzielen. Die Leistung ist angemessen gut. Beispielsweise dauerte es weniger als eine Minute, um eine Lösung für diese Zeichenfolge zu finden:
3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 5 0 1
Der Code folgt.
quelle
Haskell,
173166 Bytes, 159 Bytes in GHCiHier ist die normale Version:
Datenliste importieren
Hier ist die GHCi-Antwort (setzen Sie die Zeile nacheinander):
Nur eine rohe Kraft. Generieren Sie die mögliche Antwort. (dh die Permutation von [0..n-1] mit Null und nachfolgendem Element wurde verworfen. Überprüfen Sie dann, ob die Antwort korrekt ist. Ermitteln Sie die Mindestlänge und addieren Sie sie um eins. Da die führenden und nachfolgenden Nullen gelöscht werden).
Wie benutzt man:
j[3,4,0,0,6]
->3
quelle
Data.List.permutations
funktioniert nicht in GHC, sondern nur in GHCi. Gemäß unserem Leitfaden zu Golfregeln in Haskell sollten Sie entweder den Import hinzufügen oder Ihre Antwort als "Haskell GHCi" markieren. Die erste Option wird im Allgemeinen von Haskell-Golfern auf dieser Site bevorzugt.a<-permutations[0..t l-1],let f=takeWhile(/=0)a
kann man schreibenf<-map(takeWhile(/=0))(permutations[0..t l-1])
, worauf man wieder golfen kannf<-fst.span(>0)<$>permutations[0..t l-1]
. Damit sind Sie auch durch Hinzufügen des Imports auf 166 Byte zurückgekehrt: Probieren Sie es online aus!