Wenn Sie nicht wissen, was der Turm von Hanoi ist, erkläre ich es kurz: Es gibt drei Stangen und einige Scheiben, von denen jede eine andere Größe hat. Am Anfang befinden sich alle Scheiben in sortierter Reihenfolge auf dem ersten Turm: Die größte befindet sich unten, die kleinste oben. Ziel ist es, alle Scheiben auf die dritte Stange zu bringen. Klingt einfach? Hier ist der Haken: Sie können keine CD auf eine CD legen, die kleiner als die andere ist. Sie können immer nur eine Scheibe auf einmal in der Hand halten, um sie auf eine andere Stange zu bewegen, und Sie können die Scheibe nur auf Stangen legen, nicht auf den Tisch, Sie hinterhältiger Bastard.
ASCII-Beispiellösung:
A B C
| | |
_|_ | |
__|__ | |
A B C
| | |
| | |
__|__ _|_ |
A B C
| | |
| | |
| _|_ __|__
A B C
| | |
| | _|_
| | __|__
Herausforderung
Es gibt drei Stäbe mit den Bezeichnungen A, B und C. (Sie können sie auch mit 1,2 bzw. 3 bezeichnen, wenn das hilft) Am Anfang befinden sich alle n Scheiben auf Stab A (1).
Ihre Herausforderung besteht darin, eine Lösung für den Turm von Hanoi zu überprüfen. Sie müssen sicherstellen, dass:
- Am Ende befinden sich alle n Scheiben auf Stab C (3).
- Für eine bestimmte Disc in einem bestimmten Zustand befindet sich keine kleinere Disc darunter.
- Keine offensichtlichen Fehler wie der Versuch, Scheiben von einer leeren Stange zu nehmen oder Scheiben auf nicht vorhandene Stangen zu bewegen.
(Die Lösung muss nicht optimal sein.)
Eingang
Ihr Programm erhält zwei Eingaben:
- Die Anzahl der Discs n (eine ganze Zahl)
Die ausgeführten Züge, die aus einer Reihe von Tupeln bestehen: (Turm, von dem die derzeit oberste Scheibe genommen wird), (Turm, zu dem diese Scheibe genommen wird), wobei sich jedes Tupel auf einen Zug bezieht. Sie können wählen, wie sie dargestellt werden. Zum Beispiel so etwas wie die folgenden Darstellungsweisen der Lösung für n = 2, die ich oben in ASCII gezeichnet habe. (Ich werde den ersten in den Testfällen verwenden, weil es für die Augen einfach ist):
A-> B; A-> C; B-> C
[("A", "B"), ("A", "C"), ("B", "C")]
[(1,2), (1,3), (2,3)]
"ABACBC"
[1,2,1,3,2,3]
Ausgabe
Wahrheit, wenn die Bedingungen, die unter "Herausforderung" zu finden sind, gelten.
Falsch, wenn nicht.
Testfälle:
Wahr:
n=1, "A->C"
n=1, "A->B ; B->C"
n=2, "A->B ; A->C ; B->C"
n=2, "A->C ; C->B ; A->C ; B->C"
n=2, "A->C ; A->B ; C->B ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C ; B->C"
Falsch:
3. Vorschlag von @MartinEnder, 7. Vorschlag von @Joffan
n=1, "A->B"
n=1, "C->A"
n=2, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=2, "A->B ; A->C ; C->B"
n=2, "A->C ; A->B ; C->B ; B->A"
n=2, "A->C ; A->C"
n=3, "A->B ; A->D; A->C ; D->C ; A->C"
n=3, "A->C ; A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->B ; B->C ; B->A ; B->C ; A->C"
n=3, "A->C ; A->B ; C->B ; A->C ; B->A ; B->C ; C->B"
n=4, "A->B ; A->C ; B->C ; A->B ; C->A ; C->B ; A->B ; A->C ; B->C ; B->A ; C->A ; B->C ; A->B ; A->C"
n=4, "A->B ; A->B ; A->B ; A->C ; B->C ; B->C ; B->C"
Dies ist Code-Golf , die kürzeste Lösung gewinnt. Es gelten Standardregeln und Regelungslücken. Keine Batterien enthalten.
A->A
?
moving discs to nonexistant rods.
ja natürlich D
A=1
,B=2
,C=3
, etc.)?