Nf Fibonacci numarasını içeren nt Fibonacci numarasını yazdırın!


22

Meydan okuma

nGirdi olarak pozitif bir tamsayı alan nve nth Fib # 'ı subtring içeren th Fibonacci sayısını (Fib # boyunca kısaltılmış) çıkaran bir program yazmalısınız. Bu zorluğun amaçları doğrultusunda, Fibonacci dizisi a ile başlar 1.

Test sınavları olarak veya mücadeleyi açıklığa kavuşturmak için örnekler olarak kullanabileceğiniz bazı örnekler: (ikincisi için, lütfen neyi belirsiz bulduğunuzu açıklayan bir yorum bırakınız).

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

Her zaman olduğu gibi, bu , bu yüzden mümkün olan en düşük bayt sayısı için gidin.

Bir şey kafa karıştırıcı / net değilse, lütfen bir yorum bırakın.

(Bu zorluk ben yayınlanmıştır başka meydan kapalı dayanır: n içeren n'inci asal yazdır )


3
n=5Testcase'i eklemeyi öneririm , çünkü aptalca bir defadan fazla olsa birkaç kez sayılan bir çek yazdığım aptalca bir hata yaptım. n=5bunu yüzünden yakalardım 55.
Ørjan Johansen

2
@officialaimm Çok yüksek rakamlar beklemenin mantıklı olduğunu sanmıyorum. Çözümüm TIO'da n=25(çıktısında 1186 basamak var) çalışıyor, sonra öldürülüyor n=26(3085 basamak kendi dizüstü bilgisayarımda derlendi). Ne zaman fib(n)bir rakam daha basarsa (beklediğiniz gibi) zorluk atlıyor gibi görünüyor . Bir sonraki atlama olan 31, final çıkışında 12990 haneye sahip.
Ørjan Johansen

1
Evet. Lol! python çözümüm n> 6 için sıkışıyor, çünkü bir döngüde defalarca denilen özyinelemeli bir işlev var. : D
officialaimm

1
@ officialaimm Doğru, üstel patlama, Fibonacci'yi doğrudan özyinelemeyle tanımlarken bir problemdir. Bu olmadan bile Python'un özyineleme sınırına çok yakın bir zamanda vurabilirsiniz.
Ørjan Johansen

1
@Shaggy: Tutarlı demek istediğim bu: 0, 0. Fibonacci sayısı, o zaman 1 ilk ("1."?) Fibonacci sayısı.
ShreevatsaR

Yanıtlar:


12

Haskell , 85 84 bayt

DÜZENLE:

  • -1 bayt: Laikoni kısaldı l.
  • Yazım hatası ( x>=siçin x<=s) açıklamada.

fbir alır Intve bir döndürür 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

Çevrimiçi deneyin!

Nasıl çalışır

  • lözyinelemeli olarak kısmi toplamlar olarak tanımlanan Fibonacci sayılarının sonsuz listesidir 0:1:l. 0Listeler 0 dizinli olduğundan başlar . mdizelere dönüştürülen listenin aynısıdır.
  • İçinde f:
    • ngiriş numarasıdır ve x(F) 'nin nFibonacci sayısının dizgisidir.
    • Dış listede anlama, bir alt tabaka olarak yiçerip içermediğini test eden bir Fibonacci numarasıdır x. Geçenler ylistede toplanır !!nve çıktıyı vermek için final ile endekslenir . Sonunda xkullanmaya iki bayttan tasarruf etmek için testlere bir ekstra hazırlanmıştır !!(n-1).
    • yBirkaç kez sayılmasından kaçınmak için, her birinin testleri ysarılır orve başka bir liste kavrama yapılır.
    • İç listede anlama, sekleri ile yinelenir y.
    • xBir ön ek olup olmadığını test etmek için s, x<=sve olup olmadığını kontrol ederiz x++":">s. ( ":"biraz keyfi ama rakamlardan daha büyük olması gerekiyor.)

1
l=0:scanl(+)1lbir bayt kaydeder.
Laikoni


4

Python 2 , 99 86 bayt

  • Ørjan Johansen 7 bayt kaydetti: ile başlayan b=i=x=-1 a=1ve bırakarakx and
  • Ørjan Johansen yine 3 bayt kaydedildi: f and n==2hiçf*(n>2)
  • Felipe Nardi Batista 9 bayt kazandı: ekonomik değiş tokuş a,b=a+b,asteno f-=str(x)in str(a), sıkılmış(n<2)*f
  • ovs 13 byte kaydetti: python 3'ten python 2'ye geçiş.
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

Çevrimiçi deneyin!

Açıklama:

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 bayt

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)

Çevrimiçi deneyin!


1
İle başlayıp b=i=x=-1 a=1bırakarak 7 byte'tan kurtulabilirsiniz x and . (Esas olarak iki taraflı Fibonacci dizisi -1, 1, 0, 1, 1, 2, .... 'de 3 adım erken başlıyoruz.)
Ørjan Johansen

1
Sonunda bir boşluk bıraktınız -1: P
Ørjan Johansen

1
Erm allık . Ayrıca, “ve n> 2” den kurtulmak istiyorum ancak n==2gerçekten özel bir tedaviye ihtiyacı var gibi görünüyor . Ancak bu kısaltılabilir *(n>2).
Ørjan Johansen

1
88 byte'a kadar indirilmiş , bazı değişiklikler python 2'ye özeldir ancak geri kalanı python 3'te de çalışacaktır
Felipe Nardi Batista

