첫 번째 n 짝수 피보나치 수를 합산


19

아직이 콘테스트가없는 것 같습니다.

작업은 간단합니다. n짝수 인 피보나치 수열 의 첫 번째 숫자를 더하고 결과를 출력합니다.

이것은 OEIS A099919에 의해 주어진다. 시퀀스는 fib(1) = 0대신에 시작하여 하나씩 이동된다는 점을 제외하고 fib(1) = 1.

이것은 코드 골프입니다. 가장 낮은 바이트 수가 이깁니다.

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

관련



@EasterlyIrk 테스트 사례는 후자를 암시하지만 명시 적으로 명시해야한다.
Mego

@ Mego 그래, 나도 알아 냈다.
Rɪᴋᴇʀ

9
답변을 너무 빨리받지 마십시오. 1 시간 밖에 걸리지 않았지만 골퍼 답변 있습니다. 편집 : 이제 아직 받아 들여지지 않은 더 짧은 답변이 있습니다.
Rɪᴋᴇʀ

6
답변을 수락하기 전에 적어도 일주일 동안 기다리는 것이 일반적입니다. 많은 사람들이 더 이상 도전이 더 이상 활성화되지 않았다는 표시로 해석하기 때문입니다.
Zgarb

답변:


8

오아시스 , 8 7 5 바이트

@ETHProductions 덕분에 1 바이트 절약, @Adnan 덕분에 2 바이트 절약!

zc»+U

온라인으로 사용해보십시오!

설명:

이것은 내 MATL 답변과 동일한 재발 공식을 사용합니다.


1
Oasis의 info.txt에 따르면 U코드에서 이로 바뀌 었습니다 00. 바이트를 절약 할 수 있습니까?
ETHproductions

@ETHproductions 감사합니다! 나는 그것을 잊었다
Luis Mendo

1
좋은! 당신은 대체 할 수 4*z2+함께 »:)
아드 난

@Adnan 감사합니다! 나는 문서를 정말로 읽어야한다 :-)
Luis Mendo

17

파이썬, 33 바이트

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

온라인으로 사용해보십시오

마술 공식!


3
오 세상에 왜 두 번째 줄에서 20을 "설명"했는지 깨달아야했던 것보다 훨씬 오래 걸렸습니다. : P
Theo

@xnor,이 마술 공식에 대한 언급이 있습니까?
TheChetan

@TheChetan : a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20OEIS 페이지에서 가능 (Colin Barker, 2016 년 11 월 26 일)
Titus


7

실제로 6 바이트

r3*♂FΣ

온라인으로 사용해보십시오!

설명:

세 번째 피보나치 수 (부터 시작 F_0 = 0)는 짝수입니다. 따라서 첫 번째 n피보나치 수는 F_{i*3}i있는 것 [0, n)입니다.

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

7

자바 스크립트 (ES6), 27 바이트

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

구조 재귀! OEIS 페이지의 수식 중 하나를 사용합니다.

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

(하지만 챌린지가 하나씩 이동하기 때문에 하나씩 이동)



4

펄 6 ,  38 35  32 바이트

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

시도 해봐

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

시도 해봐

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

시도 해봐

넓히는:

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

옥타브 , 36 35 33 바이트

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

온라인으로 사용해보십시오!

설명

이 익명 함수는 차분 방정식 a(n) = 4*a(n-1)+a(n-2)+2재귀 필터 로 구현합니다 .

Y = filter(B,A,X)벡터 데이터를 필터링 X벡터에 의해 기술되는 필터 AB상기 필터링 된 데이터를 생성하기 Y. 이 필터는 표준 차이 방정식의 "Direct Form II Transposed"구현입니다.

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)

이 경우 A = [1 -4 -1], B = 2입력 x은 1로 구성된 벡터 여야하며 결과는 출력의 마지막 항목으로 나타납니다 y. 그러나 필요에 따라 0초기 값이 0출력에 표시 되도록 입력의 첫 번째 값으로 설정했습니다 .

