Wyzwanie
Rozważ następujący schemat Piętnastki w stanie ułożonym:
_____________________
| | | | |
| 1 | 2 | 3 | 4 |
|____|____|____|____|
| | | | |
| 5 | 6 | 7 | 8 |
|____|____|____|____|
| | | | |
| 9 | 10 | 11 | 12 |
|____|____|____|____|
| | | | |
| 13 | 14 | 15 | |
|____|____|____|____|
Podekscytowany łamigłówka przy każdym ruchu ma możliwość przesunięcia jednego elementu sąsiadującego z pustym polem do pustego pola. Na przykład po 1
przeniesieniu mamy 2
możliwe scenariusze (niech 0
będzie spacją):
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
Po 2
ruchach łamigłówka ma 5
różne wyniki (pamiętaj, że dwa powyższe przypadki są wykluczone, ponieważ nie można ich osiągnąć w 2 ruchach). Jedną z takich sytuacji jest pierwotnie rozwiązany stan, który można osiągnąć na dwa różne sposoby.
Twoim zadaniem w tym wyzwaniu jest uzyskanie szeregu różnych wyników, do których może doprowadzić określona liczba ruchów. Jako dane wejściowe weź liczbę N >= 0
i wypisz liczbę unikalnych sytuacji, które mogą pojawić się po N
ruchach.
Zasady
- To jest golf golfowy. Najkrótszy kod wygrywa!
- Standardowe luki są niedozwolone.
- Twój kod powinien być w stanie obliczyć sprawę w
N = 10
ciągu kilku minut. Prawdopodobnie nie przetestuję tej zasady, chyba że w odpowiedzi znajdzie się oczywiste nadużycie czasu.
Przypadki testowe
(Wyniki wygenerowane na podstawie podsumowań OEIS A089484 (Jak opisano na czacie Geobits ), zautomatyzowane przez skrypt Martina Büttnera . Dziękujemy za całą pomoc!)
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
źródło
s.add
prawdopodobnie uratuje niektóre postacie.t
za argument. Poza tym, myślę, że prawdopodobnie byłoby więcej miejsca na ulepszenia, gdybym miał lepsze umiejętności w Pythonie.if
oświadczenia do wyrażenia Zwarcie z efektem ubocznym jakj%4and e(j-1,j)
tak można umieścić je w jednej linii jako logiczną krotki: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
instrukcji. Zastanawiam się także, czy istnieje krótszy sposób na zbudowanie krotki z zamianą dwóch elementów.def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
.Perl, 148
Przykład:
źródło