Somma i primi n numeri di Fibonacci pari


19

Sembra che non ci sia ancora una gara per questo.

Il compito è semplice. Aggiungi i primi nnumeri della sequenza di Fibonacci che sono pari e genera il risultato.

Questo è dato da OEIS A099919 , tranne per il fatto che la sequenza viene spostata di una, a partire da fib(1) = 0invece di fib(1) = 1.

Questo è il codice golf. Vince il conteggio dei byte più basso.

Esempi

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

Relazionato



@EasterlyIrk I casi di test implicano quest'ultimo, ma dovrebbe essere esplicitamente dichiarato.
Mego

@Mego sì, ho pensato tanto.
R

9
Per favore, non accettare risposte così in fretta. È passata solo un'ora, potrebbe arrivare la risposta più golfista . EDIT: Vedo che c'è già una risposta più breve che non è ancora stata accettata.
R

6
È consuetudine attendere almeno una settimana prima di accettare una risposta, perché molte persone la interpretano come un segno che la sfida non è più attiva.
Zgarb,

Risposte:


8

Oasis , 8 7 5 byte

1 byte salvato grazie a @ETHProductions e altri 2 salvati grazie a @Adnan!

zc»+U

Provalo online!

Spiegazione:

Questo utilizza la stessa formula di ricorrenza della mia risposta MATL.


1
Il file info.txt di Oasis dice che Uè stato sostituito nel codice con 00, potrebbe salvarti un byte?
ETHproductions

@ETHproductions Grazie! L'ho dimenticato
Luis Mendo il

1
Bello! Puoi sostituirlo 4*con ze 2+con »:)
Adnan il

@Adnan Grazie! Dovrei davvero leggere il documento :-)
Luis Mendo il

17

Python, 33 byte

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

Provalo online

Formula magica!


3
Oh Dio. Mi ci è voluto molto più tempo di quanto avrebbe dovuto capire perché stavi "commentando" quel 20 sulla seconda riga: P
Theo

@xnor, Qualche riferimento a questa formula magica?
TheChetan

@TheChetan: forse a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker, 26 nov 2016) dalla pagina OEIS
Tito


7

In realtà , 6 byte

r3*♂FΣ

Provalo online!

Spiegazione:

Ogni terzo numero di Fibonacci (a partire da F_0 = 0) è pari. Quindi, i primi nnumeri pari di Fibonacci sono F_{i*3}per 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 byte

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

Ricorsione in soccorso! Questo utilizza una delle formule nella pagina OEIS:

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

(ma spostato di uno perché la sfida lo sposta di uno)


6

Pyke, 6 byte

3m*.bs

Provalo qui!

3m*    -   map(i*3, range(input))
   .b  -  map(nth_fib, ^)
     s - sum(^)

4

Perl 6 ,  38 35  32 byte

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

Provalo

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

Provalo

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

Provalo

Allargato:

{  # 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

Ottava , 36 35 33 byte

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

Provalo online!

Spiegazione

Questa funzione anonima implementa l'equazione della differenza a(n) = 4*a(n-1)+a(n-2)+2come filtro ricorsivo :

Y = filter(B,A,X)filtra i dati nel vettore Xcon il filtro descritto dai vettori Ae Bper creare i dati filtrati Y. Il filtro è un'implementazione "Direct Form II Transposed" dell'equazione della differenza 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)

Nel nostro caso A = [1 -4 -1], B = 2e l'input xdovrebbe essere un vettore di quelli, con il risultato che appare come l'ultima voce dell'output y. Tuttavia, impostiamo 0il primo valore dell'input in modo che 0appaia un'iniziale nell'output, come richiesto.

'FAD'-69è solo un modo più breve per produrre il vettore coefficiente A = [1 -4 -1]; e (1:n)>1produce il vettore di input x = [0 1 1 ... 1].


3

dc , 25 22 byte

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

Provalo online!

Oppure salva il programma in un file ed eseguilo digitando

dc -f *filename*

Il programma accetta un numero intero non negativo n su stdin e genera la somma dei primi n numeri di Fibonacci anche su stdout. (Si presume che la sequenza di Fibonacci inizi con 0, come da esempi dell'OP.)


Questo programma usa la formula (F (3n-1) -1) / 2 per la somma dei primi n numeri di Fibonacci pari, dove F è la solita funzione di Fibonacci, data da F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) per n> = 2.


dc è una calcolatrice basata su stack. Ecco una spiegazione dettagliata:

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.

A questo punto, il numero (1 + sqrt (5)) / 2 è in cima allo stack.

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.

