フィボナッチ関数またはシーケンス


115

フィボナッチ数列は、シーケンス内のすべての番号がそれに先行する2つの数の和である数値の配列です。シーケンスの最初の2つの数値は両方とも1です。

ここに最初のいくつかの用語があります

1 1 2 3 5 8 13 21 34 55 89 ...

次のいずれかの最短コードを記述します。

  • 終わりのないフィボナッチ数列を生成します。

  • 指定すると、シーケンスのth番目の項がn計算されnます。(1またはゼロのインデックス付き)

標準形式の入力と出力を使用できます。

(選択した言語で一方が他方よりも簡単である場合に備えて、両方のオプションを指定しました。)


を受け取る関数のn場合、かなり大きな戻り値(コンピューターの通常の単語サイズに最低限適合するフィボナッチ数の最大値)をサポートする必要があります。


リーダーボード

回答:


48

Perl 6、10文字:

匿名の無限フィボナッチ数列リスト:

^2,*+*...*

と同じ:

0, 1, -> $x, $y { $x + $y } ... Inf;

したがって、配列に割り当てることができます。

my @short-fibs = ^2, * + * ... *;

または

my @fibs = 0, 1, -> $x, $y { $x + $y } ... Inf;

そして、次のようにして最初の11個の値(0〜10)を取得します。

say @short-fibs[^11];

または:

say @fibs[^11];

待って、匿名リスト自体から最初の50個の数字を取得することもできます

say (^2,*+*...*)[^50]

それは返します:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169
63245986 102334155 165580141 267914296 433494437 701408733 1134903170 
1836311903 2971215073 4807526976 7778742049

そして、いくつかの簡単なベンチマーク:

real    0m0.966s
user    0m0.842s
sys     0m0.080s

と:

$ time perl6 -e 'say (^2, *+* ... *)[^50]'

EOF


私はの^2代替品とは思わないでしょう0,1。+1
コンラッドボロスキー

2
これはもはや有効ではないので|^2,*+*...*、と同じバイト数であると記述する必要があります0,1,*+*...*
ブラッドギルバートb2gills

5
Perlはとても奇妙です。
チョイス

1
この回答は、Perl 6のどのバージョンで記述されていますか?
電卓

3
@CalculatorFeline 2015-12-25の最初の公式リリースの少し前に、GLR(Great List Refactor)として知られる大きな変更がありました。このコードはその時まで機能していました。
ブラッドギルバートb2gills

73

Brainfuck、22ストローク

+>++[-<<[->+>+<<]>>>+]

メモリテープを徐々に移動するフィボナッチ数列を生成します。


5
綺麗な!とても美しい!またはおそらくそうではない...とにかくこれのために+1 :)
ホルンショイ-シエルベックあたり

2
これは、圧縮されたBrainfuckで3.344または4バイトです。(6 ln(22))/ ln(256)
ウィル

24
16バイト:+[[<+>->+>+<<]>]
プリモ

3
14バイト:+[.[>+>+<<-]>]
チャーリム

2
@Stefnotchはもちろん、短い方が破壊的です。上記のソリューションは、テープ上のフィボナッチシーケンスで終了します。これは、16バイトのソリューションでも行われます。
primo

51

Haskell、17 15 14文字

f=1:scanl(+)1f

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


4
なぜ2つのスペースをカットしないのf=0:scanl(+)1 fですか?
R.マルティーニ・フェルナンデス

@Martinho:編集、ありがとう。
アノン。

うわー、それは通常よりもさらに短いf@(_:x)=0:1:zipWith(+)f xです!覚えておく必要があります。
FUZxxl

4
別のスペースを削除することもできます:f=0:scanl(+)1f
-FUZxxl

37

C#4、58バイト

