Fibonacci กลับด้าน!


42

บทนำ

เราทุกคนรู้จักและชื่นชอบลำดับฟีโบนักชีของเราและได้เห็นความท้าทายมากมายที่นี่ อย่างไรก็ตามเรายังขาดกรณีง่าย ๆ ที่คำตอบนี้จะให้: Fibonacci กลับด้าน! ดังนั้นให้งานของคุณคือการหาF_nn

สเปค

อินพุต

ข้อมูลที่คุณป้อนจะเป็นจำนวนเต็มไม่เป็นลบซึ่งรับประกันว่าจะเป็นส่วนหนึ่งของลำดับฟีโบนักชี

เอาท์พุต

ผลลัพธ์จะต้องเป็นจำนวนเต็มไม่เป็นลบเช่นกัน

จะทำอย่างไร?

การแนะนำได้กล่าวไปแล้ว: เนื่องจากมีจำนวนฟีโบนักชีเอาท์พุทดัชนี จำนวน Fiboancci ขอถูกกำหนดให้เป็นF(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)และคุณได้รับและจะต้องกลับมาF(n)n

กรณีมุมที่อาจเป็นไปได้

0 คืออิน - และเอาท์พุทที่ถูกต้อง
หากได้รับ "1" เป็นอินพุตคุณสามารถเลือกเอาต์พุต "1" หรือ "2" ได้ตามต้องการ
คุณอาจสมมติว่าข้อมูลที่คุณป้อนเป็นหมายเลขฟีโบนักชีเสมอ
คุณอาจคิดว่าอินพุตนั้นสามารถแทนได้ด้วยจำนวนเต็ม 32 บิต

ใครชนะ?

นี่คือ code-golf ดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!
ใช้กฎมาตรฐานแน่นอน

การทดสอบกรณี

0 -> 0
2 -> 3
3 -> 4
5 -> 5
8 -> 6
13 -> 7
1836311903 -> 46

39
เล็กน้อย nit-pick: สิ่งนี้ไม่ควรถูกพิจารณาว่าเป็นfibonacci แบบผกผันen.m.wikipedia.org/wiki/Inverse_function
Michael

19
ดังนั้น iccanobiF!

6
@Michael นี่ไม่ใช่ Fibonacci แบบผกผันเนื่องจากไม่มีการตรงกันข้ามกับฟังก์ชัน Fibonacci เพราะมันไม่ใช่การฉีด (เพราะ "1" ปรากฏขึ้นสองครั้ง) สิ่งที่ตรงกันข้ามมาจากความคิดของ "การค้นหาตารางย้อนกลับ" ซึ่งเป็นสิ่งที่ฉันคาดหวังให้คนทำที่นี่ (เช่นฉันคาดหวังให้พวกเขาทำเพื่อแก้ปัญหา)
SEJPM

9
ฟังก์ชั่นที่นี่ถือเป็นสิ่งที่ตรงกันข้ามกับ "ฟังก์ชันฟีโบนักชี" จากจำนวนเต็มที่ไม่เป็นลบไปจนถึงชุดของตัวเลขฟีโบนักชี การมีอยู่ของผกผันที่ถูกต้องไม่ได้หมายถึงการฉีด
เดนนิส

1
@SEJPM: ฉันค่อนข้างคาดหวังว่างานเช่น "เขียนโปรแกรมที่สะกดลำดับฟีโบนักชีย้อนหลัง" แม้ว่า
Bergi

คำตอบ:


58

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

f

ใช่มีในตัวสำหรับการนี้ตั้งแต่ 16 พฤศจิกายน 2015

ลองออนไลน์


เพื่อความสนุกสนานโดยไม่ต้องสร้างขึ้นภายในจะมีขนาด 9 ไบต์:

╗1`F╜=`╓i

ลองออนไลน์!

คำอธิบาย:

