n番目のフィボナッチ数を含むn番目のフィボナッチ数を出力します!


22

チャレンジ

n入力として正の整数を取り、サブトリングとしてth Fib#nを含むthフィボナッチ数(全体を通して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=5テストケースを含めることをお勧めします。これは、サブストリングが複数回ある場合に数回カウントするチェックを書いたという愚かなエラーを犯したからです。n=5ためにそれをキャッチし55ます。
Ørjanヨハンセン

2
@officialaimm非常に高い数字を期待するのは合理的ではないと思います。私のソリューションはTIOで動作しn=25(出力は1186桁)、その後殺されますn=26(自分のラップトップでコンパイルされた3085桁)。fib(n)(予想されるように)さらに1桁上がると、難易度が急上昇するようです。次のジャンプ31は、最終出力に12990桁あります。
Ørjanヨハンセン

1
はい。笑!ループ内で何度も呼び出される再帰関数があるため、私のPythonソリューションはn> 6でスタックします。:D
officialaimm

1
@officialaimmそうそう、フィボナッチを再帰で直接定義するとき、指数関数的な爆発は問題です。それがなくても、Pythonの再帰制限にすぐに達する可能性があります。
Ørjanヨハンセン

1
@Shaggy:私が一貫して意味したのは、0が0番目のフィボナッチ数である場合、1が最初の(「1番目」?)フィボナッチ数です。
シュ

回答:


12

Haskell85 84バイト

編集:

  • -1バイト:Laikoniは短縮されましたl
  • (タイプミスx>=sのためのx<=s説明で)。

fを取り、Intを返します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

オンラインでお試しください!

使い方

  • lは、フィボナッチ数の無限リストであり、の部分和として再帰的に定義され0:1:lます。0リストのインデックスは0 であるため、最初に始まります。m文字列に変換された同じリストです。
  • f
    • nは入力番号でありx、(文字列の)n番目のフィボナッチ数です。
    • 外部リスト内包表記でyx、サブストリングとして含まれているかどうかがテストされたフィボナッチ数です。合格したysはリストに収集され、最終的なインデックスが付け!!nられて出力されます。最後にx使用することで2バイトを節約するために、テストの前に追加が追加されます!!(n-1)
    • ysを数回カウントすることを避けるために、それぞれのテストyはラップされor、別のリストを理解します。
    • 内部リスト内包表記でsは、の接尾辞を反復処理しますy
    • xがのプレフィックスであるかどうかをテストするためにs、とをチェックx<=sx++":">sます。(":"ややarbitrary意的ですが、数字よりも大きくする必要があります。)

1
l=0:scanl(+)1lバイトを保存します。
ライコニ


4

パイソン299の 86バイト

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の3126の 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
で開始してb=i=x=-1 a=1をドロップすると、さらに7バイトを取り除くことができますx and 。(基本的に3つの段階以前両面フィボナッチ数列における出発-1、1、0、1、1、2、....)
Ørjanヨハンセン

1
-1:P
ØrjanJohansenの

1
ERMの赤面。また、 `and n> 2`を取り除きたいのですが、n==2本当に特別な扱いが必要なようです。しかし、これはに短縮できます*(n>2)
Ørjanヨハンセン

1
88バイトにまで削減しましたが、一部の変更はpython 2に限定されますが、残りはpython 3でも機能します
フェリペナルディバティスタ

1
python 3の場合、9バイトをゴルフすることができます:ここ
フェリペナルディバティスタ

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

私はフィボナッチビットを複製しないことが可能であるべきだと考え続けていますが、私の努力はすべて何らかの形でより多くのバイトをもたらします。

改善のためのケビンのおかげで...これはゴルフの私の最初の試みであったことを示していると思います:)


2
スニペットは許可されていません。これを次のようにラムダに変換する必要があり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バイト)
Okx

1
PPCGへようこそ!@Okxが指摘したように、ラムダに変更した後、印象的な答えだと言わざるを得ません。私はこのチャレンジを約1時間前に昼食の直前にしようとして、あきらめました。だから私から+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バイト
ケビンクルーッセン

2

Perl 6、45バイト

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

$_関数への引数です。@f遅延生成されたフィボナッチ数列です。


2

JavaScript(ES6)、96 93 92 90 86バイト

シーケンスの0番目の番号が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)))

それを試してみてください

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などとなります。
シャギー



1

Mathematica、85バイト

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

入力

[10]

@JungHwan Minから-4バイト

出力

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])&
ジョンファンミン


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
プログラミングパズルとCode-Golfへようこそ。回答は、完全なプログラムまたは関数である必要がありますが、スニペットのみを提供しました。特に、入力が入っているnと仮定し、出力を入れるだけですb(私は思う)。あなたはそれをn引数として受け取り、返すb... 実際、何を計算しているのかわかりません。ソリューションを検証するために実行できるいくつかのコードを使用してください。(「試してみる」はそのままでは実行できません。)
ダダ

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...]

:リストをフィボナッチ数に変換します [1,1,2,3,5,8...]

'fiffthフィボナッチ数を含むすべての要素を保持する[2,21,233...]

Ṗf⁻f-1th要素を出力します(0ベースのインデックス付けにより-1)233


GitHubには、readmeとチュートリアルのみが含まれているようです。実装は参照されますが、リンクされていません。PPCGでは現在、チャレンジよりも新しい言語を使用できますが、まだ公開されている実装が必要だと思います。
Ørjanヨハンセン

@ØrjanJohansen、アハ、私に思い出させてくれてありがとう。それをアップロードするのを忘れました!すぐに起動します。
グラビトン

あなたの実装はUTF-8を使用しているようです。この場合、実際には28バイトです(Haskellの設定は気にしないでください。バイトをカウントするのにTIOのみを使用しています)。Jellyなどの言語には、このため独自のコードページがあります。
Ørjanヨハンセン

@ØrjanJohansenTouché、私は話しているように、独自のエンコーディングのためにテーブルを配布しているところです。
グラビトン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.