In số Fibonacci thứ n có chứa số Fibonacci thứ n!


22

Thử thách

Bạn phải viết một chương trình lấy một số nguyên dương nlàm đầu vào và xuất ra nsố Fibonacci thứ (được rút ngắn là Fib # trong suốt) có chứa nFib # thứ dưới dạng một phép trừ. Đối với mục đích của thử thách này, chuỗi Fibonacci bắt đầu bằng một1 .

Dưới đây là một số ví dụ mà bạn có thể sử dụng làm trường hợp thử nghiệm hoặc làm ví dụ để làm rõ thách thức (đối với trường hợp sau, vui lòng để lại nhận xét bên dưới giải thích những gì bạn thấy không rõ ràng).

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

Như mọi khi, đây là , vì vậy hãy tính số byte thấp nhất có thể.

Nếu có gì đó khó hiểu / không rõ ràng, vui lòng để lại nhận xét.

(Thử thách này dựa trên một thử thách khác mà tôi đã đăng: In số nguyên tố thứ n có chứa n )


3
Tôi khuyên bạn nên bao gồm cả n=5testcase, vì tôi vừa mắc một lỗi ngớ ngẩn khi tôi viết một tấm séc đếm số nhiều lần nếu nó có chuỗi con nhiều lần. n=5sẽ bắt rằng vì sự 55.
Ørjan Johansen

2
@officialaimm Tôi không nghĩ là hợp lý khi mong đợi số lượng rất cao. Giải pháp của tôi hoạt động trên TIO tối đa n=25(đầu ra có 1186 chữ số), sau đó bị giết n=26(3085 chữ số được biên dịch trên máy tính xách tay của riêng tôi). Dường như có một bước nhảy khó khăn mỗi khi fib(n)có thêm một chữ số (như người ta mong đợi). Bước nhảy tiếp theo, 31, có 12990 chữ số trong đầu ra cuối cùng.
Ørjan Johansen

1
Vâng. Lol! giải pháp python của tôi bị kẹt trong n> 6 vì có một hàm đệ quy được gọi nhiều lần trong một vòng lặp. : D
chính thức tuyên bố

1
@officialaimm Ồ đúng rồi, sự bùng nổ theo cấp số nhân là một vấn đề khi xác định trực tiếp Fibonacci với đệ quy. Ngay cả khi không có điều đó, bạn có thể đạt giới hạn đệ quy của Python khá sớm.
Ørjan Johansen

1
@Shaggy: Đó là ý của tôi bởi sự nhất quán: khi 0 là số Fibonacci thứ 0, thì 1 là số Fibonacci đầu tiên ("1th"?).
ShreevatsaR

Câu trả lời:


12

Haskell , 85 84 byte

CHỈNH SỬA:

  • -1 byte: Laikoni rút ngắn l.
  • Typo ( x>=scho x<=s) giải thích.

f mất một Int và trả về a String.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  • l là danh sách vô hạn của các số Fibonacci, được định nghĩa đệ quy là tổng một phần của 0:1:l . Nó bắt đầu với 0vì danh sách được lập chỉ mục 0. mlà cùng một danh sách được chuyển đổi thành chuỗi.
  • Trong f :
    • n là số đầu vào và x là (chuỗi của) nsố Fibonacci thứ.
    • Trong phần hiểu danh sách bên ngoài, ylà một số Fibonacci được kiểm tra xem nó có chứa xdưới dạng một chuỗi con hay không. Các ys đi qua được thu thập trong danh sách và được lập chỉ mục với cuối cùng!!n để đưa ra đầu ra. Một phần bổ sung xđược thêm vào các bài kiểm tra để tiết kiệm hai byte khi sử dụng!!(n-1) ở cuối.
    • Để tránh đếm ys nhiều lần, các bài kiểm tra của từngy được gói orvà một cách hiểu danh sách khác.
    • Trong danh sách bên trong hiểu, s lặp đi lặp lại qua các hậu tố của y.
    • Để kiểm tra xem có phải xlà tiền tố của hay không s, chúng tôi kiểm tra xem x<=sx++":">s. ( ":"có phần tùy ý nhưng cần phải lớn hơn bất kỳ chữ số nào.)

1
l=0:scanl(+)1ltiết kiệm một byte.
Laikoni


4

Python 2 , 99 86 byte

  • Rjan Johansen đã lưu 7 byte: bắt đầu bằng b=i=x=-1 a=1và thảx and
  • Ørjan Johansen một lần nữa lưu 3 byte: f and n==2đếnf*(n>2)
  • Felipe Nardi Batista đã lưu 9 byte: tốc a,b=a+b,aký trao đổi kinh tế f-=str(x)in str(a), vắt(n<2)*f
  • ovs đã lưu 13 byte: chuyển từ python 3 sang 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

Hãy thử trực tuyến!

Giải trình:

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

Trăn 3 , 126 120 113 112 110 101 99 byte

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)

