Le défi
Considérez le diagramme suivant du puzzle de quinze dans son état résolu:
_____________________
| | | | |
| 1 | 2 | 3 | 4 |
|____|____|____|____|
| | | | |
| 5 | 6 | 7 | 8 |
|____|____|____|____|
| | | | |
| 9 | 10 | 11 | 12 |
|____|____|____|____|
| | | | |
| 13 | 14 | 15 | |
|____|____|____|____|
À chaque mouvement, un casse-tête excité a la possibilité de déplacer une pièce adjacente à l'espace vide dans l'espace vide. Par exemple, après le 1
déménagement, nous avons 2
des scénarios possibles ( 0
soit un espace vide):
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
Après les 2
mouvements, le puzzle a 5
des résultats différents (Notez que les deux cas ci-dessus sont exclus, car ils ne peuvent pas être atteints en 2 mouvements). L'une de ces situations est l'état résolu d'origine et peut être atteint de deux manières différentes.
Votre tâche dans ce défi est de produire le nombre de résultats différents qu'un certain nombre de mouvements peuvent entraîner. En entrée, prenez un nombre N >= 0
et sortez le nombre de situations uniques qui peuvent apparaître après les N
déplacements.
Règles
- C'est du code-golf. Le code le plus court gagne!
- Les failles standard ne sont pas autorisées.
- Votre code devrait être capable de calculer le cas pendant
N = 10
quelques minutes. Je ne testerai probablement pas cette règle à moins qu'il n'y ait un abus de temps évident dans la réponse.
Cas de test
(Résultats générés à partir des sommations d' OEIS A089484 (comme les géobits décrits dans le chat ), automatisés par le script de Martin Büttner . Merci pour toute l'aide!)
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
la source
s.add
sauverait probablement certains caractères.t
pour un argument. En dehors de cela, je pense qu'il y a probablement plus de possibilités d'amélioration si j'avais de meilleures compétences en Python.if
déclarations en expressions de court-circuit avec des effets secondaires comme dej%4and e(j-1,j)
sorte que vous pouvez les mettre en une ligne comme tuple booléenne: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
instructions. Je me demande également s'il existe un moyen plus court de construire un tuple avec deux éléments échangés.def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
.Perl, 148
Exemple:
la source