Si nous définissons une séquence de type Fibonacci comme f k (n) = (f k (n-1) + f k (n-2))% k , pour un entier k (où % est l'opérateur modulo), la séquence sera nécessairement cyclique, car il n'y a que k 2 valeurs différentes pour (f k (n-1), f k (n-2)) . Cependant, ce cycle n'inclut généralement pas toutes les paires de valeurs possibles, donc en fonction des deux valeurs de départ f k (0) et f k (1) , nous pouvons obtenir des cycles différents. Par exemple, pour k = 2 , nous avons les quatre possibilités suivantes, en fonction des deux premières valeurs:
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, ...
En raison de la nature cyclique des séquences, il n'y a vraiment que deux séquences fondamentalement différentes ici, avec les orbites (0) et (0, 1, 1) . Regardons 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, ...
Encore une fois, il n'y a que deux orbites différentes: (0) et (0, 1, 1, 2, 0, 2, 2, 1) .
Pour des k plus élevés, nous pourrions obtenir plus d'orbites, mais elles tomberont toujours dans un nombre relativement petit de classes. Par exemple, k = 4 donne les quatre orbites (0) , (0,1,1,2,3,1) , (0, 2, 2) , (0, 3, 3, 2, 1, 3) et k = 5 les trois orbites (0) , (0, 1, 1, 2, 3, 0, 3, 3, 1, 4, 0, 4, 4, 3, 2, 0, 2, 2, 4, 1) et (1, 3, 4, 2) .
Votre tâche dans ce défi est de calculer le nombre d'orbites générées par la séquence pour un k . Il s'agit d' OEIS A015134 . Voici les 100 premières valeurs (à 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
Assurez-vous de vérifier k = 11 , qui est la première entrée qui produit plus de k orbites.
Règles
On vous donne un entier positif k et vous devriez sortir A015134 (k) .
Vous pouvez écrire un programme ou une fonction et utiliser l'une des méthodes standard de réception d'entrée et de sortie.
Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.
Il s'agit de code-golf , donc la réponse valide la plus courte - mesurée en octets - l'emporte.
la source
Réponses:
Husk ,
1716 octetsEssayez-le en ligne!
Explication
la source
Bash,
172,119,113, 91 octetsEssayez-le en ligne
la source
Wolfram Language (Mathematica) ,
7670 octetsEssayez-le en ligne!
Comment ça fonctionne
Nous construisons le graphe donné par les règles
{{0,0}->{0,0}, {1,0}->{1,1}, ...}
qui, étant donné deux éléments d'une séquence de Fibonacci généralisée, trouvent le suivant modulon
. leEdgeCycleMatrix
donne la matrice d'incidence des cycles aux bords dans ce graphique; nous voulons compter ses lignes.(Il existe un certain nombre de fonctions intégrées qui effectuent une tâche similaire, mais
ConnectedComponents
sont plus longues etFindCycle
nécessitent de nombreuses entrées supplémentaires pour le faire fonctionner.EdgeCycleMatrix
. )Pour compter les lignes de la matrice, nous prenons la factorielle des entrées pour la transformer en une matrice de toutes celles-ci, puis prenons la trace. (Chaque cycle contient au moins un bord et donc il y a au moins autant de colonnes que de lignes - donc cela compte les lignes et non les colonnes.)
la source
MATL ,
3836 octetsEssayez-le en ligne! Il expire dans le compilateur en ligne pour le dépassement d'entrée
7
.Explication
Le code définit les orbites en termes de nombres complexes, où la partie imaginaire est le nouveau terme et la partie réelle est le terme précédent dans la séquence de Fibonacci. Chaque valeur complexe code l' état de la séquence. À savoir, étant donné que
a+jb
la valeur suivante est calculée commeb+j(a+b)
.Les valeurs de départ possibles sont
a+jb
aveca
,b
en[0, 1, ..., k-1]
. Pour chaque valeur de départ, le code réitère lesk^2
temps. En fait, pour raccourcir le code, chaque itération est appliquée à tous les valeurs accumulées jusqu'à présent, et les résultats sont dédoublonnés (ce qui serait nécessaire à la fin de toute façon). Après la dernière itération, le vecteur de valeurs complexes dédupliquées est trié (par valeur absolue, puis par angle). Cela donne une "signature" pour chaque orbite.À la fin du programme, les signatures sont collectées dans un tableau de cellules. Le nombre de signatures uniques est la sortie souhaitée.
la source
Haskell ,
196191 octetsEssayez-le en ligne!
Cela pourrait probablement être amélioré. Surtout si quelqu'un peut trouver un moyen d'éviter
isInfixOf
et de supprimer l'importation.L'idée de base est de générer une liste "d'états" (tuples contenant les deux valeurs précédentes) pour voir quand il commence à faire un cycle. Ensuite, nous vérifions si chaque orbite est différente de ses prédécesseurs (fonctionne vraiment dans l'autre sens mais c'est difficile à mettre en mots). Pour vérifier si les orbites sont les mêmes, nous vérifions si la longueur est la même et si l'une s'inscrit dans l'autre concaténée avec elle-même. Par exemple
[0,2,2]
,[2,2,0]
: longueur des deux est 3 et[0,2,2,0,2,2]
contient en[2,2,0]
tant que séquence continue. Je ne sais pas si c'est infaillible mais cela semble fonctionner.EDIT: merci à Laikoni pour avoir décollé 5 octets! J'aurais dû lire plus de ces conseils.
la source
length
. Un autre octet peut être enregistré!
avec|r<-p++[a]=r!b
.JavaScript (ES6),
337335 octetsDésolé pour l'algorithme de force brute Ω (k ^ 3).
Les performances ...
Lorsque je calculais A015134 (quelque chose au-delà de k = 50), il dépassait la limite des 60 sur TIO.Explication (non golfée)
la source
Perl 5, 80 + 1 (-p) octets
Essayez-le en ligne
la source
Gelée , 17 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 102 octets
Renvoie une fonction qui renvoie le résultat. Pour 3 octets supplémentaires, nous pouvons lui faire retourner le résultat directement:
Les deux ont une complexité temporelle O (n 2 ).
la source
Python 2 , 214 octets
Essayez-le en ligne!
Ce n'est pas très efficace mais c'est le plus golfique que je puisse faire.
la source