Soma o primeiro n mesmo número de Fibonacci


19

Parece não haver um concurso para este ainda.

A tarefa é simples. Adicione os primeiros nnúmeros da sequência de Fibonacci que são pares e produza o resultado.

Isso é dado pelo OEIS A099919 , exceto que a sequência é alterada por um, começando comfib(1) = 0 vez de fib(1) = 1.

Isso é código de golfe. O menor número de bytes vence.

Exemplos

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

Relacionado



@EasterlyIrk Os casos de teste implicam o último, mas devem ser explicitamente declarados.
Mego3

@ Mega sim, eu imaginei isso.
Rɪᴋᴇʀ

9
Por favor, não aceite respostas tão rápido. Faz apenas uma hora que a resposta do golfista pode entrar. EDIT: Agora vejo que já existe uma resposta mais curta que ainda não foi aceita.
Rɪᴋᴇʀ

6
É costume esperar pelo menos uma semana antes de aceitar uma resposta, porque muitas pessoas a interpretam como um sinal de que o desafio não está mais ativo.
Zgarb 4/17/17

Respostas:


8

Oásis , 8 7 5 bytes

1 byte salvo graças a @ETHProductions e mais 2 salvos graças a @Adnan!

zc»+U

Experimente online!

Explicação:

Isso usa a mesma fórmula de recorrência que minha resposta MATL.


11
O info.txt do Oasis diz que Ué substituído no código por 00, isso pode lhe poupar um byte?
ETHproductions

@ETHproductions Obrigado! Eu esqueci isso
Luis Mendo

11
Agradável! Você pode substituir 4*com ze 2+com »:)
Adnan

@Adnan Obrigado! Eu realmente deve ler o doc :-)
Luis Mendo

17

Python, 33 bytes

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

Experimente online

Fórmula mágica!


3
Oh Deus. Demorei muito mais do que o necessário para perceber por que você estava "comentando" os 20 na segunda linha: P
Theo

@ xnor, Alguma referência a esta fórmula mágica?
TheChetan

@TheChetan: possivelmente a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20 (Colin Barker, 26 de novembro de 2016) a partir da página OEIS
Titus


7

Na verdade , 6 bytes

r3*♂FΣ

Experimente online!

Explicação:

Cada terceiro número de Fibonacci (começando de F_0 = 0) é par. Assim, os primeiros nnúmeros pares de Fibonacci são F_{i*3}para 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 bytes

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

Recursão ao resgate! Isso usa uma das fórmulas na página OEIS:

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

(mas alterado por um porque o desafio o altera por um)



4

Perl 6 ,  38 35  32 bytes

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

Tente

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

Tente

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

Tente

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

}

3

Oitava , 36 35 33 bytes

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

Experimente online!

Explicação

Esta função anônima implementa a equação da diferença a(n) = 4*a(n-1)+a(n-2)+2como um filtro recursivo :

Y = filter(B,A,X)filtra os dados em vetor Xcom o filtro descrito por vetores Ae Bcria os dados filtrados Y. O filtro é uma implementação "Direct Form II Transposed" da equação da diferença padrão:

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)

No nosso caso A = [1 -4 -1], B = 2e a entrada xdeve ser um vetor de uns, com o resultado que aparece como a última entrada da saída y. No entanto, definimos 0o primeiro valor da entrada para que um valor inicial0 apareça na saída, conforme necessário.

'FAD'-69é apenas uma maneira mais curta de produzir o vetor de coeficiente A = [1 -4 -1]; e (1:n)>1produz o vetor de entrada x = [0 1 1 ... 1].


3

dc , 25 22 bytes

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

Experimente online!

Ou salve o programa em um arquivo e execute-o digitando

dc -f *filename*

O programa aceita um número inteiro não negativo n em stdin e gera a soma do primeiro n números de Fibonacci mesmo em stdout. (A sequência de Fibonacci é usada para começar com 0, conforme os exemplos do OP.)


Este programa usa a fórmula (F (3n-1) -1) / 2 para a soma dos primeiros n números Fibonacci pares, em que F é a função usual de Fibonacci, dada por F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) para n> = 2.


dc é uma calculadora baseada em pilha. Aqui está uma explicação detalhada:

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.

Neste ponto, o número (1 + sqrt (5)) / 2 está no topo da pilha.

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.

Nesse ponto, 3n-1 está no topo da pilha (onde n é a entrada) e (1 + sqrt (5)) / 2 é o segundo da 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).

Nesse ponto, o número no topo da pilha é (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). O número inteiro mais próximo desse número é F (3n-1). Observe que F (3n-1) é sempre um número ímpar.

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 bytes

Agradecimentos a xnor por apontar uma fórmula alternativa, alefalpha por corrigir o índice inicial

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

11
A (Fibonacci(3*n+2)-1)/2fórmula pode ser mais curta?
Xnor

2

MATL , 15 14 bytes

OOi:"t4*b+2+]x

Experimente online!

Explicação

Isso usa uma das fórmulas de recorrência do OEIS:

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

