Tính tổng các số chẵn đầu tiên


19

Dường như chưa có một cuộc thi nào cho cuộc thi này.

Nhiệm vụ rất đơn giản. Thêm các nsố đầu tiên của chuỗi Fibonacci chẵn và xuất kết quả.

Điều này được đưa ra bởi OEIS A099919 , ngoại trừ chuỗi đó được thay đổi bởi một, bắt đầu bằng fib(1) = 0thay vì fib(1) = 1.

Đây là mã golf. Số byte thấp nhất sẽ thắng.

Ví dụ

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

Liên quan



@EasterlyIrk Các trường hợp thử nghiệm ngụ ý sau, nhưng nó cần được nêu rõ ràng.
Mego

@Mego yeah, tôi đã tìm ra nhiều.
Rɪᴋᴇʀ

9
Xin đừng chấp nhận câu trả lời quá nhanh. Chỉ còn một giờ nữa, câu trả lời của người chơi golf có thể đến. EDIT: Tôi thấy bây giờ đã có một câu trả lời ngắn hơn chưa được chấp nhận.
Rɪᴋᴇʀ

6
Theo thông lệ, phải đợi ít nhất một tuần trước khi chấp nhận câu trả lời, bởi vì nhiều người giải thích nó là một dấu hiệu cho thấy thách thức không còn hoạt động.
Zgarb

Câu trả lời:


8

Ốc đảo , 8 7 5 byte

1 byte được lưu nhờ vào @ETH Productstions và thêm 2 byte nữa nhờ @Adnan!

zc»+U

Hãy thử trực tuyến!

Giải trình:

Điều này sử dụng cùng một công thức lặp lại như câu trả lời MATL của tôi.


1
Thông tin của Oasis cho biết Uđược thay thế trong mã bằng 00, điều đó có thể giúp bạn tiết kiệm một byte không?
Sản phẩm ETH

@ETHproductions Cảm ơn! Tôi đã quên điều đó
Luis Mendo

1
Tốt đẹp! Bạn có thể thay thế 4*bằng z2+bằng »:)
Adnan

@Ad Nam Cảm ơn bạn! Tôi thực sự nên đọc tài liệu :-)
Luis Mendo

17

Python, 33 byte

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

Dùng thử trực tuyến

Công thức kỳ diệu!


3
Ôi Chúa ơi. Tôi mất nhiều thời gian hơn tôi phải nhận ra lý do tại sao bạn lại "bình luận" rằng 20 trên dòng thứ hai: P
Theo

@xnor, có tham khảo công thức ma thuật này không?
TheChetan

@TheChetan: có thể a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker, ngày 26 tháng 11 năm 2016) từ trang OEIS
Titus


7

Thực ra , 6 byte

r3*♂FΣ

Hãy thử trực tuyến!

Giải trình:

Mỗi số Fibonacci thứ ba (bắt đầu từ F_0 = 0) là chẵn. Do đó, người đầu tiên nngay cả con số Fibonacci là F_{i*3}cho itrong [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

Đệ quy để giải cứu! Điều này sử dụng một trong các công thức trên trang OEIS:

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

(nhưng thay đổi bởi một vì thách thức thay đổi nó một)



4

Perl 6 ,  38 35  32 byte

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

Thử nó

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

Thử nó

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

Thử nó

Mở rộng:

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

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

Hãy thử trực tuyến!

Giải trình

Hàm ẩn danh này thực hiện phương trình sai khác a(n) = 4*a(n-1)+a(n-2)+2như một bộ lọc đệ quy :

Y = filter(B,A,X)lọc dữ liệu trong vectơ Xvới bộ lọc được mô tả bởi vectơ ABđể tạo dữ liệu được lọc Y. Bộ lọc là một triển khai "Chuyển đổi mẫu II trực tiếp" của phương trình sai phân chuẩn:

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)

Trong trường hợp của chúng tôi A = [1 -4 -1], B = 2và đầu vào xphải là một vector của những người thân, với kết quả xuất hiện như là mục cuối cùng của sản lượng y. Tuy nhiên, chúng tôi đặt thành 0giá trị đầu tiên của đầu vào để 0xuất hiện ban đầu trong đầu ra, theo yêu cầu.