Hãy thử trực tuyến!


1
Bạn có thể loại bỏ thêm 7 byte bằng cách bắt đầu b=i=x=-1 a=1và loại bỏ x and . (Về cơ bản bắt đầu 3 bước sớm hơn trong chuỗi Fibonacci hai mặt -1, 1, 0, 1, 1, 2, ....)
Ørjan Johansen

1
Bạn đã để lại một khoảng trống ở cuối -1: P
rjan Johansen

1
Erm đỏ mặt . Ngoài ra, tôi muốn thoát khỏi `và n> 2` nhưng có vẻ như nó n==2thực sự cần được đối xử đặc biệt. Nhưng nó có thể được rút ngắn lại *(n>2).
Ørjan Johansen

1
đã giảm xuống còn 88 byte , một số thay đổi chỉ dành riêng cho python 2. nhưng phần còn lại cũng sẽ hoạt động trong python 3
Felipe Nardi Batista

1
đối với python 3, bạn vẫn có thể chơi golf 9 byte: tại đây
Felipe Nardi Batista

4

Java, 118 111 byte

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;}

Tôi tiếp tục nghĩ rằng không nên sao chép bit Fibonacci, nhưng tất cả những nỗ lực của tôi bằng cách nào đó dẫn đến nhiều byte hơn.

Cảm ơn Kevin vì những cải tiến ... đoán nó cho thấy đây là nỗ lực đầu tiên của tôi khi chơi golf :)


2
Đoạn trích không được phép. Bạn nên biến cái này thành lambda như vậy: 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 byte)
Okx

1
Chào mừng đến với PPCG! Sau khi bạn đổi nó thành lambda như @Okx đã chỉ ra, tôi phải nói rằng đó là một câu trả lời ấn tượng. Tôi đã cố gắng thực hiện thử thách này khoảng một giờ trước ngay trước bữa trưa, và đã bỏ cuộc. Vì vậy, +1 từ tôi. Một số điều nhỏ để chơi golf: while(--n>0){q=p;p=c;c+=q;}có thể 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;}có thể for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;. (Tổng cộng: 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 byte )
Kevin Cruijssen

2

Perl 6 , 45 byte

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

$_là đối số của hàm; @flà chuỗi Fibonacci, được tạo ra một cách lười biếng.


2

JavaScript (ES6), 96 93 92 90 86 byte

Được lập chỉ mục 0, với số thứ 0 trong chuỗi 1. Craps ra tại 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 byte được lưu nhờ Arnauld

Thử nó

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>


Giải trình

Phiên bản cập nhật để theo dõi, khi tôi nhận được một phút.

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

Câu trả lời của bạn dường như cung cấp đầu ra khác với các ví dụ.
ericw31415

@ ericw31415, đó là vì nó được lập chỉ mục 0.
Shaggy

Tôi đã viết cụ thể viết điều này mặc dù: "Đối với mục đích của thử thách này, chuỗi Fibonacci bắt đầu bằng 1."
ericw31415