1
python 3 için hala 9 bayt golf oynayabilirsiniz: burada
Felipe Nardi Batista

4

Java, 118 111 bayt

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

Fibonacci bitini kopyalamamanın mümkün olduğunu düşünmeye devam ediyorum, ancak bütün çabalarım bir şekilde daha fazla baytla sonuçlanıyor.

Gelişmeler için Kevin'e teşekkürler ... sanırım bu benim golf oynamaya ilk girişimin olduğunu gösteriyor :)


2
Snippet'lere izin verilmiyor. Bunu şöyle bir 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;}
lambdaya

1
PPCG'ye Hoşgeldiniz! @Okx'un işaret ettiği gibi lambda değiştirdikten sonra, bunun etkileyici bir cevap olduğunu söylemeliyim. Bu zorluğu bir saat önce öğle yemeğinden hemen önce yapmaya çalıştım ve pes ettim. Yani benden +1. Golf için bazı küçük şeyler: while(--n>0){q=p;p=c;c+=q;}olabilir for(;--n>0;p=c,c+=q)q=p;ve n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}olabilir for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;. (Toplamda: 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 bayt )
Kevin Cruijssen

2

Perl 6 , 45 bayt

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

$_işlevin argümanıdır; @fFibonacci dizisidir, tembel olarak üretilir.


2

JavaScript (ES6), 96 93 92 90 86 bayt

0 dizini oluşturulmuş, sıradaki 0 ​​sayısı var 1. De barbut 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)))
  • Arnauld sayesinde 2 6 bayt kaydedildi

Dene

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>


açıklama

Bir dakika geldiğimde takip etmek için güncellenmiş sürümü.

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

Cevabınız, örneklerden farklı sonuçlar veriyor gibi görünüyor.
ericw31415,

@ ericw31415, bunun nedeni 0 dizinli olmasıdır.
Shaggy,

Yine de şunu yazdım: "Bu zorluğun amaçları doğrultusunda, Fibonacci dizisi 1 ile başlar."
ericw31415

@ ericw31415: Ve dizilim 1 ile başlıyor, sadece 0 dizinli; dizideki 0 ve 1 sayıları 1'dir, 2. sayı 2, 3. sayı 3, 4. sayı 5, 5. sayı 8 vb.
Shaggy,

2

Kömür , 65 bayt

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

Çevrimiçi deneyin! Açıklama için ayrıntılı kod bağlantısı.



1

Mathematica, 85 bayt

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

giriş

[10]

@JungHwan Min'dan -4 bayt

çıktı

4660046610375530309


2
Garip görünüyor ama f@i@n++tamamen geçerli, 1 bayt azaltarak. Kullanma Foryerine While3 bayt azaltır. 85 bayt:(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 bayt

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

Bu gmp, Fibonacci sayısı için kütüphaneden yararlanır. Sorunun oldukça düz bir şekilde uygulanması.

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

Bazı testler

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

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

Temel bir çözüm, sonsuz bir Fibonacci sayıları dizisi kullanır s.


0

C #, 35 bayt

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

Dene

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
Programlama Bulmaca ve Kod Golf hoş geldiniz. Yalnızca bir snippet sağladığınızda, yanıtların tam bir program veya işlev olması gerekir. Özellikle, girişin içinde olduğunu varsayıyorsunuz nve çıktıyı sadece içine koyuyorsunuz b(sanırım). nArgümanlar ve geri dönüşler olarak kabul edip yazabilirsiniz b... Ayrıca, zorlukların ne istediğini hesaplamadığınızdan eminim. Aslında ne hesapladığın hakkında hiçbir fikrim yok. Lütfen çözümünüzü doğrulamak için çalıştırabileceğimiz bazı kodları kullanabilir misiniz? ("Deneyin", olduğu gibi çalıştırılamaz ..)
Dada

0

NewStack , 14 bayt

N∞ ḟᵢfi 'fif Ṗf⁻

Arıza:

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

İngilizce: (3 giriş örneği ile)

N∞: Doğal sayıların bir listesini yapın [1,2,3,4,5,6...]

ḟᵢ: Girişi değişkende saklayın f [1,2,3,4,5,6...]

: Listeyi Fibonacci numaralarına dönüştürün [1,1,2,3,5,8...]

'fif: fTh Fibonacci numarasını içeren tüm öğeleri saklayın[2,21,233...]

Ṗf⁻: f-1Th öğesini yazdırın (0 tabanlı dizinlemeden dolayı -1)233


GitHub sadece bir benioku ve bir eğitim içeriyor gibi görünüyor. Bir uygulamaya atıfta bulunulur, ancak bağlantılı değildir. Her ne kadar PPCG şu anda zorluktan daha yeni dillere izin veriyor olsa da, hala herkese açık bir uygulama gerektirdiğine inanıyorum.
Ørjan Johansen

@ ØrjanJohansen, Ahah hatırlattığın için teşekkürler. Bunu yüklemeyi unuttum! Bir dakika içinde olacak.
Graviton

Uygulamanız UTF-8 kullanıyor gibi görünüyor, bu durumda aslında 28 bayttır (Haskell ayarını dikkate almayın, yalnızca baytları saymak için TIO kullanıyorum). Jelly vb. Dillerin bu nedenle kendi kod sayfalarına sahiptir.
Ørjan Johansen

@ ØrjanJohansen Touché, konuştuğumuz gibi kendi kodlaması için bir tablo dağıtma işindeyim.
Graviton

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.