Contexte
Presque tout le monde connaît les chiffres de Fibonacci F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Celles-ci sont formées par la fonction de récursivité F(n) = F(n-1) + F(n-2)
avec F(0)=0
et F(1)=1
. A000045
Une séquence étroitement liée est le nombre de Lucas L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Celles-ci sont formées par la fonction de récursivité L(m) = L(m-1) + L(m-2)
avec L(0)=2
et L(1)=1
. A000032
Nous pouvons alterner entre les deux séquences basées sur des indices pairs / impairs, avec la construction
A(x) = F(x)
si x mod 2 = 0
et A(x) = L(x)
sinon. Par exemple, A(4)
est égal à F(4)
depuis 4 mod 2 = 0
. Nous appellerons cette séquence les numéros Lucas-Nacci , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Cela peut être formé par la fonction récursive A(x) = 3*A(x-2) - A(x-4)
avec A(0)=0
, A(1)=1
, A(2)=1
et A(3)=4
. A005013
Défi
Étant donné l'entrée n
, sortez la séquence de n+1
nombres jusqu'à et y compris A(n)
comme décrit ci-dessus. Le moins d'octets (ou équivalents d'octets, comme pour LabVIEW , tel que déterminé individuellement sur Meta) gagne.
Contribution
Un seul entier non négatif n
.
Production
Une liste de nombres qui correspondent à la sous-séquence des nombres de Lucas-nacci de A(0)
à A(n)
. La liste doit être en ordre séquentiel comme décrit ci-dessus.
Règles
- Les règles de code-golf standard et les restrictions contre les échappatoires s'appliquent.
- Les règles d'entrée / sortie standard s'appliquent.
- Le numéro d'entrée peut être dans n'importe quel format approprié: unaire ou décimal, lu depuis STDIN, fonction ou argument de ligne de commande, etc. - votre choix.
- La sortie peut être imprimée sur STDOUT ou renvoyée à la suite de l'appel de fonction. S'ils sont imprimés, des délimiteurs appropriés pour différencier les nombres doivent être inclus (séparés par des espaces, séparés par des virgules, etc.).
- De plus, si la sortie vers STDOUT, les espaces blancs environnants, les retours à la ligne de fin, etc. sont tous facultatifs.
- Si l'entrée est un entier non ou un entier négatif, le programme peut faire n'importe quoi ou rien, car le comportement n'est pas défini.
Exemples
Input -> Output
0 -> 0
5 -> 0, 1, 1, 4, 3, 11
18 -> 0, 1, 1, 4, 3, 11, 8, 29, 21, 76, 55, 199, 144, 521, 377, 1364, 987, 3571, 2584
Réponses:
Gelée, 12 octets
Essayez-le en ligne!
Contexte
Nous pouvons étendre F et L à -1 en définissant F (-1) = 1 et L (-1) = -1. Ceci est cohérent avec la fonction récursive.
Notre programme commence par
À chaque étape, pour former la paire suivante, nous inversons la dernière paire et l'ajoutons à l'avant-dernière paire. Par exemple:
Si nous continuons ce processus pour quelques étapes supplémentaires, nous obtenons
La séquence Lucas-nacci est simplement la colonne de gauche.
Comment ça fonctionne
‡
С
jette un œil aux deux liens à gauche:2
etU+¥
. Puisque le plus à gauche est un nilad, il ne peut pas être le corps de la boucle. Par conséquent,U+¥
est utilisé comme corps et un nombre est lu à partir de l'entrée. Puisqu'il n'y a aucun argument de ligne de commande, ce nombre est lu à partir de STDIN.la source
CJam,
2120 octetsMerci à Sp3000 pour avoir économisé 1 octet.
Testez-le ici.
Explication
Utilise simplement la récurrence donnée dans la spécification de défi.
la source
Perl 6, 42 octets
usage
la source
{( (0,1,*+*...*) Z (2,1,*+*...*) ).flat.rotor( 1=>2, 1=>0 )[ 0..$_ ].flat}
(0,1,1,4,{$^b;$^d;3*$^c-$^a}...*)[^(n+1)]
.Haskell,
59,57,56,52, 51 octetsDéfinition de série adaptée de cette réponse .
Moins golfé:
fibLike start
donne une liste infinie, définie:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
renvoie 2 pour une entrée impaire (série Lucas) ou 0 pour une entrée paire (série Fibonacci).lucasNacci i
donne le ième nombre de Lucas-nacci.firstN n
cartes sur la liste.Un octet enregistré par Boomerang.
la source
2*mod i 2
enl
vous pouvez supprimer la parenthèse. Comme ça:l a=2*mod a 2:scanl(+)1(l a)
etf n=[l i!!i|i<-[0..n]]
ES6, 65 octets
Utilise la relation de récurrence donnée dans la question.
la source
Rétine ,
706259 octetsEssayez-le en ligne
1?
$`¶
- Créez une ligne pour chaque nombre de 0 à n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
- Ajouterff
aux lignes impaires. Cela amorcera la fonction avec L (0) = 2.m`$
f
- Ajoutezf
à toutes les lignes (notez l'espace). Cela amène la fonction avec 0 et 1 pour les nombres de Fibonacci, et 2 et 1 pour les nombres de Lucas.+`1(f*) (f*)
$2 $2$1
- Boucle: calculer F (n + 1) = F (n) + F (n-1) alors qu'il y a encore 1s.f*
- Supprimer F (n + 1) à la fin de chaque ligne.
f
s par 1s. Si cela n'est pas nécessaire et que nous pouvons rester avecf
s, la longueur n'est que de 55 octets.la source
Oracle SQL 11.2,
218216201 octetsNon golfé
J'ai réussi à gagner quelques octets en utilisant (abusant?) La fonction SIGN pour générer les 3 premiers éléments de la séquence.
la source
Japt,
252221 octetsTestez-le en ligne!
Contexte
Il est quelque peu difficile de créer une séquence de Fibonacci dans Japt, mais nous avons une fonction intégrée
Mg
pour le faire pour nous. Cependant, cela ne nous donne que la séquence de Fibonacci, pas la séquence de Lucas. Nous pouvons accomplir la séquence Lucas assez facilement en utilisant cette astuce:Comme vous pouvez le voir,
F(N-1) + F(N+1)
est égal àL(N)
pour tousN
. Cependant, comme nous n'avons besoin que de nombres de Lucas sur les indices impairs, nous pouvons combiner les deux formules en une seule:Comment ça fonctionne
la source
Mathematica,
5251 octetsIdée très similaire à celle de Martin ci-dessus, j'ai passé un certain temps à essayer de trouver un moyen plus court de définir les «cas de base» pour la fonction. L'interpolation polynomiale a été un buste, alors j'ai opté pour cela, en utilisant l'extension en négatifs pour obtenir une définition assez courte.
la source
Mathematica, 56 octets
Implémentation très simple. Définit une fonction d'assistance
f
, puis évalue une fonction sans nom qui s'appliquef
à une plage pour obtenir tous les résultats. Cela semble inutilement lourd.Une seule fonction sans nom semble être un octet de plus cependant:
la source
MATL , 17
18octetsTraduction presque directe de la réponse CJam de Martin .
Essayez-le en ligne!
la source
Brachylog , 51 octets
Cela prend un nombre en entrée et imprime dans STDOUT la liste, avec des espaces séparant chaque nombre.
Explication
La coupure
!
dans la première règle du sous-prédicat 1 est nécessaire pour que lorsque nous revenons en arrière (\
), nous ne nous retrouvions pas dans une boucle infinie où l'interpréteur tentera la deuxième règle pour une entrée inférieure à 4.la source
Mathematica, 41 octets
la source
Groovy, 50 octets
Ceci définit la fonction x, qui prend n comme premier argument et a le cas de base des quatre premiers nombres de la séquence Fibocas comme arguments par défaut pour le reste de la fonction.
un ici est n. b, c, d et e sont les quatre éléments suivants de la séquence.
Il décrémente n et revient jusqu'à ce que n soit inférieur à zéro - lorsqu'il revient, il ajoute à la valeur de retour ultime le premier élément de sa séquence actuelle. Les nouvelles valeurs des quatre éléments suivants de la séquence sont données à l'appel récursif - les trois derniers éléments sont décalés pour être les trois premiers, et un nouveau quatrième élément est généré à partir de deux des éléments précédents à l'aide de 3 * db.
Il délimite de nouvelles valeurs avec des imbrications de liste, car groovy peut retourner plusieurs valeurs en les fourrant dans une liste - donc chaque appel renvoie le premier élément actuel et le résultat de la récursivité, qui sera sa propre liste.
la source
R , 55 octets
Essayez-le en ligne!
la source
Pylônes , 19
Il s'agit d'une traduction assez directe de l'approche de Martin.
Comment ça fonctionne:
la source
DUP , 32 octets
Try it here!
Un lambda anonyme qui laisse une séquence de nombres sur la pile. Usage:
Explication
la source
Python 2, 71 octets
Cela semble définitivement trop long. Cependant, j'étais content d'avoir pu utiliser l'
not
opérateur au niveau du bit ... deux fois. Une fois comme une sorte de parité, retournez en arrière, et une fois pour terminer la récursion lorsquen
atteinte-1
.La variable
p
sera toujours soit0
ou-1
, donc elle alternera entre les entrées0
ou-1
de la liste. (Choisir l'entrée-1
d'une liste Python signifie choisir le dernier élément.)la source
Méta-programmation de modèle C ++, 130 octets
Les définitions récursives pleurent en quelque sorte pour C ++ TMP, utilisation:
d'
x
être leA(x)
vous aimez.la source