╗1`F╜=`╓i
╗          push input to register 0
 1`F╜=`╓   push list containing first value x (starting with x = 0) where:
   F         fib(x)
    ╜=       is equal to the input
        i  flatten the list

15
ฉันมีหนึ่งความคิดและความคิดหนึ่งก็ต่อเมื่อฉันเห็นสิ่งนี้: ಠ_ಠ
Addison Crump

37
ฉันไม่เข้าใจจริง ๆ ว่าทำไมคุณถึงต้อง "เสีย" สัญลักษณ์เพื่อจุดประสงค์ที่เฉพาะเจาะจงอย่างน่าขัน
Fatalize

19
@Falize ฟังก์ชัน Fibonacci และฟังก์ชัน Fibonacci แบบผกผันเป็นสิ่งแรกที่ฉันเพิ่มเข้าไป ถึงตอนนี้ยังมีคำสั่งไบต์เดี่ยว 39 คำที่ไม่ได้ใช้อย่างสมบูรณ์ (และใครจะรู้ว่ามีโอเวอร์โหลดเท่าใดที่สามารถใช้ประโยชน์ได้) 256 สัญลักษณ์รวมกับความจริงที่ว่ามี 5 ประเภทในจริง (จำนวนเต็ม, จริง, สตริง, Iterable, ฟังก์ชั่น) หมายความว่ามีฟังก์ชั่น unary ได้ถึง 1280 และฟังก์ชั่นไบนารีที่เป็นไปได้ 6400 มีพื้นที่มากมายสำหรับคำสั่งที่ดูเหมือนไร้ประโยชน์
Mego

23
@Mego คุณแค่พยายามที่จะแข่งขันกับ Mathematica เพื่อสิ่งมีชีวิตที่มากที่สุด
gcampbell

13
จริงๆแล้วมันเป็นเพียงไบต์ ... ฮ่า ๆ รักชื่อภาษานี้
nicael

42

Mathematica ขนาด 25 ไบต์

InverseFunction@Fibonacci

ฟังก์ชัน สวยด้วยตนเองอธิบายถ้าคุณถามฉัน


31

งูหลาม36 34 32 ไบต์

lambda n:len(str(66*n**6))//1.24

รุ่นก่อนหน้า:

f=lambda n:len(str(66*n**6))//1.24
f=lambda n:(n*n*7).bit_length()//1.4

คำอธิบาย

แนวคิดหลักคือการกลับสูตร

fibonacci(n) ~ ( (1 + sqrt(5)) / 2)**n / sqrt(5)

ซึ่งบอกเราว่า

log fibonacci(n) ~ n log((1 + sqrt(5)) / 2) - log(sqrt(5))

เพื่อรับ

f(n) ~ (log(n) + log(sqrt(5))) / log((1 + sqrt(5))/2)

การเพิ่มประสิทธิภาพการเล่นกอล์ฟคือ:

  • ใช้len(str(n))เพื่อคำนวณฐานบันทึก 10 โดยไม่ต้องนำเข้าlog(เวอร์ชันเก่าที่ใช้.bit_length()ในการคำนวณฐานบันทึก 2)
  • ยกnกำลังเพื่อให้การประมาณลอการิทึมสามารถแยกแยะระหว่างหมายเลขฟีโบนักชีต่อเนื่อง
  • การคูณด้วยค่าคงที่จะทำให้ค่าอยู่ในช่วงที่ถูกต้อง

จากนั้นตัวหารถูกตัดทอนให้มีความแม่นยำน้อยที่สุดเท่าที่ฉันสามารถจัดการได้และตัวเลือกทวีคูณให้ผลลัพธ์ที่ถูกต้องสำหรับตัวเลขฟีโบนักชี 32- บิตทั้งหมด


ควรเป็น 32 ไบต์เนื่องจากf=ไม่ถูกนับ
Leun Nun

