Frage
Wir werden von einer Roboterarmee auf ihrer Raumstation gefangen genommen. Unser Raumschiffpilot befindet sich im Gefängnis auf Stufe 1. Es gibt nur einen Weg zu entkommen und er rettet Ihren Raumschiffpilot. Das bedeutet, dass Sie von Level N auf Level 1 wechseln müssen. Da dies jedoch sehr riskant ist, müssen Sie das Gefängnis in möglichst wenigen Schritten erreichen.
Bedingungen
Es gibt 4 Möglichkeiten, sich zu bewegen:
- Wechseln Sie von Ebene N zu Ebene N - 1
e.g. from 12 to 11
- Wechseln Sie von Level N zu Level N + 1
e.g. from 12 to 13
- Benutze den Teleport von Level 2k nach Level k
e.g. from 12 to 6
- Benutze den Teleport von Level 3k nach Level k
e.g. from 12 to 4
- Wechseln Sie von Ebene N zu Ebene N - 1
Teleports sind nur in eine Richtung möglich (Sie können zwischen 12 und 4 wählen, es ist jedoch unmöglich, zwischen 4 und 12 zu wählen).
- Jede Aktion macht einen Schritt
Eingang
Die Eingabe sollte von STDIN oder der nächstgelegenen Alternative in Ihrer Programmiersprache gelesen werden. Die Eingabe besteht aus einer Ganzzahl, n
wobei 1 <= n <= 10^8
.
Ausgabe
Die Ausgabe sollte die Mindestanzahl von Schritten sein, die erforderlich sind, um von n
Stufe 1 zu gelangen.
Beispiele
Level Minimum number of steps
1 0
8 3
10 3
267 7
100,000,000 25
Versuchen Sie, ein Programm zu programmieren, mit dem wir unseren Raumschiff-Piloten in kürzester Zeit aus dem Gefängnis retten und nach Hause zurückkehren können!
Der kürzeste Code gewinnt!
Antworten:
Pyth, 32 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
Ich habe das Problem ein wenig verändert. Ich definiere 4 neue Operationen, die die 4 Operationen der Frage ersetzen.
level / 2
(Zählt als(level % 2) + 1
Schritte, da Sie möglicherweise zuerst eine Stufe nach unten verschieben müssen, um zu teleportieren.)(level + 1) / 2
(zählt als(level % 2) + 1
Schritte)level / 3
(zählt als(level % 3) + 1
Schritte)(level + 1) / 3
(zählt als(-level % 3) + 1
Schritte)Mit dem Design können diese Vorgänge an jede Nummer angewandt werden, wenn die Zahl
0 mod 2
,1 mod 2
,0 mod 3
,1 mod 3
oder2 mod 3
.Sie können sich leicht überlegen, warum dies funktioniert. Die Hauptidee ist, dass es mindestens eine optimale Lösung gibt, die nicht zwei (nach unten) oder zwei (nach oben) Bewegungen hintereinander hat. Beweis: Wenn Sie eine Lösung haben, die zwei solcher Bewegungen hintereinander hat, können Sie diese ersetzen und die Lösung kleiner oder gleich lang machen. Zum Beispiel könnten Sie ersetzen (nach oben bewegen, nach oben bewegen, von 2k nach k teleportieren) durch (von 2k nach k teleportieren, nach oben bewegen) und Ähnliches in allen anderen Fällen.
Die Funktion
y
verwendet implizit Memoization und daher explodiert die Laufzeit nicht.quelle
Python, 176 Bytes
Rohe Gewalt den ganzen Weg; eine Liste aller Nummern
1 to 100,000,000
auf einem 64-Bit-Computer enthält ca. 800 MB Speicher.Der Listenindex repräsentiert die Zahlen, Werte repräsentieren den Abstand von 1 in erlaubten Rettungsschritten.
1
)0,2,2,3
)Die Laufzeit beträgt etwas mehr als 10 Minuten. *Hm*.
Code-Kommentare
Andere
quelle
Python 2 ... 1050
schlecht geschrieben, ungolfed, nicht optimal.
Liest den Startlevel auf stdin, druckt die minimale Anzahl von Schritten auf stdout.
quelle
32-Bit-x86-Computercode, 59 Byte
In hex:
Die Maschinensprache an sich kennt keine Standardeingabe. Da die Herausforderung rein rechnerisch ist, habe ich mich dafür entschieden, eine Funktion zu schreiben, die Eingabeparameter in
EAX
und Ergebnis in zurückgibtAL
.Die Mathematik hinter dem Code wird von @Jakube gut erklärt: Die Suche wird nur auf den Pfaden durchgeführt, auf denen sich Teleports mit nicht mehr als einer einstufigen Bewegung befinden. Die Leistung beträgt ca. 12000 Testfälle pro Sekunde am unteren Ende des Eingabebereichs und 50 Fälle pro Sekunde am oberen Ende. Der Speicherverbrauch beträgt 12 Byte Stapelspeicherplatz pro Rekursionsstufe.
quelle