Additionner les n premiers nombres de Fibonacci pairs


19

Il ne semble pas encore y avoir de concours pour celui-ci.

La tâche est simple. Ajoutez les premiers nnombres de la séquence de Fibonacci qui sont pairs et sortez le résultat.

Ceci est donné par OEIS A099919 , sauf que la séquence est décalée d'un, en commençant par fib(1) = 0au lieu de fib(1) = 1.

C'est le golf de code. Le nombre d'octets le plus bas gagne.

Exemples

n sum
1 0
2 2
3 10
4 44
5 188
6 798
7 3382
8 14328
9 60696

en relation



@EasterlyIrk Les cas de test impliquent ce dernier, mais il doit être explicitement indiqué.
Mego

@Mego ouais, je pensais autant.
Rɪᴋᴇʀ

9
Veuillez ne pas accepter les réponses si rapidement. Cela ne fait qu'une heure, la réponse du golfeur pourrait entrer. EDIT: Je vois maintenant qu'il y a déjà une réponse plus courte qui n'est pas encore acceptée.
Rɪᴋᴇʀ

6
Il est habituel d'attendre au moins une semaine avant d'accepter une réponse, car beaucoup de gens l'interprètent comme un signe que le défi n'est plus actif.
Zgarb

Réponses:


8

Oasis , 8 7 5 octets

1 octet enregistré grâce à @ETHProductions et 2 autres enregistrés grâce à @Adnan!

zc»+U

Essayez-le en ligne!

Explication:

Cela utilise la même formule de récurrence que ma réponse MATL.


1
Le fichier info.txt d'Oasis indique qu'il Uest remplacé dans le code par 00, cela pourrait-il vous faire économiser un octet?
ETHproductions

@ETHproductions Merci! J'ai oublié cela
Luis Mendo

1
Agréable! Vous pouvez remplacer 4*par zet 2+avec »:)
Adnan

@Adnan Merci! Je devrais vraiment lire le doc :-)
Luis Mendo

17

Python, 33 octets

c=2+5**.5
lambda n:(7-c)*c**n//20

Essayez-le en ligne

Formule magique!


3
Oh mon Dieu. Cela m'a pris beaucoup plus de temps que nécessaire pour comprendre pourquoi vous "commentiez" ce 20 sur la deuxième ligne: P
Theo

@xnor, Une référence à cette formule magique?
TheChetan

@TheChetan: peut-être a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker, 26 novembre 2016) de la page OEIS
Titus


7

En fait , 6 octets

r3*♂FΣ

Essayez-le en ligne!

Explication:

Un troisième numéro de Fibonacci (à partir de F_0 = 0) est pair. Ainsi, les premiers nnombres pairs de Fibonacci sont F_{i*3}pour iin [0, n).

r3*♂FΣ
r       [0, n)
 3*     multiply each element by 3
   ♂F   retrieve the corresponding element in the Fibonacci sequence
     Σ  sum

7

JavaScript (ES6), 27 octets

f=x=>x>1&&4*f(x-1)+f(x-2)+2

Récursivité à la rescousse! Celui-ci utilise l'une des formules de la page OEIS:

f (n <1) = 0, f (n) = 4 * a (n + 1) + a (n) +2

(mais décalé d'un car le défi le déplace d'un)



4

Perl 6 ,  38 35  32 octets

{[+] grep(*%%2,(1,&[+]...*))[^($_-1)]}

Essayez-le

{[+] grep(*%%2,(0,1,*+*...*))[^$_]}

Essayez-le

{[+] (0,1,*+*...*)[3,6...^$_*3]}

Essayez-le

Étendu:

{  # bare block lambda with implicit parameter 「$_」

  [+]                       # reduce with 「&infix:<+>」

    ( 0, 1, * + * ... * )\  # fibonacci sequence with leading 0

    [ 3, 6 ...^ $_ * 3 ]    # every 3rd value up to
                            # and excluding the value indexed by
                            # the input times 3

}

3

Octave , 36 35 33 octets

@(n)filter(2,'FAD'-69,(1:n)>1)(n)

Essayez-le en ligne!

Explication

Cette fonction anonyme implémente l'équation de différence en a(n) = 4*a(n-1)+a(n-2)+2tant que filtre récursif :

Y = filter(B,A,X)filtre les données en vecteur Xavec le filtre décrit par les vecteurs Aet Bcrée les données filtrées Y. Le filtre est une implémentation "Direct Form II Transposed" de l'équation de différence standard:

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

Dans notre cas A = [1 -4 -1], B = 2et l'entrée xdoit être un vecteur de uns, le résultat apparaissant comme la dernière entrée de la sortie y. Cependant, nous définissons 0la première valeur de l'entrée afin qu'une initiale 0apparaisse dans la sortie, comme requis.

'FAD'-69est juste un moyen plus court de produire le vecteur de coefficient A = [1 -4 -1]; et (1:n)>1produit le vecteur d'entrée x = [0 1 1 ... 1].


