Se definirmos uma sequência semelhante a Fibonacci como f k (n) = (f k (n-1) + f k (n-2))% k , para algum número inteiro k (onde % é o operador de módulo), a sequência será necessariamente cíclico, porque existem apenas k 2 valores diferentes para (f k (n-1), f k (n-2)) . No entanto, este ciclo geralmente não inclui todos os possíveis pares de valores, assim, dependendo dos dois valores a partir de f k (0) e f k (1) , podemos obter diferentes ciclos. Por exemplo, para k = 2, temos as quatro possibilidades a seguir, dependendo dos dois primeiros valores:
0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 0, 1, 1, 0, 1, 1, ...
1, 0, 1, 1, 0, 1, 1, 0, 1, ...
1, 1, 0, 1, 1, 0, 1, 1, 0, ...
Devido à natureza cíclica das seqüências, existem realmente apenas duas seqüências fundamentalmente diferentes aqui, com as órbitas (0) e (0, 1, 1) . Vejamos k = 3 :
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, ...
0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, ...
1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, ...
1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, ...
1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, ...
2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, ...
2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, 2, ...
2, 2, 1, 0, 1, 1, 2, 0, 2, 2, 1, 0, 1, 1, 2, 0, ...
Novamente, existem apenas duas órbitas diferentes: (0) e (0, 1, 1, 2, 0, 2, 2, 1) .
Para k mais alto, podemos obter mais órbitas, mas elas ainda se enquadram em um número comparativamente pequeno de classes. Por exemplo, k = 4 produz as quatro órbitas (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) e k = 5 as três órbitas (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 4, 1) e (1, 3, 4, 2) .
Sua tarefa neste desafio é calcular quantas órbitas a sequência gera para um determinado k . Este é o OEIS A015134 . Aqui estão os primeiros 100 valores (a partir de k = 1 ):
1, 2, 2, 4, 3, 4, 4, 8, 5, 6, 14, 10, 7, 8, 12, 16, 9, 16, 22, 16,
29, 28, 12, 30, 13, 14, 14, 22, 63, 24, 34, 32, 39, 34, 30, 58, 19,
86, 32, 52, 43, 58, 22, 78, 39, 46, 70, 102, 25, 26, 42, 40, 27, 52,
160, 74, 63, 126, 62, 70, 63, 134, 104, 64, 57, 78, 34, 132, 101, 60,
74, 222, 37, 38, 62, 328, 89, 64, 82, 124, 41, 86, 42, 172, 75, 44,
184, 178, 181, 132, 82, 180, 99, 140, 104, 246, 49, 50, 114, 76
Certifique-se de verificar k = 11 , que é a primeira entrada que gera mais de k órbitas.
Regras
Você recebe um número inteiro positivo k e deve gerar A015134 (k) .
Você pode escrever um programa ou uma função e usar qualquer um dos métodos padrão de recebimento de entrada e saída.
Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
fonte
Respostas:
Casca ,
1716 bytesExperimente online!
Explicação
fonte
Bash,
172,119,113, 91 bytesExperimente online
fonte
Wolfram Language (Mathematica) ,
7670 bytesExperimente online!
Como funciona
Construímos o gráfico dado pelas regras
{{0,0}->{0,0}, {1,0}->{1,1}, ...}
que, dados dois elementos de uma seqüência generalizada de Fibonacci, encontram o próximo módulon
. OEdgeCycleMatrix
fornece a matriz de incidência de ciclos para bordas neste gráfico; queremos contar suas linhas.(Existem vários built-ins que executam uma tarefa semelhante, mas
ConnectedComponents
são mais longos eFindCycle
precisam de muitas entradas extras para fazê-lo funcionar. Além disso,EdgeCycleMatrix
existe uma matriz retangular, sem formato engraçado como os outros dois, o que ajuda mais tarde. )Para contar as linhas da matriz, pegamos o fatorial das entradas para transformá-lo em uma matriz de todas, e depois pegamos o rastreio. (Cada ciclo contém pelo menos uma aresta e, portanto, há pelo menos tantas colunas quanto linhas - portanto, isso conta as linhas e não as colunas.)
fonte
MATL ,
3836 bytesExperimente online! Ele atinge o tempo limite no compilador online para exceder a entrada
7
.Explicação
O código define órbitas em termos de números complexos, onde a parte imaginária é o novo termo e a parte real é o termo anterior na sequência de Fibonacci. Cada valor complexo codifica o estado da sequência. Ou seja, dado
a+jb
o próximo valor é calculado comob+j(a+b)
.Os possíveis valores iniciais estão
a+jb
coma
,b
em[0, 1, ..., k-1]
. Para cada valor inicial, o código iterak^2
vezes. Na verdade, para tornar o código mais curto, cada iteração é aplicada a todos os valores acumulados até o momento e os resultados são deduplicados (o que seria necessário no final). Após a última iteração, o vetor de valores complexos deduplicados é classificado (por valor absoluto e depois por ângulo). Isso fornece uma "assinatura" para cada órbita.No final do programa, as assinaturas são coletadas em uma matriz de células. O número de assinaturas exclusivas é a saída desejada.
fonte
Haskell ,
196191 bytesExperimente online!
Provavelmente isso poderia ser melhorado. Especialmente se alguém puder encontrar uma maneira de evitar
isInfixOf
e remover a importação.A idéia básica é gerar uma lista de "estados" (tuplas contendo os dois valores anteriores) para ver quando começa a circular. Em seguida, verificamos se cada órbita é diferente dos seus antecessores (realmente funciona ao contrário, mas é difícil colocar em palavras). Para verificar se as órbitas são iguais, verificamos se o comprimento é o mesmo e se uma se encaixa na outra concatenada consigo mesma. Por exemplo
[0,2,2]
,[2,2,0]
: comprimento de ambos é 3 e[0,2,2,0,2,2]
contém[2,2,0]
como uma subsequência contínua. Não tenho certeza se é infalível, mas parece funcionar.EDIT: obrigado a Laikoni por descolar 5 bytes! Eu deveria ter lido mais dessas dicas.
fonte
length
. Outro byte pode ser salvo!
com|r<-p++[a]=r!b
.JavaScript (ES6),
337335 bytesDesculpe pelo algoritmo de força bruta Ω (k ^ 3).
O desempenho ...
Quando eu estava calculando A015134 (algo além de k = 50), excedia o limite de 60s no TIO.Explicação (Ungolfed)
fonte
Perl 5, 80 + 1 (-p) bytes
Experimente online
fonte
Gelatina , 17 bytes
Experimente online!
fonte
JavaScript (ES6), 102 bytes
Retorna uma função que retorna o resultado. Para mais 3 bytes, podemos retornar o resultado diretamente:
Ambos possuem complexidade temporal O (n 2 ).
fonte
Python 2 , 214 bytes
Experimente online!
Não é muito eficiente, mas é o golfe que eu poderia fazer.
fonte