2
ในฐานะที่เป็นความคิดเห็นดังกล่าวข้างต้นแล้วกล่าวว่าฟังก์ชั่นที่ไม่ระบุชื่อ / lambdas ชื่อจะได้รับอนุญาตโดยค่าเริ่มต้น นอกจากนี้ถ้าคุณ จำกัด คำตอบของงูหลาม 2 และต้องมีความยาวอาร์กิวเมนต์lambda n:~-len(`66*n**6`)//1.24ควรจะทำงาน
เดนนิส


10

เยลลี่, 14 11 ไบต์

5½×lØp+.Ḟ»0

ลองออนไลน์!

นี่เป็นคำตอบแรกของฉันใน Jelly! นี้ใช้อัลกอริทึมจากคำตอบ MATL ขอบคุณเดนนิสที่โกนหนวดออกมา 3 ไบต์!

คำอธิบาย:

   lØp      # Log Base phi
5½          # Of the square root of 5
  ×         # Times the input
      +     # Plus
       .    # 0.5
        Ḟ   # Floored

นี่เป็นคำตอบที่ถูกต้องตอนนี้เราแค่ต้องจัดการกับกรณีพิเศษของ '0' ด้วย '0' เราจึงได้-infinityดังนั้นเราจึงกลับมา

»      # The maximum of 
 0     # Zero
       # And the previous calculated value.

7
+1 เนื่องจากความคิดเห็นเกี่ยวกับคำอธิบายเป็นจุดสิ้นสุดของโคลง
Daniel

10

Julia, 27 26 18 ไบต์

!n=log(3n+.7)÷.48

สิ่งนี้ใช้สูตรผกผันของBinet ที่มีความแม่นยำเพียงพอสำหรับจำนวนเต็ม 32 บิต ใช้งานได้จริงถึงF (153) = 42,230,279,526,998,466,217,810,220,532,898> 2 105

ลองออนไลน์!

มันทำงานอย่างไร

สูตรของ Binet ระบุดังต่อไปนี้

สูตรของ Binet

จำกัดFถึงชุดของ Fibonacci, แผนที่n → F nมีสิทธิผกผัน F → n F

เรามีสิ่งนั้น

อินเวอร์สขวาของสูตรของ Binet

และทั้งหมดที่เหลือจะทำคือการจัดการกับกรณีขอบ0

เนื่องจากอินพุตถูก จำกัด ให้เป็นจำนวนเต็ม 32 บิตเราสามารถใช้ตัวอักษรทศนิยมแบบสั้นแทนค่าคงที่ในสูตร

  • log φ = 0.481211825059603447 …≈ 0.48

    น่าเสียดายที่0.5ไม่แม่นยำพอ

  • √5 = 2.2360679774997896964 …≈ 3

    นั่นอาจดูเหมือนการประมาณค่าที่แย่มากในแวบแรก แต่เราใช้ลอการิทึมและเนื่องจากlog 3 - log √5 = 0.29389333245105 …ผลลัพธ์ก่อนการปัดเศษจะถูกปิดด้วยปัจจัยคงที่ขนาดเล็ก

  • 0.5 ≈ 0.7

    เพราะส่วนเกินจากการประมาณก่อนหน้านี้เราจริงอาจละเว้นในระยะนี้โดยสิ้นเชิงและยังคงได้รับผลที่ถูกต้องสำหรับF> 0 อย่างไรก็ตามถ้าF = 0ลอการิทึมจะไม่ถูกกำหนด 0.7เปิดออกมาเป็นค่าที่สั้นที่สุดที่ขยายสูตรของเราที่จะF = 0


8

JavaScript, 54 50 69 50 42 ไบต์

b=>(j=>{for(i=c=0;b-i;c++)i=j+(j=i)})(1)|c

แน่นอนว่ามันจะไม่ชนะเพียงเพื่อความสนุก :)

ตกลงตรวจสอบว่าศูนย์ใช้เนื้อที่ 19 ไบต์ WTF? โง่ฉัน


