Vous avez probablement entendu parler des chiffres de Fibonacci. Vous savez, cette séquence entière qui commence par 1, 1
, puis chaque nouveau nombre est la somme des deux derniers?
1 1 2 3 5 8 13...
Etc. Les défis concernant les numéros de Fibonacci sont assez populaires ici . Mais qui a dit que les chiffres de Fibonacci devaient commencer 1, 1
? Pourquoi n'ont-ils pas pu commencer 0, 1
? D'accord, redéfinissons-les pour commencer à 0:
0 1 1 2 3 5 8 13...
Mais ... Nous ne devons pas nous arrêter là non plus! Si nous pouvons ajouter les deux derniers nombres pour obtenir le suivant, nous pourrions également soustraire le premier nombre du deuxième nombre pour ajouter un nouveau nombre. Cela pourrait donc commencer par 1, 0
:
1 0 1 1 2 3 5 8 13...
On peut même se retrouver avec des négatifs:
-1 1 0 1 1 2 3 5 8 13...
Et cette série continue aussi pour toujours. Je pense que c'est intéressant de voir comment cela finit par refléter les nombres réguliers de Fibonacci, juste avec tous les autres nombres rendus négatifs:
13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Appelons cette série le «numéro de Fibonacci étendu», ou EFN . Puisqu'il n'y a pas vraiment de nombre négatif évident pour commencer cette série, nous dirons que 0 apparaît à 0 , les nombres de Fibonacci réguliers s'étendent aux indices positifs, et les nombres de Fibonacci négatifs (semi-négatifs?) S'étendent aux indices négatifs, comme ceci:
Indices: ...-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
Values: ...13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Cela nous amène au défi d'aujourd'hui:
Étant donné un entier N , retournez chaque indice auquel N apparaît dans la série EFN .
Quelques observations aléatoires sur cette tâche:
1 apparaît plusieurs fois dans le EFN que tout autre numéro:
[-1, 1, 2]
. Aucun numéro n'apparaîtra dans plus de 3 endroits.Chaque numéro de Fibonacci> 1 apparaîtra une fois (3, 8, 21, etc.) ou deux fois (2, 5, 13, etc.)
Clarifications des règles:
- Si ce
abs(N)
n'est pas un nombre de Fibonacci, il n'apparaîtra jamais dans la série EFN , donc vous ne devez rien générer / une collection vide si possible, ou si cela n'est pas possible dans votre langue, vous pouvez sortir une valeur non numérique constante. - Si N apparaît à plusieurs endroits dans l' EFN , votre sortie n'a pas besoin d'être triée. Bien que chaque index doit apparaître exactement une fois.
- Bien que la plupart des défis de séquence vous permettent de choisir si vous souhaitez utiliser l'indexation basée sur 1 ou 0, ce défi doit utiliser l'indexation décrite (où 0 apparaît à 0).
- Vous pouvez utiliser les E / S dans n'importe quel format standard.
Cas de test
-13: []
-12: []
-11: []
-10: []
-9: []
-8: [-6]
-7: []
-6: []
-5: []
-4: []
-3: [-4]
-2: []
-1: [-2]
0: 0
1: [-1, 1, 2]
2: [-3, 3]
3: [4]
4: []
5: [-5, 5]
6: []
7: []
8: [6]
9: []
10: []
11: []
12: []
13: [-7, 7]
Et quelques cas de test plus importants:
89: [-11, 11]
1836311903: [46]
10000: []
-39088169: [-38]
Comme d'habitude, la réponse la plus courte en octets gagne!
Réponses:
Haskell , 78 octets
4 octets économisés grâce à nimi
Essayez-le en ligne!
D'abord, nous configurons
(#)
, prenons(#)
deux paramètres,a
etb
, et retournons la liste a commençant para
et suivie deb#(a-b)
. Cela crée une liste infinie, mais parce que Haskell est paresseux, nous n'avons pas besoin de nous en soucier en boucle pour toujours. Cela fonctionne essentiellement à l'envers en créant la séquence de Fibonacci avant une certaine paire. Par exemple,(0#1)
serait la liste de tous les nombres de Fibonacci avec un indice négatif.De là, nous faisons
f
.f
prend un argumenta
qui est le nombre que nous essayons de trouver dans la séquence. Ici, nous utilisons lado
notation pour faire une compréhension de liste. Nous commençons par prendre les premiersa*a+1
éléments de la liste0#1
1 . Puisque la fonctiona*a+1
croît plus vite que l'inverse de la séquence de Fibonacci, nous pouvons être sûrs que si nous vérifions dans cette limite, nous trouverons tous les résultats. Cela nous empêche de rechercher une liste infinie. Ensuite, pour chaque valeurx
et indicei
, six==a
nous avons trouvéa
dans la moitié négative de la séquence, nous revenons-i
, et siabs x==a
nous revenonsi
également parce que la valeur absolue de la moitié négative est la moitié positive, nous l'avons donc trouvée là.Puisque cela fait la liste
[0,0]
pour0
nous codons en dur la sortie correcte pour celle-ci.1: Cette astuce est tirée de la réponse Clean de Οurous ' . La même accélération s'applique ici comme là-bas, remplacez
a*a+1
parabs a+1
pour gagner beaucoup de temps.la source
u
para#b=a:b#(a-b)
plus0#1
économise un octet: essayez-le en ligne!Propre ,
132120109 octetsEssayez-le en ligne!
g :: Int -> Int
est la fonction de Fibonacci.? :: Int -> [Int]
seulement des indices dans les éléments de l'EFN au seink^2+1
de0
.Pour une version qui s'exécute dans un laps de temps raisonnable, passez
k*k+1
àabs k+1
.la source
Gelée , 11 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
9493 octetsEssayez-le en ligne!
la source
APL (Dyalog Classic) ,
5250 octetsA besoin
⎕IO←0
Essayez-le en ligne!
la source
0.8.2 Retina ,
104102 octetsEssayez-le en ligne! Explication:
Convertir en unaire, sauf si l'entrée est nulle.
Calculez l'indice de Fibonacci de la valeur absolue, mais si le nombre n'est pas un nombre de Fibonacci, supprimez-le, sauf s'il était zéro. Cela utilise l'expression régulière de test de Fibonacci de @ MartinEnder.
Supprimez les nombres négatifs dont les valeurs absolues sont des nombres de Fibonacci impairs.
Ajoutez des indices négatifs pour les nombres de Fibonacci positifs impairs.
Convertissez en décimal.
Ajoutez les indices supplémentaires pour
1
.la source
En fait , 34 octets
La force brute sauve la situation
Explication:
Essayez-le en ligne!
la source
Python 3 , 92 octets
Essayez-le en ligne!
Renvoie un ensemble d'indices.
la source
Python 2 ,
8785 octetsEssayez-le en ligne!
la source
05AB1E , 36 octets
Il doit y avoir une meilleure approche ..>.> Il y a six (ou sept si nous incluons
0
) différents scénarios pour ce défi, et ça me tue ..Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Quelques exemples étape par étape:
la source
Python 2 ,
959294 octetsEssayez-le en ligne!
la source
C # (Visual C # Interactive Compiler) , 144 octets
Essayez-le en ligne!
la source