La célèbre séquence de Fibonacci est F(0) = 0; F(1) = 1; F(N+1) = F(N) + F(N-1)
(pour ce défi nous commençons par 0).
Votre défi: Étant donné n , sortez la somme de tous les d ième nombres de Fibonacci pour tous les diviseurs d du n ième nombre de Fibonacci. Si vous préférez une notation plus formelle,
Entrée : un entier positif n
Sortie : la somme
Par exemple, réfléchissez n=4
. F(4) = 3
Les diviseurs de 3 sont 1 et 3, donc la sortie devrait être F(1) + F(3) = 1 + 2 = 3
.
Pour n=6
, F(6) = 8
et les diviseurs de 8 sont 1, 2, 4, 8, de sorte que la sortie est F(1) + F(2) + F(4) + F(8) = 1 + 1 + 3 + 21 = 26
.
Cas de test:
1 => 1
2 => 1
3 => 2
4 => 3
5 => 6
6 => 26
C'est le code-golf , la réponse la plus courte en octets. Des échappatoires standard s'appliquent.
code-golf
number-theory
fibonacci
division
Neil A.
la source
la source
Gelée , 7 octets
Essayez-le en ligne!
Explication:
la source
Mathematica, 29 octets
la source
Mathematica simplifié , 14 octets
Eh bien, cela a fini par être identique à la solution de @ MartinEnder ...
la source
N
)Japt , 11 octets
Essayez-le en ligne!
la source
05AB1E , 11 octets
Essayez-le en ligne!
Explication
la source
Haskell, 54 octets
Exemple d'utilisation:
g 6
->26
. Essayez-le en ligne!la source
Alice ,
3836 octetsMerci à Leo d'avoir économisé 2 octets.
Essayez-le en ligne!
Certainement pas optimal. Le flux de contrôle est assez élaboré et même si je suis assez satisfait du nombre d'octets enregistrés par rapport aux versions précédentes, j'ai le sentiment de trop compliquer les choses pour qu'il y ait une solution plus simple et plus courte.
Explication
Tout d'abord, je dois élaborer un peu sur la pile d'adresses de retour d'Alice (RAS). Comme beaucoup d'autres fungeoids, Alice a une commande pour sauter dans le code. Cependant, il a également des commandes pour retourner d'où vous venez, ce qui vous permet d'implémenter les sous-programmes très facilement. Bien sûr, étant un langage 2D, les sous-programmes n'existent vraiment que par convention. Rien ne vous empêche d'entrer ou de quitter un sous-programme par d'autres moyens qu'une commande de retour (ou à tout moment dans le sous-programme), et selon la façon dont vous utilisez le RAS, il pourrait ne pas y avoir de toute façon une hiérarchie de saut / retour propre.
En général, cela est implémenté en faisant en sorte que la commande jump
j
envoie l'adresse IP actuelle au RAS avant de sauter. La commande de retour affichek
ensuite une adresse du RAS et y saute. Si le RAS est vide,k
ne fait rien du tout.Il existe également d'autres façons de manipuler le RAS. Deux d'entre elles sont pertinentes pour ce programme:
w
pousse l'adresse IP actuelle vers le RAS sans sauter n'importe où. Si vous répétez cette commande, vous pouvez écrire des boucles simples assez facilement, comme&w...k
je l'ai déjà fait dans les réponses précédentes.J
est commej
mais ne se souvient pas de l'adresse IP actuelle sur le RAS.Il est également important de noter que le RAS ne stocke aucune information sur la direction de l'IP. Donc, revenir à une adresse avec
k
préservera toujours la direction IP actuelle (et donc aussi si nous sommes en mode Cardinal ou Ordinal) quelle que soit la façon dont nous avons traversé lej
ouw
qui a poussé l'adresse IP en premier lieu.Cela étant dit, commençons par examiner le sous-programme du programme ci-dessus:
Ce sous-programme tire l'élément inférieur de la pile, n , vers le haut, puis calcule les nombres de Fibonacci F (n) et F (n + 1) (en les laissant en haut de la pile). Nous n'avons jamais besoin de F (n + 1) , mais il sera rejeté en dehors du sous-programme, en raison de la façon dont les
&w...k
boucles interagissent avec le RAS (ce qui oblige ces boucles à se trouver à la fin d'un sous-programme). La raison pour laquelle nous prenons des éléments du bas au lieu du haut est que cela nous permet de traiter la pile plus comme une file d'attente, ce qui signifie que nous pouvons calculer tous les numéros de Fibonacci en une seule fois sans avoir à les stocker ailleurs.Voici comment fonctionne ce sous-programme:
La fin de la boucle est un peu délicate. Tant qu'il y a une copie de l'adresse «w» sur la pile, cela démarre l'itération suivante. Une fois ceux-ci épuisés, le résultat dépend de la façon dont le sous-programme a été invoqué. Si le sous-programme a été appelé avec 'j', le dernier 'k' y revient, donc la fin de la boucle se double du retour du sous-programme. Si le sous-programme a été appelé avec 'J', et qu'il y a toujours une adresse antérieure à la pile, nous sautons là. Cela signifie que si le sous-programme a été appelé dans une boucle externe elle-même, ce «k» revient au début de cette boucle externe . Si le sous-programme a été appelé avec «J» mais que le RAS est vide maintenant, alors ce «k» ne fait rien et l'IP continue simplement de se déplacer après la boucle. Nous utiliserons ces trois cas dans le programme.
Enfin, passons au programme lui-même.
Ce ne sont que deux excursions rapides en mode Ordinal pour lire et imprimer des entiers décimaux.
Après le
i
, il y en a unw
qui se souvient de la position actuelle avant de passer dans le sous-programme, en raison du second/
. Cette première invocation du sous-programme calculeF(n)
etF(n+1)
sur l'entréen
. Ensuite, nous sautons ici, mais nous nous déplaçons vers l'est maintenant, donc le reste des opérateurs de programme en mode Cardinal. Le programme principal ressemble à ceci:Ici,
31J
c'est un autre appel à la sous-routine et calcule donc un nombre de Fibonacci.la source
Axiome, 68 octets
un test
la source
Pari / GP , 34 octets
Essayez-le en ligne!
la source
Python 2 ,
8984 octets-5 octets grâce aux ovs
Essayez-le en ligne!
la source
R, 77 octets
Utilise la bibliothèque 'gmp'. Cela a une fonction Fibonacci intégrée et offre la possibilité de faire de grands nombres. Cela a causé quelques problèmes avec les séquences et les applications, bien qu'il soit encore plus petit que la création de ma propre fonction Fibonacci.
Explication
Tester
Sans utiliser gmp
81 octets , fonction récursive désespérément lente lorsque de grands nombres (9+) sont sélectionnés
88 octets , la formule de Binet qui fonctionnera raisonnablement bien avec de plus grands nombres, mais atteint toujours la limite entière assez rapidement
la source
Perl 6 , 49 octets
la source
CJam , 26 octets
Essayez-le en ligne!
Je suis sûr que cela peut être mieux fait. Explication:
L'idée est d'avoir un tableau de nombres de Fibonacci et de le produire par points avec un tableau avec 1s et 0s si ce nombre est ou n'est pas un diviseur de l'entrée.
la source
JavaScript (ES6),
7665 octetsCas de test
Afficher l'extrait de code
la source
JavaScript (ES6),
10510410310197 bytesEssayez-le
la source
(z=g(i)/y)>~~z
à(z=g(i)/y)%1
, si vous vérifiez simplement qu'ilz
s'agit d'un entier.g(z)
eng(z|0)
mais nous ramène au même nombre d'octets.Q, 75 octets
la source
C (gcc) ,
939080 octetsEssayez-le en ligne!
la source
Ajouter ++ , 89 octets
Essayez-le en ligne!
la source