Ta tâche:
Ecrivez un programme ou une fonction pour vérifier si un numéro entré est un numéro de Fibonacci . Un numéro de Fibonacci est un nombre contenu dans la séquence de Fibonacci.
La séquence de Fibonacci est définie comme suit:
F(n) = F(n - 1) + F(n - 2)
Avec les graines étant F(0) = 0
et F(1) = 1
.
Contribution:
Un entier non négatif compris entre 0 et 1 000 000 000 pouvant être un nombre de Fibonacci ou non.
Sortie:
Une valeur vérité / fausseté indiquant si l'entrée est un nombre de Fibonacci ou non.
Exemples:
0-->truthy
1-->truthy
2-->truthy
12-->falsy
Notation:
C'est le code-golf , le plus petit nombre d'octets gagne.
code-golf
sequence
decision-problem
fibonacci
Gryphon - Rétablir Monica
la source
la source
Réponses:
Neim , 2 octets
Explication:
Fonctionne de la même façon que ma réponse de réponse C'est carré , mais utilise une liste infinie différente
f
:, pour fibonacci.Essayez le!
la source
66 D5
JavaScript (ES6), 34 octets
Génère récursivement la séquence de Fibonacci jusqu’à ce qu’il trouve un élément supérieur ou égal à l’entrée, puis renvoie l’élément item == input.
la source
Retina , 23 octets
Essayez-le en ligne!
Entrée en unaire, sorties
0
ou1
.Explication
La séquence de Fibonacci est un bon candidat pour une solution avec des références en aval, c’est-à-dire un "backreference" qui fait référence à un groupe environnant ou à un groupe qui apparaît plus tard dans la regex (dans ce cas, nous utilisons en fait les deux). Lorsque des nombres tels que ceux-ci correspondent, nous devons trouver une expression récursive pour la différence entre les éléments de séquence. Par exemple, pour faire correspondre des nombres triangulaires, nous associons généralement le segment précédent plus un. Pour faire correspondre les nombres carrés (dont les différences sont les nombres impairs), nous comparons le segment précédent plus deux.
Puisque nous obtenons les nombres de Fibonacci en ajoutant l’avant-dernier élément au dernier, les différences entre eux ne sont également que les nombres de Fibonacci. Nous devons donc faire correspondre chaque segment à la somme des deux précédents. Le coeur de la regex est la suivante:
Maintenant , cela finit par ajouter les nombres de Fibonacci à partir de 1 , soit 1, 1, 2, 3, 5, ... . Les ajouter jusqu'à 1, 2, 4, 7, 12, ... . C'est-à-dire qu'ils sont un de moins que les nombres de Fibonacci, nous ajoutons donc un
1
à la fin. Le seul cas que cela ne couvre pas est zéro, nous avons donc la^$
possibilité au début de couvrir cela.la source
^$|^(^1|\2?+(\1))*1$
^
.Regex (saveur ECMAScript),
392358328224206165 octetsLes techniques qui doivent être utilisées pour faire correspondre les nombres de Fibonacci avec une expression rationnelle ECMAScript (unaire) sont bien loin de la meilleure façon de la faire dans la plupart des autres saveurs d’expression rationnelle. L'absence de références arrière ou de récursion imbriquées / imbriquées signifie qu'il est impossible de compter directement ou de conserver un total cumulé. Le manque de repères rend souvent difficile le fait de disposer de suffisamment d’espace pour travailler.
De nombreux problèmes doivent être abordés sous un angle totalement différent et ne semblent pas résolus avant l’arrivée de certaines informations essentielles. Cela vous oblige à utiliser un réseau beaucoup plus large pour déterminer quelles propriétés mathématiques des nombres avec lesquels vous travaillez pourraient être utilisées pour résoudre un problème particulier.
En mars 2014, c'est ce qui s'est passé pour les chiffres de Fibonacci. En regardant la page Wikipedia, je ne pouvais pas au départ trouver un moyen, même si une propriété en particulier semblait extrêmement proche. Ensuite, le mathématicien Teukon a présenté une méthode indiquant clairement qu'il serait possible de le faire, en utilisant cette propriété avec une autre. Il était réticent à réellement construire la regex. Sa réaction quand je suis allé de l'avant et l'a fait:
Comme pour mes autres publications ECMAScript sur les expressions mathématiques unaires, je tiens à vous avertir: je vous recommande vivement d'apprendre à résoudre des problèmes mathématiques unaires dans ECMAScript regex. Ce voyage a été fascinant pour moi et je ne veux pas le gâter pour ceux qui voudraient éventuellement l'essayer eux-mêmes, en particulier ceux qui s'intéressent à la théorie des nombres. Voir ce post pour une liste de problèmes recommandés consécutivement étiquetés spoiler à résoudre un par un.
Donc , ne lisez pas plus loin si vous ne voulez pas que la magie des expressions rationnelles unaires vous soit gâtée . Si vous voulez vraiment essayer de découvrir cette magie vous-même, je vous recommande vivement de commencer par résoudre certains problèmes de la regex ECMAScript, comme indiqué dans l'article ci-dessus.
Le défi que j’avais initialement relevé: un entier positif x est un nombre de Fibonacci si et seulement si 5x 2 + 4 et / ou 5x 2 - 4 est un carré parfait. Mais il n'y a pas de place pour calculer cela dans une regex. Le seul espace dans lequel nous devons travailler est le numéro lui-même. Nous n'avons même pas assez de place pour multiplier par 5 ou prendre la place, sans parler des deux.
L'idée de teukon sur la façon de le résoudre ( posté à l'origine ici ):
Et voici une maquette de l'algorithme en C que j'ai écrit comme test avant de l'implémenter dans une regex.
Donc, sans plus tarder, voici la regex:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
Essayez-le en ligne!
Et la jolie version commentée et commentée:
L'algorithme de multiplication n'est pas expliqué dans ces commentaires, mais est brièvement expliqué dans un paragraphe de mon article sur les regex en nombres abondants .
Je maintenais six versions différentes de la regex de Fibonacci: quatre qui vont du plus court au plus rapide et qui utilisent l'algorithme expliqué ci-dessus, et deux autres qui utilisent un algorithme différent, beaucoup plus rapide mais beaucoup plus long, qui peut effectivement renvoyer l'index de Fibonacci en tant que correspondance (expliquer cet algorithme dépasse le cadre de cet article, mais il est expliqué dans la discussion d'origine Gist ). Je ne pense pas que je maintiendrais autant de versions très similaires d’une regex, car à l’époque, je faisais tous mes tests sous PCRE et Perl, mais mon moteur de regex est assez rapide pour que les soucis de vitesse ne soient plus aussi importants (et si une construction en particulier est à l'origine d'un goulot d'étranglement, je peux lui ajouter une optimisation) - bien que je conserverais probablement encore une version la plus rapide et une version la plus courte, à la différence en vitesse étaient assez gros.
La version "retourne l'indice de Fibonacci moins 1 en match" (peu joué au golf):
Essayez-le en ligne!
Toutes les versions sont sur github avec l'historique complet des optimisations de golf:
regex pour faire correspondre les nombres de Fibonacci - court, vitesse 0.txt (le plus court mais le plus lent, comme dans cet article)
regex pour faire correspondre les nombres de Fibonacci - court, vitesse 1.txt
regex pour faire correspondre les nombres de Fibonacci - court, vitesse 2.txt
regex pour numéros
correspondants de Fibonacci - expression rationnelle courte et rapide 3.txt pour les numéros correspondants de Fibonacci - regex plus rapide.txt
pour les numéros correspondants de Fibonacci - retour index.txt
la source
Python 3 , 48 octets
Essayez-le en ligne!
la source
int
mettrait la barre plus haute (pas encore arbitrairement grande), mais nous ne forçons pas non plus les réponses C à utiliser des entiers 64 bits (ou 128 bits avec gcc). En tout état de cause, être autorisé à utiliser le même algorithme dans une langue mais pas dans une autre semble absurde.Python 2,
4844 octetsEssayez-le en ligne
Merci à Jonathan Allan pour avoir économisé 4 octets
la source
False
et les valeurs de faussetéTrue
: TIO!n-a
à la place den==a
et avoir -1 et 0 comme valeurs de retour.-101
ou un autre résultat à la place de-1
.05AB1E ,
87 octetsExplication:
Essayez-le en ligne!
-1 merci à Jonathan Allan pour la solution de contournement 0-not-a-fibonacci-number.
la source
n
(enregistrer un octet) commeÅF
étant inclusif et¹å
aboutirait dans les0
deux sensn=0
?Perl 6 , 23 octets
la source
{(0,1,*+*...^*>$_).tail==$_}
était ce que j'allais initialement poster. Je suis peut-être parvenu à régler les opérateurs par la suite.Sérieusement , 3 octets
Essayez-le en ligne!
Retourne l'index +1 dans la liste des nombres de Fibonacci si truey, sinon renvoie fausseté.
Explication:
la source
Gelée ,
8 76 octetsEssayez-le en ligne!
Comment?
Remarques:
‘
, est nécessaire pour que cela fonctionne pour 2 et 3 , car ils sont les 3 ème et 4 ème nombres de Fibonacci - au - delà de 3 tous les nombres de Fibonacci sont supérieurs à leur indice.-
est nécessaire (plutôt que simplement‘R
) donc cela fonctionne pour 0 puisque 0 est le 0 ème nombre de Fibonacci;la source
3
:)ZX81 BASIC
180151100~ 94 octets BASIC sous forme de jetonsGrâce à Moggy sur les forums SinclairZXWorld, voici une solution beaucoup plus élégante qui permet d’économiser plus d’octets.
Cela affichera 1 si un numéro de Fibonacci est entré, ou zéro sinon. Bien que cela économise des octets, il est beaucoup plus lent que les anciennes solutions ci-dessous. Pour la vitesse (mais plus d'octets BASIC), supprimez les
VAL
enveloppeurs autour des nombres littéraux de chaîne. Voici les anciennes solutions avec quelques explications:Les modifications ci-dessus permettent d’économiser davantage d’octets BASIC en condensant les
IF
instructions en une seulePRINT
ligne 12; Les autres octets ont été sauvegardés à l'aide duVAL
mot clé and, et de l'utilisation deGOTO CODE "£"
ce qui est 12 dans le jeu de caractères ZX81. Les chaînes enregistrent davantage d'octets que de chiffres car toutes les valeurs numériques sont stockées sous forme de flottants. Par conséquent , utilisez davantage d'espace sur la pile VAR.la source
5 IF R<F THEN NEXT I
- mon mauvais!C #, 109 octets
Cela pourrait certainement être amélioré, mais je n’avais pas le temps.
la source
n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}
(seulement 80 octets). Essayez-le en ligne!a+=b
place dea=a+b
et à lab+=a
place deb=a+b
.> <> ,
2119 + 3 =2422 octetsL'entrée devrait être sur la pile au début du programme, donc +3 octets pour le
-v
drapeau.Essayez-le en ligne!
Cela fonctionne en générant des nombres de Fibonacci jusqu'à ce qu'ils soient supérieurs ou égaux au nombre entré, puis en vérifiant que le dernier numéro généré est bien égal à celui de l'entrée. Affiche
1
s'il s'agit d'un nombre de Fibonacci,0
sinon.Pour s'assurer que le
0
traitement est effectué correctement, la graine est-1 1
- le premier numéro généré sera0
plutôt que1
.Merci à @cole, qui
i
peut être utilisé pour-1
empiler lorsque STDIN est vide. Très intelligent!La version précédente:
la source
i
au lieu de01-
.i
comme-1
lorsqu'il n'y avait pas d'entrée dans STDIN, je n'avais pas pensé à ça. Bien fait!Mathematica, 37 octets
-4 octets de @ngenisis
la source
Fibonacci[0]
donne0
, vous pouvez donc économiser des4
octets en les incluant0
dans laTable
plage. Vous pouvez enregistrer un autre octet en utilisant la notation infixe pourTable
:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
MATL (16 octets)
Essayez-le en ligne!
Pas la solution la plus risquée, mais je voulais utiliser la méthode directe pour vérifier si "5 * x ^ 2 +/- 4" est un carré parfait .
Explication:
Remarque:
Dans le cas "0", il retourne "2" car 4 et -4 sont des carrés parfaits, idem avec 1 qui produit "1 1". Considérez toute sortie non nulle comme "vérité" et 0 comme "fausseté".
la source
Pari / GP , 32 octets
Essayez-le en ligne!
la source
PHP , 44 octets
Essayez-le en ligne!
PHP , 58 octets
Essayez-le en ligne!
la source
for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;
.Java,
7269686359555049 octetsTestez-le vous-même!
Alternative (encore 49 octets)
Pas très original: c'est la version itérative simple et basique.
Cela fonctionne pour des nombres allant jusqu'à 1 836 311 903 (47ème numéro de fibonacci) inclus. Au-dessus, le résultat est indéfini (y compris une boucle potentielle infinie).
Merci à Kevin Cruijssen et David Conrad pour leur aide au golf :)
la source
n==0
àn<1
. Dans la question, il est indiqué " Un nombre entier non négatif compris entre 0 et 1 000 000 000 ".b+=a;a=b-a;
C # (.NET Core) , 51 octets
Essayez-le en ligne!
-6 octets grâce à @Oliver!
Cette solution utilise une fonction récursive assez simple.
n
est le nombre à tester.a
etb
sont les 2 nombres les plus récents de la séquence.Le lien TIO illustre ce fonctionnement pour 1134903170 qui dépasse la valeur maximale requise par le défi.
la source
a<n
pour 51 octetsAlchimiste ,
205134 octetsUn grand merci à ASCII uniquement pour la fusion plutôt intelligente des états, économisant 71 octets !!
Essayez-le en ligne ou vérifiez par lot!
Ungolfed
la source
0
vérifications pour moins d'octets au prix du non déterminismeb
-atom lors de l' initialisation fixe (et Savès 2 octets): D MerciGelée , 5 octets
Essayez-le en ligne!
Renvoie 0 pour les nombres autres que Fibonacci et la position indexée 1 du nombre dans la séquence de Fibonacci pour les nombres de Fibonacci.
Explication:
la source
Dyalog APL, 17 octets
Essayez-le en ligne!
la source
R,
4340 octetspryr::f
crée une fonction:Utilise
DescTools::Fibonacci
pour créer les premiersx+1
nombres de fibonacci et vérifie l’inclusion.x+1
parce que le troisième fibnum est 2, et cela ne suffirait pas pour vérifier l'inclusion de 3.Heureusement
Desctools::Fibonacci(0)=0
, c'est un joli freebee.-3 octets grâce à MickyT
la source
-1:x+1
vous épargnera un octet, mais0:45
vous en économisera trois et couvrira la plage requisepryr::f(any(!(5*n^2+c(-4,4))^.5%%1))
.pryr
.Haskell , 31 octets
Essayez-le en ligne! Ceci exploite le fait que l'entrée sera dans la plage de 0 à 1 000 000 000. Il est donc nécessaire de vérifier uniquement les 45 premiers nombres de Fibonacci.
f=0:scanl(+)1f
génère une liste infinie de nombres de Fibonacci,take 45f
est la liste des 45 premiers nombres de Fibonacci etelem
vérifie si l'entrée est dans cette liste.Version illimitée: 36 octets
Essayez-le en ligne! Pour tous
n
, prendre les premiersn+3
numéros de Fibonacci garantira qu’iln
figurera dans cette liste s’il s’agit d’un numéro de Fibonacci.Notez que cette approche est incroyablement inefficace pour les nombres élevés qui ne sont pas des nombres de Fibonacci, car tous
n+3
les nombres de Fibonacci doivent être calculés.la source
Javascript (ES6 sans l'opérateur **), 44 octets
S'appuie sur le rapport entre les nombres successifs de Fibonacci approchant le nombre d'or. La valeur de c est la partie fractionnaire de l'entrée divisée par le nombre d'or - si l'entrée est Fibonacci, il sera très proche de 1 et la valeur de c-c² sera très petite.
Pas aussi court que d'autres réponses de JS mais qui s'exécute dans le temps O (1).
la source
Julia 0.4 , 29 bytes
Essayez-le en ligne!
Si ce n'est pas ainsi que vous répondez Julia, faites-le-moi savoir. Je ne sais pas comment fonctionne l'entrée sur TIO.
la source
!m=
) ou un lambda (compterm->
). Plus important encore, cela échoue pour 0 tel quel.R,
3231 octetsPrend les entrées de stdin, retourne
TRUE
ouFALSE
selon le cas.la source
Common Lisp,
6154 octetsEssayez-le en ligne!
La réduction de taille par rapport à la version précédente:
a été déclenchée par l’idée que pour générer la séquence des nombres de Fibonacci, seules deux variables sont nécessaires, et non trois.
la source
Mathematica, 33 octets
la source
@*
(puis abandonner la finale@#&
)JS (ES6), 57 octets
Utilise la méthode de carusocomputing . Beaucoup plus golfeur que mon autre réponse .
Ungolfed
la source