Explicação não matemática
Esta é uma explicação que deve ser acessível independentemente do seu histórico. Infelizmente, isso envolve alguma matemática, mas deve ser compreensível para a maioria das pessoas com um nível de entendimento no ensino médio
Uma sequência de ponteiro é qualquer sequência tal que a (n + 1) = a (na (n)) .
Vamos escolher um pouco essa fórmula para entender o que ela significa. Isso significa apenas descobrir o próximo termo na sequência que olhamos para o último termo, dar muitos passos para trás e copiar o termo que encontramos. Por exemplo, se tivéssemos a sequência até agora
... 3 4 4 4 3 ?
Demos três passos para trás 3
... 3 4 4 4 3 ?
^
fazendo o nosso resultado 4
.
Agora normalmente jogamos esse jogo em uma fita que é infinita nas duas direções, mas também podemos jogá-lo em uma roda onde, após um certo número de etapas, voltamos ao início da sequência.
Por exemplo, aqui está uma visualização da sequência [1,3,1,3,1,3]
Agora, podemos notar que qualquer número, x em uma roda que exceda o número de células na roda, n , também pode ser x mod n, porque todo circuito completo ao redor da roda é o mesmo que não fazer nada. Portanto, consideraremos apenas as rodas com todos os membros inferiores ao tamanho da roda.
Explicação matemática
Uma sequência de ponteiro é qualquer sequência tal que a (n + 1) = a (na (n)) . Geralmente, eles são definidos dos números inteiros para os números inteiros, no entanto, você pode notar que as únicas coisas necessárias nessa definição são uma função sucessora e uma função inversa. Como todos os grupos cíclicos têm ambos, podemos considerar sequências de ponteiros em qualquer grupo cíclico.
Se começarmos a procurar esses tipos de funções, perceberemos que para cada função existem algumas funções semelhantes. Por exemplo, em Z 3, as três seguintes são todas as funções que atendem aos nossos requisitos.
f1 : [1,2,2]
f2 : [2,1,2]
f3 : [2,2,1]
(Aqui uma lista é usada para representar uma função para obter o resultado, apenas indexe a lista pela entrada)
Podemos notar que essas funções são todas "rotações" uma da outra. Para formalizar o que quero dizer com rotação, uma função b é uma rotação de a iff
Agora, se envolvermos um pouco de matemática aqui, podemos realmente mostrar que, se a é uma sequência de ponteiros, toda rotação de a também é uma sequência de ponteiros. Assim, consideraremos de fato quaisquer seqüências que são rotações uma da outra como equivalentes.
Tarefa
Dado n como entrada, o número de seqüências de ponteiros que têm tamanho n .
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
Atualmente, esses testcases estão faltando um pouco, eu tenho um programa de computador para gerá-los, mas é extremamente lento fazê-lo. Se alguém quiser contribuir com casos de teste maiores (que podem verificar corretamente), é livre para fazê-lo. Abaixo de alguns testes, há uma lista de todas as funções que encontrei, que podem ser úteis para depuração. Não posso adicioná-los para os maiores por causa dos limites de caracteres.
Se você quer o código que eu usei para gerar estes aqui está
1 -> 1
[[0]]
2 -> 2
[[1,1],[0,0]]
3 -> 4
[[2,2,2],[2,2,1],[1,1,1],[0,0,0]]
4 -> 7
[[3,3,3,3],[3,3,3,2],[2,2,2,2],[3,3,3,1],[3,1,3,1],[1,1,1,1],[0,0,0,0]]
5 -> 12
[[4,4,4,4,4],[4,4,4,4,3],[3,3,3,3,3],[4,4,4,4,2],[4,3,4,4,2],[2,2,2,2,2],[4,4,4,4,1],[4,3,4,4,1],[4,4,2,4,1],[4,4,1,4,1],[1,1,1,1,1],[0,0,0,0,0]]
6 -> 35
[[5,5,5,5,5,5],[5,5,5,5,5,4],[5,5,4,5,5,4],[4,4,4,4,4,4],[5,5,5,5,5,3],[5,4,5,5,5,3],[5,5,5,3,5,3],[5,3,5,3,5,3],[3,3,3,3,3,3],[5,5,5,5,5,2],[5,4,5,5,5,2],[5,3,5,5,5,2],[5,5,4,5,5,2],[5,5,2,5,5,2],[5,5,2,5,2,2],[5,3,2,5,2,2],[5,2,2,5,2,2],[4,2,2,4,2,2],[2,2,2,2,2,2],[5,5,5,5,5,1],[5,4,5,5,5,1],[5,3,5,5,5,1],[5,5,4,5,5,1],[5,5,2,5,5,1],[5,5,1,5,5,1],[5,5,5,3,5,1],[5,3,5,3,5,1],[5,5,5,2,5,1],[5,5,5,1,5,1],[5,3,5,1,5,1],[5,1,5,1,5,1],[3,1,3,1,3,1],[2,2,1,2,2,1],[1,1,1,1,1,1],[0,0,0,0,0,0]]
7 -> 80
[[6,6,6,6,6,6,6],[6,6,6,6,6,6,5],[6,6,6,5,6,6,5],[5,5,5,5,5,5,5],[6,6,6,6,6,6,4],[6,5,6,6,6,6,4],[6,6,6,5,6,6,4],[6,6,6,6,4,6,4],[6,5,6,6,4,6,4],[6,4,6,6,6,4,4],[4,4,4,4,4,4,4],[6,6,6,6,6,6,3],[6,5,6,6,6,6,3],[6,4,6,6,6,6,3],[6,6,5,6,6,6,3],[6,6,4,6,6,6,3],[5,6,6,5,6,6,3],[6,6,6,6,4,6,3],[6,5,6,6,4,6,3],[6,6,4,6,4,6,3],[6,4,4,6,4,6,3],[6,6,6,6,3,6,3],[6,6,4,6,3,6,3],[3,3,3,3,3,3,3],[6,6,6,6,6,6,2],[6,5,6,6,6,6,2],[6,4,6,6,6,6,2],[6,3,6,6,6,6,2],[6,6,5,6,6,6,2],[6,6,4,6,6,6,2],[6,6,6,5,6,6,2],[6,4,6,5,6,6,2],[6,3,6,5,6,6,2],[6,6,6,3,6,6,2],[6,4,6,3,6,6,2],[6,3,6,3,6,6,2],[6,6,6,2,6,6,2],[6,6,2,6,6,3,2],[6,6,6,2,6,2,2],[6,6,4,2,6,2,2],[6,6,3,2,6,2,2],[2,2,2,2,2,2,2],[6,6,6,6,6,6,1],[6,5,6,6,6,6,1],[6,4,6,6,6,6,1],[6,3,6,6,6,6,1],[6,6,5,6,6,6,1],[6,6,4,6,6,6,1],[6,6,2,6,6,6,1],[6,6,6,5,6,6,1],[6,4,6,5,6,6,1],[6,3,6,5,6,6,1],[6,6,6,3,6,6,1],[6,4,6,3,6,6,1],[6,3,6,3,6,6,1],[6,6,6,2,6,6,1],[6,6,6,1,6,6,1],[6,6,6,6,4,6,1],[6,5,6,6,4,6,1],[6,3,6,6,4,6,1],[6,6,4,6,4,6,1],[6,4,4,6,4,6,1],[6,6,2,6,4,6,1],[6,6,1,6,4,6,1],[6,6,6,6,3,6,1],[6,6,4,6,3,6,1],[6,6,2,6,3,6,1],[6,6,1,6,3,6,1],[6,6,6,6,2,6,1],[6,5,6,6,2,6,1],[6,3,6,6,2,6,1],[6,6,6,6,1,6,1],[6,5,6,6,1,6,1],[6,3,6,6,1,6,1],[6,6,4,6,1,6,1],[6,6,2,6,1,6,1],[6,6,1,6,1,6,1],[3,6,1,6,6,3,1],[1,1,1,1,1,1,1],[0,0,0,0,0,0,0]]
8 -> 311
[[7,7,7,7,7,7,7,7],[7,7,7,7,7,7,7,6],[7,7,7,6,7,7,7,6],[7,7,7,7,6,7,7,6],[6,6,6,6,6,6,6,6],[7,7,7,7,7,7,7,5],[7,6,7,7,7,7,7,5],[7,7,7,6,7,7,7,5],[7,7,7,5,7,7,7,5],[7,7,7,7,6,7,7,5],[7,6,7,7,6,7,7,5],[7,7,7,7,7,5,7,5],[7,6,7,7,7,5,7,5],[7,7,7,5,7,5,7,5],[7,5,7,5,7,5,7,5],[7,5,7,7,7,7,5,5],[7,5,7,6,7,7,5,5],[7,5,7,7,7,6,5,5],[5,5,5,5,5,5,5,5],[7,7,7,7,7,7,7,4],[7,6,7,7,7,7,7,4],[7,5,7,7,7,7,7,4],[7,7,6,7,7,7,7,4],[7,7,5,7,7,7,7,4],[6,7,7,6,7,7,7,4],[5,5,7,5,7,7,7,4],[7,7,7,7,6,7,7,4],[7,6,7,7,6,7,7,4],[7,7,5,7,6,7,7,4],[7,7,7,7,4,7,7,4],[7,6,7,7,4,7,7,4],[7,7,7,7,7,5,7,4],[7,6,7,7,7,5,7,4],[7,5,7,7,7,5,7,4],[7,7,6,7,7,5,7,4],[7,7,4,7,7,5,7,4],[7,7,7,7,7,4,7,4],[7,7,6,7,7,4,7,4],[7,7,4,7,7,4,7,4],[7,4,7,7,7,7,5,4],[7,4,7,7,4,7,5,4],[4,4,4,4,4,4,4,4],[7,7,7,7,7,7,7,3],[7,6,7,7,7,7,7,3],[7,5,7,7,7,7,7,3],[7,4,7,7,7,7,7,3],[7,7,6,7,7,7,7,3],[7,7,5,7,7,7,7,3],[7,7,4,7,7,7,7,3],[7,7,7,6,7,7,7,3],[7,5,7,6,7,7,7,3],[7,4,7,6,7,7,7,3],[7,7,7,5,7,7,7,3],[7,5,7,5,7,7,7,3],[7,4,7,5,7,7,7,3],[7,7,7,3,7,7,7,3],[6,7,7,7,6,7,7,3],[6,7,7,3,6,7,7,3],[7,7,7,7,7,5,7,3],[7,6,7,7,7,5,7,3],[7,5,7,7,7,5,7,3],[7,7,6,7,7,5,7,3],[7,7,4,7,7,5,7,3],[7,7,7,5,7,5,7,3],[7,5,7,5,7,5,7,3],[7,7,5,5,7,5,7,3],[7,6,5,5,7,5,7,3],[7,4,5,5,7,5,7,3],[7,7,7,3,7,5,7,3],[7,5,7,3,7,5,7,3],[7,7,7,7,7,4,7,3],[7,7,6,7,7,4,7,3],[7,7,4,7,7,4,7,3],[7,7,7,5,7,4,7,3],[7,7,7,3,7,4,7,3],[7,7,7,7,7,3,7,3],[7,6,7,7,7,3,7,3],[7,5,7,7,7,3,7,3],[7,7,7,5,7,3,7,3],[7,5,7,5,7,3,7,3],[7,7,7,3,7,3,7,3],[7,5,7,3,7,3,7,3],[7,3,7,3,7,3,7,3],[7,3,5,7,7,7,5,3],[7,3,5,3,7,3,5,3],[5,3,5,3,5,3,5,3],[7,7,7,3,7,7,3,3],[7,5,7,3,7,7,3,3],[7,4,7,3,7,7,3,3],[7,7,4,3,7,7,3,3],[7,7,3,3,7,7,3,3],[7,7,7,3,7,6,3,3],[7,5,7,3,7,6,3,3],[7,7,4,3,7,6,3,3],[7,7,3,3,7,6,3,3],[7,6,3,3,7,6,3,3],[7,7,3,3,7,3,3,3],[7,6,3,3,7,3,3,3],[7,4,3,3,7,3,3,3],[7,3,3,3,7,3,3,3],[6,3,3,3,6,3,3,3],[5,3,3,3,5,3,3,3],[3,3,3,3,3,3,3,3],[7,7,7,7,7,7,7,2],[7,6,7,7,7,7,7,2],[7,5,7,7,7,7,7,2],[7,4,7,7,7,7,7,2],[7,3,7,7,7,7,7,2],[7,7,6,7,7,7,7,2],[7,7,5,7,7,7,7,2],[7,7,4,7,7,7,7,2],[7,7,7,6,7,7,7,2],[7,5,7,6,7,7,7,2],[7,4,7,6,7,7,7,2],[7,3,7,6,7,7,7,2],[7,7,7,5,7,7,7,2],[7,5,7,5,7,7,7,2],[7,4,7,5,7,7,7,2],[7,3,7,5,7,7,7,2],[7,7,7,3,7,7,7,2],[7,5,7,3,7,7,7,2],[7,4,7,3,7,7,7,2],[7,3,7,3,7,7,7,2],[7,7,7,2,7,7,7,2],[7,7,7,7,6,7,7,2],[7,6,7,7,6,7,7,2],[7,4,7,7,6,7,7,2],[7,3,7,7,6,7,7,2],[7,7,5,7,6,7,7,2],[7,7,4,7,6,7,7,2],[7,7,7,7,4,7,7,2],[7,6,7,7,4,7,7,2],[7,4,7,7,4,7,7,2],[7,3,7,7,4,7,7,2],[7,7,5,7,4,7,7,2],[7,7,4,7,4,7,7,2],[7,5,4,7,4,7,7,2],[7,7,7,7,3,7,7,2],[7,7,5,7,3,7,7,2],[7,7,4,7,3,7,7,2],[7,7,7,7,2,7,7,2],[7,6,7,7,2,7,7,2],[7,4,7,7,2,7,7,2],[7,3,7,7,2,7,7,2],[4,7,7,7,7,4,7,2],[4,7,6,7,7,4,7,2],[4,7,4,7,7,4,7,2],[4,7,7,5,7,4,7,2],[4,7,7,2,7,4,7,2],[3,3,7,7,7,3,7,2],[3,3,7,5,7,3,7,2],[3,3,7,7,4,3,7,2],[3,3,7,7,3,3,7,2],[3,3,7,6,3,3,7,2],[3,3,7,3,3,3,7,2],[3,3,7,2,3,3,7,2],[7,7,2,7,7,7,4,2],[7,7,2,7,4,7,4,2],[7,7,2,7,3,7,4,2],[7,7,7,2,7,7,3,2],[7,7,3,2,7,7,3,2],[7,4,7,2,4,7,3,2],[3,3,3,2,3,3,3,2],[7,7,7,7,2,7,2,2],[7,6,7,7,2,7,2,2],[7,4,7,7,2,7,2,2],[7,7,7,5,2,7,2,2],[7,4,7,5,2,7,2,2],[7,7,7,4,2,7,2,2],[7,4,7,4,2,7,2,2],[2,2,2,2,2,2,2,2],[7,7,7,7,7,7,7,1],[7,6,7,7,7,7,7,1],[7,5,7,7,7,7,7,1],[7,4,7,7,7,7,7,1],[7,3,7,7,7,7,7,1],[7,7,6,7,7,7,7,1],[7,7,5,7,7,7,7,1],[7,7,4,7,7,7,7,1],[7,7,2,7,7,7,7,1],[7,7,7,6,7,7,7,1],[7,5,7,6,7,7,7,1],[7,4,7,6,7,7,7,1],[7,3,7,6,7,7,7,1],[7,7,7,5,7,7,7,1],[7,5,7,5,7,7,7,1],[7,4,7,5,7,7,7,1],[7,3,7,5,7,7,7,1],[7,7,7,3,7,7,7,1],[7,5,7,3,7,7,7,1],[7,4,7,3,7,7,7,1],[7,3,7,3,7,7,7,1],[7,7,7,2,7,7,7,1],[7,7,7,1,7,7,7,1],[7,7,7,7,6,7,7,1],[7,6,7,7,6,7,7,1],[7,4,7,7,6,7,7,1],[7,3,7,7,6,7,7,1],[7,7,5,7,6,7,7,1],[7,7,4,7,6,7,7,1],[7,7,2,7,6,7,7,1],[7,7,7,7,4,7,7,1],[7,6,7,7,4,7,7,1],[7,4,7,7,4,7,7,1],[7,3,7,7,4,7,7,1],[7,7,5,7,4,7,7,1],[7,7,4,7,4,7,7,1],[7,5,4,7,4,7,7,1],[7,7,2,7,4,7,7,1],[7,4,7,2,4,7,7,1],[7,7,7,7,3,7,7,1],[7,7,5,7,3,7,7,1],[7,7,4,7,3,7,7,1],[7,7,2,7,3,7,7,1],[7,7,7,7,2,7,7,1],[7,6,7,7,2,7,7,1],[7,4,7,7,2,7,7,1],[7,3,7,7,2,7,7,1],[7,7,7,7,1,7,7,1],[7,6,7,7,1,7,7,1],[7,4,7,7,1,7,7,1],[7,3,7,7,1,7,7,1],[7,7,7,7,7,5,7,1],[7,6,7,7,7,5,7,1],[7,5,7,7,7,5,7,1],[7,3,7,7,7,5,7,1],[7,7,6,7,7,5,7,1],[7,7,4,7,7,5,7,1],[7,7,2,7,7,5,7,1],[7,7,1,7,7,5,7,1],[7,7,7,5,7,5,7,1],[7,5,7,5,7,5,7,1],[7,3,7,5,7,5,7,1],[7,7,5,5,7,5,7,1],[7,6,5,5,7,5,7,1],[7,4,5,5,7,5,7,1],[7,7,7,3,7,5,7,1],[7,5,7,3,7,5,7,1],[7,3,7,3,7,5,7,1],[7,7,7,2,7,5,7,1],[7,7,7,1,7,5,7,1],[7,5,7,1,7,5,7,1],[7,7,7,7,7,4,7,1],[7,7,6,7,7,4,7,1],[7,7,4,7,7,4,7,1],[7,7,2,7,7,4,7,1],[7,7,1,7,7,4,7,1],[7,7,7,5,7,4,7,1],[7,7,7,3,7,4,7,1],[7,7,7,2,7,4,7,1],[7,7,7,1,7,4,7,1],[7,7,4,7,2,4,7,1],[7,7,7,7,7,3,7,1],[7,6,7,7,7,3,7,1],[7,5,7,7,7,3,7,1],[7,3,7,7,7,3,7,1],[7,7,7,5,7,3,7,1],[7,5,7,5,7,3,7,1],[7,3,7,5,7,3,7,1],[7,7,7,3,7,3,7,1],[7,5,7,3,7,3,7,1],[7,3,7,3,7,3,7,1],[7,7,7,2,7,3,7,1],[7,7,7,1,7,3,7,1],[7,5,7,1,7,3,7,1],[7,3,7,1,7,3,7,1],[7,3,7,7,3,3,7,1],[7,3,7,6,3,3,7,1],[7,3,7,2,3,3,7,1],[7,7,7,7,7,2,7,1],[7,6,7,7,7,2,7,1],[7,5,7,7,7,2,7,1],[7,3,7,7,7,2,7,1],[7,7,6,7,7,2,7,1],[7,7,4,7,7,2,7,1],[7,7,2,7,7,2,7,1],[7,4,2,7,7,2,7,1],[7,7,1,7,7,2,7,1],[7,7,2,7,2,2,7,1],[7,5,2,7,2,2,7,1],[7,4,2,7,2,2,7,1],[7,7,7,7,7,1,7,1],[7,6,7,7,7,1,7,1],[7,5,7,7,7,1,7,1],[7,3,7,7,7,1,7,1],[7,7,6,7,7,1,7,1],[7,7,4,7,7,1,7,1],[7,7,2,7,7,1,7,1],[7,7,1,7,7,1,7,1],[7,7,7,5,7,1,7,1],[7,5,7,5,7,1,7,1],[7,3,7,5,7,1,7,1],[7,7,7,3,7,1,7,1],[7,5,7,3,7,1,7,1],[7,3,7,3,7,1,7,1],[7,7,7,2,7,1,7,1],[7,7,7,1,7,1,7,1],[7,5,7,1,7,1,7,1],[7,3,7,1,7,1,7,1],[7,1,7,1,7,1,7,1],[5,1,5,1,5,1,5,1],[4,7,1,7,7,7,4,1],[4,7,1,7,7,5,4,1],[3,7,7,1,7,7,3,1],[3,7,3,1,3,7,3,1],[3,5,7,1,7,5,3,1],[3,5,3,1,3,5,3,1],[3,3,3,1,3,3,3,1],[3,1,3,1,3,1,3,1],[1,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0]]
9 -> 1049
10 -> 4304
Último caso calculado por @HyperNeutrino
fonte
Respostas:
Geléia ,
1817 bytesExperimente online!
Como funciona
fonte
Python 2 ,
162156152146 146143 bytesExperimente online!
Mais ou menos força bruta:
product(r,repeat=n)
all(l[-~i-n]==l[i-l[i]]for i in r)
min(l[i:]+l[:i]for i in r)
Função recursiva que provoca um curto-circuito:
Esta versão é mais longa, mas pode calcular
f(10)
em ~ 19 segundos em tio.runNa minha máquina, encontrei:
f(11) = 16920
f(12) = 78687
Python 2 , 209 bytes
Experimente online!
Explicação:
fonte
%n
(e depois alguns parênteses)?CJam, 37
Experimente online
Praticamente força bruta, e parece meio desajeitado. Fica muito lento depois de 6. Substitua a última vírgula por a
p
para imprimir as rodas.fonte
Pitão, 28 bytes
Suíte de teste
Primeiro, geramos todas as sequências do comprimento apropriado com os elementos apropriados. Segundo, verificamos se há alguma falha no ponteiro. Terceiro, mapeie para todas as rotações classificadas. Quarto, desduplicar e contar.
fonte
Haskell ,
117 112104 bytesForça bruta, muito lenta para grandes entradas. Experimente online!
-5 bytes graças a Laikoni.
-5 bytes graças a Ørjan Johansen.
fonte
and[y<=drop i y++take i y|i<-x]
salva alguns bytes.x<$f
é um byte menor que\_->x
. (2) Graças à preguiça,n`drop`cycle y
economiza 4 bytesdrop n y++take n y
.<$
truque é bom.drop n y++y
acaba sendo ainda mais curto para a segunda dica.tails
, por isso, mais 4 com uma variante do truque padrão:all(y<=)$scanr(:)y y
.