Para entrada N, o código itera N vezes, o que é 2 vezes mais que o necessário. Isto é compensado por definição 0, 0(em vez de 0, 2) como valores iniciais, e por exclusão do último valor obtido e exibindo o 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)

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%

Usa o fato de que cada terceiro número de Fibonacci é par e apenas os calcula três por vez (calcular mais de um por vez é realmente mais fácil, pois você não precisa trocar valores). Eu tentei o(Fibonacci(3*n+2)-1)/2 formulação, mas na verdade é alguns bytes mais ( t+=acaba sendo bastante eficiente em termos de tamanho do código).


2

C, 82 38 36 bytes

2 bytes salvos graças a @BrainSteel

As fórmulas na página OEIS tornaram muito mais curtas:

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

Experimente online!

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

A primeira versão tem 75 bytes, mas a função não é reutilizável, a menos que você sempre chame fcom mais do Nque a chamada 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;}

Minha primeira resposta aqui. Não checou nenhuma outra resposta nem o OEIS. Eu acho que existem alguns truques que eu posso aplicar para torná-lo mais curto :-)


11
Você pode fazer isso um pouco mais curto por baralhar as coisas um pouco: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 bytes)
BrainSteel

1

Haskell ( 32 31 bytes)

Guardou um byte graças a @ChristianSievers.

Usando a fórmula dada em 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


Uma maneira golfista de dizer n<=1para números inteiros é n<2. Além disso, a segunda condição não precisa ser a negação da primeira (a idiomática otherwiseé simplesmente True); portanto, geralmente no golfe 1<2é usado algo parecido .
Christian Sievers

@ChristianSievers de fato n <2 é uma melhoria óbvia, obrigado. O segundo também funciona, embora não me salve nada neste caso. Ainda estou aprendendo Haskell e não percebi que poderia ter um guarda assim. Obrigado!
Dylan Meeus

1

Mathematica, 32 27 bytes

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

Crédito para xnor . Economizou 5 bytes graças a JungHwan Min.


Certamente o Mathematica tem Fibonacci e é mais curto fazer um (Fibonacci(3*n+2) - 1)/2ou escrever o sumi?
Xnor

@JungHwanMin Isso não é plágio; menciona a página OEIS. Além disso, este não é um candidato ao wiki da comunidade. Consulte Como os Wikis da comunidade devem ser usados? .
Dennis

@devRichter Desculpe por cancelar a exclusão de sua postagem, mas era necessário ter uma conversa. Se você quiser mantê-lo excluído, entre em contato e eu moverei essa conversa para uma sala de bate-papo.
Dennis

@Dennis ainda, acredito que Vincenzo Librandi deveria dar crédito explicitamente - (excluiu acidentalmente meu último comentário ... isso poderia ser excluído?) Para a sugestão de post da comunidade, eu estou corrigido.
JungHwan Min

O que eu queria dizer era mencionar seu nome no post ... (ou talvez incluir o comentário Mathematica (* Vincenzo Librandi, Mar 15 2014 *)no post, como é em OEIS.)
JungHwan Min

1

R, 42 bytes

Solução não recursiva, em contraste com a solução anterior de @rtrunbull aqui .

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

Usa a propriedade que cada terceiro valor da sequência de Fibonacci é par. Também abusa do fato de que, Fpor padrão, é definido como FALSE=0, permitindo que ele adicione os valores como base.


1

R, 42 bytes

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

scan(): tire nde stdin.

scan():2-1: gerar números inteiros de npara 2, decrementar por 1, render n-1através 1.

3*(scan():2-1) : multiplique por 3, pois cada terceiro número de fibonacci é par.

DescTools::Fibonacci(3*(scan():2-1)): Retorno estes números de Fibonacci (isto é, 3através(n-1)*3 ).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Soma o resultado.

Anteriormente, eu tinha essa solução desinteressante usando uma das fórmulas do OEIS:

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

Eu consegui corresponder ao seu bytecount sem recursão :)
JAD

@JarkoDubbeldam Nice! Eu já abandonou a recursão também e fez uma melhoria de um byte :)
rturnbull

Bom, o que exatamente isso desctools::fibonaccinão numbers::fibonaccipode? Porque essa névoa é um pouco mais curta.
JAD

Oh deixa pra lá, achei. Doce, as outras implementações que encontrei não suportam a solicitação de vários números de uma só vez.
JAD

11
@JarkoDubbeldam Sim, retorna objetos `` gmp :: fibnum '' do tipo bigz, qual a *applyclasse de funções convertidos para digitar rawporque razões ...
rturnbull


1

PHP, 73 70 bytes

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

apresentando variáveis ​​variáveis . Em). Corra com -nr.

demolir

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

Os números são nomes de variáveis ​​perfeitamente válidos no PHP.
Mas, para os literais, eles exigem aparelho; ou seja ${0}, não $0.

36 bytes, O (1)

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

resposta do porto da xnor


0

PARI / GP, 21 bytes

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

\ é o quociente inteiro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.