3

dc , 25 22 octets

9k5v1+2/3?*1-^5v/0k2/p

Essayez-le en ligne!

Ou enregistrez le programme dans un fichier et exécutez-le en tapant

dc -f *filename*

Le programme accepte un entier non négatif n sur stdin, et il sort la somme des n premiers nombres de Fibonacci pairs sur stdout. (La séquence de Fibonacci est prise pour commencer par 0, selon les exemples de l'OP.)


Ce programme utilise la formule (F (3n-1) -1) / 2 pour la somme des n premiers nombres de Fibonacci pairs, où F est la fonction de Fibonacci habituelle, donnée par F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) pour n> = 2.


dc est une calculatrice basée sur la pile. Voici une explication détaillée:

9k  # Sets the precision to 9 decimal places (which is more than sufficient).

5v  # Push the square root of 5

1+  # Add 1 to the number at the top of the stack.

2/  # Divide the number at the top of the stack by 2.

À ce stade, le nombre (1 + sqrt (5)) / 2 est en haut de la pile.

3   # Push 3 on top of the stack.

?   # Read a number from stdin, and push it.

\*  # Pop two numbers from the stack, multiply them, and push the product

1-  # Subtract 1 from the number at the top of the stack.

À ce stade, 3n-1 est en haut de la pile (où n est l'entrée) et (1 + sqrt (5)) / 2 est le deuxième en haut.

^   # Pop two numbers from the stack (x, then y), compute the power y^x, and push that back on the stack.

5v/ # Divide the top of the stack by sqrt(5).

À ce stade, le nombre en haut de la pile est (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). L'entier le plus proche de ce nombre est F (3n-1). Notez que F (3n-1) est toujours un nombre impair.

0k # Change precision to 0 decimal places.

2/ # Divide the top of the stack by 2, truncating to an integer.

p # Print the top of the stack on stdout.

3

Mathematica, 27 21 octets

Merci à xnor d'avoir indiqué une autre formule, alephalpha pour avoir corrigé l'index de départ

Fibonacci[3#-1]/2-.5&

1
La (Fibonacci(3*n+2)-1)/2formule pourrait-elle être plus courte?
xnor

2

MATL , 15 14 octets

OOi:"t4*b+2+]x

Essayez-le en ligne!

Explication

Celui-ci utilise l'une des formules de récurrence d'OEIS:

a (n) = 4 * a (n-1) + a (n-2) +2

Pour l'entrée N, le code itère N fois, soit 2 fois plus que nécessaire. Ceci est compensé en définissant 0, 0(au lieu de 0, 2) comme valeurs initiales, et en supprimant la dernière valeur obtenue et en affichant la précédente.

OO      % Push two zeros as initial values of a(n-2), a(n-1)
i       % Input N
:"      % Do this N times
  t     %   Duplicate a(n-1)
  4*    %   Multiply by 4
  b+    %   Bubble up a(n-2) and add to 4*a(n-1)
  2+    %   Add 2. Now we have 4*a(n-1)+a(n-2)+2 as a(n), on top of a(n-1)
]       % End
x       % Delete last value, a(n). Implicitly display the remaining value, a(n-1)

2

Lot, 80 octets

@set/at=x=0,y=1
@for /l %%i in (2,1,%1)do @set/az=x+y,y=z+x,t+=x=y+z
@echo %t%

Utilise le fait que chaque troisième nombre de Fibonacci est pair, et les calcule simplement trois à la fois (calculer plus d'un à la fois est en fait plus facile car vous n'avez pas à échanger de valeurs). J'ai essayé la (Fibonacci(3*n+2)-1)/2formulation mais c'est en fait quelques octets de plus ( t+=s'avère être assez efficace en termes de taille de code).


2

C, 82 38 36 octets

2 octets enregistrés grâce à @BrainSteel

Les formules de la page OEIS l'ont rendu beaucoup plus court:

a(n){return--n<1?0:4*a(n)+a(n-1)+2;}

Essayez-le en ligne!

82 octets:

x,s,p,n,c;f(N){s=0;p=n=1;c=2;while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}

La première version est de 75 octets mais la fonction n'est pas réutilisable, sauf si vous appelez toujours favec plus Nque l'appel précédent :-)

x,s,p=1,n=1,c=2;f(N){while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}

Ma première réponse ici. N'a pas vérifié d'autres réponses ni l'OEIS. Je suppose qu'il y a quelques astuces que je peux appliquer pour raccourcir :-)


1
Vous pouvez faire un peu plus court en mélangeant un peu les choses: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 octets)
BrainSteel

1

Haskell ( 32 31 octets)

Un octet enregistré grâce à @ChristianSievers.

Utilisation de la formule donnée dans OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1par Gary Detlefs

a n|n>1=4*a(n-1)+a(n-2)+2|n<2=0


