สรุปตัวเลข n คู่แรกของ Fibonacci


19

ดูเหมือนว่ายังไม่มีการแข่งขันสำหรับรายการนี้

งานง่าย เพิ่มnตัวเลขแรกของลำดับฟีโบนักชีที่เท่ากันและเอาท์พุทผลลัพธ์

นี้จะได้รับโดยOEIS A099919ยกเว้นลำดับที่ขยับตัวโดยหนึ่งเริ่มต้นด้วยแทนfib(1) = 0fib(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
โปรดอย่ายอมรับคำตอบอย่างรวดเร็ว ใช้เวลาเพียงหนึ่งชั่วโมงคำตอบของนักกอล์ฟอาจมาถึงแก้ไข: ฉันเห็นแล้วว่ามีคำตอบสั้น ๆ ที่ยังไม่ได้รับการยอมรับ
Rɪᴋᴇʀ

6
เป็นเรื่องปกติที่จะต้องรออย่างน้อยหนึ่งสัปดาห์ก่อนที่จะยอมรับคำตอบเพราะหลายคนตีความว่ามันเป็นสัญญาณว่าความท้าทายไม่ได้ใช้งานอีกต่อไป
Zgarb

คำตอบ:


8

โอเอซิส , 8 7 5 ไบต์

บันทึก 1 ไบต์ขอบคุณ @ETHProductions และอีก 2 บันทึกขอบคุณ @Adnan!

zc»+U

ลองออนไลน์!

คำอธิบาย:

นี่ใช้สูตรการเกิดซ้ำเช่นเดียวกับคำตอบ MATL ของฉัน


1
info.txt ของ Oasis บอกว่าUถูกแทนที่ด้วยรหัส00ซึ่งอาจช่วยให้คุณประหยัดได้หรือไม่
ETHproductions

@ ETHproductions ขอบคุณ! ฉันลืมไปแล้ว
หลุยส์เมนโด

1
ดี! คุณสามารถแทนที่4*ด้วยzและ2+ด้วย»:)
Adnan

@Adnan ขอบคุณ! ฉันควรอ่าน doc :-) จริงๆ
หลุยส์เมนโด

17

Python ขนาด 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)))/20(Colin Barker, 26 พ.ย. 2016) จากหน้า OEIS
Titus


7

ที่จริงแล้ว 6 ไบต์

r3*♂FΣ

ลองออนไลน์!

คำอธิบาย:

หมายเลขฟีโบนักชีที่สาม (เริ่มต้นF_0 = 0) คือเลขคู่ ดังนั้นครั้งแรกnแม้ตัวเลข Fibonacci มี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

JavaScript (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

Perl 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ที่มีตัวกรองอธิบายโดยเวกเตอร์Aและในการสร้างข้อมูลกรองB 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 yอย่างไรก็ตามเราตั้งค่า0เป็นค่าแรกของอินพุตเพื่อให้ค่าเริ่มต้น0ปรากฏในเอาต์พุตตามที่ต้องการ

'FAD'-69เป็นเพียงวิธีที่สั้นลงในการผลิตเวกเตอร์สัมประสิทธิ์A = [1 -4 -1]; และผลิตเวกเตอร์การป้อนข้อมูล(1:n)>1x = [0 1 1 ... 1]


3

dc , 25 22 ไบต์

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

ลองออนไลน์!

หรือบันทึกโปรแกรมในไฟล์และเรียกใช้โดยพิมพ์

dc -f *filename*

โปรแกรมยอมรับจำนวนเต็มn ที่ไม่เป็นลบบน stdin และส่งออกผลรวมของnแรกแม้แต่หมายเลข Fibonacci บน stdout (ลำดับ Fibonacci นั้นเริ่มต้นด้วย 0 ตามตัวอย่างของ OP)


โปรแกรมนี้ใช้สูตร (F (3n-1) -1) / 2 สำหรับผลรวมของ n หมายเลขแรกแม้แต่ฟีโบนักชีโดยที่ F เป็นฟังก์ชันฟีโบนักชีปกติที่ได้รับจาก F (0) = 0, F (1) = 1, F (n) = F (n-2) + F (n-1) สำหรับ n> = 2


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

Mathematica, 27 21 ไบต์

ขอบคุณ xnor ที่ชี้ให้เห็นสูตรทางเลือก alephalpha สำหรับการแก้ไขดัชนีเริ่มต้น

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 ที่สามเป็นเลขคู่และเพียงคำนวณสามครั้งต่อครั้ง (การคำนวณมากกว่าหนึ่งครั้งต่อครั้งนั้นง่ายกว่าจริง ๆ เพราะคุณไม่ต้องสลับค่า) ฉันลองใช้(Fibonacci(3*n+2)-1)/2สูตร แต่จริง ๆ แล้วมันมีความยาวไม่กี่ไบต์ ( t+=กลายเป็นว่าค่อนข้างมีประสิทธิภาพในแง่ของขนาดรหัส)


2

C, 82 38 36 ไบต์

บันทึก 2 ไบต์ด้วย @BrainSteel

สูตรที่หน้า 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;}(36 bytes)
BrainSteel

