ฉันเป็นหมายเลขฟีโบนักชีหรือไม่


49

งานของคุณ:

เขียนโปรแกรมหรือฟังก์ชั่นเพื่อตรวจสอบว่าหมายเลขที่ป้อนนั้นเป็นหมายเลขฟีโบนักชีหรือไม่ หมายเลขฟีโบนักชีเป็นตัวเลขที่อยู่ในลำดับฟีโบนักชี

ลำดับ Fibonacci ถูกกำหนดเป็น: F(n) = F(n - 1) + F(n - 2)

มีเมล็ดเป็นและF(0) = 0F(1) = 1

การป้อนข้อมูล:

จำนวนเต็มที่ไม่เป็นลบระหว่าง 0 ถึง 1,000,000,000 ซึ่งอาจเป็นหรือไม่ใช่ตัวเลขฟีโบนักชี

เอาท์พุท:

ค่าความจริง / เท็จแสดงว่าอินพุตเป็นหมายเลขฟีโบนักชีหรือไม่

ตัวอย่าง:

0-->truthy
1-->truthy
2-->truthy
12-->falsy

เกณฑ์การให้คะแนน:

นี่คือ , จำนวนไบต์ต่ำสุดที่ชนะ


2
ภาษาการเขียนโปรแกรมที่ฉันใช้รองรับเฉพาะตัวเลขสูงถึง 9999 (Geometry Dash) ไม่เป็นไรถ้าฉันคิดว่ามันรองรับตัวเลขได้มากถึง 1000000 ในทางทฤษฎี?
MilkyWay90

คำตอบ:


36

Neim , 2 ไบต์

f𝕚

คำอธิบาย:

f       Push an infinite fibonacci list
 𝕚      Is the input in that list?

ใช้งานได้เหมือนคำตอบIt's Hip to my Squareแต่ใช้ infinite list ที่แตกต่างกัน: fสำหรับ fibonacci

ลองมัน!


1
ว้าว! คะแนนที่น่าประทับใจ
Gryphon - Reinstate Monica

2
เยี่ยมมาก แต่ไม่ถึง 2 ไบต์ ใน UTF-8 จะแสดงเป็น "66 F0 9D 95 9A"
sm4rk0

10
@ sm4rk0 เยี่ยมมาก แต่คุณผิด Neim ใช้ codepage ที่กำหนดเองดังนั้นการแทนไบต์ของสิ่งนี้คือ66 D5
Okx

ไม่วนซ้ำนี้ตลอดไปหากอินพุตไม่อยู่ในรายการ? ถ้าเป็นเช่นนั้นจะถือว่าเป็นเท็จหรือไม่
Enrico Borba

@EnricoBorba Neim รู้ว่าองค์ประกอบที่ n ในรายการที่ไม่มีที่สิ้นสุดนี้จะเท่ากับหรือน้อยกว่าองค์ประกอบที่ +1 ในรายการเสมอ ดังนั้นมันสามารถจับตัวเองและมันจะไม่ทำงานตลอดไป คุณลองโปรแกรมแล้วหรือยัง : P
Okx

18

JavaScript (ES6), 34 ไบต์

f=(n,x=0,y=1)=>x<n?f(n,y,x+y):x==n

สร้างลำดับ Fibonacci ซ้ำ ๆ จนกระทั่งพบรายการที่มากกว่าหรือเท่ากับอินพุตจากนั้นส่งคืนรายการ == อินพุต


หมายเหตุ: การคำนวณแบบซ้ำ ๆ ของลำดับ Fibonacci คือ O (Fib (n)) - ประมาณ O (1.6 ^ n)
Alnitak

f = n => n? n> 2? f (n-1) + f (n-2): 1: 0 28bytes
jackkav

@jackkav ขอบคุณ แต่ความท้าทายคือการตรวจสอบว่าการป้อนข้อมูลเป็นจำนวนฟีโบนักชี
ETHproductions

12

เรติน่า 23 ไบต์

^$|^(^1|(?>\2?)(\1))*1$

ลองออนไลน์!

ป้อนข้อมูลในเอก, เอาท์พุทหรือ01

คำอธิบาย

ลำดับฟีโบนักชีเป็นตัวเลือกที่ดีสำหรับวิธีแก้ปัญหาที่มีการอ้างอิงไปข้างหน้านั่นคือ "การอ้างอิงย้อนกลับ" ที่อ้างอิงถึงกลุ่มที่อยู่โดยรอบหรือที่ปรากฏในภายหลังใน regex (ในกรณีนี้เราใช้ทั้งคู่) เมื่อจับคู่ตัวเลขเช่นนี้เราต้องหานิพจน์แบบเรียกซ้ำสำหรับความแตกต่างระหว่างองค์ประกอบลำดับ เช่นเพื่อจับคู่ตัวเลขสามเหลี่ยมเรามักจะจับคู่เซ็กเมนต์ก่อนหน้าบวกหนึ่งส่วน เพื่อให้ตรงกับหมายเลขสแควร์ (ซึ่งความแตกต่างคือเลขคี่) เราจับคู่เซ็กเมนต์ก่อนหน้าบวกสอง

เนื่องจากเราได้รับหมายเลขฟีโบนักชีโดยการเพิ่มองค์ประกอบที่สองไปยังส่วนสุดท้ายไปยังส่วนสุดท้ายความแตกต่างระหว่างพวกเขาก็เป็นเพียงตัวเลขฟีโบนักชี ดังนั้นเราต้องจับคู่แต่ละเซกเมนต์เป็นผลรวมของสองภาคก่อน หลักของ regex คือ:

