Nous connaissons tous la célèbre séquence de Fibonacci , qui commence par 0
et 1
, et chaque élément est la somme des deux précédents. Voici les premiers termes (OEIS A000045 ):
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584
Étant donné un entier positif , retournez le nombre le plus proche de la séquence de Fibonacci, selon ces règles:
Le nombre de Fibonacci le plus proche est défini comme le nombre de Fibonacci avec la plus petite différence absolue avec l'entier donné. Par exemple,
34
est le nombre de Fibonacci le plus proche de30
, car|34 - 30| = 4
, qui est plus petit que le deuxième plus proche21
, pour lequel|21 - 30| = 9
.Si l'entier donné appartient à la séquence de Fibonacci, le nombre de Fibonacci le plus proche est exactement lui-même. Par exemple, le nombre de Fibonacci le plus proche de
13
est exactement13
.En cas d'égalité, vous pouvez choisir de sortir l'un des numéros de Fibonacci les plus proches de l'entrée ou simplement les sortir tous les deux. Par exemple, si l'entrée est
17
, tous les éléments suivants sont valables:21
,13
ou21, 13
. Si vous les retournez tous les deux, veuillez mentionner le format.
Les échappatoires par défaut s'appliquent. Vous pouvez prendre des entrées et fournir des sorties par n'importe quelle méthode standard . Votre programme / fonction ne doit gérer que des valeurs jusqu'à 10 8 .
Cas de test
Entrée -> Sortie 1 -> 1 3 -> 3 4 -> 3 ou 5 ou 3, 5 6 -> 5 7 -> 8 11 -> 13 17 -> 13 ou 21 ou 13, 21 63 -> 55 101 -> 89 377 -> 377 467 -> 377 500 -> 610 1399 -> 1597
Notation
C'est le code-golf , donc le code le plus court en octets dans chaque langue gagne!
n
impliquen ≥ 1
.Réponses:
Python 2 , 43 octets
Essayez-le en ligne!
Itère à travers des paires de nombres de Fibonacci consécutifs
(a,b)
jusqu'à ce qu'il atteigne celui où l'entréen
est inférieure à leur point médian(a+b)/2
, puis revienta
.Écrit en tant que programme (47 octets):
Même longueur :
la source
Neim , 5 octets
Explication:
Dans la dernière version de Neim, cela peut être joué à 3 octets:
Comme des listes infinies ont été retravaillées pour ne remonter qu'à leur valeur maximale.
Essayez-le en ligne!
la source
Python ,
5552 octetsEssayez-le en ligne!
la source
R ,
7067646260 octets-2 octets grâce à djhurio!
-2 octets de plus grâce à djhurio (garçon peut-il jouer au golf!)
Puisque nous n'avons qu'à gérer des valeurs jusqu'à
10^8
, cela fonctionne.Essayez-le en ligne!
Lit à
n
partir de stdin. lawhile
boucle génère les nombres de fibonacci enF
(dans l'ordre décroissant); en cas d'égalité, le plus gros est retourné. Cela déclenchera un certain nombre d'avertissements carwhile(F<1e8)
n'évalue l'instruction que pour le premier élément deF
avec un avertissementÀ l'origine, j'ai utilisé
F[which.min(abs(F-n))]
l'approche naïve, mais @djhurio a suggéré(F-n)^2
que la commande serait équivalente etorder
non paswhich.min
.order
retourne une permutation d'indices pour mettre son entrée dans l'ordre croissant, cependant, nous avons donc besoin[1]
à la fin d'obtenir uniquement la première valeur.version plus rapide:
ne stocke que les deux derniers nombres de fibonacci
la source
F=1:0;n=scan();while(n>F)F=c(F[1]+F[2],F);F[order((F-n)^2)][1]
F=1:0;n=scan();while(n>F)F=c(sum(F),F[1]);F[order((F-n)^2)][1]
F=1:0;while(F<1e8)F=c(F[1]+F[2],F);F[order((F-scan())^2)][1]
numbers::fibonacci(x<-scan(),T)
JavaScript (ES6), 41 octets
Arrondit par préférence.
la source
f=(n,x=0,y=1)=>x*(2*n<x+y)||f(n,y,x+y)
Comme vous n'avez pas à travailler avec 0, vous pouvez jouer un peu plus au golf.Gelée ,
97 octets-2 octets grâce à @EriktheOutgolfer
Essayez-le en ligne!
Conseils de golf bienvenus :). Prend un int pour entrée et retourne une int-list.
la source
µḢ
.Mathematica, 30 octets
Essayez-le en ligne!
la source
Code machine x86-64, 24 octets
Les octets de code ci - dessus définissent une fonction dans un code machine x86 64 bits qui trouve le plus proche nombre de Fibonacci de la valeur d'entrée spécifiée,
n
.La fonction suit la convention d'appel System V AMD64 (standard sur les systèmes Gnu / Unix), de sorte que le seul paramètre (
n
) est passé dans leEDI
registre et le résultat est retourné dans leEAX
registre.Mnémoniques d'assemblage non golfés:
Essayez-le en ligne!
Le code se divise essentiellement en trois parties:
EAX
est défini sur 0 etEDX
défini sur 1.La partie suivante est une boucle qui permet de calculer de manière itérative les nombres de Fibonacci de part et d' autre de la valeur d'entrée,
n
. Ce code est basé sur mon implémentation précédente de Fibonacci avec soustraction , mais… euh… n'est pas avec soustraction. :-) En particulier, il utilise la même astuce pour calculer le nombre de Fibonacci en utilisant deux variables - ici, ce sont les registresEAX
etEDX
. Cette approche est extrêmement pratique ici, car elle nous donne des nombres de Fibonacci adjacents. Le candidat potentiellement inférieur à celuin
détenuEAX
, tandis que le candidat potentiellement supérieur à celuin
détenuEDX
. Je suis assez fier de la façon dont j'ai pu serrer le code à l'intérieur de cette boucle (et encore plus chatouillé que je l'ai redécouvert indépendamment, et que j'ai réalisé plus tard à quel point c'était similaire à la réponse de soustraction liée ci-dessus).Une fois que nous avons les valeurs de Fibonacci candidates disponibles dans
EAX
etEDX
, il s'agit d'une question conceptuellement simple de déterminer laquelle est la plus proche (en termes de valeur absolue)n
. En fait, prendre une valeur absolue coûterait beaucoup trop d'octets, nous ne faisons donc qu'une série de soustractions. Le commentaire à droite de l'avant-dernière instruction de déplacement conditionnel explique bien la logique ici. Ce soit se déplaceEDX
dansEAX
, ou les feuillesEAX
seules, de sorte que lorsque la fonctionRET
Urnes, le nombre le plus proche est retourné Fibonacci dansEAX
.Dans le cas d'une égalité, la plus petite des deux valeurs candidates est retournée, puisque nous avons utilisé
CMOVG
au lieu deCMOVGE
faire la sélection. C'est un changement trivial, si vous préférez l'autre comportement. Le retour des deux valeurs n'est cependant pas un démarreur; un seul résultat entier, s'il vous plaît!la source
nasm foo.asm -l /dev/stdout | cut -b -28,$((28+12))-
pour couper certaines colonnes entre le code machine et la source dans une réponse récente.xor eax,eax
/cdq
/inc edx
. Vous pouvez donc créer une version de convention d'appel personnalisée 32 bits qui enregistre un octet.cdq
beaucoup dans les réponses de code-golf. Une convention d'appel personnalisée n'est pas requise. J'utilise généralement la__fastcall
convention d'appel Microsoft pour le code 32 bits. La bonne chose à ce sujet est qu'il est pris en charge par GCC avec une annotation, vous pouvez donc toujours utiliser le service TIO que tout le monde veut voir.edi
/esi
pourlodsb
/stosb
, et seul x86-64 SysV le fait (fait amusant: exprès pour cette raison, car certaines fonctions transmettent leurs arguments à memset / memcpy, et je suppose que gcc à l'époque aimait aux opérations de chaîne en ligne).PowerShell ,
8074 octets(Essayez-le en ligne! Ne répond pas temporairement)
Solution itérative. Prend l'entrée
$n
, définit$a,$b
être1,0
, puis boucle avec Fibonacci jusqu'à ce qu'elle$a
soit plus grande que l'entrée. À ce stade, nous indexons en($b,$a)
basé sur Boolean si la différence entre le premier élément et$n
est supérieure à celle entre$n
et le deuxième élément. Cela reste sur le pipeline, la sortie est implicite.la source
JavaScript (ES6), 67 octets
Cas de test
Afficher l'extrait de code
la source
JavaScript (Babel Node) , 41 octets
Basé sur la réponse impressionnante d'Ovs en Python
Essayez-le en ligne!
Non golfé
la source
0
(pas que ce soit nécessaire; je le veux juste):f=(n,i=1,j=1)=>n+n<i+j?i:f(n,j,j+i)
Python, 74 octets
Essayez-le en ligne!
Comment ça marche
Pour tout k ≥ 0, puisque | φ - k / √5 | <1/2, F k = φ k / √5 + φ - k / √5 = rond (φ k / √5). Ainsi, la valeur de retour passe de F k - 1 à F k exactement où k = log φ ( n ⋅2√5) - 1, ou n = φ k + 1 / (2√5), qui est à 1/4 de F k + 1/2 = ( F k - 1 + F k ) / 2.
la source
05AB1E , 6 octets
Essayez-le en ligne!
la source
C (gcc) ,
86858376 octetsEssayez-le en ligne!
la source
Java (OpenJDK 8) ,
605756 octetsEssayez-le en ligne!
-1 octet grâce à @Neil
la source
Python 3 , 103 octets
Essayez-le en ligne!
Malheureusement, j'ai dû utiliser un def au lieu de lambda ... Il y a probablement beaucoup de place à l'amélioration ici.
Réponse originale (incorrecte):
Python 3 , 72 octetsEssayez-le en ligne!
Ma première soumission PPCG. Au lieu de calculer les nombres de Fibonacci de manière récursive ou de les avoir prédéfinis, ce code utilise la façon dont le nième nombre de Fibonacci est l'entier le plus proche de la nième puissance du nombre d'or divisé par la racine de 5.
la source
nearest_fib_PM2R
fonction que j'ai liée dans mon commentaire sur la question.Taxi, 2321 octets
Essayez-le en ligne!
Essayez-le en ligne avec des commentaires!
Non golfé avec commentaires:
la source
Python 3 , 84 octets
Essayez-le en ligne!
Cela peut fonctionner, mais ce n'est certainement pas rapide ...
Sorties
True
au lieu de1
, mais en Python, elles sont équivalentes.la source
dc, 52 octets
Essayez-le en ligne!
Prend l'entrée lors de l'exécution en utilisant?
Modifié pour supposer le haut de la pile comme valeur d'entrée, -1 octet.
L'entrée est stockée dans le registre
i
. Ensuite, nous mettons 1 et 1 sur la pile pour démarrer la séquence de Fibonacci, et nous générons la séquence jusqu'à ce que nous atteignions une valeur supérieure ài
. À ce stade, nous avons deux nombres dans la séquence de Fibonacci sur la pile: un qui est inférieur ou égal ài
, et un qui est supérieur ài
. Nous les convertissons en leurs différences respectives aveci
puis comparons les différences. Enfin, nous reconstruisons le nombre de Fibonacci en ajoutant ou en soustrayant la différence ài
.Oups, je chargeais deux registres dans le mauvais ordre, puis les échangeais, gaspillant un octet.
la source
C # (.NET Core) ,
6356 octets-1 octet grâce à @Neil
-6 octets grâce à @Nevay
Essayez-le en ligne!
la source
for(;b<n;a=b,b+=c)c=a;
Enregistre- t-il un octet?c
en utilisantb+=a,a=b-a
(devrait économiser 6 octets).Q / KDB +, 51 octets
la source
Hexagonie , 37 octets
Essayez-le en ligne!
non golfé:
En panne:
Comme certaines autres affiches, je me suis rendu compte que lorsque le milieu de dernier et de curr est supérieur à la cible, le plus petit des deux est le plus proche ou à égalité pour le plus proche.
Le point médian est à (last + curr) / 2. Nous pouvons raccourcir cela parce que next est déjà last + curr, et si nous multiplions à la place notre entier cible par 2, nous devons seulement vérifier que (next - 2 * target)> 0, puis retourner en dernier.
la source
Brachylog , 22 octets
Essayez-le en ligne!
Vraiment tout ce que j'ai fait ici est de coller ensemble la solution classique de Fatalize Retourner le nombre premier le plus proche et ma propre Suis-je un numéro de Fibonacci? Solution. Heureusement, cette dernière opère déjà sur la variable de sortie; malheureusement, il inclut également une coupure nécessaire qui doit être isolée pour +2 octets, donc le seul point de choix qu'il rejette est de le
ⁱ
laisser≜
intact.la source
Japt
-g
, 8 octetsEssayez-le
la source
Java 7,
244234 octetsla source
static
si vous souhaitez rester avec Java 7.r>c&&s<c
devrait êtrer>=c&&s<=c
,s-c
devrait êtrec-s
), vous pouvez supprimer les espaces non requis, utiliserint f(int i){return i<2?i:f(--i)+f(--i);}
, utiliser une seule instruction de retour avec l'opérateur ternaire en c et supprimer la gestion spéciale pourc-s==r-c
car le retour de l'une ou l'autre valeur est autorisé.Pyke , 6 octets
Essayez-le en ligne!
la source
Lisp commun, 69 octets
Essayez-le en ligne!
la source
Perl 6 , 38 octets
Essaye-le
Pour une accélération potentielle, ajoutez
.tail(2)
avant.sort(…)
.Dans le cas d'une égalité, elle renverra toujours la plus petite des deux valeurs, car il
sort
s'agit d'un tri stable. (deux valeurs qui trieraient les mêmes gardent leur ordre)la source
Pyth, 19 octets
Essayez-le ici
Explication
la source
Haskell, 48 octets
Essayez-le en ligne!
la source