Une façon golfique de dire n<=1pour les entiers est n<2. De plus, la deuxième condition n'a pas besoin d'être la négation de la première (l'idiomatique otherwiseest simplement True), donc généralement dans le golf, quelque chose comme 1<2est utilisé.
Christian Sievers

@ChristianSievers en effet le n <2 est une amélioration évidente, merci. Le second fonctionne également, bien qu'il ne me sauve rien dans ce cas. J'apprends toujours Haskell et je ne savais pas que je pourrais avoir un gardien comme ça. Je vous remercie!
Dylan Meeus

1

Mathematica, 32 27 octets

Fibonacci[3Input[]-1]/2-1/2

Crédit à xnor . Enregistré 5 octets grâce à JungHwan Min.


Sûrement Mathematica a Fibonacci et il est plus court de faire (Fibonacci(3*n+2) - 1)/2ou d'écrire le sumi?
xnor

@JungHwanMin Ce n'est pas du plagiat; il mentionne la page OEIS. De plus, ce n'est pas un candidat pour le wiki communautaire. Voir Comment utiliser les wikis communautaires? .
Dennis

@devRichter Désolé d'avoir supprimé votre message, mais il était nécessaire d'avoir une conversation. Si vous souhaitez le supprimer, faites-le moi savoir et je déplacerai cette conversation dans une salle de chat.
Dennis

@Dennis encore, je crois que le mérite devrait être explicitement attribué à Vincenzo Librandi - (supprimé accidentellement mon dernier commentaire ... cela pourrait-il être supprimé?) Pour la suggestion de publication communautaire, je me tiens corrigé.
JungHwan Min

Ce que je voulais dire était de mentionner son nom dans le post ... (ou peut-être d'inclure le commentaire Mathematica (* Vincenzo Librandi, Mar 15 2014 *)dans le post, comme c'est le cas sur OEIS.)
JungHwan Min

1

R, 42 octets

Solution non récursive, contrairement à la solution précédente de @rtrunbull ici .

for(i in 1:scan())F=F+gmp::fibnum(3*i-3);F

Utilise la propriété que chaque troisième valeur de la séquence de Fibonacci est paire. Abuse également le fait qui Fest défini par défaut comme FALSE=0, ce qui lui permet comme base pour ajouter les valeurs à.


1

R, 42 41 octets

sum(DescTools::Fibonacci(3*(scan():2-1)))

scan(): prendre nde stdin.

scan():2-1: générer des entiers de nà 2, décrémenter de 1, céder à n-1travers 1.

3*(scan():2-1) : multipliez par 3, car chaque troisième nombre de fibonacci est pair.

DescTools::Fibonacci(3*(scan():2-1)): Renvoie ces nombres de fibonacci (c'est- 3à- dire à travers (n-1)*3).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Additionnez le résultat.

Auparavant, j'avais cette solution sans intérêt en utilisant l'une des formules d'OEIS:

a=function(n)`if`(n<2,0,4*a(n-1)+a(n-2)+2)

J'ai réussi à faire correspondre votre bytecount sans récursivité :)
JAD

@JarkoDubbeldam Nice! J'ai également abandonné la récursivité et fait une amélioration d'un octet :)
rturnbull

Bien, qu'est- desctools::fibonaccice que ça fait exactement numbers::fibonacci? Parce que cette brume est un peu plus courte.
JAD

Oh peu importe, je l'ai trouvé. Doux, les autres implémentations que j'ai trouvées ne prennent pas en charge la demande de plusieurs numéros à la fois.
JAD

1
@JarkoDubbeldam Oui, `` gmp :: fibnum '' retourne des objets de type bigz, que la *applyclasse de fonctions convertit en type rawpour des raisons ...
rturnbull


1

PHP, 73 70 octets

for(${0}=1;$i++<$argv[1];$$x=${0}+${1})${$x^=1}&1?$i--:$s+=$$x;echo$s;

présentant des variables variables . Sur). Courez avec -nr.

panne

for(${0}=1;         # init first two fibonaccis (${1}=NULL evaluates to 0 in addition)
                    # the loop will switch between $0 and $1 as target.
    $i++<$argv[1];  # loop until $i reaches input
    $$x=${0}+${1}       # 3. generate next Fibonacci
)
    ${$x^=1}            # 1. toggle index (NULL => 1 => 0 => 1 ...)
    &1?$i--             # 2. if current Fibonacci is odd, undo increment
    :$s+=$$x;           #    else add Fibonacci to sum
echo$s;             # print result

Les nombres sont des noms de variables parfaitement valides en PHP.
Mais, pour les littéraux, ils nécessitent des accolades; c'est-à ${0}- dire non $0.

36 octets, O (1)

<?=(7-$c=2+5**.5)*$c**$argv[1]/20|0;

port de la réponse de xnor


0

PARI / GP, 21 octets

n->fibonacci(3*n-1)\2

\ est le quotient entier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.