ストリーム(69;に弱く入力された場合は65 IEnumerable

(。のusingディレクティブを想定していSystem.Collections.Genericます。)

IEnumerable<int>F(){int c=0,n=1;for(;;){yield return c;n+=c;c=n-c;}}

単一値(58)

int F(uint n,int x=0,int y=1){return n<1?x:F(n-1,y,x+y);}

6
それnが与えられると、uintn==0短縮できますn<1。また、ストリームは、ジェネリック型の後にスペースを捨てて、x必要以上に広いスコープで宣言することにより、いくつかの文字を節約できます。実際、x完全に捨てる:n+=c;c=n-c;
ピーターテイラー

1
@Peter:感謝します。時間があれば編集します。
ジョンスキート

あなたの単一値バージョンは、私の再帰ラムダ式が答える限りです...いい!
アンドリューグレイ

1
@ wizzwizz4間違っていなければ、うまく!nいけnば、条件式を反転するだけでいいはずです。
チョイス

3
@JonSkeet Aw。そして、ここで私はC#でJon Skeetを破ったと思っていました... :
wizzwizz4

32

GolfScript、12

さて、わずか12文字です!

1.{.@.p+.}do

+1いい仕事。あなたがそれを13文字より短くすると、私はあなたの答えを即座に受け入れます(もちろん誰かがさらに短い答えをしない限り)。:-P
クリスジェスターヤング

1
チャレンジが大好きです。できた!;-)
jtjacques

いいですね、勝ちます。少なくとも、誰かがさらに短くするまで(可能であれば)。:-P
クリスジェスターヤング

5
その定義は「フィボナッチ」という名前そのものとほぼ同じです!+1
agent-j


21

J、10文字

組み込みのテイラー級数係数の計算を使用しているので、少しチートです ここで学んだ。

   (%-.-*:)t.

   (%-.-*:)t. 0 1 2 3 4 5 10 100
0 1 1 2 3 5 55 354224848179261915075

2
@aditsu (q:^-^:p) 664 729pが偶数の場所です。Jはおそらく、なぞなぞに適しています。:)
randomra

2
さらに良い:(<:^-^:>) 4is 81<:^-^:> 4is 53.5982です。
ランダラ

2
ここで示す絵文字は、すべてのJコードが目指すべきものです。補足として、別の選択肢は+/@:!&i.-9バイトを使用することです。
マイル

1
@milesとても素敵です!それは私のものとは完全に異なるため、投稿してください。
-randomra

21

六角形18 14 12

6バイトありがとうございます。

1="/}.!+/M8;

拡張:

  1 = "
 / } . !
+ / M 8 ;
 . . . .
  . . .

オンラインで試す


古い、答え。画像と説明が新しいHexagonyユーザーに役立つ可能性があるため、これは残されています。

