Nous connaissons tous la séquence de Fibonacci :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765
Cependant, au lieu de, f(n) = f(n-1) + f(n-2)
nous prendrons la somme numérique des 2 entrées précédentes.
La séquence doit toujours commencer 0, 1
, après quoi les différences sont rapidement apparentes. Cette liste est indexée 0, vous pouvez également utiliser l'index 1, indiquez celle que vous avez utilisée.
f(0) = 0
f(1) = 1
f(2) = 1 # 0 + 1
f(3) = 2 # 1 + 1
f(4) = 3 # 1 + 2
f(5) = 5 # 2 + 3
f(6) = 8 # 3 + 5
f(7) = 13 # 8 + 5
f(8) = 12 # 8 + 1 + 3
f(9) = 7 # 1 + 3 + 1 + 2
f(10) = 10 # 1 + 2 + 7
f(11) = 8 # 7 + 1 + 0
f(12) = 9 # 1 + 0 + 8
f(13) = 17 # 8 + 9
f(14) = 17 # 9 + 1 + 7
f(15) = 16 # 1 + 7 + 1 + 7
f(16) = 15 # 1 + 7 + 1 + 6
f(17) = 13 # 1 + 6 + 1 + 5
f(18) = 10 # 1 + 5 + 1 + 3
f(19) = 5 # 1 + 3 + 1 + 0
f(20) = 6 # 1 + 0 + 5
f(21) = 11 # 5 + 6
f(22) = 8 # 6 + 1 + 1
f(23) = 10 # 1 + 1 + 8
f(24) = 9 # 8 + 1 + 0
f(25) = 10 # 1 + 0 + 9
f(26) = 10 # 9 + 1 + 0
f(27) = 2 # 1 + 0 + 1 + 0
(After this point it repeats at the 3rd term, 0-indexed)
Remarque: je n'ai pas remarqué la répétition jusqu'à ce que j'aie posté le défi lui-même, et ici je pensais qu'il serait impossible d'écrire un autre défi Fibonacci.
Votre tâche consiste, en fonction d'un nombre n
, à sortir le nième chiffre de cette séquence.
Les 3 premiers chiffres: [0,1,1]
,
Motif répété à 24 chiffres: [2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,10,9,10,10]
Astuce: Vous pourrez peut-être exploiter cette répétition à votre avantage.
C'est le golf de code , le nombre d'octets le plus bas est le gagnant.
BONUS: Si vous utilisez la répétition dans votre réponse, je vais attribuer à la réponse de décompte d'octets la plus basse qui profite de la répétition dans la séquence une prime de 100 points. Cela devrait être soumis dans le cadre de votre réponse d'origine, après votre réponse d'origine. Voir cet article comme un exemple de ce dont je parle: https://codegolf.stackexchange.com/a/108972/59376
Pour bénéficier de ce bonus, votre code doit être exécuté en temps constant ( O(1)
) avec une explication.
Gagnant du bonus: Dennis https://codegolf.stackexchange.com/a/108967/59376 <Dennis a gagné.
Implémentation la plus unique: https://codegolf.stackexchange.com/a/108970/59376
(recevra également 100 points, finalisés après avoir choisi la bonne réponse)
la source
%24
à une solution "normale"?O(1)
. Votre code doit être exécuté en temps constant, s'il exploite vraiment la répétition.Réponses:
Oasis , 5 octets
Code:
Essayez-le en ligne!
Version étendue:
Explication:
la source
JavaScript (ES6), 45 octets
x
ety
ne peuvent pas être les deux9
, car cela nécessiterait que le nombre précédent soit0
, donc leur somme numérique ne peut pas dépasser17
. Cela signifie que la racine numérique pour les nombres supérieurs à9
est la même que le reste modulo9
.la source
Python 2, 53 octets
Fonction récursive. Les cas de base
n=0
etn=1
produisentn
des nombres plus grands calculent la valeur en appelantf(n-1)
et enf(n-2)
convertissant chacun en une chaîne, en concaténant les deux chaînes, en convertissant chaque caractère en un entier à l'aide de amap
avec laint
fonction, puis en additionnant la liste résultante.En utilisant les informations modulo-24, je peux actuellement obtenir une fonction non récursive non nommée de 56 octets:
la source
JavaScript (ES6), 34 octets
Peut geler votre navigateur pour les entrées supérieures à 27 environ, mais cela fonctionne pour toutes les valeurs d'entrée. Cela peut être vérifié avec un simple cache:
Comme indiqué dans la brillante réponse de Neil , la sortie ne peut jamais dépasser 17, de sorte que la somme numérique de toute sortie supérieure à 9 est égale à
n%9
. Cela fonctionne également avec des sorties inférieures à 9; nous pouvons aussi le faire fonctionner pour 9 en soustrayant 1 avec~-
avant le module, puis en rajoutant en 1 après.Le mieux que je puisse faire avec le codage en dur est de 50 octets:
la source
Gelée , 8 octets
Essayez-le en ligne!
Comment ça marche
Solution alternative, 19 octets, temps constant
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6),
52 4645 octetsUsage
Sortie
Explication
Cette fonction vérifie si l'entrée est inférieure à 2, et si c'est le cas, elle renvoie l'entrée. Sinon, il crée un tableau de deux valeurs qui sont ajoutées l'une à l'autre sous forme de chaînes. Ces deux valeurs sont le résultat de l'appel de la fonction avec
input - 1
etinput - 2
.le
...
opérateur divise cette chaîne en un tableau de caractères, qui est ensuite converti à nouveau en chaîne, mais maintenant avec+
es entre les valeurs. Cette chaîne est ensuite interprétée comme du code, de sorte que la somme est calculée, qui est ensuite renvoyée.Il s'agit d'un algorithme à double récursivité, ce qui le rend assez inefficace. Il a besoin de 2
n-2
appels de fonction pour l'entréen
. En tant que tel, voici une solution plus longue mais plus rapide. Merci à ETHproductions de l'avoir proposé.la source
[..._(--$)+[_(--$)]]
:-)05AB1E , 8 octets
Essayez-le en ligne!
Explication
la source
CJam,
2220 octetsEnregistré 2 octets grâce à Martin Ender
Algorithme récursif simple, rien d'extraordinaire. 0 indexé.
Essayez-le en ligne! ou tester pour 0-50 (fonctionne en fait assez rapidement).
Explication
CJam, 42 octets
Solution utilisant la répétition. Algorithme similaire à la solution de Jonathan Allan.
Essayez-le en ligne!
la source
Perl 6 ,
4137 octetsEssayez-le
Essayez-le
la source
*.comb.sum+*.comb.sum
.MATL , 15 octets
Essayez-le en ligne!
la source
Python 2 ,
5446 octetsFortement inspiré par la réponse ES6 de @ETHproductions .
Essayez-le en ligne!
la source
C, 96 octets
ou 61 octets comptant les codes d'échappement comme 1 octet chacun
0 indexé. Semblable à certaines des autres réponses, j'indexe une table de recherche de valeurs mais je l'ai compressée en blocs de 4 octets. Je n'ai pas pris la peine d'étudier la version mod 24 parce que je ne pensais pas que c'était aussi intéressant puisque les autres l'ont déjà fait mais avouons-le, C ne va pas gagner de toute façon.
explication:
Essayez-le en ligne!
la source
Japt ,
2725 octetsEssayez-le en ligne!
Sauvegardé 2 octets grâce à ETHproductions.
la source
´
à la place de--
sauver deux octets.Haskell , 54 octets
Essayez-le en ligne! Usage:
(g!!) 12
la source
Mathematica, 49 octets
Définition récursive simple. Obtient assez lent après un certain temps.
Mathematica,
7971 octetsCodage en dur du modèle périodique. Rapide comme l'éclair et abusivement satisfaisant pour Mathematica :) Merci à JungHwan Min pour avoir économisé 8 octets!
la source
LetterNumber@"JJBCEHMLGJHIQQPOMJEFKHJ"
est 8 octets plus court que43626804920391712116157158790~IntegerDigits~18
.LetterNumber
...Python 2 , 56 octets
Solution itérative simple.
Essayez-le en ligne!
L'utilisation
(a%9or a)+(b%9or b)
s'est avérée être plus courte quesum(map(int(`a`+`b`)))
!la source
sum(map(int,a+b))
(ne peut pas comprendre comment utiliser `dans les commentaires)PowerShell , 79 octets
Essayez-le en ligne!
Longue solution itérative ennuyeuse qui effectue des calculs de somme de chiffres directs à chaque
for
boucle. À la fin de la boucle, le nombre que nous voulons est$b
, donc il reste sur le pipeline et la sortie est implicite. Notez que si l'entrée est0
, alors la boucle n'entrera pas car le conditionnel est faux, donc ça$b
reste0
.la source
Lot, 85 octets
Je me demandais comment j'allais porter ma réponse JavaScript en batch mais l'indice était dans la solution Python de @ Dennis.
la source
Pyth, 20 octets
Un programme qui prend en entrée un entier indexé zéro et imprime le résultat.
Suite de tests (première partie pour le formatage)
Comment ça marche
[Explication à venir plus tard]
la source
Rubis, 58 octets
La solution simple en dur.
la source
empilé , 40 octets
Cette lambda est équivalente à la lambda suivante:
Essayez-le en ligne!
la source
Octave, 148 octets
la source
Haskell, 151 octets
Appelez la fonction avec
f 123456789012345678901234567890123456789012345678
, par exemple.Le code fonctionne également avec de très gros indices. En raison de la fonctionnalité modulo 24 implémentée, elle est très rapide.
Le code non compressé:
la source
R, 90 octets
Une solution horriblement longue, mais elle est meilleure que la 108 que j'avais à l'origine. Je soupçonne qu'il existe une bien meilleure façon de procéder, mais je ne peux pas le voir pour le moment.
Il s'agit d'une fonction sans nom qui utilise
gsub
etscan(t=
pour diviser les chiffres du vecteur en chiffres. La somme de ceux-ci est ajoutée au vecteur pendant que le premier élément est supprimé.repeat
est utilisé pour parcourir lesn
temps de séquence et le résultat est le premier élément du vecteur.la source
PHP, 80 octets
Version en ligne
la source
Mathematica, 67 octets
la source