พิมพ์หมายเลข Fibonacci ที่ n ที่มีหมายเลข Fibonacci ที่ n!


22

ท้าทาย

คุณต้องเขียนโปรแกรมที่รับจำนวนเต็มบวกnเป็นอินพุตและส่งออกnหมายเลขฟีโบนักชี (ตัดให้สั้นลงเหมือน Fib # ตลอด) ที่มีฟิปส์n# เป็นตัวหาร สำหรับวัตถุประสงค์ของการท้าทายนี้, 1ลำดับฟีโบนักชีเริ่มต้นด้วย

นี่คือตัวอย่างบางส่วนที่คุณสามารถใช้เป็นกรณีทดสอบหรือเพื่อเป็นตัวอย่างในการอธิบายความท้าทาย (สำหรับกรณีหลังโปรดแสดงความคิดเห็นลงด้านล่างเพื่ออธิบายสิ่งที่คุณพบว่าไม่ชัดเจน)

n=1
Fib#s: 1
       ^1 1st Fib# that contains a 1 (1st Fib#)
Output: 1

n=2
Fib#s: 1, 1
       ^1 ^2 2nd Fib# that contains a 1 (2nd Fib#)
Output: 1

n=3
Fib#s: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
             ^1              ^2                   ^3 3rd Fib# that contains a 2 (3rd Fib#)
Output: 233

n=4
Output: 233

n=5
Output: 6765

n=6
Output: 28657

n=7
Output: 1304969544928657

n=8
Output: 14472334024676221

n=9
Output: 23416728348467685

n=10
Fib#s: 1, ..., 34, 55, 89, ..., 63245986, 102334155, 165580141, ..., 2880067194370816120, 4660046610375530309
                   ^1                     ^2         ^3                                   ^10 10th Fib# that contains a 55 (10th Fib#)
Output: 4660046610375530309

และเช่นเคยนี่คือดังนั้นควรนับไบต์ที่ต่ำที่สุด

หากสิ่งที่ทำให้สับสน / ไม่ชัดเจนโปรดแสดงความคิดเห็น

(ความท้าทายนี้อ้างอิงจากความท้าทายอื่นที่ฉันโพสต์: พิมพ์ตัวที่ n ที่ประกอบด้วย n )


3
ฉันแนะนำให้รวมn=5testcase เพราะฉันเพิ่งทำผิดพลาดโง่ที่ฉันเขียนเช็คที่นับจำนวนหลายครั้งถ้ามันมี substring มากกว่าหนึ่งครั้ง จะจับว่าเพราะn=5 55
Ørjan Johansen

2
@ อย่างเป็นทางการฉันไม่คิดว่ามันสมเหตุสมผลที่จะคาดหวังจำนวนที่สูงมาก โซลูชันของฉันใช้งานได้กับ TIO มากถึงn=25(ผลลัพธ์มี 1186 หลัก) จากนั้นถูกฆ่าเพราะn=26(3085 หลักรวบรวมในแล็ปท็อปของฉันเอง) ดูเหมือนว่าจะมีปัญหาในการกระโดดเมื่อใดก็ตามที่fib(n)ได้รับหนึ่งหลัก (ตามที่คาดหวัง) การกระโดดครั้งต่อไปวันที่ 31 มี 12990 หลักในผลลัพธ์สุดท้าย
Ørjan Johansen

1
ใช่. ฮ่า ๆ! โซลูชันไพ ธ อนติดอยู่ที่ n> 6 เพราะมีฟังก์ชั่นวนซ้ำซึ่งเรียกว่าวนซ้ำหลายครั้ง : D
เป็นทางการเมื่อ

1
@officialaimm โอ้ถูกต้องการระเบิดแบบเลขชี้กำลังเป็นปัญหาเมื่อกำหนด Fibonacci โดยตรงกับการเรียกซ้ำ แม้ว่าจะไม่มีสิ่งนั้นคุณก็อาจถึงขีด จำกัด การเรียกซ้ำของ Python ค่อนข้างเร็ว
Ørjan Johansen

1
@Shaggy: นั่นคือสิ่งที่ฉันหมายถึงโดยสอดคล้อง: เมื่อ 0 คือหมายเลข Fibonacci 0 แล้ว 1 คือหมายเลขแรก ("1th"?) หมายเลข Fibonacci
ShreevatsaR

คำตอบ:


12

Haskell , 85 84 ไบต์

แก้ไข:

  • -1 ไบต์: Laikoni lสั้นลง
  • คำอธิบายTypo ( x>=sสำหรับx<=s)

fใช้เวลาและผลตอบแทนIntString

l=0:scanl(+)1l
m=show<$>l
f n|x<-m!!n=[y|y<-x:m,or[x<=s|s<-scanr(:)""y,x++":">s]]!!n

ลองออนไลน์!

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

  • lเป็นรายการที่ไม่มีที่สิ้นสุดของตัวเลข Fibonacci 0:1:lกำหนดซ้ำเป็นผลรวมบางส่วนของ มันเริ่มต้นด้วย0เพราะรายการมีการจัดทำดัชนี 0 mเป็นรายการเดียวกันที่ถูกแปลงเป็นสตริง
  • ในf:
    • nคือหมายเลขอินพุตและxเป็นหมายเลข (สตริงของ) nหมายเลขฟีโบนักชี
    • ในรายการความเข้าใจภายนอกyคือหมายเลข Fibonacci ที่ทดสอบว่ามีxสตริงย่อยหรือไม่ การส่งผ่านyถูกรวบรวมในรายการและจัดทำดัชนีพร้อมกับขั้นสุดท้าย!!nเพื่อให้เอาต์พุต ส่วนเสริมxจะถูกเตรียมไว้ให้กับการทดสอบเพื่อบันทึกสองไบต์ไปใช้!!(n-1)ในตอนท้าย
    • เพื่อหลีกเลี่ยงการนับyหลาย ๆ ครั้งการทดสอบของแต่ละรายการyจะถูกห่อorและรายการความเข้าใจอื่น
    • ในความเข้าใจของรายการภายในsiterates yผ่านคำต่อท้ายของ
    • เพื่อทดสอบว่าxเป็นคำนำหน้าของsเราตรวจสอบว่าและx<=s x++":">s( ":"ค่อนข้างโดยพลการ แต่ต้องการมากกว่าตัวเลขใด ๆ )

1
l=0:scanl(+)1lบันทึกเป็นไบต์
Laikoni


4

Python 2 , 99 86 ไบต์

  • Ørjan Johansenบันทึก 7 ไบต์: เริ่มต้นด้วยb=i=x=-1 a=1และวางx and
  • Ørjan Johansenบันทึกอีก 3 ไบต์: f and n==2ถึงf*(n>2)
  • เฟลิปานาร์ดีบาติสตาบันทึก 9 ไบต์: a,b=a+b,aชวเลขแลกเปลี่ยนเศรษฐกิจf-=str(x)in str(a)บีบ(n<2)*f
  • ovsบันทึก 13 ไบต์: การเปลี่ยนจาก python 3 เป็น python 2
f=n=input()
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=`x`in`a`
print a

ลองออนไลน์!

คำอธิบาย:

f=n=int(input())                 # f is number of required numbers

b=i=x=-1                         # i is index(counter) set at -1
                                 # In Two-sided fibonacci, fib(-1) is 1 
                                 # and b(fib before it) i.e. fib(-2) is -1
                                 # Taking advantage of all -1 values, x is 
                                 # also set to -1 so that the `if str(...`
                                 # portion does not execute until x is set a 
                                 # value(i.e. the nth fibonacci) since there 
                                 # is no way -1 will be found in the number 
                                 # (ALL HAIL to Orjan's Genius Idea of using 
                                 # two-sided fibonacci)      

a=1                              # fib(-1) is 1


while(n>2)*f:                    # no need to perform this loop for n=1 and 
                                 # n=2 and must stop when f is 0

 i+=1                            # increment counter

 b,a=a,a+b                       # this might be very familiar (fibonacci 
                                 # thing ;))                         

 x=[x,a][i==n]                   # If we have found (`i==n`) the nth 
                                 # fibonacci set x to it

 f-=`x`in`a`                     # the number with required substring is 
                                 # found, decrease value of f

print a                          # print required value

Python 3 , 126 120 113 112 110 101 99 ไบต์

f=n=int(input())
b=i=x=-1
a=1
while(n>2)*f:i+=1;a,b=a+b,a;x=[x,a][i==n];f-=str(x)in str(a)
print(a)

ลองออนไลน์!


1
คุณสามารถกำจัดอีก 7 ไบต์โดยเริ่มต้นด้วยและวางb=i=x=-1 a=1 x and (โดยพื้นฐานแล้วจะเริ่มต้น 3 ขั้นตอนก่อนหน้านี้ในลำดับ Fibonacci สองด้าน -1, 1, 0, 1, 1, 2, .... )
Ørjan Johansen

1
คุณออกจากพื้นที่ในตอนท้ายของ-1: P
Ørjan Johansen

1
เอ่ออาย นอกจากนี้ฉันต้องการกำจัด `และ n> 2` แต่ดูเหมือนว่าn==2ต้องได้รับการดูแลเป็นพิเศษ แต่สามารถย่อให้สั้นลง*(n>2)ได้
Ørjan Johansen

1
golfed มันลงไปที่88 ไบต์การเปลี่ยนแปลงบางอย่างเป็นเอกสิทธิ์ของไพ ธ อน 2 แต่ส่วนที่เหลือจะทำงานในไพ ธ อน 3 เช่นกัน
Felipe Nardi Batista

1
สำหรับ python 3 คุณยังสามารถเล่นกอล์ฟ 9 bytes ได้ที่นี่
Felipe Nardi Batista

4

Java, 118 111 ไบต์

i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}