(         # This is group 1 which is repeated 0 or more times. On each
          # iteration it matches one Fibonacci number.
  ^1      # On the first iteration, we simply match 1 as the base case.
|         # Afterwards, the ^ can no longer match so the second alternative
          # is used.
  (?>\2?) # If possible, match group 2. This ends up being the Fibonacci
          # number before the last. The reason we need to make this optional
          # is that this group isn't defined yet on the second iteration.
          # The reason we wrap it in an atomic group is to prevent backtracking:
          # if group 2 exists, we *have* to include it in the match, otherwise
          # we would allow smaller increments.
  (\1)    # Finally, match the previous Fibonacci number and store it in
          # group 2 so that it becomes the second-to-last Fibonacci number
          # in the next iteration.
)*

ตอนนี้จบลงด้วยการเพิ่มตัวเลข Fibonacci เริ่มต้นที่1คือ1, 1, 2, 3, 5, ... ผู้ที่เพิ่มขึ้นถึง1, 2, 4, 7, 12, ... นั่นคือพวกเขาเป็นหนึ่งในจำนวนที่น้อยกว่าจำนวนฟีโบนักชีดังนั้นเราจึงเพิ่ม a 1ในตอนท้าย กรณีเดียวที่ไม่ครอบคลุมคือศูนย์ดังนั้นเราจึงมี^$ทางเลือกในตอนต้นที่จะครอบคลุม


2
สง่างามมาก! ฉันแค่อยากจะชี้ให้เห็นเพื่อประโยชน์ของความสมบูรณ์ที่สามารถสั้นลงถึง 20 ไบต์ใน PCRE โดยใช้ปริมาณที่เป็นเจ้าของ:^$|^(^1|\2?+(\1))*1$
Deadcode

1
@Deadcode ฉันทำพลาดเหล่านั้นเป็นจำนวนมากใน .NET;)
มาร์ตินเอนเดอร์

บันทึก 1 ^ไบต์โดยการเอาที่สองที่ไม่จำเป็น
Neil

12

Regex (ECMAScript รส), 392 358 328 224 206 165 ไบต์

เทคนิคที่จำเป็นในการเล่นเพื่อจับคู่หมายเลข Fibonacci กับ ECMAScript regex (ในภาษาเดียว) เป็นหนทางไกลจากวิธีที่ทำได้ดีที่สุดในรสชาติ Regex อื่น ๆ การขาดการตอบโต้กลับ / ซ้อนซ้ำหรือการเรียกซ้ำหมายความว่ามันเป็นไปไม่ได้ที่จะนับหรือเก็บผลรวมของการทำงานใด ๆ โดยตรง การขาดการมองดูทำให้บ่อยครั้งเป็นสิ่งที่ท้าทายแม้จะมีพื้นที่เพียงพอที่จะทำงาน

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

ในเดือนมีนาคม 2014 นี่คือสิ่งที่เกิดขึ้นสำหรับหมายเลขฟีโบนักชี เมื่อมองไปที่หน้าวิกิพีเดียในตอนแรกฉันไม่สามารถหาวิธีได้แม้ว่าจะมีทรัพย์สินหนึ่งที่ดูเหมือนจะยั่วเย้า จากนั้นนักคณิตศาสตร์teukon ได้สรุปวิธีการที่ทำให้เห็นได้ชัดว่ามันเป็นไปได้ที่จะทำโดยใช้คุณสมบัตินั้นพร้อมกับอีกอันหนึ่ง เขาลังเลที่จะสร้าง regex ปฏิกิริยาของเขาเมื่อฉันไปข้างหน้าและทำมัน:

คุณบ้า! ... ฉันคิดว่าคุณอาจทำสิ่งนี้

เช่นเดียวกับ ECMAScript unary math regex อื่น ๆ ของฉันโพสต์ฉันจะให้คำเตือน:ฉันขอแนะนำให้เรียนรู้วิธีการแก้ปัญหาทางคณิตศาสตร์ unary ใน ECMAScript regex มันเป็นการเดินทางที่น่าสนใจสำหรับฉันและฉันไม่ต้องการที่จะทำลายมันสำหรับใครก็ตามที่อาจต้องการลองด้วยตัวเองโดยเฉพาะผู้ที่มีความสนใจในทฤษฎีจำนวน ดูโพสต์นั้นสำหรับรายการของปัญหาแนะนำที่ติดแท็กสปอยเลอร์อย่างต่อเนื่องเพื่อแก้ปัญหาทีละคน

ดังนั้นไม่ได้อ่านเพิ่มเติมใด ๆ ถ้าคุณไม่ต้องการบางมายากล regex เอกมากมายสำหรับคุณ หากคุณต้องการถ่ายภาพเพื่อหาเวทมนตร์นี้ด้วยตัวเองฉันขอแนะนำให้เริ่มต้นด้วยการแก้ปัญหาบางอย่างใน ECMAScript regex ดังที่ระบุไว้ในโพสต์ที่ลิงก์ด้านบน

ความท้าทายที่ผมเริ่มประสบจำนวนเต็มบวกx เป็นจำนวนฟีโบนักชีถ้าและเพียง 5x ถ้า2 + 4 และ / หรือ 5x 2 - 4 เป็นตารางที่สมบูรณ์ แต่ไม่มีที่ว่างให้คำนวณใน regex พื้นที่เดียวที่เราต้องทำงานคือจำนวนตัวเอง เราไม่มีที่ว่างพอที่จะคูณด้วย 5 หรือใช้สี่เหลี่ยมจัตุรัสทั้งคู่

แนวคิดของ teukon เกี่ยวกับวิธีแก้ไข ( โพสต์ดั้งเดิมที่นี่ ):

