私はフィボナッチ数ですか?


49

あなたのタスク:

入力された数値がフィボナッチ数であるかどうかを確認するプログラムまたは関数を作成します。 フィボナッチ数は、フィボナッチ数列に含まれる数です。

フィボナッチ数列は次のように定義されます: F(n) = F(n - 1) + F(n - 2)

種がF(0) = 0ありF(1) = 1ます。

入力:

フィボナッチ数である場合とそうでない場合がある0〜1,000,000,000の負でない整数。

出力:

入力がフィボナッチ数であるかどうかを示す真実/偽の値。

例:

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

得点:

これは、最小バイト数が優先されます。


2
私が使用しているプログラミング言語は、9999(Geometry Dash)までの数値のみをサポートしています。理論的には1000000までの数字をサポートすると仮定しても大丈夫ですか?
MilkyWay90

回答:


36

ニーム、2 バイト

f𝕚

説明:

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

私のIt's Hip to Square answer と同じように動作しますf、フィボナッチには異なる無限リストを使用します。

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


1
うわー!印象的なスコア。
グリフォン-モニカーの復活

2
それは素晴らしいですが、2バイトではありません。UTF-8では、「66 F0 9D 95 9A」として表されます
sm4rk0

10
@ sm4rk0それは素晴らしいですが、あなたは間違っています。Neimはカスタムコードページを使用するため、これのバイト表現は66 D5
Okx

入力がリストにない場合、これは永久にループしませんか?もしそうなら、それは偽とみなされますか?
エンリコボルバ

@EnricoBorba Neimは、この無限リストのn番目の要素が常にリストのn + 1番目の要素以下になることを知っています。したがって、それ自体をキャッチすることができ、永久に実行されません。プログラムを試してみましたか?:P
Okx

18

JavaScript(ES6)、34バイト

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

入力以上の項目が見つかるまでフィボナッチ数列を再帰的に生成し、item == inputを返します。


NB:フィボナッチ数列の単純な再帰計算は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$

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

単項入力、出力0または1

説明

フィボナッチ数列は、前方参照、つまり周囲のグループまたは正規表現の後半に表示されるグループを参照する「後方参照」を使用したソリューションの良い候補です(この場合、実際には両方を使用しています)。このように数値を照合する場合、シーケンス要素間の違いを再帰的に表現する必要があります。たとえば、三角の数字と一致させるには、通常、前のセグメントに1を加えたものを一致させます。平方数(差は奇数)を一致させるには、前のセグメントに2を加えたものを一致させます。

最後から2番目の要素を追加してフィボナッチ数を取得するため、それらの差もフィボナッチ数になります。したがって、前の2つの合計として各セグメントを一致させる必要があります。正規表現の中核は次のとおりです。

(         # 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.
)*

これで、1から始まるフィボナッチ数、つまり1、1、2、3、5 、...が追加されます。それらは合計1、2、4、7、12 、...になります。すなわち、それらはフィボナッチ数よりも1つ少ないため1、最後にaを追加します。これがカバーしない唯一のケースはゼロなので、それを^$カバーする最初の選択肢があります。


2
とてもエレガント!私はそれが独占的量を使用してPCREに20バイトに短縮することができる、完全のために、指摘してちょうどたいと思います:^$|^(^1|\2?+(\1))*1$
Deadcode

1
@Deadcode .NETで見逃しがちです;)
Martin Ender

不要な秒を削除して1バイトを節約します^
ニール

12

正規表現(ECMAScriptフレーバー)、392 358 328 224 206 165バイト

フィボナッチ数とECMAScript正規表現(単項)を一致させるために必要なテクニックは、他のほとんどの正規表現フレーバーでの最適な方法とはかけ離れています。前方参照/ネストされた後方参照または再帰がないため、実行中の合計を直接カウントしたり保持したりすることはできません。後読みの欠如は、作業するのに十分なスペースを確保することさえしばしば困難になります。

多くの問題は完全に異なる視点からアプローチされなければならず、いくつかの重要な洞察が到来するまで解決できないように思われます。特定の問題を解決するために、使用している数字のどの数学プロパティを使用できるかを見つける際に、はるかに広いネットをキャストする必要があります。

2014年3月に、これがフィボナッチ数に起こりました。ウィキペディアのページを見ると、最初は方法がわかりませんでしたが、特定のプロパティの1つが食欲をそそるほど近くに見えました。次に、数学者のテューコンは、そのプロパティを別のプロパティと一緒に使用して、実行できることを非常に明確にする方法を概説しました。彼は実際に正規表現を構築することに消極的でした。私が先に進んだときの彼の反応:

あなたは狂っている!...あなたはこれをするかもしれないと思った。