1

แฮสเคลล์ ( 32 31 ไบต์)

บันทึกหนึ่งไบต์ด้วย @ChristianSievers

การใช้สูตรที่กำหนดใน OEIS: a(n) = 4*a(n-1)+a(n-2)+2, n>1โดย Gary Detlefs

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


วิธี golfier ที่จะบอกว่าสำหรับจำนวนเต็มคือn<=1 n<2นอกจากนี้เงื่อนไขที่สองไม่ได้จะต้องมีการปฏิเสธครั้งแรก (สำนวนotherwiseเป็นเพียงTrue) ดังนั้น usally ในบางสิ่งบางอย่างในการเล่นกอล์ฟเหมือน1<2ถูกนำมาใช้
Christian Sievers

@ ChristianSievers แน่นอน n <2 เป็นการปรับปรุงที่ชัดเจนขอบคุณ อันที่สองก็ใช้ได้เช่นกันถึงแม้ว่ามันจะไม่ได้ช่วยอะไรฉันเลยในกรณีนี้ ฉันยังคงเรียนรู้ Haskell และไม่รู้ว่าฉันจะมียามเช่นนี้ได้ ขอขอบคุณ!
Dylan Meeus

1

Mathematica, 32 27 ไบต์

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

เครดิตXNOR บันทึก 5 ไบต์ด้วย JungHwan Min


Mathematica มี Fibonacci และสั้นกว่าที่จะทำ(Fibonacci(3*n+2) - 1)/2หรือเขียน sumi?
xnor

@JungHwanMin นี่ไม่ใช่การลอกเลียนแบบ มันกล่าวถึงหน้า OEIS นอกจากนี้นี่ไม่ใช่ผู้สมัครสำหรับวิกิชุมชน ดูว่าควรใช้ Wikis ชุมชนอย่างไร .
Dennis

@devRichter ขออภัยที่ยกเลิกการลบโพสต์ของคุณ แต่จำเป็นต้องมีการสนทนา หากคุณต้องการที่จะลบมันทิ้งให้ฉันรู้และฉันจะย้ายการสนทนานี้ไปยังห้องสนทนา
Dennis

@Dennis ยังฉันเชื่อว่าควรให้เครดิตแก่Vincenzo Librandiอย่างชัดเจน - (ลบความคิดเห็นล่าสุดของฉันโดยไม่ตั้งใจ ... นั่นอาจถูกยกเลิกการลบได้หรือไม่) สำหรับคำแนะนำเกี่ยวกับการโพสต์ในชุมชน
JungHwan Min

สิ่งที่ฉันหมายถึงคือการพูดถึงชื่อของเขาในโพสต์ ... (หรืออาจรวมถึงความคิดเห็น Mathematica (* Vincenzo Librandi, Mar 15 2014 *)ในการโพสต์เช่นเดียวกับ OEIS)
JungHwan Min

1

R, 42 ไบต์

วิธีการแก้ปัญหาที่ไม่ใช่ recursive เป็นตรงกันข้ามกับวิธีการแก้ปัญหาก่อนหน้านี้โดย @rtrunbull ที่นี่

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(): เอาnมาจาก stdin

scan():2-1: สร้างจำนวนเต็มจากnการ2พร่องโดย1ยอมผ่านn-11

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)

ฉันจัดการเพื่อให้ตรงกับ bytecount ของคุณโดยไม่ต้องเรียกซ้ำ :)
JAD

@JarkoDubbeldam เยี่ยม! ฉันทิ้งการสอบถามซ้ำอีกครั้งและทำการปรับปรุงหนึ่งไบต์ :)
rturnbull

นีซdesctools::fibonacciทำอย่างนั้นทำnumbers::fibonacciอะไรไม่ได้? เพราะหมอกนั้นสั้นกว่านิดหน่อย
JAD

โอ้ไม่เป็นไรพบแล้ว น่ารักการใช้งานอื่น ๆ ที่ฉันพบไม่สนับสนุนการขอหมายเลขหลายรายการพร้อมกัน
JAD

1
@JarkoDubbeldam ใช่ `` gmp :: fibnum '' ส่งคืนออบเจ็กต์ประเภทbigzซึ่ง*applyคลาสของฟังก์ชันแปลงเป็นประเภท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.