O desafio
Considere o seguinte diagrama do Quinze quebra-cabeças em seu estado resolvido:
_____________________
| | | | |
| 1 | 2 | 3 | 4 |
|____|____|____|____|
| | | | |
| 5 | 6 | 7 | 8 |
|____|____|____|____|
| | | | |
| 9 | 10 | 11 | 12 |
|____|____|____|____|
| | | | |
| 13 | 14 | 15 | |
|____|____|____|____|
A cada movimento, um quebra-cabeças animado tem a oportunidade de mover uma peça adjacente ao espaço em branco para o espaço em branco. Por exemplo, após a 1
mudança, temos 2
cenários possíveis (deixe 0
um espaço em branco):
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
Após os 2
movimentos, o quebra-cabeça tem 5
resultados diferentes (observe que os dois casos acima são excluídos, pois não podem ser alcançados em 2 movimentos). Uma dessas situações é o estado resolvido original e pode ser alcançado de duas maneiras diferentes.
Sua tarefa neste desafio é produzir o número de resultados diferentes aos quais um certo número de movimentos pode levar. Como entrada, pegue um número N >= 0
e produza o número de situações únicas que podem aparecer após os N
movimentos.
Regras
- Isso é código-golfe. O código mais curto vence!
- As brechas padrão não são permitidas.
- Seu código deve poder calcular o caso
N = 10
em alguns minutos. Provavelmente não testarei essa regra, a menos que exista um abuso óbvio de tempo em uma resposta.
Casos de teste
(Resultados gerados a partir dos somatórios de OEIS A089484 (conforme Geobits descrito no bate-papo ), automatizados pelo script de Martin Büttner . Obrigado por toda a ajuda!)
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
fonte
s.add
provavelmente salvaria alguns caracteres.t
como argumento. Fora isso, acho que provavelmente há mais espaço para melhorias se eu tivesse melhores habilidades em Python.if
declarações em expressões-circuito curto, com efeitos a lado comoj%4and e(j-1,j)
para que você possa colocá-los em uma linha como uma tupla boolean: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
declarações. Também me pergunto se existe uma maneira mais curta de construir uma tupla com dois elementos trocados.def e(a,b):*l,=t;l[a],l[b]=l[b],l[a];s.add(tuple(l))
.Perl, 148
Exemplo:
fonte