การสาธิต! หากต้องการดูกรณีทดสอบล่าสุดคุณต้องเลื่อนคอนโซลสักครู่

a=b=>(j=>{for(i=c=0;b-i;c++)i=j+(j=i)})(1)|c;
console.log('0: '+a(0));
console.log('2: '+a(2));
console.log('3: '+a(3));
console.log('5: '+a(5));
console.log('8: '+a(8));
console.log('13: '+a(13));
console.log('1836311903: '+a(1836311903));

ขอบคุณ @ edc สำหรับการย่อให้สั้นลง 8 ไบต์


ง่ายb=>{for(j=1,i=c=0;b-i;c++)i=j+(j=i);return c}45, ตีกอล์ฟb=>(j=>{for(i=c=0;b-i;c++)i=j+(j=i)})(1)|c42
edc65

1
@ edc ว้าวมันฉลาดมากขอบคุณ <3
nicael

8

Perl 6  33 30  27 ไบต์

{first *==$_,:k,(0,1,*+*...*>$_)}
{first *==$_,:k,(0,1,*+*...*)}
{first $_,:k,(0,1,*+*...*)}

ลองมัน

คำอธิบาย:

# lambda with implicit 「$_」 parameter
{
  first           # find the first element
    $_,           # where something is equal to the block's argument
    :k,           # return the key rather than the value

    # of the Fibonacci sequence
    ( 0, 1, * + * ... * )
    # ^--^ first two values
    #       ^---^ lambda used to generate the next in the series
    #             ^-^ generate until
    #                 ^ Whatever
}

ทดสอบ:

#! /usr/bin/env perl6
use v6.c;
use Test;

# using the safer version that stops generating
# values bigger than the input
my &fib-index = {first $_,:k,(0,1,*+*...*>$_)}

my @tests = (
  0 => 0,
  2 => 3,
  3 => 4,
  5 => 5,
  8 => 6,
  13 => 7,
  1836311903 => 46,
  1836311904 => Nil, # this is why the safe version is used here
  12200160415121876738 => 93,
  19740274219868223167 => 94,
  354224848179261915075 => 100,
);

plan +@tests + 1;

for @tests -> $_ ( :key($input), :value($expected) ) {
  cmp-ok fib-index($input), &[eqv], $expected, .gist
}

cmp-ok fib-index((0,1,*+*...*)[1000]), &[eqv], 1000, 'works up to 1000th element of Fibonacci sequence'
1..13
ok 1 - 0 => 0
ok 2 - 2 => 3
ok 3 - 3 => 4
ok 4 - 5 => 5
ok 5 - 8 => 6
ok 6 - 13 => 7
ok 7 - 1836311903 => 46
ok 8 - 1836311904 => Nil
ok 9 - 12200160415121876738 => 93
ok 10 - 19740274219868223167 => 94
ok 11 - 354224848179261915075 => 100
ok 12 - works up to 1000th element of Fibonacci sequence

1
คุณสามารถแทนที่first *==$_ด้วย just first $_เพราะตัวเลขเป็น smart-matcher ที่ถูกต้อง
smls

24 bytesโดยใช้...โอเปอเรเตอร์แทนfirst
Jo King

7

เยลลี่ขนาด 8 ไบต์

1+С0
¢i

ลองออนไลน์! โปรดทราบว่าวิธีการนี้ไม่มีประสิทธิภาพมากเกินไปสำหรับกรณีทดสอบล่าสุด

มันทำงานอย่างไร

¢i     Main link. Argument: n

¢      Call the helper link niladically (i.e., without arguments).
       This yields the sequence of the first n positive Fibonacci numbers, i.e.,
       [1, 1, 2, 3, 5, ...].
 i     Find the first index of n (1-based, 0 if not found).


1+С0  Helper link. No arguments.

1      Set the left argument to 1.
    0  Yield 0.
 +С   Add both arguments, replacing the left argument with the sum and the right
       argument with the previous value of the left argument.
       Yield the array of all intermediate values of the left argument.