regex แสดงด้วยสตริงของฟอร์ม^x*$ให้ z เป็นความยาว ตรวจสอบว่า z เป็นหนึ่งในไม่กี่หมายเลขแรกของฟีโบนัชชีด้วยมือ (มากถึง 21 ควรทำ) ถ้าไม่ใช่:

  1. อ่านตัวเลขสองสามตัว a <b เช่นว่า b ไม่มากกว่า 2a
  2. ใช้ไปข้างหน้ามอง Aheads ที่จะสร้าง2 , AB และข2
  3. ยืนยันว่า 5a 2 + 4 หรือ 5a 2 - 4 เป็นสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ (ดังนั้นต้องเป็น F n-1สำหรับบาง n)
  4. ยืนยันว่า 5b 2 + 4 หรือ 5b 2 + 4 เป็นสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ (ดังนั้น b ต้องเป็น F n )
  5. ตรวจสอบว่า z = F 2n + 3หรือ z = F 2n + 4โดยใช้2 , ab, และ b 2 ที่สร้างไว้ก่อนหน้าและตัวตน:
    • F 2n-1 = F n 2 + F n-1 2
    • F 2n = (2F n-1 + F n ) F n
ในช่วงสั้น ๆ : อัตลักษณ์เหล่านี้ช่วยให้เราสามารถลดปัญหาของการตรวจสอบว่าเป็นจำนวนที่กำหนดจะ Fibonacci เพื่อการตรวจสอบว่าคู่ของมากขนาดเล็กจำนวนมากมีฟีโบนักชี พีชคณิตเล็กน้อยจะแสดงให้เห็นว่าถ้ามีขนาดใหญ่พอที่ n (n = 3 ควรทำ), F 2n + 3 > F n + 5F n 2 + 4 ดังนั้นจึงควรมีที่ว่างเพียงพอ

และนี่คือการจำลองของอัลกอริทึมใน Cซึ่งฉันเขียนเป็นแบบทดสอบก่อนที่จะนำไปใช้ใน regex

ดังนั้นโดยไม่มีความกังวลใจต่อไปนี่คือ regex:

^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$

ลองออนไลน์!

และเวอร์ชั่นที่พิมพ์สวยและมีความคิดเห็น:

^(
  (?=
    (x*)                   # \2+1 = potential number for which 5*(\2+1)^2 ± 4
                           # is a perfect square; this is true iff \2+1 is a Fibonacci
                           # number. Outside the surrounding lookahead block, \2+1 is
                           # guaranteed to be the largest number for which this is true
                           # such that \2 + 5*(\2+1)^2 + 4 fits into the main number.
    .*
    (?=                    # tail = (\2+1) * (\2+1) * 5 + 4
      x{4}
      (                    # \3 = (\2+1) * 5
        x{5}
        (\2{5})            # \4 = \2 * 5
      )
      (?=\3*$)
      \4+$
    )
    (|x{4})                # \5 = parity - determined by whether the index of Fibonacci
                           #               number \2+1 is odd or even
    (?=xx (x*)(\6 x?))     # \6 = arithmetic mean of (\2+1) * (\2+1) * 5 and \8 * \8,
                           #      divided by 2
                           # \7 = the other half, including remainder
    \5
    # require that the current tail is a perfect square
    (x(x*))                # \8 = potential square root, which will be the square root
                           #      outside the surrounding lookahead; \9 = \8-1
    (?=(\8*)\9+$)          # \10 = must be zero for \8 to be a valid square root
    (?=\8*$\10)
    \8*
    (?=(x\2\9+$))          # \11 = result of multiplying \8 * (\2+1), where \8 is larger
    (x*)\12                # \12 = \11 / 2; the remainder will always be the same as it
                           #       is in \7, because \8 is odd iff \2+1 is odd
  )
  \7\11
  (
    \6\11
  |
    \12
  )
|
  x{0,3}|x{5}|x{8}|x{21}   # The Fibonacci numbers 0, 1, 2, 3, 5, 8, 21 cannot be handled
                           # by our main algorithm, so match them here; note, as it so
                           # happens the main algorithm does match 13, so that doesn't
                           # need to be handled here.
)$

ขั้นตอนวิธีการคูณไม่ได้อธิบายในความคิดเห็นเหล่านั้น แต่จะมีการอธิบายสั้น ๆ ในวรรคของฉันตัวเลขมากมายโพสต์ regex

ฉันรักษา Fibonacci regex หกรุ่น: สี่วงล้อนั้นจากความยาวสั้นที่สุดไปจนถึงความเร็วที่เร็วที่สุดและใช้อัลกอริทึมที่อธิบายข้างต้นและอีกสองรุ่นที่ใช้อัลกอริทึมที่แตกต่างกันเร็วกว่า แต่ยาวกว่ามาก ดัชนี Fibonacci เป็นการจับคู่ (อธิบายว่าอัลกอริทึมที่นี่อยู่นอกเหนือขอบเขตของโพสต์นี้ แต่มันอธิบายไว้ในสรุปสาระสำคัญเดิม ) ฉันไม่คิดว่าฉันจะรักษา regex รุ่นที่คล้ายกันจำนวนมากอีกครั้งเพราะในขณะที่ฉันทำการทดสอบทั้งหมดใน PCRE และ Perl แต่เครื่องมือ regex ของฉัน เร็วพอที่ความกังวลเรื่องความเร็วจะไม่สำคัญอีกต่อไป (และถ้าสิ่งก่อสร้างเฉพาะทำให้คอขวดฉันสามารถเพิ่มการเพิ่มประสิทธิภาพสำหรับมัน) - แม้ว่าฉันอาจจะคงรุ่นที่เร็วที่สุดหนึ่งและอีกหนึ่งรุ่นที่สั้นที่สุดถ้าความแตกต่าง ความเร็วมีขนาดใหญ่พอ

"คืนค่าดัชนี Fibonacci ลบด้วย 1 ในรูปแบบการแข่งขัน" (ไม่ได้ตีกอล์ฟมาก):