@ ericw31415: Và trình tự của tôi bắt đầu bằng 1, nó chỉ là 0-index; các số 0 và 1 trong dãy là 1, số 2 là 2, số 3 là 3, số 4 là 5, số 5 là 8, v.v.
Xù xì

2

Than , 65 byte

AIθνAνφA±¹βAβιAβξA¹αW∧›ν²φ«A⁺ι¹ιA⁺αβχAαβAχαA⎇⁼ιναξξA⁻φ›№IαIξ⁰φ»Iα

Hãy thử trực tuyến! Liên kết với mã verbose để giải thích.



1

Toán học, 85 byte

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

đầu vào

[10]

-4 byte từ @JungHwan Min

đầu ra

4660046610375530309


2
Trông lạ nhưng f@i@n++hoàn toàn hợp lệ, giảm 1 byte. Sử dụng Forthay vì Whilegiảm 3 byte. 85 byte:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
JungHwan Min


1

R, 77 72 byte

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

Điều này làm cho việc sử dụng gmp thư viện cho số Fibonacci. Khá thẳng thực hiện foward của câu hỏi.

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

Một số bài kiểm tra

> 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 byte

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

Một giải pháp cơ bản, sử dụng một chuỗi vô hạn các số Fibonacci s.


0

C #, 35 byte

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

Thử nó

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
Chào mừng bạn đến với Câu đố lập trình và Code-Golf. Câu trả lời cần phải là một chương trình đầy đủ hoặc một chức năng, trong khi bạn chỉ cung cấp một đoạn trích. Cụ thể, bạn đang giả sử rằng đầu vào là trong nvà bạn chỉ cần đặt đầu ra vào b(tôi nghĩ). Bạn có thể viết lấy các nđối số và trả về b... Ngoài ra, tôi khá chắc chắn rằng bạn không tính toán những gì các thách thức yêu cầu. Trên thực tế, tôi không biết bạn đang tính toán cái gì. Bạn có thể vui lòng cung cấp sử dụng với một số mã mà chúng tôi có thể chạy để xác minh giải pháp của bạn không? ("Dùng thử" của bạn không thể chạy như vậy ..)
Dada

0

NewStack , 14 byte

N∞ ḟᵢfi 'fif Ṗf⁻

Sự phá vỡ:

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

Bằng tiếng Anh: (với ví dụ về đầu vào là 3)

N∞: Lập danh sách các số tự nhiên [1,2,3,4,5,6...]

ḟᵢ: Lưu trữ đầu vào trong biến f [1,2,3,4,5,6...]

: Chuyển đổi danh sách thành số Fibonacci [1,1,2,3,5,8...]

'fif: Giữ tất cả các phần tử có chứa fsố Fibonacci thứ[2,21,233...]

Ṗf⁻: In f-1phần tử thứ (-1 do lập chỉ mục dựa trên 0)233


GitHub dường như chỉ chứa một readme và một hướng dẫn. Một triển khai được đề cập đến, nhưng nó không được liên kết. Mặc dù PPCG hiện cho phép các ngôn ngữ mới hơn thách thức, tôi tin rằng chúng tôi vẫn yêu cầu triển khai công khai.
Ørjan Johansen

@ RjanJohansen, Ahah cảm ơn vì đã nhắc nhở tôi. Tôi quên tải lên mà! Nó sẽ lên trong một phút nữa.
Graviton

Việc triển khai của bạn dường như sử dụng UTF-8, trong trường hợp đó thực sự là 28 byte (đừng bận tâm đến cài đặt Haskell, tôi chỉ sử dụng TIO để đếm byte). Các ngôn ngữ như Jelly, vv có các trang mã riêng vì lý do này.
Ørjan Johansen

@ RjanJohansen Touché, tôi đang làm việc phân phối một bảng cho mã hóa của chính nó như chúng ta nói.
Graviton

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.