5

Python ขนาด 29 ไบต์

g=lambda n:n>.7and-~g(n/1.61)

หารอินพุตซ้ำด้วยการประมาณอัตราส่วนทองคำ 1.61 จนกระทั่งต่ำกว่า 0.7 และส่งออกจำนวนหน่วย

สำหรับ 0 ผลรหัสFalse, ซึ่งเท่ากับ 0 ในหลาม สิ่งนี้สามารถหลีกเลี่ยงได้สำหรับ 2 ไบต์

g=lambda n:n//.7and 1+g(n/1.61)

4

JavaScript (ES6), 39 33 ไบต์

f=(n,j=0,k=1)=>n>j?f(n,k,j+k)+1:0

แม้ว่า ES7 จะมีสูตร Inverse Binet ที่ใช้เวลา 47 ไบต์:

x=>Math.log(x*5**.5)/Math.log(.5+1.25**.5)+.5|0
x=>Math.log(x*5**.5)/Math.log((1+5**.5)/2)+.5|0
x=>Math.log(x*(p=5**.5))/Math.log((1+p)/2)+.5|0

เพียงแค่แจกจ่ายlogและ precompute ค่าคงที่ทั้งหมด ...
ชาร์ลี

IMHO ถ้าคุณโทรซ้ำแลมบ์ดาโดยใช้ชื่อf(n,k,j+k)คุณควรจะรวมถึงการกำหนดf=และนับเป็น2 ไบต์ กฎสำหรับลูกแกะที่ไม่มีชื่อไม่ควรใช้ที่นี่
charlie

@ charlie ขออภัยฉันลืมเรื่องนี้เสมอ แก้ไขแล้ว.
Neil

4

Sage, 49 ไบต์

lambda x,s=sqrt(5):x and int(log(x*s,(1+s)/2)+.5)

ขอบคุณ TuukkaX สำหรับคำแนะนำเกี่ยวกับการบันทึกsqrt(5)ว่าsจะสามารถตัดทิ้งได้ไม่กี่ไบต์

ลองมันออนไลน์

วิธีนี้ใช้สูตรผกผันของ Binet นำเสนอการปรับปรุงหลายอย่างจากวิธีการก่อนหน้านี้: เร็วกว่า (เวลาคงที่และเวลากำลังสอง) มันใช้งานได้จริงกับอินพุตที่ใหญ่ขึ้นและสั้นลง!

ผู้ใช้ Python อาจสงสัยว่าทำไมฉันถึงใช้งานsqrt(5)แทนการใช้ที่สั้นกว่า5**.5- เพราะ5**.5มันถูกคำนวณด้วยpowฟังก์ชั่นของ C และสูญเสียความแม่นยำเนื่องจากปัญหาจุดลอยตัว ฟังก์ชั่นทางคณิตศาสตร์จำนวนมาก (รวมถึงsqrtและlog) มีการโอเวอร์โหลดใน Sage เพื่อส่งคืนค่าสัญลักษณ์ที่แน่นอนซึ่งไม่สูญเสียความแม่นยำ


ฉันไม่รู้จักปราชญ์ แต่คุณสามารถบันทึกไบต์ด้วยการถือsqrt(5)ในตัวแปรและใช้มันสองครั้งแทนที่จะพิมพ์sqrt(5)สองครั้ง?
Yytsi

4

MATL , 14 ไบต์

t?5X^*17L&YlYo

ลองออนไลน์!

สิ่งนี้ใช้การผกผันของสูตรของ Binetดังนั้นมันจึงเร็วมาก

ให้Fแสดงถึงn -th จำนวนฟีโบนักชีและไวอัตราส่วนทองคำ แล้วก็

ป้อนคำอธิบายรูปภาพที่นี่