ลองออนไลน์!

ทุกรุ่นอยู่ใน GitHub ที่มีประวัติความเป็นมาเต็มรูปแบบของการเพิ่มประสิทธิภาพกอล์ฟ:

regex สำหรับการจับคู่หมายเลข Fibonacci - สั้น, เร็ว 0.txt (สั้นที่สุด แต่ช้าที่สุด, ในกระทู้นี้)
regex สำหรับการจับคู่หมายเลข Fibonacci - สั้น, ความเร็ว 1.txt
regex สำหรับการจับคู่หมายเลข Fibonacci - สั้น, ความเร็ว 2.txt
regex สำหรับ การจับคู่หมายเลขฟีโบนักชี - สั้น, ความเร็ว 3.txt
regex สำหรับการจับคู่หมายเลขฟีโบนักชี - เร็วที่สุด. เร็กซ์
regex สำหรับการจับคู่หมายเลขฟีโบนักชี - return index.txt


9

Python 3 , 48 ไบต์

lambda n:0in((5*n*n+4)**.5%1,abs(5*n*n-4)**.5%1)

ลองออนไลน์!


1
การเป็นงูหลามไม่ควรให้ทรัพยากรมากพอสำหรับอินพุตที่มีขนาดใหญ่หรือไม่
Jonathan Allan

2
ฉันมักจะรู้สึกว่าเราสามารถใช้อัลกอริธึมที่เราต้องการตราบเท่าที่มันใช้งานได้จริงหากการคำนวณนั้นเหมาะกับประเภทข้อมูลและในทางทฤษฎีที่ให้ความแม่นยำอย่างไม่มีที่สิ้นสุด แน่นอนว่าการใช้intจะตั้งค่าแถบที่สูงกว่า (ยังไม่ใหญ่มาก) แต่เราไม่บังคับให้คำตอบ C ใช้จำนวนเต็ม 64- บิต (หรือ 128- บิตกับ gcc) ไม่ว่าในกรณีใดการอนุญาตให้ใช้อัลกอริธึมเดียวกันในภาษาหนึ่ง แต่ไม่ปรากฏว่าไร้สาระ
Dennis

มุมมองอัลกอริทึมนั้นสมเหตุสมผล (ฉันคิดเสมอว่าเป็นโดเมนอินพุตที่กำหนดเกณฑ์ "พอดีกับชนิดข้อมูล") สิ่งเดียวที่ต้องระวังคือพื้นที่สีเทาระหว่างความคิดของอัลกอริธึมและการนำไปใช้ ที่นี่หนึ่งสามารถตรวจสอบว่าหนึ่งในจำนวนเต็มเป็นตารางโดยไม่ต้องหล่อลอย ฉันเดาว่านักแสดงภายในเป็นผลข้างเคียงเป็นที่ยอมรับได้ตราบใดที่มันเป็นส่วนหนึ่งของอัลกอริทึมที่ถูกต้องและใช้งานได้ (... และฉันค่อนข้างแน่ใจว่าอัลกอริทึมที่อาศัยนักแสดงนั้นจะไม่เป็นที่ยอมรับ)
Jonathan Allan

@JanathanAllan เนื่องจากค่าสูงสุดในการจัดการคือ 1e9 ฉันไม่คิดว่าอินพุตที่มีขนาดใหญ่ตามอำเภอใจจะเป็นปัญหา
JAD

1
@JarkoDubbeldam ใช่แล้วรายละเอียดนั้นเปลี่ยนไปหลังจากที่ความคิดเห็นของฉันถูกสร้างขึ้นมา
Jonathan Allan

7

Python 2, 48 44 ไบต์

f=lambda n,a=0,b=1:n>a and f(n,b,a+b)or n==a

ลองออนไลน์

ขอบคุณ Jonathan Allan สำหรับการบันทึก 4 ไบต์


นี่อาจเป็น 47 ไบต์หากค่าความจริงสามารถเป็นFalseค่าเท็จได้True: TIO!
นาย Xcoder

สามารถใช้n-aแทนn==aและมี -1 และ 0 เป็นค่าส่งคืนของคุณ
Magic Octopus Urn

@carusocomputing ฉันได้ว่าในประวัติการแก้ไขของฉัน แต่มันไม่ทำงานเพราะสำหรับค่าทดสอบใหญ่คุณอาจมี-101หรือบางส่วนผลอื่น ๆ -1แทน
mbomb007

@ Mr.Xcoder คุณคิดว่าการประหยัด 1 ไบต์นั้นคุ้มค่ากับการมีสติของทุกคนหรือไม่
frarugi87

1
@ frarugi87 การบันทึกไบต์มีค่าอยู่เสมอ
Mr. Xcoder

7

05AB1E , 8 7 ไบต์

>ÅF¹å¹m

คำอธิบาย:

>ÅF       # Generate Fibbonacci numbers up to n+1
   ¹å     # 0 if original isn't in the list, 1 if it is
     ¹m   # 0**0 = 1 if input was 0 (hotfix for 0).
          # or 0**n if not fibb / 1**n if it is a fibb.

ลองออนไลน์!

-1 ขอบคุณ Jonathan Allan สำหรับวิธีแก้ปัญหา 0-a-fibonacci-number


ที่จริงแล้วจะไม่อัปเดตเป็น 6 ไบต์ ไม่อยากเชื่อเลยว่าจะไม่มีวิธีต่อท้าย 0 กับรายการในขนาดไม่เกิน 3 ไบต์
Magic Octopus Urn

@Janathan ทุกคน "ฟังก์ชัน fibbonacci" ใน 05AB1E ไม่มี 0
Magic Octopus Urn