'FAD'-69chỉ là một cách ngắn hơn để tạo ra vectơ hệ số A = [1 -4 -1]; và (1:n)>1tạo ra các vectơ đầu vào x = [0 1 1 ... 1].


3

dc , 25 22 byte

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

Hãy thử trực tuyến!

Hoặc lưu chương trình trong một tệp và chạy nó bằng cách gõ

dc -f *filename*

Chương trình chấp nhận một số nguyên n không âm trên stdin và nó đưa ra tổng của số n số chẵn đầu tiên trên stdout. (Chuỗi Fibonacci được lấy để bắt đầu bằng 0, theo ví dụ của OP.)


Chương trình này sử dụng công thức (F (3n-1) -1) / 2 cho tổng của các số Fibonacci n chẵn đầu tiên, trong đó F là hàm Fibonacci thông thường, được đưa ra bởi F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) với n> = 2.


dc là một máy tính dựa trên ngăn xếp. Đây là một lời giải thích chi tiết:

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.

Tại thời điểm này, số (1 + sqrt (5)) / 2 nằm ở đầu ngăn xếp.

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.

Tại thời điểm này, 3n-1 nằm ở đầu ngăn xếp (trong đó n là đầu vào) và (1 + sqrt (5)) / 2 là thứ hai từ trên xuống.

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

Tại thời điểm này, số ở đầu ngăn xếp là (((1 + sqrt (5)) / 2) ^ (3n-1)) / sqrt (5). Số nguyên gần nhất với số này là F (3n-1). Lưu ý rằng F (3n-1) luôn là số lẻ.

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

Toán học, 27 21 byte

Cảm ơn xnor đã chỉ ra một công thức thay thế, alephalpha để sửa lỗi cho chỉ mục bắt đầu

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

1
Có thể (Fibonacci(3*n+2)-1)/2công thức ngắn hơn?
xnor

2

MATL , 15 14 byte

OOi:"t4*b+2+]x

Hãy thử trực tuyến!

Giải trình

Điều này sử dụng một trong các công thức lặp lại từ OEIS:

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

Đối với đầu vào N , mã lặp lại N lần, gấp 2 lần so với mức cần thiết. Giá trị này được bù bằng cách đặt 0, 0(thay vì 0, 2) làm giá trị ban đầu và bằng cách xóa giá trị thu được cuối cùng và hiển thị giá trị trước đó.

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

Mẻ, 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%

Sử dụng thực tế là mọi số Fibonacci thứ ba đều chẵn và chỉ tính ba số đó một lần (tính toán nhiều hơn một lần thực sự dễ dàng hơn khi bạn không phải trao đổi giá trị xung quanh). Tôi đã thử (Fibonacci(3*n+2)-1)/2công thức nhưng thực tế nó dài hơn một vài byte ( t+=hóa ra khá hiệu quả về kích thước mã).


2

C, 82 38 36 byte

Lưu 2 byte nhờ @BrainSteel

Các công thức tại trang OEIS làm cho nó ngắn hơn nhiều:

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

Hãy thử trực tuyến!

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

Phiên bản đầu tiên là 75 byte nhưng chức năng không thể sử dụng lại được, trừ khi bạn luôn gọi fvới số lượng lớn Nhơn cuộc gọi trước :-)

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

Câu trả lời đầu tiên của tôi ở đây. Không kiểm tra bất kỳ câu trả lời nào khác cũng như OEIS. Tôi đoán có một vài thủ thuật mà tôi có thể áp dụng để làm cho nó ngắn hơn :-)


1
Bạn có thể làm cho điều này ngắn hơn một chút bằng cách xáo trộn mọi thứ xung quanh một chút: a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36 byte)
BrainSteel

1

Haskell ( 32 31 byte)

Đã lưu một byte nhờ @ChristianSievers.

Sử dụng công thức được đưa ra trong OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1bởi Gary Detlefs

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


Một cách golfier để nói n<=1cho số nguyên là n<2. Ngoài ra, điều kiện thứ hai không cần phải là phủ định của điều thứ nhất (thành ngữ otherwiseđơn giản là vậy True), do đó, thông thường trong việc chơi golf một cái gì đó giống như 1<2được sử dụng.
Christian Sievers

