ตัวเลขฟีโบนักชีเชิงลบ


28

คุณคงรู้จักลำดับฟีโบนาชี:

fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)
fibonacci(0)=0
fibonacci(1)=1

งานของคุณง่ายอย่างที่ควรจะเป็น:

  • รับNคำนวณจำนวนเต็มfibonacci(n)

แต่นี่คือการบิด:

  • ยังลบ N

รอ. อะไร?

fibonacci(1)=fibonacci(0)+fibonacci(-1)

ดังนั้น

fibonacci(-1)=1

และ

fibonacci(-2)=fibonacci(0)-fibonacci(1)=-1

และอื่น ๆ ...

  • นี่คือสั้นที่สุดดังนั้นโปรแกรมเป็นไบต์ชนะ
  • คุณสามารถส่งฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • N อยู่ใน [-100,100]

Testcase ในรูปแบบ CSV:

-9;-8;-7;-6;-5;-4;-3;-2;-1;0;1;2;3;4;5;6;7;8
34;-21;13;-8;5;-3;2;-1;1;0;1;1;2;3;5;8;13;21

คำแนะนำ:

n <0 และ n & 1 == 0:

fibonacci(n)=fibonacci(abs(n))*-1


ไม่ฉันต้องการให้คุณสนับสนุนตัวเลขลบเช่นกัน
Roman Gräf

7
ฉันคิดว่านี่ไม่ใช่การล่อลวง จากคำตอบในหน้าแรกของความท้าทาย Fibonacci ที่มีอยู่มีเพียง 1 คนเท่านั้นที่สามารถจัดการกับเนกาทีฟได้และส่วนที่เหลือทั้งหมดจะต้องเปลี่ยนไปอย่างมากเพื่อย้อนกลับไปเช่นกัน
xnor

เพิ่มบางส่วน อย่าลังเลที่จะเพิ่มมากขึ้น @Flip
Roman Gräf

1
อ่านเมตาโพสต์นี้เกี่ยวกับการจัดรูปแบบกรณีทดสอบ: พยายามหลีกเลี่ยงตารางแฟนซี
FlipTack

และโดย CSV คุณหมายถึง SSV (ค่าที่คั่นด้วยเครื่องหมายอัฒภาค) หรือไม่
นิวแฮมป์เชียร์

คำตอบ:


22

Mathematica ขนาด 9 ไบต์

Fibonacci

ใช่ฟังก์ชั่นในตัวนี้รองรับจำนวนลบ


2
นี่เป็นคำต่อคำที่ฉันจะโพสต์: D
Greg Martin

17

อ็อกเทฟ 20 ไบต์

 @(n)([1,1;1,0]^n)(2)

ลองออนไลน์!

คำอธิบาย

สิ่งนี้ใช้ประโยชน์จากความจริงที่ว่าลำดับ fibonacci f(n)สามารถเขียนเป็น (นี่ควรเป็นสัญกรณ์เวกเตอร์เมทริกซ์):

ซ้ำ:

[f(n+1)]  = [1  1] * [f(n)  ]
[f(n)  ]    [1  0]   [f(n-1)]

อย่างชัดเจน:

[f(n+1)]  = [1  1] ^n * [1]
[f(n)  ]    [1  0]      [0]

นี่หมายความว่ารายการด้านบนขวาของเมทริกซ์นี้ต่อความสามารถของnค่าที่f(n)เรากำลังมองหา เห็นได้ชัดว่าเราสามารถกลับเมทริกซ์นี้ได้เนื่องจากมีอันดับเต็มและความสัมพันธ์ยังคงอธิบายความสัมพันธ์ที่เกิดซ้ำเหมือนกัน นั่นหมายความว่ามันยังทำงานได้กับอินพุตลบ


1
(วิธีการ) สิ่งนี้ใช้ได้กับอินพุตเชิงลบหรือไม่
Roman Gräf

ใช่คำอธิบายมา ...
ข้อบกพร่อง

จะans(-6)หมายถึงการเป็นบวก?
FlipTack

@FlipTack ขออภัยอาจเป็นเพราะการเลื่อนดัชนี ฉันใช้แบบที่ใช้ 1 ในขณะที่คำถามที่ใช้แบบที่เป็นแบบพื้นฐานนั้นฉันแก้ไขได้แล้ว
ข้อบกพร่อง

13

Maxima, 3 ไบต์

 fib

รองรับตัวเลขบวกและลบ

ลอง (วาง) บนCESGA - Maxima ในบรรทัด


คุณสามารถเพิ่มลิงค์ไปยังภาษาได้หรือไม่?
Pavel

แน่นอนเพิ่มลิงค์ไปยังเครื่องคิดเลขออนไลน์!
rahnema1

ใช้ได้กับ WolframAlpha
Thunda

11

Python ขนาด 43 ไบต์

g=5**.5/2+.5
lambda n:(g**n-(1-g)**n)/5**.5

gสูตรโดยตรงกับอัตราส่วนทองคำ ด้วยfฟังก์ชั่นด้านบน:

for n in range(-10,11):print f(n) 

-55.0
34.0
-21.0
13.0
-8.0
5.0
-3.0
2.0
-1.0
1.0
0.0
1.0
1.0
2.0
3.0
5.0
8.0
13.0
21.0
34.0
55.0

alt ความยาวเท่ากันเพียงนามแฝงรากที่สองของ 5:

a=5**.5
lambda n:((a+1)**n-(1-a)**n)/a/2**n