'FAD'-69계수 벡터를 생성하는 짧은 방법 일뿐입니다 A = [1 -4 -1]. 및 (1:n)>1상기 입력 벡터를 생성한다 x = [0 1 1 ... 1].


3

dc , 25 22 바이트

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

온라인으로 사용해보십시오!

또는 프로그램을 파일로 저장하고 다음을 입력하여 실행하십시오.

dc -f *filename*

프로그램은 stdin에서 음이 아닌 정수 n 을 받아들이고 stdout 에서 첫 번째 n 짝수 피보나치 수 의 합을 출력합니다 . (피보나치 수열은 OP의 예에 따라 0으로 시작합니다.)


이 프로그램은 첫 번째 n 짝수 피보나치 수의 합으로 공식 (F (3n-1) -1) / 2를 사용합니다. 여기서 F는 F (0) = 0, F (1) = 1, n> = 2 인 경우 F (n) = F (n-2) + F (n-1)


dc는 스택 기반 계산기입니다. 자세한 설명은 다음과 같습니다.

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.

이 시점에서 숫자 (1 + sqrt (5)) / 2는 스택의 맨 위에 있습니다.

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.

이 시점에서 3n-1은 스택의 맨 위에 있으며 (여기서 n은 입력), (1 + sqrt (5)) / 2는 맨 위에서 두 번째입니다.

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

이 시점에서 스택 맨 위에있는 숫자는 (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5)입니다. 이 수에 가장 가까운 정수는 F (3n-1)입니다. F (3n-1)은 항상 홀수입니다.

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

수학, 27 21 바이트

인덱스 시작을 정정하기위한 대체 공식, alephalpha를 지적한 xnor에게 감사

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

1
세력 (Fibonacci(3*n+2)-1)/2공식은 짧아?
xnor

2

MATL , 15 14 바이트

OOi:"t4*b+2+]x

온라인으로 사용해보십시오!

설명

OEIS의 재귀 수식 중 하나를 사용합니다.

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

입력 N의 경우 코드는 N 번 반복 되는데, 이는 필요한 것보다 2 배 더 많습니다. 이 설정에 의해 보상되고 0, 0(대신에 0, 2초기 값 등)과 마지막 얻어진 값을 삭제하고 이전 표시로.

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

배치, 80 바이트

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

세 번째 피보나치 수는 모두 짝수라는 사실을 사용하고 한 번에 세 개씩 만 계산합니다 (한 번에 두 개 이상을 계산하면 실제로 값을 교환 할 필요가 없으므로 더 쉽습니다). 나는 (Fibonacci(3*n+2)-1)/2공식을 시도했지만 실제로 몇 바이트 더 길다 ( t+=코드 크기면에서 상당히 효율적인 것으로 밝혀 짐).


2

C, 82 38 36 바이트

@BrainSteel 덕분에 2 바이트 절약

OEIS 페이지의 공식은 훨씬 짧았습니다.

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

온라인으로 사용해보십시오!

82 바이트 :

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

첫 번째 버전은 75 바이트이지만 항상 이전 호출 f보다 큰 N값으로 호출하지 않으면 함수를 재사용 할 수 없습니다.

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

내 첫 대답은 여기입니다. 다른 답변이나 OEIS를 확인하지 않았습니다. 나는 그것을 더 짧게 만들기 위해 적용 할 수있는 몇 가지 트릭이 있다고 생각합니다 :-)


1
조금 주위를 a(n){return--n<1?0:4*a(n)+a(n-1)+2;}
뒤섞음

1

하스켈 ( 32 31 바이트)

@ChristianSievers 덕분에 1 바이트를 절약했습니다.

OEIS에 제공된 공식 사용 : a(n) = 4*a(n-1)+a(n-2)+2, n>1Gary Detlefs

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


n<=1정수 를 말하는 골퍼 방법 은 n<2입니다. 또한 두 번째 조건은 첫 번째 조건을 부정 할 필요가 없으므로 (관용 otherwise은 단순히 True), 일반적으로 골프 1<2를하는 데 사용됩니다.
Christian Sievers