รหัสใช้สูตรนี้โดยมีการดัดแปลงสองแบบ:

  • แทนที่จะเพิ่ม 1/2 แล้วปัดเศษรหัสจะปัดไปทางเลขจำนวนเต็มที่ใกล้เคียงที่สุดซึ่งใช้จำนวนไบต์น้อยลง
  • อินพุตF = 0 ต้องได้รับการพิจารณาเป็นกรณีพิเศษ

มันเป็นอย่างไร

t         % Take input F implicitly. Make a copy
?         % If (copy of) F is positive
  5X^     %   Push sqrt(5)
  *       %   Multiply by F
  17L     %   Push phi (predefined literal)
  &Yl     %   Two-input logarithm: first input is argument, second is base
  Yo      %   Round towards nearest integer
          % Else the input, which is 0, is left on the stack
          % End if implicitly
          % Display implicitly

1
วิธีอื่น:O1G:"yy+]vGmfq
DJMcMayhem

1
11 ไบต์:t?17L&YlXkQ
jimmy23013

@ jimmy23013 วิธีการที่ดี! คุณควรโพสต์สิ่งนั้นเป็นคำตอบที่แยกจากกัน
หลุยส์เมนโด

5X^*ฉันไม่คิดว่ามันคุ้มค่าคำตอบอื่นตามที่มันเป็นเพียงวิธีการลบได้ ( ฉันเคยทำสิ่งนี้มาก่อน ) และฉันไม่รู้ MATL มากพอที่จะปรับปรุงให้ดีขึ้นได้
jimmy23013


3

JavaScript ขนาด 22 ไบต์

n=>Math.log(n)/.48+2|0

ฉันไม่คิดว่ามันจะทำงานเมื่อฉันเห็น แต่เห็นได้ชัดว่า-Infinity|0อยู่0ใน JavaScript ไปคิด
Dennis

@Dennis: ใน JS ผู้ประกอบการระดับบิตใช้เวลาเพียง 32 -Infinity = FFF00000 00000000คนสุดท้ายบิตและ ผมก็ดีใจที่จะหามันอะไหล่ 3 n&&ไบต์ไม่ต้องย่อหน้าศูนย์ทดสอบอย่างชัดเจนเช่น นอกเหนือจากนั้นวัตถุประสงค์หลักของการ|0เป็นตัวแทนMath.trunc()(เช่น÷ใน Julia)
charlie

3

C, 62 58 ไบต์

g(c,a,b){return c-a?g(c,b,a+b)+1:0;}f(c){return g(c,0,1);}

รายละเอียด

int g(int c, int a, int b)
{
    if (c == a)
    {
        return 0;
    }
    else
    {
        return g(c, b, a+b) + 1;
    }
}

int f(c)
{
    return g(c, 0, 1);
}

3

Java 7, 70 ไบต์

int c(int n){int a=0,b=1,c=0,t;while(a<n){c++;t=b;b+=a;a=t;}return c;}

https://ideone.com/I4rUC5


2
ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี!
Leun Nun

int c(int n){int a=0,b=1,c=0,t;for(;a<n;t=b,b+=a,a=t)c++;return c;}(ไม่ผ่านการทดสอบ)
Leun Nun

int c(int n){int a=0,b=1,c=0;while(a<n){c++;b+=a;a=b-a;}return c;}(ไม่ได้ทดสอบ)
Leun Nun

2
int c(int n){int a=0,b=1,c=0;for(;a<n;b+=a,a=b-a)c++;return c;}(ไม่ผ่านการทดสอบ)
Leun Nun

2

TSQL, 143 ไบต์

อินพุตเข้า@nเป็นเหมือนในDECLARE @n INT = 1836311903;

DECLARE @O BIGINT=0;WITH F(R,P,N)AS(SELECT @O,@O,@O+1 UNION ALL SELECT R+1,N,P+N FROM F WHERE N<=@n)SELECT MAX(R)FROM F OPTION(MAXRECURSION 0);


2

