Suma los primeros n incluso números de Fibonacci

19

Parece que todavía no hay un concurso para este.

La tarea es simple. Agregue los primeros nnúmeros de la secuencia de Fibonacci que sean pares y genere el resultado.

Esto viene dado por OEIS A099919 , excepto que la secuencia se desplaza por uno, comenzando con en fib(1) = 0lugar de fib(1) = 1.

Este es el código de golf. El conteo de bytes más bajo gana.

Ejemplos

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

Relacionado

dfernan
fuente
@EasterlyIrk Los casos de prueba implican lo último, pero debe declararse explícitamente.
Mego
@Mego, sí, me lo imaginé.
Rɪᴋᴇʀ
99
Por favor, no acepte respuestas tan rápido. Solo ha pasado una hora, la respuesta de golfista podría entrar. EDITAR: Ahora veo que ya hay una respuesta más corta que aún no se acepta.
Rɪᴋᴇʀ
66
Es habitual esperar al menos una semana antes de aceptar una respuesta, porque muchas personas la interpretan como una señal de que el desafío ya no está activo.
Zgarb

Respuestas:

8

Oasis , 8 7 5 bytes

¡1 byte guardado gracias a @ETHProductions y 2 más guardados gracias a @Adnan!

zc»+U

Pruébalo en línea!

Explicación:

Esto usa la misma fórmula de recurrencia que mi respuesta MATL.

Luis Mendo
fuente
1
El info.txt de Oasis dice que Use reemplaza en el código con 00, ¿podría eso ahorrarle un byte?
ETHproductions
@ETHproductions ¡Gracias! Lo olvidé
Luis Mendo
1
¡Agradable! Puede reemplazar 4*con zy 2+con »:)
Adnan
@Adnan Gracias! Realmente debería leer el documento :-)
Luis Mendo
17

Python, 33 bytes

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

Pruébalo en línea

¡Formula magica!

xnor
fuente
3
Oh Dios. Me tomó mucho más tiempo del que debería tener que darme cuenta por qué estabas "comentando" ese 20 en la segunda línea: P
Theo
@xnor, ¿Alguna referencia a esta fórmula mágica?
TheChetan
@TheChetan: posiblemente a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker, 26 de noviembre de 2016) de la página OEIS
Titus
7

En realidad , 6 bytes

r3*♂FΣ

Pruébalo en línea!

Explicación:

Cada tercer número de Fibonacci (a partir de F_0 = 0) es par. Por lo tanto, los primeros nnúmeros pares de Fibonacci son F_{i*3}para ien [0, n).

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

JavaScript (ES6), 27 bytes

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

¡Recursión al rescate! Esto usa una de las fórmulas en la página OEIS:

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

(pero cambiado por uno porque el desafío lo cambia por uno)

ETHproducciones
fuente
6

Pyke, 6 bytes

3m*.bs

Pruébalo aquí!

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

Perl 6 ,  38 35  32 bytes

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

Intentalo

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

Intentalo

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

Intentalo

Expandido:

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

}
Brad Gilbert b2gills
fuente
3

Octava , 36 35 33 bytes

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

Pruébalo en línea!

Explicación

Esta función anónima implementa la ecuación de diferencia a(n) = 4*a(n-1)+a(n-2)+2como un filtro recursivo :

Y = filter(B,A,X)filtra los datos en vector Xcon el filtro descrito por vectores Ay Bcrea los datos filtrados Y. El filtro es una implementación de "Transposición directa de forma II" de la ecuación de diferencia estándar:

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)

En nuestro caso A = [1 -4 -1],, B = 2y la entrada xdebe ser un vector de unos, con el resultado que aparece como la última entrada de la salida y. Sin embargo, establecemos 0el primer valor de la entrada para que 0aparezca una inicial en la salida, según sea necesario.

'FAD'-69es solo una forma más corta de producir el vector coeficiente A = [1 -4 -1]; y (1:n)>1produce el vector de entrada x = [0 1 1 ... 1].

Luis Mendo
fuente
3

dc , 25 22 bytes

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

Pruébalo en línea!

O guarde el programa en un archivo y ejecútelo escribiendo

dc -f *filename*

El programa acepta un número entero no negativo n en stdin, y genera la suma de los primeros n números pares de Fibonacci en stdout. (La secuencia de Fibonacci se toma para comenzar con 0, según los ejemplos del OP).


Este programa usa la fórmula (F (3n-1) -1) / 2 para la suma de los primeros n números pares de Fibonacci, donde F es la función habitual de Fibonacci, dada por F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) para n> = 2.


dc es una calculadora basada en pila. Aquí hay una explicación detallada:

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.

En este punto, el número (1 + sqrt (5)) / 2 está en la parte superior de la pila.

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.

En este punto, 3n-1 está en la parte superior de la pila (donde n es la entrada) y (1 + sqrt (5)) / 2 es el segundo desde la parte superior.

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

En este punto, el número en la parte superior de la pila es (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). El entero más cercano a este número es F (3n-1). Tenga en cuenta que F (3n-1) siempre es un número impar.

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.
Mitchell Spector
fuente
3

Mathematica, 27 21 bytes

Gracias a xnor por señalar una fórmula alternativa, alephalpha por corregir el índice inicial

