Si definimos una secuencia similar a Fibonacci como f k (n) = (f k (n-1) + f k (n-2))% k , para algún entero k (donde % es el operador del módulo), la secuencia necesariamente será cíclico, porque solo hay k 2 valores diferentes para (f k (n-1), f k (n-2)) . Sin embargo, este ciclo generalmente no incluye todos los pares de valores posibles, por lo que dependiendo de los dos valores iniciales f k (0) y f k (1) , podríamos obtener diferentes ciclos. Por ejemplo, para k = 2, tenemos las siguientes cuatro posibilidades, dependiendo de los dos primeros 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, ...
Debido a la naturaleza cíclica de las secuencias, aquí solo hay dos secuencias fundamentalmente diferentes, con las órbitas (0) y (0, 1, 1) . Veamos 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, ...
Nuevamente, solo hay dos órbitas diferentes: (0) y (0, 1, 1, 2, 0, 2, 2, 1) .
Para k más altos podríamos obtener más órbitas, pero aún caerán en un número comparativamente pequeño de clases. Por ejemplo k = 4 rendimientos los cuatro órbitas (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) y k = 5 las tres órbitas (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 4, 1) y (1, 3, 4, 2) .
Su tarea en este desafío es calcular cuántas órbitas genera la secuencia para una k dada . Este es OEIS A015134 . Aquí están los primeros 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
Asegúrese de verificar k = 11 , que es la primera entrada que produce más de k órbitas.
Reglas
Se le da un entero positivo k y debe generar A015134 (k) .
Puede escribir un programa o una función y utilizar cualquiera de los métodos estándar para recibir entradas y proporcionar salidas.
Puede usar cualquier lenguaje de programación , pero tenga en cuenta que estas lagunas están prohibidas de forma predeterminada.
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
fuente
Respuestas:
Casco ,
1716 bytesPruébalo en línea!
Explicación
fuente
Bash,
172,119,113, 91 bytesPruébalo en línea
fuente
Wolfram Language (Mathematica) ,
7670 bytesPruébalo en línea!
Cómo funciona
Construimos el gráfico dado por las reglas
{{0,0}->{0,0}, {1,0}->{1,1}, ...}
que, dados dos elementos de una secuencia de Fibonacci generalizada, encuentran el siguiente módulon
. ElEdgeCycleMatrix
da la matriz de incidencia de ciclos a bordes en este gráfico; Queremos contar sus filas.(Hay una serie de funciones integradas que realizan una tarea similar, pero
ConnectedComponents
es más larga yFindCycle
necesita muchas entradas adicionales para que funcione. Además,EdgeCycleMatrix
es una matriz rectangular, no de forma divertida como las otras dos, que ayuda más adelante. )Para contar las filas de la matriz, tomamos el factorial de las entradas para convertirlo en una matriz de todas, luego tomamos el rastro. (Cada ciclo contiene al menos un borde y, por lo tanto, hay al menos tantas columnas como filas, por lo que esto cuenta las filas y no las columnas).
fuente
MATL ,
3836 bytesPruébalo en línea! Se agota el tiempo de espera en el compilador en línea por exceder la entrada
7
.Explicación
El código define las órbitas en términos de números complejos, donde la parte imaginaria es el nuevo término y la parte real es el término precedente en la secuencia de Fibonacci. Cada valor complejo codifica el estado de la secuencia. A saber, dado
a+jb
el siguiente valor se calcula comob+j(a+b)
.Los posibles valores iniciales son
a+jb
cona
,b
in[0, 1, ..., k-1]
. Para cada valor inicial, el código iterak^2
veces. En realidad, para acortar el código, cada iteración se aplica a todos los valores acumulados hasta el momento, y los resultados se deduplican (lo que sería necesario al final de todos modos). Después de la última iteración, el vector de valores complejos deduplicados se ordena (por valor absoluto, luego por ángulo). Esto le da una "firma" para cada órbita.Al final del programa, las firmas se recopilan en una matriz de celdas. El número de firmas únicas es la salida deseada.
fuente
Haskell ,
196191bytesPruébalo en línea!
Esto probablemente podría mejorarse. Particularmente si alguien puede encontrar una manera de evitar
isInfixOf
y eliminar la importación.La idea básica es generar una lista de "estados" (tuplas que contienen los dos valores anteriores) para ver cuándo comienza a circular. Luego verificamos si cada órbita es diferente a sus predecesoras (realmente funciona al revés, pero es difícil de expresar con palabras). Para verificar si las órbitas son iguales, verificamos si la longitud es la misma y si una encaja en la otra concatenada consigo misma. Por ejemplo
[0,2,2]
,[2,2,0]
: longitud de ambos es 3 y[0,2,2,0,2,2]
contiene[2,2,0]
como una subsecuencia continua. No estoy seguro de si es infalible, pero parece funcionar.EDITAR: gracias a Laikoni por despegar 5 bytes! Debería haber leído más de esos consejos.
fuente
length
. Se puede guardar otro byte!
con|r<-p++[a]=r!b
.JavaScript (ES6),
337335 bytesPerdón por el algoritmo de fuerza bruta Ω (k ^ 3).
El rendimiento ...
Cuando estaba calculando A015134 (algo más allá de k = 50) superó el límite de 60 s en TIO.Explicación (sin golf)
fuente
Perl 5, 80 + 1 (-p) bytes
Pruébalo en línea
fuente
Jalea , 17 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 102 bytes
Devuelve una función que devuelve el resultado. Para 3 bytes más podemos hacer que devuelva el resultado directamente:
Ambos tienen complejidad temporal O (n 2 ).
fuente
Python 2 , 214 bytes
Pruébalo en línea!
No es muy eficiente, pero es el más golfista que podría hacer.
fuente