!).={!/"*10;$.[+{]

拡張:

  ! ) .
 = { ! /
" * 1 0 ;
 $ . [ +
  { ] .

これは、改行で区切られたフィボナッチ数列を出力します。

オンラインでお試しください!ただし、オンラインインタプリタは無限の出力を実際に好まないことに注意してください。

説明

このプログラムには2つの「サブルーチン」があり、それぞれ2つの使用されたIPの1つによって実行されます。最初のルーチンは改行を出力し、2番目のルーチンはフィボナッチ計算と出力を行います。

最初のサブルーチンは最初の行から始まり、常に左から右に移動します。最初にメモリポインタの値(ゼロに初期化)を出力し、次にメモリポインタの値をでインクリメントします1。no-opの後、IPは3行目にジャンプし、最初に別のメモリセルに切り替えてから、改行を出力します。改行には正の値(値は10)があるため、コードは常に5番目の行にジャンプします。5行目は、フィボナッチ数へのメモリポインターを返し、他のサブルーチンに切り替えます。このサブルーチンから戻ると、ノーオペレーションを実行した後、IPは3行目に戻ります。

2番目のサブルーチンは右上隅から始まり、南東への移動を開始します。何もしなかった後、2行目に沿って西に移動します。この行は、メモリポインターを次の場所に移動する前に、現在のフィボナッチ数を出力します。次に、IPは4行目にジャンプし、前の2行を使用して次のフィボナッチ数を計算します。その後、最初のサブルーチンに制御を戻しますが、プログラムの制御を取り戻すと、ジャンプに遭遇するまで続行し、元々西に向けられていたミラー上で跳ね返り、2行目に戻ります。


予備のきれいな写真!

画像の左側はプログラム、右側はメモリを表します。青いボックスは最初のIPであり、両方のIPは実行される次の命令を指しています。

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

注:画像は、画像編集プログラムのスキルが同様に制限されている人にのみきれいに表示される場合があり*ます。

注2:これの大部分を書いた後、alephalphaの答えを見ただけで、分離のためにまだ価値があると思ったが、プログラムの実際のフィボナッチ部分は非常に似ている。さらに、これは複数のIPを使用するのを見た中で最小のHexagonyプログラムであるため、とにかく維持するのが良いと思いました:P


きれいな写真を作成するために使用したものにリンクしてから、そのリンクをesolangs.org/wiki/Hexagonyに置いてください。
mbomb007

1
@ mbomb007 gimpを使用して各フレームを手動で作成し、画像をGIF作成Webサイトにアップロードしました。ただし、このプロセス中に何度か、それを行うためのツールを作成することを検討しました。
FryAmTheEggman

わーい!挑戦してください。誰かが答えを投稿すると確信しています。:D魚のオンライン通訳に似たウェブサイトを作成できればなおさらです。
mbomb007

@ mbomb007これは、このサイトでのチャレンジには少し野心的かもしれません。もちろん、それはおそらく非常に広範であることから多くの苦痛を被るでしょう。私はそれを投稿するつもりはありませんが、あなたがそれを提示する良い方法を持っていると思うならば、あなた自身でそれをすることを遠慮しません。また、私は、Timwiがヘキサゴニー用のC#ideを作成したと思いますが、モノに煩わされていないため、使用しませんでした。
FryAmTheEggman

1
@ mbomb007 ideはここに住んでいます、ところで、前回リンクするのを忘れました。
FryAmTheEggman


17

Python 2、34バイト

Python、再帰を使用して...ここにStackOverflowがあります!

def f(i,j):print i;f(j,i+j)
f(1,1)

15

ゼリー、3バイト

+¡1

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

使い方

+¡1    Niladic link. No implicit input.
       Since the link doesn't start with a nilad, the argument 0 is used.

  1    Yield 1.
+      Add the left and right argument.
 ¡     For reasons‡, read a number n from STDIN.
       Repeatedly call the dyadic link +, updating the right argument with
       the value of the left one, and the left one with the return value.

¡左側の2つのリンクを覗きます。1つしかないため、ループの本体である必要があります。したがって、入力から数値が読み取られます。コマンドライン引数がないため、その番号はSTDINから読み取られます。


12

Golfscript-シングルナンバー-12/11/10

stdinからの入力を取得するための12文字:

~0 1@{.@+}*;

すでにスタックにある入力用の11文字:

0 1@{.@+}*;

1を0番目のフィボナッチ数としてさらに定義するための10文字:

1.@{.@+}*;

1
オプションは「n番目のフィボナッチ数を指定して計算」です。だから~、あなたは11個の文字を持っているのでn、スタックに乗ってスタックに残しF_nます。
ピーターテイラー

12

ルビー

29 27 25 24文字

p a=b=1;loop{b=a+a=p(b)}

編集:無限ループにしました。;)


13
b=a+a=bパリンドロームに気づいた人はいますか?:)
st0le

2
はい
st0le

私はパーティーに遅れていることは知っていますが、誰かがそのb=a+a=b部分がどのように機能するかを説明できますか?頭を包み込むように思えない。
氏ラマ

3
@GigaWattは、それをこのように考えて、命令はそう...左から右に実行されますnewb=olda+(a=oldb)
st0le

あなたは使用して2つの文字を保存することができますloopp 1,a=b=1;loop{p b=a+a=b}
パトリックOscity

11

Mathematica、9文字

Fibonacci

組み込み関数が許可されていない場合、明示的な解決策は次のとおりです。

Mathematica、33 32 31文字

#&@@Nest[{+##,#}&@@#&,{0,1},#]&

#&@@Nest[{#+#2,#}&@@#&,{0,1},#]&32文字。
チャノッグ

1
@chyanog 31:#&@@Nest[{+##,#}&@@#&,{0,1},#]&
Mr.Wizard

