Die Herausforderung
Betrachten Sie das folgende Diagramm des Fünfzehn-Puzzles im gelösten Zustand:
_____________________
| | | | |
| 1 | 2 | 3 | 4 |
|____|____|____|____|
| | | | |
| 5 | 6 | 7 | 8 |
|____|____|____|____|
| | | | |
| 9 | 10 | 11 | 12 |
|____|____|____|____|
| | | | |
| 13 | 14 | 15 | |
|____|____|____|____|
Bei jeder Bewegung hat ein aufgeregter Puzzler die Möglichkeit, ein Teil neben der Leerstelle in die Leerstelle zu verschieben. Zum Beispiel 1
haben wir nach dem Umzug 2
mögliche Szenarien (lassen Sie 0
ein Leerzeichen sein):
1 2 3 4 1 2 3 4
5 6 7 8 5 6 7 8
9 10 11 12 and 9 10 11 0
13 14 0 15 13 14 15 12
Nach 2
Zügen hat das Rätsel 5
unterschiedliche Ergebnisse (Beachten Sie, dass die beiden oben genannten Fälle ausgeschlossen sind, da sie in 2 Zügen nicht erreicht werden können). Eine dieser Situationen ist der ursprünglich gelöste Zustand und kann auf zwei verschiedene Arten erreicht werden.
Ihre Aufgabe bei dieser Herausforderung besteht darin, die Anzahl der unterschiedlichen Ergebnisse zu ermitteln, zu denen eine bestimmte Anzahl von Zügen führen kann. Nehmen Sie als Eingabe eine Zahl N >= 0
und geben Sie die Anzahl der eindeutigen Situationen aus, die nach N
Zügen auftreten können.
Regeln
- Das ist Code-Golf. Kürzester Code gewinnt!
- Standardlücken sind nicht zulässig.
- Ihr Code sollte in der Lage sein, den Fall
N = 10
innerhalb weniger Minuten zu berechnen . Ich werde diese Regel wahrscheinlich nicht testen, es sei denn, in einer Antwort liegt ein offensichtlicher Zeitmissbrauch vor.
Testfälle
(Ergebnisse generiert aus Summen von OEIS A089484 (Wie Geobits im Chat beschrieben ), automatisiert von Martin Büttner's Skript . Danke für all die Hilfe!)
0 moves: 1
1 moves: 2
2 moves: 5
3 moves: 12
4 moves: 29
5 moves: 66
6 moves: 136
7 moves: 278
8 moves: 582
9 moves: 1224
10 moves: 2530
11 moves: 5162
12 moves: 10338
13 moves: 20706
14 moves: 41159
15 moves: 81548
16 moves: 160159
17 moves: 313392
18 moves: 607501
19 moves: 1173136
20 moves: 2244884
21 moves: 4271406
22 moves: 8047295
23 moves: 15055186
24 moves: 27873613
25 moves: 51197332
26 moves: 93009236
27 moves: 167435388
28 moves: 297909255
29 moves: 524507316
30 moves: 911835416
31 moves: 1566529356
quelle
s.add
würde wahrscheinlich einige Zeichen speichern.t
Argument vorbringen. Abgesehen davon gibt es wahrscheinlich mehr Raum für Verbesserungen, wenn ich bessere Python-Fähigkeiten hätte.if
wie Anweisungen in Kurzschließen Ausdrücke mit Nebenwirkung ,j%4and e(j-1,j)
so dass Sie sie in eine Zeile als boolean Tupel setzen können:j%4and e(j-1,j),j%4>2or e(j,j+1),j<4or e(j-4,j),j>11or e(j,j+4)
.if
Anweisungen zu verwenden. Ich frage mich auch, ob es eine kürzere Möglichkeit gibt, ein Tupel mit zwei getauschten Elementen zu erstellen.def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
.Perl, 148
Beispiel:
quelle