Fibonacci[3#-1]/2-.5&
ngenisis
fuente
1
¿Podría la (Fibonacci(3*n+2)-1)/2fórmula ser más corta?
xnor
2

MATL , 15 14 bytes

OOi:"t4*b+2+]x

Pruébalo en línea!

Explicación

Utiliza una de las fórmulas de recurrencia de OEIS:

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

Para la entrada N, el código itera N veces, que es 2 veces más de lo necesario. Esto se compensa mediante el establecimiento 0, 0(en lugar de 0, 2) como valores iniciales, y eliminando el último valor obtenido y se presentan la anterior.

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)
Luis Mendo
fuente
2

Lote, 80 bytes.

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

Utiliza el hecho de que cada tercer número de Fibonacci es par, y solo los calcula de tres en tres (calcular más de uno a la vez es realmente más fácil ya que no tiene que cambiar los valores). Probé la (Fibonacci(3*n+2)-1)/2formulación, pero en realidad es unos pocos bytes más ( t+=resulta ser bastante eficiente en términos de tamaño del código).

Neil
fuente
2

C, 82 38 36 bytes

2 bytes guardados gracias a @BrainSteel

Las fórmulas en la página OEIS lo hicieron mucho más corto:

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

Pruébalo en línea!

82 bytes:

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 primera versión es de 75 bytes, pero la función no es reutilizable, a menos que siempre llame fcon una llamada mayor Nque la anterior :-)

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

Mi primera respuesta aquí. No comprobé ninguna otra respuesta ni el OEIS. Supongo que hay algunos trucos que puedo aplicar para acortarlo :-)

Simón
fuente
1
Puede hacer esto un poco más corto barajando un poco las cosas: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 bytes)
BrainSteel
1

Haskell ( 32 31 bytes)

Guardado un byte gracias a @ChristianSievers.

Usando la fórmula dada en OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1por Gary Detlefs

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

Dylan Meeus
fuente
Una forma más golfística de decir n<=1enteros es n<2. Además, la segunda condición no necesita ser la negación de la primera (lo idiomático otherwisees simplemente True), por lo que habitualmente en el golf 1<2se usa algo así .
Christian Sievers
@ChristianSievers, de hecho, el n <2 es una mejora obvia, gracias. El segundo también funciona, aunque no me ahorra nada en este caso. Todavía estoy aprendiendo a Haskell y no me di cuenta de que podría tener un guardia así. ¡Gracias!
Dylan Meeus
1

Mathematica, 32 27 bytes

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

Crédito a xnor . Guardado 5 bytes gracias a JungHwan Min.

devRicher
fuente
¿Seguramente Mathematica tiene Fibonacci y es más corto hacer (Fibonacci(3*n+2) - 1)/2o escribir el sumi?
xnor
@JungHwanMin Esto no es plagio; menciona la página OEIS. Además, este no es un candidato para la wiki comunitaria. Consulte ¿Cómo se deben usar los wikis comunitarios? .
Dennis
@devRichter Perdón por recuperar tu publicación, pero fue necesario mantener una conversación. Si desea mantenerlo eliminado, avíseme y trasladaré esta conversación a una sala de chat.
Dennis
@Dennis aún, creo que se debe dar crédito a Vincenzo Librandi explícitamente - (borré accidentalmente mi último comentario ... ¿podría eso no ser borrado?) Por la sugerencia de publicación de la comunidad, me corrijo.
JungHwan Min
Lo que quise decir fue mencionar su nombre en la publicación ... (o tal vez incluir el comentario de Mathematica (* Vincenzo Librandi, Mar 15 2014 *)en la publicación, ya que está en OEIS.)
JungHwan Min
1

R, 42 bytes

Solución no recursiva, en contraste con la solución anterior de @rtrunbull aquí .

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

Utiliza la propiedad de que cada tercer valor de la secuencia de Fibonacci es par. También abusa del hecho de que Fse define por defecto como FALSE=0, lo que le permite agregar los valores como base.

JAD
fuente
1

R, 42 41 bytes

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

scan(): tomar nde stdin.

scan():2-1: genera enteros de na 2, decremento por 1, cediendo a n-1través 1.

3*(scan():2-1) : multiplique por 3, ya que cada tercer número de Fibonacci es par.

DescTools::Fibonacci(3*(scan():2-1)): Devuelve estos números de Fibonacci (es decir, a 3través de (n-1)*3).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Suma el resultado.

Anteriormente, tenía esta solución poco interesante usando una de las fórmulas de OEIS:

a=function(n)`if`(n<2,0,4*a(n-1)+a(n-2)+2)
rturnbull
fuente
Me las arreglé para hacer coincidir su bytecount sin recurrencia :)
JAD
@JarkoDubbeldam ¡Qué bien! También abandoné la recursión e hice una mejora de un byte :)
rturnbull
Bien, ¿qué hace exactamente desctools::fibonaccieso numbers::fibonacci? Porque esa niebla será un poco más corta.
JAD
Oh, no importa, lo encontré. Dulce, las otras implementaciones que encontré no admiten pedir varios números a la vez.
JAD
1
@JarkoDubbeldam Sí, `` gmp :: fibnum '' devuelve objetos de tipo bigz, que la *applyclase de funciones convierte a tipo rawpor razones ...
rturnbull
1

PHP, 73 70 bytes

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

mostrando variables variables . En). Corre con -nr.

Descompostura

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

Los números son nombres de variables perfectamente válidos en PHP.
Pero, para los literales, requieren llaves; es decir ${0}, no $0.

36 bytes, O (1)

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

respuesta del puerto de xnor

Titus
fuente
0

PARI / GP, 21 bytes

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

\ es el cociente entero

alephalpha
fuente