1
@ Mr.Wizard 24文字(26バイト):Round[GoldenRatio^#/√5]&
ジョンファンミン

1
または23文字(27バイト):Round[((1+√5)/2)^#/√5]&
ジョンファンミン

10

DC(20バイト)

おまけとして、さらに難読化されています;)

zzr[dsb+lbrplax]dsax

編集:私はあなたが十分長く待っている場合、フィボナッチ数列のすべての数字を印刷することを指摘するかもしれません。


13
私はそれを難読化されたとは呼ばないでしょう-難読化されたコードは理解するのが難しいと思われます、そしてdcに関する限り、ここのコードは完全に単純です。
ナブ

10

プレリュード、12バイト

Preludeが実際にかなり競争力のあるいくつかの課題の1つ:

1(v!v)
  ^+^

これには値を文字ではなく10進数として出力するPythonインタープリターが必要です。

説明

Preludeでは、すべての行が並列に実行され、命令ポインターがプログラムの列を横断します。各行には、ゼロに初期化される独自のスタックがあります。

1(v!v)
  ^+^
| Push a 1 onto the first stack.
 | Start a loop from here to the closing ).
  | Copy the top value from the first stack to the second and vice-versa.
   | Print the value on the first stack, add the top two numbers on the second stack.
    | Copy the top value from the first stack to the second and vice-versa.

最初のスタックが0最上位になることはないため、ループは永久に繰り返されます。

これはからフィボナッチ数列を開始することに注意してください0


10

六角形、6バイト

言語が質問よりも新しいため、競合しない。

1.}=+!

ゴルフをしていない:

  1 .
 } = +
  ! .

フィボナッチ数列をセパレータなしで出力します。


2
これには、数字の間の区切り文字を出力しないという小さな問題があります。ただし、これはチャレンジでは完全に明確に指定されていません。(そして、私は誰かが六角形を使用していることを本当に嬉しく思います。)
マーティンエンダー

9

TI-BASIC、11

伝説的なTI-BASICゴルファーのケネスハモンド( "Weregoose")による、このサイトから。O(1)時間で実行され、0をフィボナッチ数列の0番目の項と見なします。