@JanathanAllan ฉันเข้าใจแล้วความคิดที่ดี ใช้เวลาสักครู่เพื่อหาว่าเกิดอะไรขึ้นที่นั่นจริง ๆ
Magic Octopus Urn

มันไม่เพียงพอที่จะสร้างเกินn(บันทึกไบต์) ตามที่ÅFรวมและ¹åจะส่งผลใน0ทางใดทางหนึ่งn=0หรือไม่
Emigna

0AF = [] 1AF = [1,1] เห็นได้ชัดว่าไม่ใช่
Magic Octopus Urn


5

อย่างจริงจัง 3 ไบต์

,fu

ลองออนไลน์!

ส่งคืนดัชนี +1 ในรายการหมายเลข Fibonacci ถ้าเป็นจริงมิฉะนั้นจะส่งกลับค่าเท็จ

คำอธิบาย:

,fu
,   read input
 f  0-indexed index of that number in the fibonacci sequence (-1 if not in the sequence)
  u increment. (Makes the -1 value falsy and the 0-value truthy)

9
หยาบคายอย่างจริงจัง ^^
Jonathan Allan

5

เยลลี่ ,  8 7  6 ไบต์

-r‘ÆḞċ

ลองออนไลน์!

อย่างไร?

-r‘ÆḞċ - Link: non negative number, n
-      - literal -1      = -1
 r     - inclusive range = [-1,0,1,2,3,4,5,...,n]
  ‘    - increment n     = [ 0,1,2,3,4,5,6,...,n+1]
   ÆḞ  - Fibonacci       = [ 0,1,1,2,3,5,8,...,fib(n+1)]
     ċ - count occurrences of n (1 if n is a Fibonacci number, 0 otherwise)

หมายเหตุ:

  • ที่เพิ่มขึ้น, เป็นสิ่งจำเป็นเพื่อให้การทำงานนี้สำหรับ2และ3เนื่องจากพวกเขาเป็น3 RDและ4 THตัวเลข Fibonacci - เกิน3หมายเลข Fibonacci มากกว่าดัชนีของพวกเขา
  • -เป็นสิ่งจำเป็น (มากกว่าแค่‘R) เพื่อให้งานนี้สำหรับ0ตั้งแต่0เป็น0 THตัวเลข Fibonacci;

อืมดูเหมือนคำตอบของฉันมากเกินไป ...
Erik the Outgolfer

โอ้ฉันตีกอล์ฟของฉันลงไปที่ตัวคุณยกเว้นงานของฉันสำหรับ3:)
Jonathan Jonathan Allan

โอ้โห…ฟีโบนักชีแปลกมาก (btw ลบคำตอบของฉันแล้วถ้าคุณพูดอย่างนั้น)
Erik the Outgolfer

คุณแน่ใจเกี่ยวกับบันทึกย่อสุดท้ายใช่ไหม เมื่อฉันเรียกใช้ Fibonacci atom ในรายการที่เริ่มต้นจาก 0, 0 จะรวมอยู่ในผลลัพธ์
กระจาย

1
ดูเหมือนจะไม่เกี่ยวข้องกันตามถ้อยคำของความท้าทาย แต่ถ้าคุณใช้จำนวนอะตอมด้วย 1 เป็นอาร์กิวเมนต์ของคุณในรายการหมายเลขฟีโบนักชีผลลัพธ์คือ 2 (ไม่ใช่ 1)
FryAmTheEggman

5

ZX81 พื้นฐาน180 151 100 ~ 94 โทเค็นพื้นฐานไบต์

ด้วยความขอบคุณ Moggy บนฟอรัม SinclairZXWorld นี่เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพมากที่ช่วยประหยัดไบต์ได้มากขึ้น

 1 INPUT I
 2 FOR F=NOT PI TO VAL "1E9"
 3 LET R=INT (VAL ".5"+(((SQR VAL "5"+SGN PI)/VAL "2")**I)/SQR VAL "5")
 4 IF R>=I THEN PRINT F=R
 5 IF R<I THEN NEXT F

สิ่งนี้จะแสดงผล 1 หากป้อนหมายเลขฟีโบนักชีหรือเป็นศูนย์ถ้าไม่ แม้ว่าสิ่งนี้จะช่วยประหยัดไบต์ แต่มันก็ช้ากว่าโซลูชั่นเก่าด้านล่าง สำหรับความเร็ว (แต่มากกว่า BASIC ไบต์) ให้เอาส่วนที่VALล้อมรอบหมายเลขตัวอักษรของสตริง นี่คือโซลูชันเก่า ๆ ที่มีคำอธิบายบางอย่าง:

 1 INPUT A$
 2 LET A=SGN PI
 3 LET B=A
 4 LET F=VAL A$
 5 IF F>SGN PI THEN FOR I=NOT PI TO VAL "1E9"
 6 LET C=A+B
 7 LET A=B
 8 LET B=C
 9 IF B>=F THEN GOTO CODE "£"
10 IF F THEN NEXT I
12 PRINT STR$(SGN PI*(B=F OR F<=SGN PI)) AND F>=NOT PI;"0" AND F<NOT PI

การแก้ไขข้างต้นช่วยประหยัดไบต์พื้นฐานเพิ่มเติมเพื่อย่อIFข้อความลงPRINTในบรรทัดเดียวใน 12 ไบต์อื่นถูกบันทึกโดยใช้VALคีย์เวิร์ดและและการใช้GOTO CODE "£"ซึ่งในชุดอักขระ ZX81 คือ 12 Strings บันทึกไบต์มากกว่าจำนวนมากเนื่องจากค่าตัวเลขทั้งหมดจะถูกเก็บเป็นลอยดังนั้นจึงใช้พื้นที่มากขึ้นในสแต็ก VAR

enter image description here