Sesos , 28 ไบต์

hexdump:

0000000: 16f8be 766ef7 ae6d80 f90bde b563f0 7ded18 3ceffa  ...vn..m.....c.}..<..
0000015: b1c1bb af9f3f ff                                  .....?.

ลองออนไลน์!

(เวลาเอ็กซ์โปเนนเชียลเพราะในการคัดลอก Sesos จำนวนนั้นต้องการเวลาเอ็กซ์โปเนนเชียล)

ชุดประกอบที่ใช้ในการสร้างไฟล์ไบนารี:

set numin
set numout
get
jmp
sub 1
fwd 1
add 1
fwd 1
add 1
rwd 2
jnz    ;input input
fwd 4
add 1  ;input input 0 1
fwd 2
add 1  ;input input 0 1 0 1
rwd 4
jmp
jmp    ;input input-curr curr next iterations
sub 1
jnz    ;input 0 curr next iterations
fwd 3
add 1
jmp
sub 1
fwd 2
add 1
rwd 2
jnz    ;input 0 curr next 0 0 iterations+1
rwd 1
jmp
sub 1
fwd 1
add 1
fwd 1
add 1
rwd 2
jnz    ;input 0 curr 0 next next iterations+1
rwd 1
jmp
sub 1
fwd 1
sub 1
fwd 2
add 1
rwd 3
jnz    ;input 0 0 -curr next curr+next iterations+1
rwd 2
jmp
sub 1
fwd 2
add 1
fwd 1
add 1
rwd 3
jnz    ;0 0 input input-curr next curr+next iterations+1
fwd 3
jnz
fwd 3
put

2

Java 8 61 ไบต์

เช่นเดียวกับ @dainichi คำตอบทำให้สั้นลงโดยใช้ lambdas Java 8 คำตอบคือการแสดงออก rvalue ที่ถูกต้อง

n->{int a=0,b=1,c=0,t;while(a<n){c++;t=b;b+=a;a=t;}return c;}

Ungolfed:

interface F
{
    int c(int n);
}

public class Main
{

    public static void main(String[] args)
    {
        F f = n->{int a=0,b=1,c=0,t;while(a<n){c++;t=b;b+=a;a=t;}return c;};
    }
}


1

Java 7, 89 ไบต์

int c(int n){int i=-1;while(f(++i)<n);return i;}int f(int n){return n<2?n:f(n-1)+f(n-2);}

แรงบันดาลใจจากคำอธิบายของ@Adnanคำตอบ 05AB1E 's

กรณีที่ไม่ได้รับการทดสอบ &:

ลองที่นี่ (เกินขีด จำกัด เวลาสำหรับกรณีทดสอบครั้งสุดท้าย แต่ใช้งานได้ใน 30-45 วินาทีบนพีซีของฉัน)

class Main{
  static int c(int n){
    int i = -1;
    while(f(++i) < n);
    return i;
  }

  static int f(int n){
    return n < 2
             ? n
             : f(n - 1) + f(n - 2);
  }

  public static void main(String[] a){
    System.out.println(c(0));
    System.out.println(c(2));
    System.out.println(c(3));
    System.out.println(c(5));
    System.out.println(c(8));
    System.out.println(c(1836311903));
  }
}

เอาท์พุท:

0
3
4
5
6
46


1

J, 32 27 17 ไบต์

i.~0,+/@(!|.)\@i.

คำนวณตัวเลขn Fibonacci แรกแล้วค้นหาดัชนีของnในรายการนั้น

การใช้