私の他のECMAScript単項数学正規表現の投稿と同様に、警告を出します。ECMAScript正規表現の単項数学問題を解決する方法を学ぶことを強くお勧めします。それは私にとって魅力的な旅であり、自分で試してみたいと思う人、特に数論に興味のある人のためにそれを台無しにしたくありません。連続してスポイラーでタグ付けされた推奨される問題のリストについては、その投稿参照して1つずつ解決してください。

したがって、単項正規表現の魔法を台無しにしたくない場合は、これ以上読み進めないでください。この魔法を自分で理解するためにショットを撮りたい場合は、上記のリンクに記載されているECMAScript正規表現の問題を解決することから始めることを強くお勧めします。

私が最初に直面した課題は:正の整数xは フィボナッチ数である場合にのみ5X場合2 + 4及び/又は5× 2 - 4は完全な方形です。しかし、正規表現でこれを計算する余地はありません。作業しなければならない唯一のスペースは、番号そのものです。5を掛けたり、正方形をとったりすることはできません。

それを解決する方法に関するtueukonのアイデア(元々はここに投稿されました):

正規表現には、形式の文字列が表示され、^x*$その長さをzとします。zが最初の数個のフィボナッチ数の1つであるかどうかを手動で確認します(最大21個)。そうでない場合:

  1. bが2a以下になるように、a <bの数個の数値を読み取ります。
  2. 先読みを使用してa 2、ab、およびb 2を構築します。
  3. いずれか5Aと主張2 + 4又は図5(a)2 4が完全な正方形(SO Fでなければなりません- N-1 、いくつかのnについて)。
  4. 5b 2 + 4または5b 2 + 4が完全な正方形であると断定します(bはF nでなければなりません)。
  5. 以前に作成したa 2、ab、およびb 2、およびID を使用して、z = F 2n + 3またはz = F 2n + 4であることを確認します。
    • F 2n-1 = F n 2 + F n-1 2
    • F 2n =(2F n-1 + F n)F n
簡単に言えば:これらのIDは、私たちは、一対ことを確認するに与えられた数がフィボナッチであることを確認の問題を軽減することができるように多くの。小さい数字はフィボナッチあります 小さな代数は、十分に大きいn(n = 3で十分)に対して、F 2n + 3 > F n + 5F n 2 + 4であるため、常に十分なスペースがあることを示します。

そしてこれが正規表現で実装する前にテストとして書いたCのアルゴリズムのモックアップです

これ以上苦労することなく、正規表現を次に示します。