@ChristianSievers 실제로 n <2는 분명히 개선되었습니다. 감사합니다. 두 번째는 잘 작동하지만이 경우에는 아무것도 저장하지 않습니다. 나는 아직도 Haskell을 배우고 있는데 그런 경비를 가질 수 있다는 것을 몰랐습니다. 감사합니다!
Dylan Meeus

1

매스 매 티카, 32 27 바이트

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

xnor 에게 크레딧 . JungHwan Min 덕분에 5 바이트를 절약했습니다.


확실히 Mathematica에는 피보나치가 있으며 sumi를 (Fibonacci(3*n+2) - 1)/2쓰거나 쓰는 것이 더 짧 습니까?
xnor

@JungHwanMin 이것은 표절이 아닙니다. OEIS 페이지를 언급합니다. 또한 이것은 커뮤니티 위키의 후보가 아닙니다. 커뮤니티 위키 사용 방법을 참조하십시오 . .
Dennis

@devRichter 게시물을 삭제하지 못해 죄송하지만 대화가 필요했습니다. 삭제 된 상태로 유지하려면 알려 주시면이 대화를 대화방으로 옮길 것입니다.
Dennis

@Dennis는 여전히 Vincenzo Librandi에 신용을 명시 적으로 부여해야한다고 생각합니다. (실수로 마지막 코멘트를 삭제했습니다. 삭제되지 않을 수 있습니까?) 커뮤니티 게시물 제안을 위해 정정되었습니다.
JungHwan Min

내가 의미하는 바는 포스트에서 그의 이름을 언급하는 것이 었습니다. (또는 아마도 (* Vincenzo Librandi, Mar 15 2014 *)OEIS에서와 같이 포스트에 Mathematica 코멘트 를 포함시킬 수도 있습니다 .)
JungHwan Min

1

R, 42 바이트

@rtrunbull의 이전 솔루션과 달리 비 재귀 솔루션은 here .

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

피보나치 수열의 세 번째 값이 모두 짝수 인 속성을 사용합니다. 또한 F기본적으로로 정의 된 사실을 남용하여 FALSE=0값을 추가 할 수있는 기초로 허용합니다.


1

R, 42 41 바이트

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

scan(): nstdin에서 가져 옵니다.

scan():2-1:에서 n까지의 정수를 생성 하고 2, 씩 감소 1하고을 생성 n-1합니다 1.

3*(scan():2-1) : 세 번째 피보나치 수는 짝수이므로 3을 곱합니다.

DescTools::Fibonacci(3*(scan():2-1)):이 피보나치 수를 반환합니다 (예 : 3~ (n-1)*3).

sum(DescTools::Fibonacci(3*(scan():2-1))) : 결과를 합산합니다.

이전에는 OEIS의 공식 중 하나를 사용하여이 흥미로운 솔루션을 얻었습니다.

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

나는 재귀없이 바이트 수를 일치시킬 수 있었다 :)
JAD

트윗 담아 가기 나는 또한 재귀를 버리고 1 바이트 개선했습니다 :)
rturnbull

좋아요, 정확히 무엇을 desctools::fibonacci할 수 numbers::fibonacci있습니까? 그 안개는 조금 짧아지기 때문입니다.
JAD

오, 신경 쓰지 마 Sweet, 내가 찾은 다른 구현은 한 번에 여러 숫자를 요구하는 것을 지원하지 않습니다.
JAD

1
@JarkoDubbeldam 예,``gmp :: fibnum ''은 type의 객체를 반환합니다. 이유 때문에 함수 bigz*apply클래스가 type으로 변환됩니다 raw.
rturnbull


1

PHP, 73 70 바이트

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

변수 변수를 보여줍니다 . 의 위에). 으로 실행합니다 -nr.

고장

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

PHP에서 숫자는 완벽하게 유효한 변수 이름입니다.
그러나 리터럴의 경우 중괄호가 필요합니다. 즉 ${0}, 아닙니다 $0.

36 바이트, O (1)

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

xnor의 답변 포트


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.