Définition
La séquence de Fibonacci de puissance alternative est formée comme suit.
Commencez avec la séquence vide et réglez n sur 1 .
Calculez f n , le n ième nombre de Fibonacci non négatif , avec répétitions.
0 est le premier, 1 est le deuxième et le troisième, 2 est le quatrième. Tous les autres sont obtenus en additionnant les deux nombres précédents dans la séquence, donc 3 = 1 + 2 est le cinquième, 5 = 2 + 3 est le sixième, etc.Si n est impair, changez le signe de f n .
Ajoutez 2 n-1 copies de f n à la séquence.
Incrémentez n et revenez à l'étape 2.
Ce sont les cent premiers termes de la séquence APF.
0 1 1 -1 -1 -1 -1 2 2 2 2 2 2 2 2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5 5 5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
Tâche
Écrivez un programme complet ou une fonction qui prend un entier positif n en entrée et imprime ou retourne le n ème terme de la séquence APF.
Si vous préférez une indexation basée sur 0, vous pouvez également prendre un entier non négatif n et imprimer ou renvoyer le numéro APF à l'index n .
C'est du golf de code ; que le code le plus court en octets gagne!
Cas de test (basés sur 1)
1 -> 0
2 -> 1
3 -> 1
4 -> -1
7 -> -1
8 -> 2
100 -> -8
250 -> 13
500 -> -21
1000 -> 34
11111 -> 233
22222 -> -377
33333 -> 610
Cas de test (basés sur 0)
0 -> 0
1 -> 1
2 -> 1
3 -> -1
6 -> -1
7 -> 2
99 -> -8
249 -> 13
499 -> -21
999 -> 34
11110 -> 233
22221 -> -377
33332 -> 610
Réponses:
Gelée , 5 octets
Essayez-le en ligne!
Comment?
Extension de la série de Fibonacci à des indices négatifs de telle sorte que la relation
f(i) = f(i-2) + f(i-1)
est toujours valable:Pour revenir
i=0
aux chiffres, nous devons répéter 2 à 1 fois, et Jelly's Fibonacci intégréÆḞ
, les calculera.Nous pouvons trouver le
-i
(un nombre positif) dont nous avons besoin en prenant la longueur de bitsn
et en soustrayant1
.Puisque nous voulons
i
(un nombre négatif) , nous pouvons effectuer à la place1-bitLength
et Jelly a un atome pour1-x
,C
la monade du complément.la source
µ
et⁸
Python 2 , 30 octets
Essayez-le en ligne!
Un index.
La séquence ressemblait à un puzzle, quelque chose que Dennis a généré en ayant un moyen court de l'exprimer. Les répétitions de puissance de deux suggèrent une récurrence par décalage de bits (division du plancher par 2). La récursion de Fibonacci à signe alternatif
f(n)=f(n-2)-f(n-1)
peut être adaptée au décalage de bits au lieu de décrémenter. Le cas de base fonctionne bien car tout est acheminé versn=0
.la source
Mathematica,
433624 octets7 octets enregistrés grâce à @GregMartin, et 12 autres grâce à @JungHwanMin.
la source
Floor@Log2@#
et en écrivantFibonacci[t=...]
(et en supprimant les espaces du dernier exposant).Fibonacci@-Floor@Log2@#&
-Fibonacci
peut aussi prendre des arguments négatifs (s'occupe du signe pour vous).MATL ,
19171611 octetsL'entrée est basée sur 1.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Comment ça marche
Pour une entrée n basée sur 1 , soit m le nombre de chiffres dans l'expansion binaire de n . Le n- ème terme de la séquence de sortie est le m- ème terme de la séquence de Fibonacci, éventuellement avec son signe changé.
Une idée serait d'itérer m fois pour calculer les termes de la séquence de Fibonacci. C'est facile avec une
for each
boucle utilisant le tableau de chiffres binaires. Si la séquence de Fibonacci était initialisée avec 0 , puis 1 comme d'habitude, l'itération de m fois entraînerait m + 2 termes sur la pile, de sorte que les deux premiers chiffres devraient être supprimés. Au lieu de cela, nous initialisons avec 1 , puis 0 . De cette façon, les prochains termes générés sont 1 , 1 , 2 , ... et une seule suppression est nécessaire.Le signe pourrait être traité en utilisant une autre boucle pour changer le signe m fois. Mais c'est coûteux. Il est préférable d'intégrer les deux boucles, ce qui se fait simplement en soustrayant au lieu d'ajouter dans l'itération de Fibonacci.
la source
JavaScript (ES6), 33 octets
1 indexé.
Un port de la réponse de xnor serait 23:
la source
Python 2 ,
838279 octetsEssayez-le en ligne!
la source
or -1
.Gelée , 9 octets
Utilise l'indexation à base unique.
Essayez-le en ligne!
Explication
Cette méthode fonctionne si votre fonction Fibonacci prend uniquement en charge les arguments non négatifs.
la source
Japt , 6 octets
Testez-le en ligne!
Comment ça marche
Comme mentionné dans d' autres réponses, le n ième terme de la série de Fibonacci signe alternatif est le même que le -n e terme de la série régulière. n peut être trouvé en prenant la longueur de bit de l'entrée et en soustrayant celle-ci; la négation de ceci entraîne 1 moins la longueur de bit.
la source
05AB1E ,
1110 octetsUtilise l'indexation basée sur 1
05AB1ELa fonction Fibonacci de renvoie des nombres de fib positifs inférieurs à n , ce qui signifie que nous devons générer plus que nécessaire, obtenir le bon par index puis calculer le signe. Je doute donc que toute méthode basée sur cela soit plus courte que le calcul itératif des nombres.
Utilise la réalisation que nous pouvons initialiser la pile avec
1, 0
inversé pour gérer le cas lorsquen=1
comme décrit dans la réponse MATL de Luis Mendo .Essayez-le en ligne!
Explication
la source
Perl 6 , 53 octets
Mise en œuvre simple de la séquence, telle qu'elle a été décrite.
Base zéro.
la source
Julia 0,5 , 19 octets
Essayez-le en ligne!
Comment ça marche
Cela utilise la même formule que la réponse Python @ xnor . La relation de récurrence
g (n) = g (n-2) + g (n-1) génère les termes négatifs de la séquence de Fibonacci, qui égalent les termes positifs avec des signes alternés. De n'importe où dans une série de 2 k répétitions du même nombre, nous pouvons choisir n'importe quelle répétition de la série précédente de 2 k-1 et de la série de 2 k-2 avant celles en divisant l'index par 2 et 4 .
Plutôt que le simple
nous pouvons redéfinir un opérateur pour nos besoins. De plus, f fonctionnera tout aussi bien avec des flotteurs, donc nous obtenons
Enfin, si nous mettons à jour n avec une division par 4 , nous pouvons écrire n / 2 comme 2n et omettre une paire de parens, conduisant à la définition de fonction de 19 octets dans cette réponse.
la source
J , 18 octets
Utilise l'indexation à base unique. Prend un entier d'entrée n > 0 et calcule
floor(log2(n))
en trouvant la longueur de sa représentation binaire, puis décrémente cette valeur de un. Il trouve alors lefloor(log2(n))-1
e coefficient de la fonction génératrice x / (1 + x - x 2 ) qui est le gf pour les valeurs de Fibonacci indexées négativement.Essayez-le en ligne!
Explication
la source