introduction
Nous connaissons tous et aimons notre séquence de Fibonacci et nous avons déjà vu une myriade de défis à relever. Cependant, il nous manque encore un cas très simple que cette réponse va fournir: Fibonacci inversé! Donc, étant donné que F_n
votre travail est de trouver n
.
spécification
Contribution
Votre entrée sera un entier non négatif, ce qui est garanti pour faire partie de la séquence de fibonacci.
Sortie
La sortie doit également être un entier non négatif.
Que faire?
L’introduction disait déjà: À partir d’un numéro de fibonacci, affichez son index. Le numéro FiboCancci est défini comme suit: F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)
vous êtes donné F(n)
et vous devez revenir n
.
Cas potentiels de coin
0 est une entrée et une sortie valide.
Si vous donnez "1" en entrée, vous pouvez sortir "1" ou "2", comme vous préférez.
Vous pouvez toujours supposer que votre entrée est en réalité un nombre de fibonacci.
Vous pouvez supposer que l'entrée est représentable sous la forme d'un entier signé 32 bits.
Qui gagne?
C'est du code-golf donc la réponse la plus courte en octets gagne!
Les règles standard s'appliquent bien sûr.
Cas de test
0 -> 0
2 -> 3
3 -> 4
5 -> 5
8 -> 6
13 -> 7
1836311903 -> 46
Réponses:
En fait, 1 octet
Oui, il y a une logique pour cela, depuis le 16 novembre 2015 .
Essayez-le en ligne
Pour le plaisir, sans l'integrin, c'est 9 octets:
Essayez-le en ligne!
Explication:
la source
Mathematica, 25 octets
Une fonction. Assez explicite si vous me demandez.
la source
Python,
363432 octetsVersions précédentes:
Explication
L'idée principale est d'inverser la formule
qui nous dit que
obtenir
Les optimisations de golf sont les suivantes:
len(str(n))
pour calculer la base de journaux 10 sans importerlog
(ancienne version utilisée.bit_length()
pour calculer la base de données 2)n
à une puissance, de sorte que l'approximation du logarithme puisse faire la distinction entre les nombres de Fibonacci successifsEnsuite, le diviseur a été tronqué avec le moins de précision possible et le multiplicateur choisi pour donner les résultats corrects pour tous les nombres de fibonacci 32 bits.
la source
f=
n'est pas compté.lambda n:~-len(`66*n**6`)//1.24
devrait fonctionner.05AB1E , 3 octets
Code:
Explication:
Utilise le codage CP-1252 . Essayez-le en ligne! .
la source
Gelée,
14 à11 octetsEssayez-le en ligne!
C'est ma toute première réponse en gelée! Ceci utilise l'algorithme de la réponse MATL . Merci à Dennis d'avoir réduit de 3 octets!
Explication:
Cela donne la bonne réponse, il ne reste plus qu'à gérer le cas particulier du «0». Avec '0' comme argument, nous obtenons
-infinity
, alors nous revenonsla source
Julia,
272618 octetsCeci utilise l'inverse de la formule de Binet , avec juste assez de précision pour les entiers 32 bits; cela fonctionne réellement jusqu'à F (153) = 42.230.279.526.998.466.217.810.220.532.898> 2 105 .
Essayez-le en ligne!
Comment ça marche
La formule de Binet est la suivante.
La restriction de F à l'ensemble de Fibonacci, la carte n → F n a un droit inverse F → n F .
Nous avons cela
et tout ce qui reste à faire est de traiter le cas de bord 0 .
L'entrée étant limitée aux entiers 32 bits, nous pouvons utiliser des littéraux décimaux courts au lieu des constantes de la formule.
log φ = 0.481211825059603447… ≈ 0.48
Malheureusement, 0.5 n'est pas assez précis.
√5 = 2,23606797749978969664… 3
Cela peut sembler une première approximation, mais nous prenons des logarithmes et puisque log 3 - log √5 = 0,29389333245105… , le résultat avant arrondi est décalé d’un petit facteur constant.
0.5 ≈ 0.7
En raison de l'excès par rapport à l'approximation précédente, nous pourrions en fait omettre complètement ce terme et toujours obtenir des résultats corrects pour F> 0 . Cependant, si F = 0 , le logarithme sera indéfini. 0,7 s'est avéré être la valeur la plus courte qui étend notre formule à F = 0 .
la source
JavaScript,
5450695042 octetsÇa ne va sûrement pas gagner, juste pour le plaisir :)
Ok, la vérification de zéro consomme 19 octets. WTF?Stupide que je suis.Démo! Pour voir le dernier cas de test, vous devez faire un peu défiler la console.
Merci @edc pour le raccourcissement de 8 octets.
la source
b=>{for(j=1,i=c=0;b-i;c++)i=j+(j=i);return c}
45, golfedb=>(j=>{for(i=c=0;b-i;c++)i=j+(j=i)})(1)|c
42.Perl 6
33 3027 octetsL'essayer
Explication:
Tester:
la source
first *==$_
par justefirst $_
, car un nombre est un corrélat intelligent....
opérateur au lieu defirst
Gelée , 8 octets
Essayez-le en ligne! Notez que cette approche est trop inefficace pour le dernier cas de test.
Comment ça marche
la source
Pyke, 5 octets
Essayez-le ici!
la source
Python, 29 octets
Divise récursivement l'entrée par l'approximation du nombre d'or 1.61 jusqu'à ce qu'elle soit inférieure à 0,7 et génère le nombre de divisions.
Pour 0, le code est généré
False
, ce qui correspond à 0 en Python . Cela peut être évité pour 2 octetsla source
JavaScript (ES6),
3933 octetsMême avec ES7, la formule inverse de Binet prend 47 octets:
la source
log
et de pré-calculer toutes les constantes ...f(n,k,j+k)
, vous devez inclure l'affectationf=
et la compter comme +2 octets . La règle pour les lambdas non nommés ne devrait pas s'appliquer ici.Sage, 49 octets
Merci à TuukkaX pour la suggestion de sauver
sqrt(5)
que des
se raser quelques octets.Essayez-le en ligne .
Cette approche utilisant une méthode inverse de la formule de Binet offre plusieurs améliorations par rapport à la précédente: plus rapide (temps constant ou temps quadratique), elle fonctionne en fait pour les entrées plus volumineuses et plus courte!
Les utilisateurs de Python peuvent se demander pourquoi j'utilise
sqrt(5)
plutôt que le plus court5**.5
- c'est parce qu'il5**.5
est calculé avec lapow
fonction de C et perd de la précision en raison de problèmes de virgule flottante. De nombreuses fonctions mathématiques (y comprissqrt
etlog
) sont surchargées dans Sage pour renvoyer une valeur symbolique exacte, qui ne perd pas de précision.la source
sqrt(5)
dans une variable et l'utiliser deux fois au lieu de tapersqrt(5)
deux fois?MATL , 14 octets
Essayez-le en ligne!
Cela utilise un inverse de la formule de Binet , donc c'est très rapide.
Soit F le n- ième nombre de Fibonacci et φ le nombre d' or . ensuite
Le code utilise cette formule avec deux modifications:
Comment c'est fait
la source
O1G:"yy+]vGmfq
t?17L&YlXkQ
5X^*
. ( Je l'ai déjà fait auparavant .) Et je ne connais pas suffisamment MATL pour continuer à l'améliorer.Python, 38 octets
Testez-le sur Ideone .
la source
JavaScript, 22 octets
la source
-Infinity|0
c'est0
en JavaScript. Allez comprendre.-Infinity = FFF00000 00000000
. J'étais heureux de le savoir, il épargne 3 octets pour ne pas avoir à prévoir un test de zéro explicite commen&&
. En dehors de cela, le but principal de|0
est de remplacerMath.trunc()
(comme÷
dans Julia).C,
6258 octetsDétaillé
la source
Java 7, 70 octets
https://ideone.com/I4rUC5
la source
int c(int n){int a=0,b=1,c=0,t;for(;a<n;t=b,b+=a,a=t)c++;return c;}
(non testé)int c(int n){int a=0,b=1,c=0;while(a<n){c++;b+=a;a=b-a;}return c;}
(non testé)int c(int n){int a=0,b=1,c=0;for(;a<n;b+=a,a=b-a)c++;return c;}
(non testé)TSQL, 143 octets
L'entrée se passe
@n
comme dansDECLARE @n INT = 1836311903;
la source
Haskell, 45 octets
la source
Sesos , 28 octets
Hexdump:
Essayez-le en ligne!
(Temps exponentiel car dans Sesos, la copie d’un nombre nécessite un temps exponentiel.)
Assemblage utilisé pour générer le fichier binaire:
la source
Java 8 61 octets
Identique à @dainichi, la réponse a été raccourcie avec Java 8 lambdas. La réponse est une expression rvalue valide.
Ungolfed:
la source
Pyth, 13 octets
Suite de tests.
Approximation en Python 2:
approche alternative, 18 octets
Suite de tests.
Cela utilise
.I
pour inverse.la source
Java 7, 89 octets
Inspiré par l'explication de @Adnan réponse 05AB1E de .
Ungolfed & cas de test:
Essayez ici. (La limite de temps est dépassée pour le dernier cas de test, mais cela fonctionne dans environ 30 à 45 secondes sur mon PC.)
Sortie:
la source
Perl 5.10, 48 octets
Fondamentalement, chercher le bon
n
pour queF(n) = input
.-a
switch ajoute un octet.Essayez-le ici!
la source
J,
322717 octetsCalcule les n premiers nombres de Fibonacci, puis trouve l'index de n dans cette liste.
Usage
Des commandes supplémentaires sont utilisées pour formater plusieurs entrées / sorties. Le dernier cas de test est omis car le calcul nécessitera beaucoup plus de temps.
Explication
la source
Mathematica, 30 octets
Fonction pure; renvoie 2 si l'entrée est 1.
Ne bat pas l’autre entrée de Mathematica, mais présente une méthode inhabituelle: c’est un fait (très cool) que le nombre Nth de Fibonacci est l’entier le plus proche de [1 / sqrt (5) fois la Nième puissance du nombre d’or] (" Formule de Binet ").
Par conséquent, la fonction inverse sera le logarithme base- [nombre d'or] de [sqrt (5) fois le nombre de Fibonacci en question]. Le
.8+
est un hack pour s'assurer que nous ne prenons pas le logarithme de 0, sans foirer les autres valeurs.la source
Japt , 10 octets
Essayez-le en ligne!
Explication
la source
Brachylog , 14 octets
Essayez-le en ligne!
Prend les entrées par la variable de sortie et les sorties par la variable d’entrée.
Je ne suis pas tout à fait sûr pourquoi
≜
est nécessaire.la source
Javascript (en utilisant une bibliothèque externe) (84 octets)
Lien vers lib: https://github.com/mvegh1/Enumerable
Explication de code: La bibliothèque a une méthode statique qui crée une séquence jusqu'à ce que le prédicat ait une valeur de retour non définie. Le prédicat a une signature de ("i" ndex, courant interne "a" généré). À chaque itération, nous vérifions si le dernier élément du tableau interne est égal à l'entrée, n. Sinon, retourne la valeur suivante dans la séquence fib. Sinon, le prédicat a un résultat non défini qui met fin à la génération de la séquence. Ensuite, nous retournons la longueur de la séquence (et soustrayons 1 pour se conformer à la valeur 0 telle qu’elle est vue dans l’OP
la source
n=>{a=c=t=0,b=1;while(a<n){c++;t=b;b+=a;a=t}return c}
Essayez-le en ligne!