@ChristianSievers thực sự n <2 là một cải tiến rõ ràng, cảm ơn bạn. Cái thứ hai cũng hoạt động, mặc dù nó không giúp tôi tiết kiệm được gì trong trường hợp này. Tôi vẫn đang học Haskell và không nhận ra mình có thể có một người bảo vệ như thế. Cảm ơn bạn!
Dylan Meeus

1

Toán học, 32 27 byte

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

Tín dụng cho xnor . Đã lưu 5 byte nhờ JungHwan Min.


Chắc chắn Mathicala có Fibonacci và nó ngắn hơn để làm (Fibonacci(3*n+2) - 1)/2hoặc viết sumi?
xnor

@JungHwanMin Đây không phải là đạo văn; nó đề cập đến trang OEIS. Ngoài ra, đây không phải là một ứng cử viên cho wiki cộng đồng. Xem Wikis cộng đồng nên được sử dụng như thế nào? .
Dennis

@devRichter Xin lỗi vì đã xóa bài đăng của bạn, nhưng cần phải có một cuộc trò chuyện. Nếu bạn muốn xóa nó, hãy cho tôi biết và tôi sẽ chuyển cuộc trò chuyện này sang phòng chat.
Dennis

@Dennis vẫn còn, tôi tin rằng tín dụng nên được trao cho Vincenzo Librandi một cách rõ ràng - (vô tình xóa bình luận cuối cùng của tôi ... điều đó có thể bị xóa không?) Đối với đề xuất bài đăng của cộng đồng, tôi đã sửa chữa.
JungHwan Min

Điều tôi muốn nói là đề cập đến tên của anh ấy trong bài đăng ... (hoặc có lẽ bao gồm cả bình luận Mathicala (* Vincenzo Librandi, Mar 15 2014 *)trong bài đăng, như trên OEIS.)
JungHwan Min

1

R, 42 byte

Giải pháp không đệ quy, trái ngược với giải pháp trước đó của @rtrunbull ở đây .

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

Sử dụng thuộc tính mà mỗi giá trị thứ ba của chuỗi Fibonacci là chẵn. Cũng lạm dụng thực tế Ftheo mặc định được định nghĩa là FALSE=0, cho phép nó làm cơ sở để thêm các giá trị vào.


1

R, 42 41 byte

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

scan(): lấy ntừ stdin.

scan():2-1: tạo số nguyên từ nđến 2, giảm theo 1, cho n-1qua 1.

3*(scan():2-1) : nhân với 3, vì mỗi số thứ ba của Wikipedia là số chẵn.

DescTools::Fibonacci(3*(scan():2-1)): Trả lại các số Wikipedia này (tức là 3thông qua(n-1)*3 ).

sum(DescTools::Fibonacci(3*(scan():2-1))) : Tính tổng kết quả.

Trước đây, tôi đã có giải pháp không thú vị này bằng cách sử dụng một trong các công thức từ OEIS:

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

Tôi đã xoay sở để khớp với số tiền của bạn mà không cần đệ quy :)
JAD

@JarkoDubbeldam Đẹp quá! Tôi cũng đã bỏ đệ quy và thực hiện cải tiến một byte :)
rturnbull

Đẹp, chính xác thì không desctools::fibonaccithể làm numbers::fibonaccigì? Bởi vì sương mù đó ngắn hơn một chút.
JAD

Oh nevermind, tìm thấy nó. Thật ngọt ngào, các triển khai khác mà tôi thấy không hỗ trợ yêu cầu nhiều số cùng một lúc.
JAD

1
@JarkoDubbeldam Vâng, `` gmp :: fibnum '' trả về các đối tượng thuộc loại bigz, mà *applylớp hàm chuyển đổi thành loại rawvì lý do ...
rturnbull


1

PHP, 73 70 byte

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

hiển thị các biến số . Trên). Chạy với -nr.

phá vỡ

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

Các số là tên biến hoàn toàn hợp lệ trong PHP.
Nhưng, đối với những người theo nghĩa đen, họ yêu cầu niềng răng; tức là ${0}, không phải $0.

36 byte, O (1)

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

cổng câu trả lời của xnor


0

PARI / GP, 21 byte

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

\ là thương số nguyên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.