ฉันไม่เห็นวิธีที่จะสร้างฟังก์ชั่นวนซ้ำที่สามารถแข่งขันกับสิ่งเหล่านี้ได้ ความพยายามครั้งละ 57 ไบต์:

f=lambda n:n<0and(-1)**n*f(-n)or n>1and f(n-1)+f(n-2)or n

สำหรับการเปรียบเทียบวิธีการวนซ้ำ (60 bytes ใน Python 2):

n=input()
a,b=0,1;exec"a,b=b,a+b;"*n+"a,b=b-a,a;"*-n
print a

หรือสำหรับ 58 ไบต์:

n=input()
a,b=0,1;exec"a,b=b,a+cmp(n,0)*b;"*abs(n)
print a

10

JavaScript (ES6), 42 ไบต์

f=n=>n<2?n<0?f(n+2)-f(n+1):n:f(n-2)+f(n-1)

ทดสอบ


ฉันชอบฟังก์ชั่นของคุณ ฉันมีข้อเสนอแนะที่นี่ แต่ฉันมองข้าม - ดังนั้นจึงใช้ไม่ได้ ...
ลุค

5

MATL , 11 9 ไบต์

ฉันมีความสุขกับการเล่น[3,2]กอล์ฟซึ่งแน่นอนว่าถ้าใครรู้วิธีโปรดแจ้งให้เราทราบ =) (มันจะทำงานด้วย[1,3])ขอบคุณ @LuisMendo สำหรับ -2 bytes =)

IHhBiY^2)

นี่คือการใช้วิธีการเช่นเดียวกับannswer คู่ แต่ต้องสร้างเมทริกซ์

[1,1]
[1,0]

เราแค่แปลงจำนวน3และ2จากทศนิยมเป็นไบนารี (เช่น11และ10)

ลองออนไลน์!


5

JavaScript (ES7) 37 ไบต์

ใช้สูตรของ Binet

n=>((1+(a=5**.5))**n-(1-a)**n)/a/2**n

เอาท์พุทนี้nTH Fibonacci + ตัวเลข0.0000000000000005-


**ต้องใช้ ES7
Neil

โอ้คิดว่ามันเป็นส่วนหนึ่งของ ES6 แต่คุณพูดถูก เปลี่ยนแล้ว ฉันยังใช้สูตรอื่นของ Binet สำหรับบันทึก 1B
ลุค

ตอนนี้ฉันคิดเกี่ยวกับมันเพียงใช้1-pแทน-1/pควรได้ทำงานเพื่อการประหยัดเดียวกัน
Neil

3

Jolf, 2 ไบต์

mL

ลองที่นี่!

ฟีโบนักชีบิวอินนำมาใช้โดยใช้phiสูตร


Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด | ที่ Function ใหม่ (<anonymous>) ที่ p (math.min.js: 27) ที่ Object (math.min.js: 27) ที่พิมพ์ (eval ที่ p (math.min.js: 27), <anonymous>: 36:14) ที่ Object.n [เป็นโรงงาน] (math.min.js: 45) ที่ t (math.min.js: 27) ที่ f (math.min.js: 27) ที่ Object.get [as median ] (math.min.js: 27) ที่โคลน (rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf.js:902) ที่ rawgit.com/ConorOBrien-Foxx/Jolf/master/src/jolf js: 2128 (Google Chrome รุ่นล่าสุด, รุ่น 55.0.2883.87m)
Ismael Miguel

@IsmaelMiguel สิ่งนี้ควรใช้กับ firefox เท่านั้น
Conor O'Brien

ฉันไม่รู้ว่ามันไม่ใช่ที่ใด
Ismael Miguel

2

Haskell, 51 ไบต์

s=0:scanl(+)1s;f z|even z,z<0= -f(-z);f z=s!!abs z

1
การทดสอบหลายภายในยามสามารถใช้ร่วมกับ,แทน:&& even z,z<0
nimi

1

PowerShell , 112 ไบต์

function f($n){$o=('-','+')[$n-lt0];&(({$a,$b=(2,1|%{f("$n$o$_"|iex)});"$a- $o$b"|iex},{$n*$n})[$n-in(-1..1)])}

โทรสาธิต:

-9..9 | %{"{0,2}`t=> {1,3}" -f $_,(f($_))} 

ผลลัพธ์ของการสาธิต:

-9  =>  34
-8  => -21
-7  =>  13
-6  =>  -8
-5  =>   5
-4  =>  -3
-3  =>   2
-2  =>  -1
-1  =>   1
 0  =>   0
 1  =>   1
 2  =>   1
 3  =>   2
 4  =>   3
 5  =>   5
 6  =>   8
 7  =>  13
 8  =>  21
 9  =>  34

1

Lithp , 88 ไบต์

#N::((if(< N 2)((if(< N 0)((-(f(+ N 2))(f(+ N 1))))((+ N))))((+(f(- N 2))(f(- N 1))))))

รูปลักษณ์ของฉันที่ทุกคนวงเล็บ

ลองออนไลน์!

ไม่เล็กมากจริงๆ ขณะนี้มีข้อผิดพลาดในการแยกวิเคราะห์ที่ต้องการให้ใช้(get N)หรือ(+ N)แทนที่จะใช้เพียงอย่างNเดียว ฉันเลือกอันที่เล็กกว่านี้ อย่างไรก็ตามฉันไม่คิดว่าจะมีสิ่งใดที่สามารถทำต่อไปเพื่อตีกอล์ฟได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.