int(round(√(.8)cosh(Anssinh‾¹(.5

使用するには:

2:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     1

12:int(round(√(.8)cosh(Anssinh‾¹(.5
                                     144

これはどのように作動しますか?計算を行うと、にsinh‾¹(.5)等しいことが判明したln φため、(1/φ)^n修正項を使用する代わりに切り捨てるBinetの式の修正版です。round((9つの小数点以下にラウンド)が丸めエラーを防止するために必要とされます。


8

K-12

計算nn-1フィボナッチ数。

{x(|+\)/0 1}

ただ、nthフィボナッチ数。

{*x(|+\)/0 1}

+1悪くない!あなたがそれを1文字だけ縮小することができたら(そしてそれをテストする方法を私に提供してください)、私はあなたの答えを受け入れます。:-)
クリスジェスターヤング

縮小する唯一の方法は、関数を既知の番号への呼び出しに置き換えることです:n(| + \)/ 0 1 このインタプリタを使用しテストします。
isawdrones


7

Java、55

ここではほとんどの言語の簡潔さに対抗することはできませんが、n番目の数を計算するための大幅に異なる、おそらくはるかに高速な(一定の時間)方法を提供できます。

Math.floor(Math.pow((Math.sqrt(5)+1)/2,n)/Math.sqrt(5))

nn = 1から始まる入力(intまたはlong)です。これは、使用していますビネーの式やラウンドの代わりに、減算を。


このソリューションが大好き
アンドレアス

これは私にはうまくいかないようですが、それは早く、何かが足りないかもしれません!0シーケンスの最初の番号であると仮定すると、これは0, 0, 1, 1, 3, 4, 8, 12, 21, 33最初の10の番号を与えます
シャギー

@Shaggyおっと!申し訳ありませんが、バグを導入しました-今修正しました。
ハンス・ピーターStörr17年

6

ルビー、25文字

st0leの答えは短くなりました。

p 1,a=b=1;loop{p b=a+a=b}

6
実際には、使用しても、それをさらに短縮することができますa=b=1;loop{p a;b=a+a=b}
Ventero

6
あなたは彼の答えをst0le?:P
mbomb007

6

FAC:機能的APL、4文字(!!)

私のものではないため、コミュニティWikiとして投稿されています。FACはAPLの方言で、Hai-Chen Tuが1985年に博士号の論文として提案したようです。彼は後にAlan J. Perlisと一緒に「FAC:A Functional APL Language」という記事を書きました。APLのこの方言は「遅延配列」を使用し、無限の長さの配列を可能にします。演算子 "iter"()を定義して、いくつかの再帰シーケンスのコンパクトな定義を可能にします。

の単項(「単項」)ケースは基本的にHaskellのケースでありiterate、と定義され(F⌼) A ≡ A, (F A), (F (F A)), …ます。ダイアディック(「バイナリ」)の場合は、2つの変数に対して多少似たように定義されますA (F⌼) B ≡ A, B, (A F B), (B F (A F B)), …。なぜこれが便利ですか?結局のところ、これはまさにフィボナッチ数列が持っている種類の再発です。実際、その例の1つは

1+⌼1

おなじみのシーケンスを生成します1 1 2 3 5 8 …

それで、そこに行く、全く新しいプログラミング言語での可能な限り最短のフィボナッチ実装。:D


ああ、私の(手動の)バルクアンウィキの一環として、誤ってあなたの投稿のコミュニティウィキを解除しました。しかたがない。;-)
クリスジェスターヤング



6

ドードー、26バイト

	dot F
F
	F dip
	F dip dip

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

使い方

関数Fは、すべての重量物を持ち上げます。次のように再帰的に定義されます。

F(n) = ( F(|n - 1|), F(||n - 1| - 1|) )

n> 1のときはいつでも、| n-1 | = n-1 <nおよび|| n-1 | -1 | = | n-1-1 | = n-2 <nなので、関数は(F(n-1)、F(n-2))を返します。

もしn = 0の場合、| N - 1 | = 1> 0 ; もしn = 1の場合、||のn - 1 | -1 | = | 0-1 | = 1 = 1。どちらの場合も、試行された再帰呼び出しF(1)Surrender例外を発生させるため、F(0)0を返し、F(1)1を返します。

たとえば、F(3)=(F(1)、F(2))=(1、F(0)、F(1))=(1、0、1)

最後に、メイン関数は次のように定義されます

main(n) = sum(F(n))

そのため、Fが返すベクトルのすべての座標を合計します。

たとえば、main(3)= sum(F(3))= sum(1、0、1)= 2です。



5

デスモス、61バイト

ゴルフ

add sliderボタンをクリックしますn

p=.5+.5\sqrt{5}
n=0
f=5^{-.5}\left(p^n-\left(-p\right)^{-n}\right)

最後の行は出力です。

非ゴルフ

関数です。

\phi =\frac{1+\sqrt{5}}{2}
f_{ibonacci}\left(n\right)=\frac{\phi ^n-\left(-\phi \right)^{-n}}{\sqrt{5}}

5

Cubix、10バイト

言語が質問よりも新しいため、競合しない回答。

Cubixは、@ ETHproductionsによる新しい2次元言語で、コードが収まるサイズのキューブにラップされていました。

;.o.ON/+!)

オンラインで試す

これは、次の方法で2 x 2キューブにラップします。

    ; .
    o .
O N / + ! ) . .
. . . . . . . .
    . .
    . .
  • O TOSの値を出力します
  • N 改行をスタックにプッシュします
  • / 北を反映
  • o TOSの文字を出力します
  • ; ポップTOS
  • / キューブを回った後、東を反映
  • + スタックの上位2つの値を追加します
  • ! TOSが0の場合、次のコマンドをスキップします
  • ) TOSを1増やします。これにより、基本的にシーケンスが開始されます。

これは、改行セパレーターを使用してシーケンスを出力する無限ループです。ほとんどのコマンドはスタックから値をポップしないという事実を利用します。
区切り文字が無視される場合、これは5バイトで実行できます.O+!)


5

Brainfuck、16、15、14 / 13文字

+[[->+>+<<]>]  

フィボナッチ数列を生成し、何も出力しません。また、上記のものよりも短いです。

+[.[->+>+<<]>]   

これは14文字ですが、フィボナッチ数列の値を持つASCII文字を出力します。


1
これは良いことですが、14バイトバージョンは2番目の1からのみ出力すると言うのは間違っていますか?「1 1 2 3 5 8」ではなく「1 2 3 5 8」のように?
チャーリム

1
@チャーリムああ、あなたは正しい。2014年の私が何を考えていたかわからない。とにかく、印刷命令をループの先頭に移動して修正しました。
Stefnotch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.