A questo punto, 3n-1 è in cima allo stack (dove n è l'input) e (1 + sqrt (5)) / 2 è il secondo dall'alto.

^   # 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).

A questo punto, il numero in cima allo stack è (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). Il numero intero più vicino a questo numero è F (3n-1). Si noti che F (3n-1) è sempre un numero dispari.

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 byte

Grazie a xnor per aver indicato una formula alternativa, alephalpha per la correzione dell'indice di partenza

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

1
La (Fibonacci(3*n+2)-1)/2formula potrebbe essere più breve?
xnor

2

MATL , 15 14 byte

OOi:"t4*b+2+]x

Provalo online!

Spiegazione

Questo utilizza una delle formule di ricorrenza di OEIS:

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

Per l'ingresso N il codice scorre N volte, ovvero 2 volte in più del necessario. Questo è compensata impostando 0, 0(anziché 0, 2) come valori iniziali, e eliminando l'ultimo valore ottenuto e visualizzare quella precedente.

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

Lotto, 80 byte

@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%

Utilizza il fatto che ogni terzo numero di Fibonacci è pari e li calcola tre alla volta (il calcolo di più di uno alla volta è in realtà più semplice in quanto non è necessario scambiare valori). Ho provato la (Fibonacci(3*n+2)-1)/2formulazione ma in realtà è più lunga di alcuni byte ( t+=risulta abbastanza efficiente in termini di dimensioni del codice).


2

C, 82 38 36 byte

2 byte salvati grazie a @BrainSteel

Le formule nella pagina OEIS lo hanno reso molto più breve:

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

Provalo online!

82 byte:

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 prima versione è di 75 byte ma la funzione non è riutilizzabile, a meno che non si chiami sempre fcon un numero maggiore Ndi quello precedente :-)

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;}

La mia prima risposta qui. Non ho controllato altre risposte né l'OEIS. Immagino che ci siano alcuni trucchi che posso applicare per renderlo più breve :-)


1
Puoi renderlo un po 'più breve mescolando un po' le cose: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 byte)
BrainSteel

1

Haskell ( 32 31 byte)

Salvato un byte grazie a @ChristianSievers.

Utilizzando la formula fornita in OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1da Gary Detlefs

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


Un modo più golfista da dire n<=1per gli interi è n<2. Inoltre, la seconda condizione non deve necessariamente essere la negazione della prima (l'idiomatico otherwiseè semplicemente True), quindi di solito nel golf 1<2si usa qualcosa del genere .
Christian Sievers,

@ChristianSievers infatti n <2 è un evidente miglioramento, grazie. Anche il secondo funziona, anche se in questo caso non mi risparmia nulla. Sto ancora imparando Haskell e non ho realizzato che avrei potuto avere una guardia del genere. Grazie!
Dylan Meeus,

1

Mathematica, 32 27 byte

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

Ringraziamo xnor . Risparmiato 5 byte grazie a JungHwan Min.


Sicuramente Mathematica ha Fibonacci ed è più breve fare (Fibonacci(3*n+2) - 1)/2o scrivere il sumi?
xnor

@JungHwanMin Questo non è plagio; menziona la pagina OEIS. Inoltre, questo non è un candidato per wiki della comunità. Vedi Come utilizzare i wiki della community? .
Dennis,

@devRichter Ci scusiamo per aver deselezionato il tuo post, ma era necessario avere una conversazione. Se vuoi tenerlo eliminato, fammelo sapere e sposterò questa conversazione in una chat room.
Dennis,

@Dennis ancora, credo che il merito dovrebbe essere dato esplicitamente a Vincenzo Librandi - (cancellato per errore il mio ultimo commento ... potrebbe essere cancellato?) Per il suggerimento post della community, mi correggo.
JungHwan Min

Quello che volevo dire era menzionare il suo nome nel post ... (o forse includere il commento di Mathematica (* Vincenzo Librandi, Mar 15 2014 *)nel post, come su OEIS.)
JungHwan Min

1

R, 42 byte

Soluzione non ricorsiva, in contrasto con la precedente soluzione di @rtrunbull qui .

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

Utilizza la proprietà che ogni terzo valore della sequenza di Fibonacci è pari. Inoltre abusa del fatto che Fper impostazione predefinita è definito FALSE=0, consentendogli come base per aggiungere i valori.


1

R, 42 41 byte

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

scan(): prendere ndallo stdin.

scan():2-1: Generare numeri interi da na 2, decremento da parte 1, cedendo n-1attraverso 1.

3*(scan():2-1) : moltiplicare per 3, poiché ogni terzo numero di fibonacci è pari.

DescTools::Fibonacci(3*(scan():2-1)): Restituisce questi numeri di fibonacci (cioè 3attraverso (n-1)*3).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Somma il risultato.

In precedenza, avevo questa soluzione poco interessante utilizzando una delle formule di OEIS:

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

Sono riuscito ad abbinare il tuo bytunt senza ricorsione :)
JAD

@JarkoDubbeldam Nice! Ho abbandonato anche la ricorsione e ho apportato un miglioramento di un byte :)
rturnbull,

Bello, che cosa desctools::fibonaccinon numbers::fibonaccipuò fare esattamente ? Perché quella nebbia è un po 'più corta.
JAD

Oh non importa, l'ho trovato. Dolce, le altre implementazioni che ho trovato non supportano la richiesta di più numeri contemporaneamente.
JAD

1
@JarkoDubbeldam Sì, `` gmp :: fibnum '' restituisce oggetti di tipo bigz, che la *applyclasse di funzioni converte in tipo rawperché motivi ...
rturnbull


1

PHP, 73 70 byte

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

una vetrina per variabili variabili . Su). Corri con -nr.

abbattersi

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

I numeri sono nomi di variabili perfettamente validi in PHP.
Ma, per i letterali, hanno bisogno di parentesi graffe; cioè ${0}no $0.

36 byte, O (1)

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

porta della risposta di xnor


0

PARI / GP, 21 byte

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

\ è il quoziente intero.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.