^((?=(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.
)$

乗算アルゴリズムは、これらのコメントでは説明されていませんが、豊富な数の正規表現postの段落で簡単に説明されています。

私はフィボナッチ正規表現の6つの異なるバージョンを維持していました:4つは最短長から最速までラチェットし、上記で説明したアルゴリズムを使用し、他の2つは異なる、より高速ですがはるかに長いアルゴリズムを使用し、実際に返すことができます一致としてのフィボナッチインデックス(ここでのアルゴリズムはこの投稿の範囲を超えていることを説明していますが、元のディスカッションGistで説明されています)。当時、PCREとPerlですべてのテストを行っていたが、正規表現エンジンを使用していたため、非常に類似した正規表現のバージョンを再び維持するとは思わない 速度の懸念がそれほど重要ではないほど十分に高速です(特定の構成要素がボトルネックを引き起こしている場合、最適化を追加できます)。速度が十分に大きかった。

「フィボナッチ指数から1を引いたものをマッチとして返す」バージョン(重度のゴルフではない):

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

すべてのバージョンはgithubにあり、ゴルフの最適化の完全なコミット履歴があります。

フィボナッチ数を照合するための正規表現-短い、速度0.txt(この投稿のように、最短だが最も遅いもの)
フィボナッチ数
を照合するための正規表現-フィボナッチ数を照合するための短い1.speed
正規表現-短い、速度2.txtの正規表現一致するフィボナッチ数-一致するフィボナッチ数の短縮、速度3.txt
正規表現-一致するフィボナッチ数の最速.txt
正規表現-index.txtを返す


9

Python 3、48バイト

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

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


1
任意の大きな入力に対して、十分なリソースが与えられれば、Pythonは動作しないはずですか?
ジョナサンアラン

2
計算がデータ型に収まり、理論的に無限の精度が与えられた場合に実際に機能するので、私たちが望む限りどんなアルゴリズムでも使用できるという印象が常にありました。確かに、使用するだけでintバーが高くなります(それでもarbitrarily意的に大きくなりません)が、Cの回答に64ビット整数(またはgccの128ビット)を強制することもありません。とにかく、ある言語で同じアルゴリズムを使用でき、別の言語では使用できないことは無意味に思えます。
デニス

アルゴリズムの見方は理にかなっています(「データ型に合わせる」基準を決定するのは入力ドメインだといつも思っていました)。注目すべき唯一のことは、アルゴリズムのアイデアとその実装の間の灰色の領域です。ここでは、浮動小数点数にキャストせずに、整数のいずれかが正方形であるかどうかを確認できます。副作用としての内部キャストは、正当で機能するアルゴリズムの一部である限り受け入れられると思います(...そして、キャストに依存するアルゴリズムは受け入れられないと確信してます)。
ジョナサンアラン

@JonathanAllan処理する最大値は1e9なので、任意の大きな入力が問題になるとは思わない。
JAD

1
@JarkoDubbeldamはい、その詳細は実際に私のコメントがなされた後に変更されました。
ジョナサンアラン

7

パイソン2、48の 44バイト

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

オンラインで試す

4バイトを節約してくれたJonathan Allanに感謝


真理値が偽の値になる可能性がある場合、これは47バイトになる可能性がFalseありますTrueTIO!
ミスターXcoder

n-a代わりに使用しn==a、戻り値として-1と0を使用することもできます。
魔法のタコUr

@carusocomputing編集履歴にはそれがありましたが、機能しません。テスト値が大きいと、の-101代わりに他の結果が得られる可能性があるためです-1
mbomb007

@ Mr.Xcoderあなたは本当に1バイトを節約することは皆の正気に値すると思いますか?
frarugi87

1
@ frarugi87バイトを保存するで、常にそれだけの価値
氏Xcoder

7

05AB1E8 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フィボナッチ数ではない0の回避策についてJonathan Allanに感謝します。


実際、6バイトに更新されることはありません。3バイト未満のリストに0を追加する方法がないとは信じられません。
魔法のタコUr

05AB1Eで@JonathanAllan「を生成fibbonacci機能は」0が含まれていません
マジックタコ壺

@ジョナサンアラン私は今、いいアイデアを理解しています。そこに実際に何が起こっているのかを理解するために少し時間がかかりました。
魔法のタコUr

包括的であるためにn(バイトを節約する)を生成するのに十分ではなく、どちらの方法でも結果が得られますか?ÅF¹å0n=0
エミグナ

0AF = []。1AF = [1,1]。そうではないようです。
魔法のタコUr



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)

ノート:

  • 増分が必要であるため、3 番目4 番目のフィボナッチ数であるため、これは23で機能します。3を超えると、すべてのフィボナッチ数がインデックスより大きくなります。
  • -(というだけよりも必要とされ‘R、これがために働くようにする)0ので、00 番目のフィボナッチ数。

うーん、あまり私の答えのようなこのルックス...
エリックOutgolfer

ああ、私はあなたのために私のものをゴルフダウンしました、私のものは3:)
ジョナサンアラン

ああ、フィボナッチは変だ。(ところで、もし
あなたが

最後のメモについて本当によろしいですか?0から始まるリストでフィボナッチアトムを実行すると、出力に0が含まれます。
散布

1
チャレンジの文言に基づいて関連性があるようには見えませんが、フィボナッチ数のリストの引数として1を指定したcountアトムを使用すると、結果は2(1ではなく)になります。
FryAmTheEggman

5

ZX81 BASIC 180 151 100〜94は、BASICバイトをトークン化

SinclairZXWorldフォーラムのMoggyのおかげで、より多くのバイトを節約できる、非常にすてきなソリューションがあります。

 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が出力され、入力されなかった場合は0が出力されます。これはバイトを節約しますが、以下の古いソリューションよりもはるかに遅いです。速度を上げるため(ただし、より多くの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

上記の修正により、BASICバイトがさらに節約IFされ、ステートメントPRINTが行12の1つに凝縮されます。他のバイトは、VALキーワードおよびand を使用して保存さGOTO CODE "£"れ、ZX81文字セットでは12です。すべての数値は浮動小数点数として格納されるため、文字列は数値よりも多くのバイトを節約します。

ここに画像の説明を入力してください


実際、6行目をすべて削除し、5行目を変更することで、トークン化されたBASICバイトをさらに6個節約できました5 IF R<F THEN NEXT I
ショーンビバーズ

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へようこそ!
マーティンエンダー

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バイト)。オンラインでお試しください!
チャーリー

1
@CarlosAlejoのa+=b代わりにa=a+bとのb+=a代わりに、さらに2バイトを保存しますb=a+b
TheLethalCoder

4

> <>21 19 + 3 = 24 22バイト

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

入力はプログラムの開始時にスタック上にあると予想されるため、-vフラグは+3バイトです。

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

これは、フィボナッチ数が入力数以上になるまでフィボナッチ数を生成し、最後に生成された数が入力と等しいかどうかをチェックすることで機能します。1フィボナッチ数の場合は出力、0それ以外の場合は出力します。

0正しく処理されるようにするために、シードは-1 1次のとおりです-最初に生成される番号はで0なくになり1ます。

STDINが空のときにスタックにiプッシュ-1するために使用できることを指摘してくれた@coleに感謝します。非常に賢い!

前のバージョン:

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

今では、生成された各数値を途中で連続的にチェックするバイトを浪費するのは愚かだと感じています。うまくできました!
エミグナ

1
i代わりに使用する22バイト01-
コール

@coleはもちろん、STDINへの入力がない場合のiよう-1に使用しますが、私はそれを考慮しませんでした。うまくできました!
ソク

3

Mathematica、37バイト

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

@ngenisisから-4バイト


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」の場合、4と-4の両方が完全な正方形であるため、「2」を返します。1は「1 1」を生成します。ゼロ以外の出力はすべて「真」であり、0は「偽」であると考えてください。




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
いいアプローチ。ところで、に変更n==0することでバイトをゴルフできますn<1。質問では、「0〜1,000,000,000の間の負でない整数」と述べています。
ケビンCruijssen

1
@KevinCruijssen私はその節で1バイトではなく、5バイトをゴルフしました!:-Pありがとう、気づかなかった。
オリヴィエグレゴワール

2
フィボナッチ数列に一時変数は必要ありません。連続したペアを計算できますb+=a;a=b-a;
デビッドコンラッド

1
@DavidConrad、あなたは黒魔術をやっています!言っています!黒魔術!:)
オリビエグレゴワール

