El reto
Considere el siguiente diagrama del Fifteen Puzzle en su estado resuelto:
_____________________
| | | | |
| 1 | 2 | 3 | 4 |
|____|____|____|____|
| | | | |
| 5 | 6 | 7 | 8 |
|____|____|____|____|
| | | | |
| 9 | 10 | 11 | 12 |
|____|____|____|____|
| | | | |
| 13 | 14 | 15 | |
|____|____|____|____|
En cada movimiento, un rompecabezas emocionado tiene la oportunidad de mover una pieza adyacente al espacio en blanco al espacio en blanco. Por ejemplo, después del 1
movimiento, tenemos 2
escenarios posibles (dejemos 0
un espacio en blanco):
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
Después de los 2
movimientos, el rompecabezas tiene 5
diferentes resultados ( tenga en cuenta que los dos casos anteriores están excluidos, ya que no se pueden alcanzar en 2 movimientos). Una de estas situaciones es el estado resuelto original, y se puede alcanzar de dos maneras diferentes.
Su tarea en este desafío es producir el número de resultados diferentes a los que puede conducir un cierto número de movimientos. Como entrada, tome un númeroN >= 0
y genere el número de situaciones únicas que pueden aparecer después de los N
movimientos.
Reglas
- Este es el código de golf. ¡El código más corto gana!
- Lagunas estándar no están permitidas.
- Su código debería poder calcular el caso
N = 10
dentro de unos minutos. Probablemente no probaré esta regla a menos que exista un abuso obvio del tiempo en una respuesta.
Casos de prueba
(Resultados generados a partir de las sumas de OEIS A089484 (Como describió Geobits en el chat ), automatizado por el script de Martin Büttner . ¡Gracias por toda la ayuda!)
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
fuente
s.add
probablemente salvaría a algunos personajes.t
como argumento. Aparte de eso, creo que es probable que haya más margen de mejora si tuviera mejores habilidades en Python.if
declaraciones en expresiones de cortocircuito con efectos secundarios comoj%4and e(j-1,j)
para que pueda ponerlos en una línea como una tupla booleano: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
declaraciones. También me pregunto si hay una forma más corta de construir una tupla con dos elementos intercambiados.def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
.Perl, 148
Ejemplo:
fuente