ที่จริงแล้วฉันสามารถบันทึกไบต์พื้นฐาน 6 โทเค็นได้อีกโดยลบบรรทัด 6 ทั้งหมดและเปลี่ยนบรรทัด 5 เป็น5 IF R<F THEN NEXT I- แย่ของฉัน!
Shaun Bebbers

4

C #, 109 ไบต์

bool f(int n){int[]i=new[]{0,1,0};while(i[0]<n||i[1]<n){i[i[2]%2]=i[0]+i[1];i[2]++;}return n==i[0]||n==i[1];}

น่าจะปรับปรุงได้ แต่ฉันไม่มีเวลา


ยินดีต้อนรับสู่ PPCG!
Martin Ender

1
ฉันเขียนคำตอบของฉันเองเท่านั้นที่จะตระหนักว่ามันเหมือนกับของคุณ คุณสามารถใช้แลมบ์ดานิพจน์และตัวแปรอย่างง่ายเพื่อรับสิ่งนี้: n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}(เพียง 80 ไบต์) ลองออนไลน์!
Charlie

1
@CarlosAlejo บันทึกอีก 2 ไบต์บนที่มีa+=bแทนa=a+bและแทนb+=a b=a+b
TheLethalCoder

4

> <> , 21 19 + 3 = 24 22 ไบต์