ฉันคิดว่ามันคงเป็นไปไม่ได้ที่จะไม่ทำซ้ำบิตฟีโบนักชี แต่ความพยายามทั้งหมดของฉันส่งผลให้เกิดไบต์เพิ่มขึ้น

ขอบคุณ Kevin สำหรับการปรับปรุง ... เดาว่ามันแสดงให้เห็นว่านี่เป็นความพยายามครั้งแรกของฉันในการเล่นกอล์ฟ :)


2
ไม่อนุญาตให้ใช้ตัวอย่าง คุณควรเปลี่ยนให้เป็น lambda ดังนี้: i->{long n=i,p=0,q,c=1;while(--n>0){q=p;p=c;c+=q;}n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}return p;}(118 bytes)
Okx

1
ยินดีต้อนรับสู่ PPCG! หลังจากที่คุณเปลี่ยนเป็นแลมบ์ดาเมื่อ @Okx ชี้ให้เห็นฉันต้องบอกว่ามันเป็นคำตอบที่น่าประทับใจ ฉันพยายามทำสิ่งที่ท้าทายเมื่อประมาณหนึ่งชั่วโมงที่แล้วก่อนอาหารกลางวันและยอมแพ้ +1 จากฉัน สิ่งเล็ก ๆ น้อย ๆ ในการเล่นกอล์ฟ: while(--n>0){q=p;p=c;c+=q;}สามารถเป็นได้for(;--n>0;p=c,c+=q)q=p;และn=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}เป็นfor(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;ได้ (รวม: i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}( 111 bytes )
Kevin Cruijssen

2

Perl 6 , 45 ไบต์

{my@f=0,1,*+*...*;@f.grep(/$(@f[$_])/)[$_-1]}

$_เป็นอาร์กิวเมนต์ของฟังก์ชัน @fเป็นลำดับฟีโบนักชีสร้างอย่างขี้เกียจ


2

JavaScript (ES6), 96 93 92 90 86 ไบต์

0 การจัดทำดัชนีมีจำนวน 0 1ในการเป็นลำดับ 14เพอร์ออกมา

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
  • 2 6 ไบต์ได้รับการบันทึกขอบคุณArnauld

ลองมัน

f=(n,x=1,y=1)=>n?f(n-1,y,x+y):x+""
g=(n,x=y=0)=>x>n?f(y-1):g(n,x+!!f(y++).match(f(n)))
oninput=_=>o.innerText=(v=+i.value)<14?`f(${v}) = ${f(v)}\ng(${v}) = `+g(v):"Does not compute!"
o.innerText=`f(0) = ${f(i.value=0)}\ng(0) = `+g(0)
<input id=i min=0 type=number><pre id=o>


คำอธิบาย

อัปเดตเวอร์ชันที่จะติดตามเมื่อฉันได้รับนาที

f=...                   :Just the standard, recursive JS function for generating the nth Fibonacci number
g=(...)=>               :Recursive function with the following parameters.
n                       :  The input integer.
x=0                     :  Used to count the number of matches we've found.
y=0                     :  Incremented on each pass and used to generate the yth Fibonacci number.
x>n?                    :If the count of matches is greater than the input then
f(y-1)                  :    Output the y-1th Fibonacci number.
:                       :Else
g(...)                  :    Call the function again, with the following arguments.
n                       :      The input integer.
x+                      :      The total number of matches so far incremented by the result of...
RegExp(f(n)).test(f(y)) :        A RegEx test checking if the yth Fibonacci number, cast to a string, contains the nth Fibonacci number.
                        :        (returns true or false which are cast to 1 and 0 by the addition operator)
y+1                     :      The loop counter incremented by 1

คำตอบของคุณดูเหมือนจะให้ผลลัพธ์ที่แตกต่างจากตัวอย่าง
ericw31415

@ ericw31415 นั่นเป็นเพราะดัชนี 0
ขนดก

ฉันเขียนสิ่งนี้โดยเฉพาะว่า: "สำหรับวัตถุประสงค์ของการท้าทายนี้ลำดับฟีโบนักชีเริ่มต้นด้วย 1.
ericw31415

@ ericw31415: และลำดับของฉันเริ่มต้นด้วย 1 มันแค่ 0 ดัชนี หมายเลข 0 และหมายเลข 1 ในลำดับคือ 1, 2 คือ 2, 3 คือ 3, 4 คือ 5, อันดับที่ 5 คือ 8, และอื่น ๆ
Shaggy



1

Mathematica, 85 ไบต์

(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&

อินพุต

[10]

-4 bytes จาก @JungHwan Min

เอาท์พุต

4660046610375530309


2
ดูแปลก แต่f@i@n++ถูกต้องทั้งหมดลดลง 1 ไบต์ การใช้ForแทนการWhileลดขนาด 3 ไบต์ 85 ไบต์:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
JungHwan Min

เพียงแค่หัวขึ้นการประกาศตัวแปรโกลบอลแยกต่างหากนั้นดีมาก ความผิดฉันเอง.
JungHwan Min

1

R, 77 72 ไบต์

F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)

สิ่งนี้ใช้ประโยชน์จากgmpไลบรารีสำหรับหมายเลขฟีโบนักชี การใช้คำถามตรงไปตรงมาอย่างยุติธรรม

F=gmp::fibnum;          # Alias Fibonacci function to F
i=0;                    # intitalise counter
d=n=scan();             # get n assign to d as well
while(n)               # loop while n
  if(grepl(F(d),F(i<-i+1)))  # use grepl to determine if Fib of input is in Fib# and increment i
     n=n-1;             # decrement n
F(i)                  # output result

การทดสอบบางอย่าง

> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 2
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 3
2: 
Read 1 item
Big Integer ('bigz') :
[1] 233
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 10
2: 
Read 1 item
Big Integer ('bigz') :
[1] 4660046610375530309
> F=gmp::fibnum;i=0;d=n=scan();while(n)if(grepl(F(d),F(i<-i+1)))n=n-1;F(i)
1: 15
2: 
Read 1 item
Big Integer ('bigz') :
[1] 1387277127804783827114186103186246392258450358171783690079918032136025225954602593712568353

0

Clojure, 99 ไบต์

(def s(lazy-cat[0 1](map +(rest s)s)))#(nth(filter(fn[i](.contains(str i)(str(nth s %))))s)(dec %))

sวิธีการแก้ปัญหาขั้นพื้นฐานใช้ลำดับอนันต์ของตัวเลขฟีโบนักชี


0

C #, 35 ไบต์

int u=1,b=1;for(;b<n;){b+=u;u=b-u;}

ลองมัน

int n=int.Parse(t2.Text);int u=1,b=1;for(;b<n;){b+=u;u=b-u;t.Text+=b.ToString()+" ";}if(b==n){t.Text+="true";}

1
ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัส - กอล์ฟ รู้รอบจำเป็นต้องเป็นโปรแกรมเต็มรูปแบบหรือฟังก์ชั่นในขณะที่คุณให้ข้อมูลโค้ดเท่านั้น โดยเฉพาะอย่างยิ่งคุณสมมติว่าอินพุตอยู่nและคุณเพิ่งใส่เอาต์พุตb(ฉันคิดว่า) คุณสามารถเขียนสิ่งนี้เพื่อnเป็นข้อโต้แย้งและกลับมาได้b... นอกจากนี้ฉันค่อนข้างแน่ใจว่าคุณไม่ได้คำนวณความท้าทายที่ต้องการ จริงๆแล้วฉันไม่รู้ว่าคุณกำลังคำนวณอะไรอยู่ คุณช่วยให้ใช้รหัสบางอย่างที่เราสามารถเรียกใช้เพื่อตรวจสอบการแก้ไขปัญหาของคุณ? (ไม่สามารถเรียกใช้ "ทดลองใช้" ตามที่เป็นอยู่ .. )
Dada

0

NewStackขนาด 14 ไบต์

N∞ ḟᵢfi 'fif Ṗf⁻

รายละเอียด:

N∞              Add all natural numbers to the stack
   ḟᵢ           Define new function will value of input
     fi          Get the n'th Fibonacci number for ever element n
       'fif      Remove all elements that don't contain the (input)'th Fibonacci number 
           Ṗf⁻  Print the (input-1)'th element

ในภาษาอังกฤษ: (พร้อมตัวอย่างอินพุต 3)

N∞: ทำรายการหมายเลขธรรมชาติ [1,2,3,4,5,6...]

ḟᵢ: เก็บอินพุตในตัวแปร f [1,2,3,4,5,6...]

: แปลงรายการเป็นหมายเลข Fibonacci [1,1,2,3,5,8...]

'fif: เก็บองค์ประกอบทั้งหมดที่มีfหมายเลขฟีโบนักชีไว้[2,21,233...]

Ṗf⁻: พิมพ์f-1องค์ประกอบที่ (-1 เนื่องจากการทำดัชนีตาม 0)233


GitHub ดูเหมือนจะมี readme และการสอนเท่านั้น มีการอ้างถึงการนำไปใช้ แต่ไม่ได้เชื่อมโยง แม้ว่า PPCG ในขณะนี้จะช่วยให้ภาษาใหม่กว่าความท้าทาย แต่ฉันเชื่อว่าเรายังต้องมีการติดตั้งใช้งานแบบสาธารณะ
Ørjan Johansen

@ ØrjanJohansen, Ahah ขอบคุณที่เตือนฉัน ฉันลืมที่จะอัพโหลดมัน! มันจะขึ้นในไม่กี่นาที
Graviton

ดูเหมือนว่าการใช้งานของคุณจะใช้ UTF-8 ซึ่งในกรณีนี้คือ28 ไบต์ (ไม่ต้องสนใจการตั้งค่า Haskell ฉันแค่ใช้ TIO เพื่อนับจำนวนไบต์) ภาษาอย่าง Jelly ฯลฯ มีหน้ารหัสของตัวเองด้วยเหตุนี้
Ørjan Johansen

@ ØrjanJohansenTouchéฉันอยู่ในการแจกจ่ายตารางสำหรับการเข้ารหัสของตัวเองเมื่อเราพูด
Graviton

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