คำสั่งพิเศษใช้สำหรับการจัดรูปแบบอินพุต / เอาท์พุตหลายรายการ กรณีทดสอบสุดท้ายถูกละเว้นเนื่องจากต้องใช้เวลาในการคำนวณมากขึ้น

   f =: i.~0,+/@(!|.)\@i.
   (,.f"0) 0 1 2 3 5 8 13
 0 0
 1 1
 2 3
 3 4
 5 5
 8 6
13 7

คำอธิบาย

i.~0,+/@(!|.)\@i.  Input: n
               i.  Get the range [0, 1, ..., n-1]
             \@    For each prefix of that range
          |.         Reverse the prefix
         !           Find the binomial coefficient between each value in the original
                     prefix and the reversed prefix
     +/@             Sum those binomial coefficients
                   This will create the Fibonacci numbers from 1 to n
   0,              Prepend a 0 to the list of Fibonacci numbers
i.~                Find the index of n in that list and return

1

Mathematica ขนาด 30 ไบต์

Round@Log[5^.5/2+.5,.8+5^.5#]&

ฟังก์ชั่นบริสุทธิ์; ส่งคืน 2 หากอินพุตคือ 1

ไม่ได้เอาชนะรายการ Mathematica อื่น ๆ แต่นำเสนอวิธีการที่ผิดปกติ: มันเป็นความจริง (เจ๋งมาก) ว่าหมายเลข Nth Fibonacci เป็นจำนวนเต็มที่ใกล้เคียงที่สุดกับ [1 / sqrt (5) คูณด้วยพลัง Nth ของอัตราส่วนทองคำ] (" สูตรของ Binet ")

ดังนั้นฟังก์ชันผกผันจะเป็นลอการิทึมฐาน [อัตราส่วนทองคำ] ของ [sqrt (5) คูณจำนวนฟีโบนักชีในคำถาม] นี่.8+คือแฮ็คเพื่อให้แน่ใจว่าเราจะไม่ใช้ลอการิทึมเป็น 0 โดยไม่ทำให้ค่าอื่นเสีย



1

Brachylogขนาด 14 ไบต์

≜∧0;1⟨t≡+⟩ⁱ↖?h

ลองออนไลน์!

รับอินพุตผ่านตัวแปรเอาต์พุตและเอาต์พุตผ่านตัวแปรอินพุต

≜                 Label the input variable, trying 0, 1, -1, 2...,
  0               then starting with 0
 ∧                (which is not necessarily the input variable)
   ;1             paired with 1,
     ⟨t≡ ⟩        replace the first element of the pair with the last element
     ⟨ ≡+⟩        and the last element of the pair with the sum of the elements
          ⁱ↖?     a number of times equal to the input variable,
             h    such that the first element of the pair is the output variable.

ฉันไม่แน่ใจทั้งหมดว่าทำไมจึงมีความจำเป็น


0

Javascript (ใช้ไลบรารีภายนอก) (84 ไบต์)

n=>_.Until((i,a)=>{l=a.length;if(a[l-1]!=n){return i<=1?i:a[l-1]+a[l-2]}}).Count()-1

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable

คำอธิบายรหัส: ห้องสมุดมีวิธีการคงที่ที่สร้างลำดับจนกว่าภาคจะมีค่าตอบแทนที่ไม่ได้กำหนด เพรดิเคตมีลายเซ็นต์ของ ("i" ndex, ภายในปัจจุบัน "a" rray สร้างขึ้น) ในการวนซ้ำแต่ละครั้งเราจะตรวจสอบว่าองค์ประกอบสุดท้ายของอาร์เรย์ภายในเท่ากับอินพุตหรือไม่ หากไม่ใช่ให้ส่งคืนค่าถัดไปในลำดับตอแหล มิฉะนั้นภาคจะมีผลไม่ได้กำหนดซึ่งจะยุติการสร้างลำดับ จากนั้นเรากลับความยาวของลำดับ (และลบ 1 เพื่อให้สอดคล้องกับ 0 ตามที่เห็นใน OP

ป้อนคำอธิบายรูปภาพที่นี่


53 ไบต์โดยใช้รหัสจากที่นี่ n=>{a=c=t=0,b=1;while(a<n){c++;t=b;b+=a;a=t}return c} ลองออนไลน์!
pixma140
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.