3

C#(.NET Core)、51バイト

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

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

@Oliverのおかげで-6バイト!

このソリューションでは、非常に単純な再帰関数を使用します。

  • 変数nはテストする番号です。
  • 変数abは、シーケンス内の最新の2つの数値です。
  • 最新の2つの数値のうち最初の数値が入力より小さいかどうかを確認します。この場合、シリーズの次の番号に対して再帰呼び出しが行われます。
  • それ以外の場合は、最初の数値が入力と等しいかどうかを確認し、結果を返します。

TIOリンクは、チャレンジで必要な最大値を超える1134903170のこの動作を示しています。


最近C#のソリューションを見るためにそれのnice :) -私はあなたが単純かどうかを確認することができると思うa<nのために51バイト
オリバー

ありがとう!素敵なヒント:)
ダナ

3

錬金術師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

オンラインそれを試してみてくださいまたはバッチで確認してください!

非ゴルフ

# 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非決定性を犠牲に少ないバイトのためのチェックを
ASCIIのみの


@ASCIIのみ:それはかなりいいです!かかわらず、0で失敗したが、追加することではないb、それは初期の修正に-原子を(2つのバイトが保存されます):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の一般的なコンセンサスでは、自然なデータ型がサポートするものを処理できなければならず、Jellyは任意精度の整数をサポートする必要があります。
エリックアウトゴルファー

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フィボナッチ数を作成し、含めるかどうかを確認するために使用します。x+13番目のfibnumは2であり、3の包含をチェックするには十分ではないためです。

幸いなことにDesctools::Fibonacci(0)=0、それは素晴らしいフリービーです。

MickyTのおかげで-3バイト


-1:x+11バイト節約しますが、3バイト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フィボナッチ数を取得nすると、フィボナッチ数である場合にこのリストに含まれることが保証されます。

すべてのn+3フィボナッチ数を計算する必要があるため、このアプローチはフィボナッチ数ではない大きな数では信じられないほど非効率的であることに注意してください。


2

Javascript(**演算子なしのES6)、44バイト

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

黄金比に近づく連続したフィボナッチ数の比に依存します。cの値は、入力の小数部を黄金比で割ったものです。入力がフィボナッチの場合、これは1に非常に近く、c-c²の値は非常に小さくなります。

他のJS回答のいくつかほど短くはありませんが、O(1)時間で実行されます。


正確ですか?
user259412

fibonacchi番号16558014では機能しません
Black Owl Kai


2

R、32 31バイト

STDIN、リターンからの入力を受け取りTRUE、またはFALSE必要に応じて。

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

2

Common Lisp、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))))

フィボナッチ数列を生成するために必要な変数は3つではなく2つだけであるという考えからきています。


1

Mathematica、33バイト

AtomQ@*InverseFunction[Fibonacci]

を使用して数バイトを保存できます@*(そして、最後のをドロップします@#&
Martin Ender

1

JS(ES6)、57バイト

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

carusocomputingのmethodを使用します。私の他の答えよりも多くのゴルファー。

非ゴルフ

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.