Contexte
La plupart d'entre vous savent ce qu'est un numéro de Fibonacci . Certains d'entre vous savent peut-être que tous les nombres entiers positifs peuvent être représentés comme la somme d'un ou plusieurs nombres de Fibonacci distincts, selon le théorème de Zeckendorf . Si le nombre de termes dans la représentation optimale de Zeckendorf d'un entier n
est lui-même un nombre de Fibonacci, nous appellerons n
"secrètement" Fibonacci.
Par exemple:
139 = 89 + 34 + 13 + 3
This is a total of 4 integers. Since 4 is not a Fibonacci number, 139 is not secretly Fibonacci
140 = 89 + 34 + 13 + 3 + 1
This is a total of 5 integers. Since 5 is a Fibonacci number, 140 is secretly Fibonacci
Remarques
- La représentation optimale de Zeckendorf peut être trouvée en utilisant un algorithme gourmand. Prenez simplement le plus grand nombre de Fibonacci <= n et soustrayez-le de n jusqu'à ce que vous atteigniez 0
- Tous les nombres de Fibonacci peuvent être représentés comme une somme de 1 nombre de Fibonacci (lui-même). Puisque 1 est un nombre de Fibonacci, tous les nombres de Fibonacci sont également secrètement Fibonacci.
Défi
Votre défi est d'écrire un programme ou une fonction qui prend un entier et retourne si cet entier est secrètement Fibonacci.
Contribution
Vous pouvez prendre des contributions dans n'importe quel format raisonnable. Vous pouvez supposer que l'entrée sera un seul entier positif.
Sortie
Sortie l'un des deux résultats distincts pour savoir si l'entrée est secrètement Fibonacci. Les exemples incluent True
/ False
, 1
/ 0
, etc.
Notation
C'est le golf de code , donc la réponse la plus courte en octets gagne! Les failles standard sont interdites.
Cas de test
Truthy (secretly Fibonacci)
1
2
4
50
140
300099
Falsey (NOT secretly Fibonacci)
33
53
54
139
118808
la source
Réponses:
JavaScript (Node.js) , 54 octets
Essayez-le en ligne!
la source
Python 2 , 77 octets
Essayez-le en ligne!
Cela utilise le théorème que les deux descriptions d' OEIS A003714 sont équivalentes:
Nous générons suffisamment * de tels nombres, puis les utilisonsn
z
comme mappage à partir d'entiers non négatifs sur «combien de termes sont dans la représentation de Zeckendorf de ?» En comptant 1s en binaire.Il reste alors à vérifier s'il
z[n]
s'agit d'un nombre de Fibonacci, c'est-à-direz[z[n]] == 1
.* Au moins, semble suffisant, et expérimentalement cela semble suffisant. Je le prouverai un peu plus tard.n2+ 1
la source
bin(x)
. Vous pouvez également en supprimer un en remplaçantrange(n*n+1)
parrange(n<<n)
. (En supposant que 0 n'est pas valide)bin(x)
, haha. Et, hm,1<<n
c'est déjà bien, bien plus que suffisant, mais j'aimerais garder le temps d'exécution non astronomiqueGelée , 15 octets
Un lien monadique acceptant un entier non négatif qui donne
1
si "Secretly Fibonacci" et0
autrement.Essayez-le en ligne! (trop inefficace pour les cas de test plus importants)
Comment?
la source
R , 83 octets
Essayez-le en ligne!
la source
C # (.NET de base) ,
12411598 bytesEssayez-le en ligne!
-3 octets: changé pendant la boucle en for (grâce à Olivier Grégoire )
-6 octets: les retours commutés utilisent une variable, b et c initialisés en dehors des boucles (merci à Kevin Cruijssen )
-17 octets: condition changée dans la deuxième boucle pour se déplacer si hors boucle et combiner avec retour, variables b et c réutilisées dans la dernière boucle (merci à raznagul )
Non golfé:
la source
for(;c<=a;b=c-b)c+=b;
vous fera économiser 3 octets.{}
crochets de vos boucles et mis tout enfor
-loops. De plus, j'ai ajouté une variabler
que nous avons définie1
dans votreif(e==n)
et revenons à la fin, donc vous n'en avez qu'unereturn
.e<n
vous pouvez déplacer leif
à après la boucle et combiner consequentlly avec lereturn
pour 101 octets .b
etc
dans la dernière boucle et en supprimantd
ete
.Perl 6 , 58 octets
Essayez-le en ligne!
1, &[+] ... * > $_
n'est que la séquence de Fibonacci, arrêtée à un endroit non infini pratique (le numéro d'entrée).$_, { $^n - (1, &[+] ...^ * > $n).tail } ... 0
est une séquence de nombres, en commençant par le numéro d'entrée, et chaque élément successif obtenu en soustrayant le plus grand nombre de Fibonacci inférieur ou égal à l'élément précédent de l'élément précédent. La séquence se termine quand0
est atteinte. Par exemple, si$_
est140
, alors cette séquence est140, 51, 17, 4, 1, 0
.Soustraire un de cette séquence le traite comme un nombre, sa longueur et la différence est le nombre de nombres de Fibonacci qui, additionnés, donnent le numéro d'entrée. Ensuite, ce numéro est vérifié pour l'appartenance à la première séquence de Fibonacci.
la source
&[+]
avant! Belle économie sur le fait de ne pas avoir à définir deux termes initiauxPerl 6 , 48 octets
Essayez-le en ligne!
Transforme l'entrée en une liste de représentations Zeckendorf à plusieurs reprises jusqu'à ce qu'elle atteigne un seul nombre, puis vérifie si la longueur de la séquence était inférieure à 4.
La fonction Zenckendorf au milieu provient principalement de la réponse de Sean avec quelques améliorations.
Explication:
Par exemple, la séquence de
2
est2 1
puisque2
est déjà un nombre de Fibonacci. La séquence de140
est140 5 1
et puisque 5 est un nombre de Fibonacci, cela renvoie vrai. La séquence de33
est33 4 2 1
, et comme ce4
n'est pas un nombre de Fibonacci, la séquence est de longueur 4.la source
05AB1E , 14 octets
Essayez-le en ligne . Pas de suite de tests pour tous les cas de test, car le
counter_variable
ne peut pas être réinitialisé à 0 .. J'ai tout vérifié à la main et ils sont corrects.Explication:
REMARQUE: le
counter_variable
serait5
pour l'entrée139
et6
pour l'entrée140
, car pour que laΔ
boucle vérifie la pile reste la même, elle fait bien sûr une itération supplémentaire.la source
Haskell , 64 octets
Essayez-le en ligne!
la source
Retina 0.8.2 , 61 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Convertissez en unaire.
Comptez le nombre de numéros de Fibonacci nécessaires.
La première alternance concerne les nombres de Fibonacci qui sont au moins 2. Lors de la première passe,
\2
n'existe pas encore, mais heureusement c'est facultatif, donc nous n'avons pas à le faire correspondre.\1
n'existe pas non plus, mais heureusement, nous avons l'alternative\G.
qui correspond à un seul caractère au début du match. Les deux\2
et\1
donc prendre la valeur 1.Lors des passes suivantes,
\2
existe, nous essayons donc de le faire correspondre. Cette fois, si elle échoue, elle échoue\1
également (car elle est plus grande que\2
), mais si elle réussit, elle(?>)
empêche le retour en arrière, donc si elle\2
correspond, mais\1
pas, nous n'essayons pas simplement\1
. (\G1
échoue toujours depuis que nous avons avancé après le début du patch.) Finalement\2
prend la valeur précédente de\1
while\1
prend la somme des deux valeurs.Nous faisons donc correspondre autant de numéros de Fibonacci que possible, en ajoutant au fur et à mesure. Puisque les sommes partielles de la séquence
1, 2, 3, 5...
sont à0, 1, 3, 6, 11...
savoir 2 de moins que les nombres de Fibonacci, nous terminons en faisant correspondre 2 à la fin.Cela ne correspond évidemment pas à 1 lui-même, donc une alternance gère ce cas.
Convertissez en unaire.
Testez s'il s'agit d'un numéro de Fibonacci. Cela utilise la même idée que le premier test, mais il utilise à la
^
place de\G
et nous devons également correspondre exactement, donc il utilise une capture facultative au lieu d'une alternance car c'est golfier (mais cela augmente les nombres de capture de 1).Rétine , 35 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Convertissez en unaire.
Comptez le nombre de numéros de Fibonacci nécessaires. (En bouclant à la fois la conversion et le nombre, vous économisez un octet entier au lieu d'obtenir le nombre en unaire en premier lieu.)
Effectuez les étapes précédentes deux fois au total. Cela prend le nombre de nombres de Fibonacci nécessaires pour additionner le nombre de nombres de Fibonacci.
Si le nombre était secrètement Fibonacci, le résultat est 1.
la source
Python 2 ,
146137 octetsEssayez-le en ligne!
f () est une fonction récursive qui renvoie la valeur du nième nombre de Fibonacci. Tiré de cette réponse .
g () est une fonction récursive qui renvoie la représentation de Zeckendorf du nombre donné sous la forme d'une liste d'entiers.
Étant donné que tous les nombres de Fibonacci auront une longueur de retour d'un élément de g (), h () vérifie si la longueur de g () de g (n) == 1.
EDIT: 9 octets enregistrés grâce à nedla2004 . J'oublie toujours que les lambdas ne sont pas toujours la meilleure solution ...
la source
g
une fonction pour pouvoir définirf(n-1)
une variable. Couple d' autres changements de==
la<
où ils sont les mêmes.