i1\{=n;
?!\:@+:{:}(

คาดว่าอินพุตจะอยู่ในสแต็กเมื่อเริ่มต้นโปรแกรมดังนั้นจึงมีค่า 3 ไบต์สำหรับ-vแฟล็ก

ลองออนไลน์!

สิ่งนี้ทำงานโดยการสร้างหมายเลขฟีโบนักชีจนกว่าพวกเขาจะมากกว่าหรือเท่ากับหมายเลขอินพุทจากนั้นตรวจสอบหมายเลขที่สร้างล่าสุดเพื่อความเท่าเทียมกับอินพุท ผล1ถ้ามันเป็นจำนวนฟีโบนักชีเป็น0อย่างอื่น

เพื่อให้มั่นใจว่า0มีการจัดการอย่างถูกต้องเป็นเมล็ดพันธุ์-1 1- หมายเลขแรกที่สร้างขึ้นจะมากกว่า01

ขอบคุณ @cole สำหรับการชี้ให้เห็นว่าiสามารถใช้ในการกด-1ลงบนสแต็กเมื่อ STDIN ว่างเปล่า ฉลาดมาก!

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

01-1\{=n;
}(?!\:@+:{:

ตอนนี้ฉันรู้สึกงี่เง่าที่จะเสียไบต์อย่างต่อเนื่องตรวจสอบหมายเลขที่สร้างขึ้นแต่ละหมายเลขตามทาง ทำได้ดีมาก!
Emigna

1
22 ไบต์ใช้แทนi 01-
โคล

@cole ของหลักสูตรที่ใช้iเป็น-1เมื่อมีการป้อนข้อมูลเพื่อ STDIN ไม่มีผมไม่ได้พิจารณาแล้วเห็นว่า ทำได้ดีมาก!
Sok

3

Mathematica ขนาด 37 ไบต์

!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&

-4 ไบต์จาก @ngenisis


Fibonacci[0]ให้0ดังนั้นคุณสามารถบันทึก4ไบต์โดยรวม0อยู่ในTableช่วง คุณสามารถบันทึกไบต์อื่นได้โดยใช้สัญลักษณ์มัดสำหรับTable:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
ngenisis

3

MATL (16 ไบต์)

2^5*4-t8+hX^tk=s

ลองออนไลน์!

ไม่ใช่วิธีที่ง่ายที่สุด แต่ต้องการใช้วิธีตรวจสอบโดยตรงว่า "5 * x ^ 2 +/- 4" เป็นตารางที่สมบูรณ์แบบหรือไม่

คำอธิบาย:

2^5*    % 5 times the input squared
4-      % push the above minus 4
t8+     % push the above plus 8 (+4 overall)
hX^     % concatenate them into an array and then take the sqrt().
tk      % push a copy of the array that is rounded using floor().
=       % test if the sqrt's were already integers
s       % sum the results, returns 0 if neither was a perfect square.

บันทึก:

ในกรณี "0" จะส่งคืน "2" เนื่องจากทั้ง 4 และ -4 เป็นสี่เหลี่ยมที่สมบูรณ์แบบเช่นเดียวกับ 1 ซึ่งสร้าง "1 1" พิจารณาเอาท์พุทที่ไม่ใช่ศูนย์ใด ๆ เป็น "ความจริง" และ 0 เป็น "เท็จ"



3

PHP , 44 ไบต์

for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;

ลองออนไลน์!

PHP , 58 ไบต์

for($x=0,$y=1;$x<$argn;$x=$y,$y=$t)$t=$x+$y;echo$x==$argn;

ลองออนไลน์!


2
ตีกอล์ฟมากขึ้น: for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;.
user63956

@ user63956 ขอบคุณสำหรับความพยายามในการเรียนรู้ด้วยการมอบหมายตัวแปรการผูกมัด
JörgHülsermann

3

Java, 72 69 68 63 59 55 50 49 ไบต์

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

ทดสอบด้วยตัวเอง!

ทางเลือก (ยัง 49 ไบต์)

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

ไม่ใช่ของแท้มาก: มันเป็นเวอร์ชั่นซ้ำและธรรมดา

ใช้ได้กับตัวเลขสูงสุด 1,836,311,903 (รวมฟีโบนักชีหมายเลข 47) เหนือสิ่งนั้นผลลัพธ์ไม่ได้ถูกกำหนด (รวมถึงการวนซ้ำไม่สิ้นสุด)

ขอบคุณ Kevin Cruijssen และ David Conrad ที่ช่วยเล่นกอล์ฟ :)


1
วิธีการที่ดี Btw คุณสามารถกอล์ฟไบต์โดยการเปลี่ยนไปn==0 n<1ในคำถามนั้นระบุว่า " จำนวนเต็มไม่เป็นลบระหว่าง 0 ถึง 1,000,000,000 "
Kevin Cruijssen

1
@KevinCruijssen ฉันเล่นกอล์ฟไม่ได้ 1 แต่ 5 ไบต์ด้วยประโยคนั้น :-P ขอบคุณฉันไม่ได้สังเกต
Olivier Grégoire

2
คุณไม่ต้องการตัวแปรชั่วคราวสำหรับลำดับฟีโบนักชี คุณสามารถคำนวณคู่ที่ต่อเนื่องได้ด้วยb+=a;a=b-a;
David Conrad

1
คุณกำลังทำเวทย์มนตร์ดำ @DavidConrad! ฉันกำลังบอกคุณ! มนต์ดำ! :)
Olivier Grégoire

3

C # (. NET Core) 51 ไบต์

bool f(int n,int a=0,int b=1)=>a<n?f(n,b,a+b):a==n;

ลองออนไลน์!

-6 ไบต์ขอบคุณ @Oliver!

วิธีนี้ใช้ฟังก์ชั่นการเรียกซ้ำที่ค่อนข้างตรงไปตรงมา

  • ตัวแปรnคือจำนวนที่จะทดสอบ
  • ตัวแปรaและbเป็น 2 หมายเลขล่าสุดในลำดับ
  • ตรวจสอบว่าตัวเลขล่าสุดสองตัวแรกน้อยกว่าอินพุทหรือไม่ เมื่อเป็นกรณีนี้การโทรซ้ำจะโทรไปยังหมายเลขถัดไปในซีรีส์
  • มิฉะนั้นตรวจสอบว่าหมายเลขแรกเท่ากับอินพุตและส่งกลับผลลัพธ์

ลิงค์ TIO แสดงให้เห็นถึงการทำงานนี้สำหรับ 1134903170 ซึ่งเกินค่าสูงสุดที่ท้าทาย


มันเป็นเรื่องดีที่จะเห็นการแก้ปัญหา C # เมื่อเร็ว ๆ นี้ :) - ฉันคิดว่าคุณก็สามารถตรวจสอบว่าa<nสำหรับ51 ไบต์
โอลิเวอร์

ขอบคุณ! และคำแนะนำที่ดี :)
dana

3

Alchemist , 205 134 ไบต์

ขอขอบคุณASCII- เพียงอย่างเดียวสำหรับการผสานสถานะที่ค่อนข้างฉลาดประหยัด 71 ไบต์ !!

_->In_x+c+u
u+b->u+a+d
u+0b->v
v+c->v+b+d
v+0c->w
w+a+x->w+y
w+0a+0x->Out_"1"
w+a+0x->Out_"0"
w+0a+x+y->w+2x
w+0a+0y+d->w+c
w+0d+0a->u

ลองออนไลน์หรือตรวจสอบในชุด!

Ungolfed

# read input, initialize (c = 1)
_ -> In_x + c + s0

# a,d <- b
s0 +  b -> s0 + a + d
s0 + 0b -> s1

# b,d <- c
s1 +  c -> s1 + b + d
s1 + 0c -> s2

s2 +  a +  x -> s2 + y            # y <- min(a,x)
s2 + 0a + 0x -> Out_"1"           # if (a == x): was Fibonacci
s2 +  a + 0x -> Out_"0"           # if (a >  x): stop (we exceeded target)
s2 + 0a +  x +  y -> s2 + 2x      # if (a <  x): x += a (since y = a) / restore x
s2 + 0a      + 0y +  d -> s2 + c  # once that's done; c <- d
s2 + 0a           + 0d->s0        # and finally loop


139 . คุณสามารถลบการ0ตรวจสอบบางอย่างสำหรับไบต์น้อยลงที่ค่าใช้จ่ายของ nondeterminism
ASCII เท่านั้น


@ ASCII เท่านั้น: มันค่อนข้างดี! ล้มเหลวสำหรับ 0 แต่ แต่ไม่ได้เพิ่มb-atom ในการเริ่มต้นแก้ไขมัน (และช่วยประหยัด 2 bytes): D ขอบคุณ
ბიმო

2

เยลลี่ 5 ไบต์

ȷḶÆḞi

ลองออนไลน์!

ส่งคืนค่า 0 สำหรับหมายเลขที่ไม่ใช่แบบฟีโบนักชีและตำแหน่งแบบดัชนี 1 ตำแหน่งของหมายเลขในลำดับฟีโบนักชีสำหรับหมายเลขฟีโบนักชี

คำอธิบาย:

ȷḶÆḞi
ȷ        The literal number 1000
 Ḷ       Range [0,1,...,999]
  ÆḞ     Get the ith Fib number; vectorizes [1,1,2,3,5,...,<1000th Fib number>]
    i    Get the first index of element in list, or 0 if not found

ใช้งานไม่ได้สำหรับ 0.
Okx

@ComradeSparklePony คุณแน่ใจหรือไม่ ที่เหมาะกับฉัน
กระจาย

1
ไม่ทำงานสำหรับ 0 หรืออะไรใหญ่กว่า 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875.
เอริก Outgolfer

1
@ Mr.Xcoder ฉันทามติทั่วไปคือคุณต้องสามารถจัดการสิ่งที่ประเภทข้อมูลทางธรรมชาติของคุณสนับสนุนและเจลลี่สนับสนุนจำนวนเต็มความแม่นยำโดยพลการ
Erik the Outgolfer

1
ยังคงไม่ได้ทำงานให้อะไรมากกว่า 26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626.
เอริก Outgolfer


2

R, 43 40 ไบต์

pryr::f(x%in%DescTools::Fibonacci(0:45))  

pryr::f สร้างฟังก์ชั่น:

function (x) 
x %in% DescTools::Fibonacci(0:45)

ใช้DescTools::Fibonacciในการสร้างครั้งแรกx+1หมายเลข fibonacciและตรวจสอบการรวม x+1เพราะ Fibnum ที่สามคือ 2 และนั่นก็ไม่เพียงพอที่จะตรวจสอบการรวม 3

เดชะบุญ Desctools::Fibonacci(0)=0ที่เป็น freebee ที่ดี

-3 ไบต์ขอบคุณ MickyT


-1:x+1จะช่วยให้คุณประหยัดไบต์ แต่0:45จะช่วยให้คุณสามและครอบคลุมช่วงที่ต้องการ
MickyT

@MickyT โอ้ฉันต้องมองข้ามข้อกำหนดช่วงที่ต้องการ ขอบคุณ :)
JAD

วิธีทางเลือกเพียง 36 pryr::f(any(!(5*n^2+c(-4,4))^.5%%1))ไบต์:
rturnbull

ผมได้รับมันลงไป 32 ไบต์ดูที่นี่
rturnbull

ฉันไม่คุ้นเคยกับกฎของการตีกอล์ฟ ฉันสามารถเขียนรหัส R โดยพลการลงในแพ็คเกจติดตั้งและเรียกใช้ในลักษณะเดียวกับที่คุณเรียกใช้ฟังก์ชันpryrได้
mb7744

2

Haskell , 31 ไบต์

f=0:scanl(+)1f
(`elem`take 45f)

ลองออนไลน์! วิธีนี้ใช้ประโยชน์จากความจริงที่ว่าอินพุตจะอยู่ในช่วงตั้งแต่ 0 ถึง 1,000,000,000 ดังนั้นเราต้องตรวจสอบเฉพาะหมายเลข 45 ฟีโบนักชีเท่านั้น f=0:scanl(+)1fสร้างรายการที่ไม่มีที่สิ้นสุดของหมายเลขฟีโบนักชีtake 45fเป็นรายการหมายเลขฟีโบนักชี 45 รายการแรกและelemตรวจสอบว่าอินพุตอยู่ในรายการนี้หรือไม่


รุ่นที่ไม่ จำกัด : 36 ไบต์

f=0:scanl(+)1f
g n=n`elem`take(n+3)f

ลองออนไลน์! สำหรับการใด ๆnที่เกิดครั้งแรกn+3ตัวเลข Fibonacci จะรับประกันได้ว่าnจะอยู่ในรายการนี้หากเป็นหมายเลขฟีโบนักชี

โปรดทราบว่าวิธีการนี้ไม่มีประสิทธิภาพอย่างเหลือเชื่อสำหรับตัวเลขที่สูงซึ่งไม่ใช่ตัวเลขฟีโบนักชีเพราะn+3ต้องคำนวณจำนวนฟีโบนัชชีทั้งหมด


2

Javascript (ES6 ที่ไม่มีตัวดำเนินการ **), 44 ไบต์

f=(x,c=x*(Math.sqrt(5)-1)/2%1)=>x*(c-c*c)<.5

ขึ้นอยู่กับอัตราส่วนระหว่างตัวเลข Fibonacci ที่ต่อเนื่องที่เข้าหาอัตราส่วนทองคำ ค่าของ c คือส่วนที่เป็นเศษส่วนของอินพุตหารด้วยอัตราส่วนทองคำ - ถ้าอินพุตคือฟีโบนักชีนี่จะใกล้เคียงกับ 1 มากและค่าของ c-c²จะเล็กมาก

ไม่สั้นเท่ากับคำตอบของ JS อื่น ๆ แต่จะทำงานในเวลา O (1)


คุณแน่ใจเหรอ
user259412

ใช้งานไม่ได้กับหมายเลข fibonacchi 16558014
Black Owl Kai

2

Julia 0.4 , 29 ไบต์

!m=in(0,sqrt(5*m*m+[4,-4])%1)

ลองออนไลน์!


หากนี่ไม่ใช่วิธีที่คุณจะตอบ Julia ได้โปรดแจ้งให้เราทราบ ฉันไม่แน่ใจว่าอินพุตทำงานอย่างไรบน TIO


1
คุณจะต้องทำให้มันเป็นฟังก์ชั่นปกติ (นับ!m=) หรือแลมบ์ดา (นับm->) ที่สำคัญกว่านี้ล้มเหลวสำหรับ0ตามที่เป็นอยู่
Dennis

2

R, 32 31 ไบต์

รับอินพุตจาก stdin, return TRUEหรือFALSEตามความเหมาะสม

any(!(5*scan()^2+-1:1*4)^.5%%1)

2

เสียงกระเพื่อมสามัญ 61 54 ไบต์

(defun f(x)(do((a 0 b)(b 1(+ a b)))((>= a x)(= a x))))

ลองออนไลน์!

การลดขนาดเมื่อเทียบกับรุ่นก่อนหน้า:

(defun f(x)(do((a 0 b)(b 1 c)(c 1(+ b c)))((>= a x)(= a x))))

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



1

JS (ES6), 57 ไบต์

n=>(y=y=>((5*(n**2)+y)**0.5),~~y(4)==y(4)|~~y(-4)==y(-4))

ใช้วิธีการ carusocomputing ของ มากนักกอล์ฟกว่าคำตอบอื่น ๆ ของฉันคำตอบอื่น

Ungolfed

n=>{
    y=y=>((5*(n**2)+y)**0.5);//carusocomputing's method in a function
    return ~~y(4) === y(4) || ~~y(-4) === y(-4);//~~x === Math.floor(x)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.