First-nフィボナッチ数列要素


11

ここには、短い(最小の文字)フィボナッチシーケンスジェネレーターを要求するよく知られた質問があります。

誰かがフィボナッチ数列の最初のN個の要素のみを非常に短いスペースで生成できるかどうか知りたいのですが。私はそれをpythonでやろうとしていますが、どんな言語でも、どんな短い答えにも興味があります。関数F(N)は、シーケンスの最初のN個の要素を生成し、関数の戻りとしてそれらを返すか、出力します。

興味深いことに、コードゴルフの回答は1 1 2でなくで始まるようです0 1 1 2。それはコードゴルフや一般的なプログラミングの慣習ですか?(ウィキペディアによると、フィボナッチ数列はゼロから始まります。)

Pythonサンプル(最初の5要素):

def f(i,j,n):
    if n>0:
        print i;
        f(j,i+j,n-1)
f(1,1,5)

1
これはリンクされた質問に似すぎていると思います。そこでのほとんどのソリューションは、最初のnケースを処理するように簡単に変更できます。
hammar 2012年

3
私が見てきたどこでも、基本例は以下のように定義されているF_0 = 0, F_1 = 1か、同等F_1 = 1, F_2 = 1。違いは、シーケンスをインデックス0(プログラミングでより一般的)または1(数学でより一般的)から開始するかどうかです。
hammar 2012年

1
そして、定義することF_0 = 0, F_1 = 1は、行列表現での単純さにおいて明確な利点があり[[1 1][1 0]]^n = [[F_{n+1} F_n][F_n F_{n-1}]]ます。
Peter Taylor

1
@ピーター:どちらか一方を選ぶほうがいい理由です(審美的な理由から、私はずっと0、1を好んでいましたが、それらが自分自身を押し込んいるとは信じていません)。
dmckee ---元モデレーターの子猫2012

1
現時点ではこれはかなり古い課題であることに気づきましたが、最短ではない回答を受け入れたことに注意してください。これはコードゴルフ競技なので、最短の答えは承認されたとマークされたものでなければなりません。
Alex A.

回答:


39

C

カウントしませんでしたが、ここに楽しい例があります:

f(n){return n<4?1:f(--n)+f(--n);}
main(a,b){for(scanf("%d",&b);a++<=b;printf("%d ",f(a)));}

それが機能することの証明。


私はこれを非常に誇りに思っています。私は退屈したので、コードを(いくつかの小さな追加を加えて)再配置し、各行がフィボナッチシーケンスの値を表すようにしました。

                         #                                // 1
                         f                                // 1
                         //                               // 2
                        (n)                               // 3
                       {/**/                              // 5
                      return n                            // 8
                    <2 ? 1:f(--n)                         // 13
                +f(--n); } main(a, b)                     // 21
          {a = 0, b = 0;scanf("%d",&b); for(              // 34
;a < b; a+=1) { int res = f(a); printf("%d ", res); } }   // 55

それが機能することの証明。


いいね。90文字(改行なし)。2バイト節約:a++<=b-> a++-bおよびreturn--n<3?1:f(n)+f(n-1)。さらにscanf、nをに含める必要がある場合は回避できますargc
ugoren

大好きです!これは--n、同じ式内のの2つのインスタンスの順序付けの未定義の動作が無関係である良い例です。鮮やかさ!
トッドリーマン

ちなみに、4実際にはがあるはず3です。現在で書かれているよう<4に、生成されるシーケンスは1、1、1、2、3、5、8です...これは1が多すぎます。
トッドリーマン

さらに、シーケンスの0番目の要素を正しく処理する場合は、2文字を追加して、コードをreturn n<3?n>0:f(--n)+f(--n);
Todd Lehman

6

ハスケル(26)

驚いたことに、これはJソリューションよりも1文字だけ長くなっています。

f =( `take`s)
s = 0:scanl(+)1s

私はいくつかのキャラクターを次のように削ります。

  1. take二項演算子として使用;
  2. scanl詳細の代わりに使用しzipWithます。

ここで何が行われているのかを理解するのに文字列で30分ほどかかりました。これsはとてもエレガントなので、そのような解決策を誰がどのように考えているのかわかりません!私が知らなかったのはs、定義中に再度使用できることsです。(私はまだ初心者です=)
flawr

5

これが1行のPythonです。浮動小数点を使用しているため、n正確でなくなっているものがあるかもしれません。

F=lambda n:' '.join('%d'%(((1+5**.5)/2)**i/5**.5+.5)for i in range(n))

F(n)nスペースで区切られた最初のフィボナッチ数を含む文字列を返します。


これをしようと思っていましたが、長すぎると思いました。私はフローリングを使うことを考えていませんでした。非常に素晴らしい。
クリスハーパー

ああ、ビネットの公式。私もそれを使用しました、そしてそれは正確です、あなたが最初のものとして0を数えるなら少なくとも59番目のフィボナッチ数までです。その後、数値が大きくなりすぎ、指数を使用し始めます。
elssar 2012年

関数を定義する70文字、1行。+ 4 +呼び出すcrlf。かなり良い!
ウォーレンP

5

GolfScript、16文字

~0 1@{.2$+}*;;]`

出力例:

$ ruby golfscript.rb ~/Code/golf/fib.gs <<< "12"
[0 1 1 2 3 5 8 13 21 34 55 89]

4

Perl、50文字

sub f{($a,$b,$c)=@_;$c--&&say($a)&&f($b,$a+$b,$c)}

4

Scala 71:

def f(c:Int,a:Int=0,b:Int=1):Unit={println(a);if(c>0)f(c-1,b,a+b)};f(9)

プリント

0
1
1
2
3
5
8
13
21
34

涼しい。私はまだScalaで遊んだことすらありません。今夜は家でやってみます。
ウォーレンP

3

Perl、29 28バイト

perl -E'say$b+=$;=$b-$;for-pop..--$;' 8
1
1
2
3
5
8
13
21

説明

これは$b += $a = $b-$a、次のように機能する古典的な繰り返しに基づいています。

  • 各ループの開始時に、$acontains F(n-2)$bcontainsF(n)
  • $a = $b-$a $a含む後F(n-1)
  • $b += $a $b含む後F(n+1)

ここでの問題は初期化です。古典的な方法です$b += $a = $b-$a || 1が、シーケンスは1 2 3 5 ...

フィボナッチ数列を左に拡張することにより:

... 5 -3 2 -1 1 0 1 1 2 3 5 ...

適切な開始点は$a = -1and $b = 0です。$ aの初期化はループの設定と組み合わせることができます

最後に置き換える$aことにより、$;前にスペースを取り除くためにfor


2

2行のPythonソリューションを提供できます。これはそれらをリストとして返します。

f = lambda n: 1 if n < 2 else f(n-1) + f(n-2)
g = lambda m: map(f, range(0,m))

print g(5)

別のマップを追加して文字列にしてから結合を追加することで印刷することもできますが、それは私には不必要に思えます。

残念ながら、再帰的なラムダをに入れる方法がわからないmapので、2つの行で立ち往生しています。


それは何のために戻りg(100)ますか?;)
Llama氏、2012年

@GigaWattへえ、OPはそれが合理的である必要があるとは決して言っていません。漸近的な実行時間はO(n(1.62)^ n)のようなものですか?
クリスハーパー

これが(一種の)これを行う方法の1つです。注ことf(n)n<=0戻り整数、およびn>0リターンリストは、..だから多分それは理想的ではありません:f = lambda n: map(f, (-x for x in range(0, n))) if n > 0 else -n if n > -2 else f(n+1) + f(n+2)
ディロン萎縮

ちなみに、あなた0はあなたの答えの最初を逃した。fリターンに変更することn if n < 2は、1つの回避策です。:)
Dillon Cower 2012年

@DC私はあなたのソリューションが好きです。かなりクリエイティブ。ええ、私は1、1から始めました。それが私がいつもそれを学んだ方法だからです。簡単に変更できると思いました。
クリスハーパー

2

Python(78文字)

フィボナッチ数を計算するためにビネットの公式を使用しました-

[(1 + sqrt(5))^ n-(1-sqrt(5)^ n] / [(2 ^ n)sqrt(5)]

ここでは他のいくつかの答えほど小さくはありませんが、男の子は速いです

n=input()
i=1
x=5**0.5
while i<=n:
    print ((1+x)**i-(1-x)**i)/((2**i)*x)
    i+=1

1
Python(12文字):print"11235":)
Joel Cornett

かっこを取り除いて、2文字を削ることができ2**iます。**優先順位が高い*
Joel Cornett

binetの公式の2番目の項は、最初は小さく、小さくなります。完全に
省略

2

スキーム

これは、末尾再帰を使用して最適化されます。

(define (fib n)
  (let fib ([n n] [a 0] [b 1])
    (if (zero? n) (list a)
        (cons a (fib (- n 1) b (+ a b))))))


2

J、25文字

Jソリューションはおそらくあなたが求めているものではないことを私は理解していますが、とにかくここにあります。:-)

0 1(],+/&(_2&{.))@[&0~2-~

使用法:

    0 1(],+/&(_2&{.))@[&0~2-~ 6
0 1 1 2 3 5
    0 1(],+/&(_2&{.))@[&0~2-~ 10
0 1 1 2 3 5 8 13 21 34

使い方:

右から(Jプログラムは右から左に読み込まれるため)、

2-~ 6~これは同じであるので、オペレータは、動詞の引数を反転させます6-2

今のところ括弧内のセクションを無視して、括弧内0 1(...)@[&0~ xの動詞を取得xし、リスト0 1を入力として使用してそれを繰り返し実行します- ~ここでも引数を逆x (...)@[&0 ] 0 1にします。

括弧内のフォークである],+/&(_2&{.)- 3つの動詞で構成され],そして+/&(_2&{.)

フォークは3つの動詞a b cを取り、次のように使用します。(x a y) b (x c y)ここでx、およびyは、フォークへの引数です。,このフォークの中心動詞であるとの結果合流x ] yしてx +/&(_2&{.) y一緒に。

]左の引数を変更せずに返すため、にx ] y評価されxます。

+/&(_2&{.)指定されたリストから最後の2つの項目(_2&{.)(この場合0 1は)を取得して+/、それらを一緒に追加します(&sは接着剤として機能します)。

動詞が動作すると、結果が次の実行のためにフィードバックされ、シーケンスが生成されます。


2

TI-Basic、43文字

:1→Y:0→X
:For(N,1,N
:Disp X
:Y→Z
:X+Y→Y
:Z→X
:End

このコードは、メインプログラムに直接挿入することも、最初のプログラムが参照する別のプログラムにすることもできます。


これは私がここで見た最初のTI-BASICソリューションで、私が手に入れたものではありません:) +1
Timtech

また、改行は削除される可能性があるため、ここではカウントされないことを他の人に注意してください。
Timtech 2014年

TI-92 big-giant-qwerty-keyboard電卓を入手しました。これをありがとう。
ウォレンP

2

APL(33)

{⍎'⎕','←0,1',⍨'←A,+/¯2↑A'⍴⍨9×⍵-2}

使用法:

   {⍎'⎕','←0,1',⍨'←A,+/¯2↑A'⍴⍨9×⍵-2}7
0 1 1 2 3 5 8

ボックス文字⎕はAPLの一部ですか、それともグリフが不足していますか?
ウォレンP

@WarrenP:左から4番目の文字を意味する場合、これは「クワッド」と呼ばれ、そのように見えるはずです。ボックスは1つだけです。
マリナス2014


1

PowerShell-35文字

Powershellはパイプライン入力を受け入れるのでn |n | <mycode>が私のカウントに反するべきはなく、言語で「関数」を開始するための一部にすぎないといます。

最初のソリューションは、0から始めることを前提としています。

%{for($2=1;$_--){($2=($1+=$2)-$2)}}

2番目のソリューションでは、1から始めることができると想定しています。

%{for($2=1;$_--){($1=($2+=$1)-$1)}}

呼び出し例: 5 | %{for($2=1;$_--){($1=($2+=$1)-$1)}}

収量:

1
1
2
3
5

興味深いことに、for()ループのオーバーヘッドを回避しようとすると、同じ文字数になります%{$2=1;iex('($1=($2+=$1)-$1);'*$_)}


1

Python、43文字

以下は、Binetの式を使用しない根本的に異なる3つのワンライナーです。

f=lambda n:reduce(lambda(r,a,b),c:(r+[b],a+b,a),'.'*n,([],1,0))[0]
f=lambda n:map(lambda x:x.append(x[-1]+x[-2])or x,[[0,1]]*n)[0]
def f(n):a=0;b=1;exec'print a;a,b=b,a+b;'*n

私はreduceそんなにひどく虐待したことがありません。


1
+1のreduce乱用
Warren P

1

dc、32文字:

これは実際には常に最初の2つの1を表示するため、関数はN> = 2に対して期待どおりにのみ機能します。

?2-sn1df[dsa+plarln1-dsn0<q]dsqx

C、75文字:

受け入れられた回答ほどクールではありませんが、短くて高速です。

main(n,t,j,i){j=0,i=scanf("%d",&n);while(n--)t=i,i=j,printf("%d\n",j+=t);}
追加:

CL、64文字:

私の最も使用されるのひとつのブックマークは、この学期はより短く、興味深い例がある多くのここで他のもののいくつかを、そして、それはちょうどのストレートな呼び出しだloopマクロ-基本的には一つだけの文!私ができるすべての空白のためにそれを取り除きました:

(loop repeat n for x = 0 then y and y = 1 then(+ x y)collect y)

かなり短くて、読みやすくなっています!入力を読み取るには、n (周囲の空白を含む)をに置き換えて(read)、3文字を追加します。


main4つの引数を取りますか?

1
それはあなたがそれを与えるのと同じくらい多くかかります。この場合、後で使用されるいくつかの変数を定義するために(ab)使用されます:)
daniero

1

FALSE、28バイト

0 1- 1 10[$][@@$@+$." "@1-]#

あなたは生成することができます-1使用1_するのではなく0 1 -
12Me21

1

Python 2、38バイト

以前に投稿されたソリューションの改善:

a=b=1
exec'print a;a,b=b,a+b;'*input()

これはexec、ループを回避するために文字列乗算を使用します。

Python 3、46バイト

Python 3ではそれほど効率的ではありません。

a=b=1
exec('print(a);a,b=b,a+b;'*int(input()))

Python 2に切り替えると、9バイトを節約できます。オンラインでお試しください!おそらくあなたの答えにPython 2バージョンを追加することができます。
スティーブン

@スティーブン良い点!更新しました。
ラッセルシュワルツ

0

C99、58文字

次の関数は、n0から始まるフィボナッチ数列の最初の値で整数の配列を埋めます。

void f(int*a,int n){for(int p=0,q=1;n--;q+=*a++)*a=p,p=q;}

nコマンドライン引数として、ハーネスをテストします。

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
     int n = (argc > 1) ? atoi(argv[1]) : 1;
     int a[n];
     f(a, n);
     for (int i = 0; i < n; ++i)
          printf("%d\n", a[i]);
}

0

CoffeeScript、48

f=(n,i=1,j=1)->(console.log i;f n-1,j,i+j)if n>0

jsの65:

function f(n,i,j){if(n>0)console.log(i),f(n-1,(j=j||1),(i||1)+j)}

0

PHP、87

function f($n,$a=array(0,1)){echo' '.$a[0];$n>0?f(--$n,array($a[1],array_sum($a))):'';}

array_sumシリーズを生成するために再帰関数を使用します。

例えば:

 $ php5 fibo.php 9
 0 1 1 2 3 5 8 13 21 34 


0

Scala、65文字

(Seq(1,0)/:(3 to 9)){(s,_)=>s.take(2).sum+:s}.sorted map println

たとえば、最初の9つのフィボナッチ数が出力されます。コンソール入力からシーケンスの長さを使用するより使いやすいバージョンでは、70文字が必要です。

(Seq(1,0)/:(3 to readInt)){(s,_)=>s.take(2).sum+:s}.sorted map println

Rangeの使用はこれをInt値に制限することに注意してください。



0

Lua、85バイト

私はLuaを学んでいるので、この言語をプールに追加したいと思います。

function f(x)
    return (x<3) and 1 or f(x-1)+f(x-2)
end
for i=1,io.read() do
    print(f(i))
end

全体で85文字、パラメーターをコマンドライン引数として使用しました。もう一つの良い点は、それが読みやすいことです。


0

FALSE、20文字

^1@[1-$][@2ø+$.\9,]#

これを実行する前に、入力をスタックに置く必要があります。


0

Pyt、3バイト

ř⁻Ḟ

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

ř配列[1、2、3、...、x]を作成します
everyは、すべてのアイテムを1回デクリメントします(Ḟは0にインデックス付けされるため)
x xのすべてのアイテムについて、フィボナッチ数に変換します


0

x86マシンコード-379バイト

ELFヘッダーが484バイトのスコアを持つバージョン:

00000000: 7f45 4c46 0101 0100 0000 0000 0000 0000  .ELF............
00000010: 0200 0300 0100 0000 c080 0408 3400 0000  ............4...
00000020: 0000 0000 0000 0000 3400 2000 0200 2800  ........4. ...(.
00000030: 0000 0000 0100 0000 0000 0000 0080 0408  ................
00000040: 0000 0000 e401 0000 0010 0000 0500 0000  ................
00000050: 0010 0000 0100 0000 0000 0000 0090 0408  ................
00000060: 0000 0000 0000 0000 0000 1000 0600 0000  ................
00000070: 0010 0000 0000 0000 0000 0000 0000 0000  ................
00000080: 51b9 0090 0408 8801 31c0 ba01 0000 00eb  Q.......1.......
00000090: 0351 89c1 31c0 89c3 43b0 04cd 8031 c099  .Q..1...C....1..
000000a0: 4259 c300 0000 0000 0000 0000 0000 0000  BY..............
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000000c0: 31c0 9942 b903 9004 08c6 4101 0ac6 4102  1..B......A...A.
000000d0: 01c6 4103 013a 7103 0f84 ff00 0000 3a71  ..A..:q.......:q
000000e0: 0374 2680 4103 050f b641 036b c008 0041  .t&.A....A.k...A
000000f0: 048a 4104 e887 ffff ff80 6904 30c6 4103  ..A.......i.0.A.
00000100: 0183 e903 3a71 0375 da8a 4104 e86f ffff  ....:q.u..A..o..
00000110: ff3a 7106 0f84 ba00 0000 0fb6 4105 8841  .:q.........A..A
00000120: 060f b641 0788 4105 0fb6 4107 0041 06c6  ...A..A...A..A..
00000130: 4107 003a 7106 0f84 8800 0000 c641 0701  A..:q........A..
00000140: fe49 063a 7106 0f84 7800 0000 c641 0702  .I.:q...x....A..
00000150: fe49 063a 7106 0f84 6800 0000 c641 0703  .I.:q...h....A..
00000160: fe49 063a 7106 0f84 5800 0000 c641 0704  .I.:q...X....A..
00000170: fe49 063a 7106 744c c641 0705 fe49 063a  .I.:q.tL.A...I.:
00000180: 7106 7440 c641 0706 fe49 063a 7106 7434  q.t@.A...I.:q.t4
00000190: c641 0707 fe49 063a 7106 7428 c641 0708  .A...I.:q.t(.A..
000001a0: fe49 063a 7106 741c c641 0709 fe49 063a  .I.:q.t..A...I.:
000001b0: 7106 7410 fe41 08fe 4109 fe49 060f b641  q.t..A..A..I...A
000001c0: 0688 4107 c641 0601 83c1 033a 7106 0f85  ..A..A.....:q...
000001d0: 46ff ffff 3a71 030f 8501 ffff ffb3 0031  F...:q.........1
000001e0: c040 cd80                                .@..

ヘッダーなしバージョン(つまり、評価されるバージョン):

00000000: 67c6 4101 0a67 c641 0201 67c6 4103 0167  g.A..g.A..g.A..g
00000010: 3a71 030f 842a 0167 3a71 0374 2e67 8041  :q...*.g:q.t.g.A
00000020: 0305 6667 0fb6 4103 666b c008 6700 4104  ..fg..A.fk..g.A.
00000030: 678a 4104 e80d 0167 8069 0430 67c6 4103  g.A....g.i.0g.A.
00000040: 0166 83e9 0367 3a71 0375 d267 8a41 04e8  .f...g:q.u.g.A..
00000050: f200 673a 7106 0f84 df00 6667 0fb6 4105  ..g:q.....fg..A.
00000060: 6788 4106 6667 0fb6 4107 6788 4105 6667  g.A.fg..A.g.A.fg
00000070: 0fb6 4107 6700 4106 67c6 4107 0067 3a71  ..A.g.A.g.A..g:q
00000080: 060f 84a3 0067 c641 0701 67fe 4906 673a  .....g.A..g.I.g:
00000090: 7106 0f84 9200 67c6 4107 0267 fe49 0667  q.....g.A..g.I.g
000000a0: 3a71 060f 8481 0067 c641 0703 67fe 4906  :q.....g.A..g.I.
000000b0: 673a 7106 0f84 7000 67c6 4107 0467 fe49  g:q...p.g.A..g.I
000000c0: 0667 3a71 0674 6167 c641 0705 67fe 4906  .g:q.tag.A..g.I.
000000d0: 673a 7106 7452 67c6 4107 0667 fe49 0667  g:q.tRg.A..g.I.g
000000e0: 3a71 0674 4367 c641 0707 67fe 4906 673a  :q.tCg.A..g.I.g:
000000f0: 7106 7434 67c6 4107 0867 fe49 0667 3a71  q.t4g.A..g.I.g:q
00000100: 0674 2567 c641 0709 67fe 4906 673a 7106  .t%g.A..g.I.g:q.
00000110: 7416 67fe 4108 67fe 4109 67fe 4906 6667  t.g.A.g.A.g.I.fg
00000120: 0fb6 4106 6788 4107 67c6 4106 0166 83c1  ..A.g.A.g.A..f..
00000130: 0367 3a71 060f 8521 ff67 3a71 030f 85d6  .g:q...!.g:q....
00000140: fe00 0000 6651 66b9 7801 0000 6788 0166  ....fQf.x...g..f
00000150: 31c0 66ba 0100 0000 eb05 6651 6689 c166  1.f.......fQf..f
00000160: 31c0 6689 c366 43b0 04cd 8066 31c0 6699  1.f..fC....f1.f.
00000170: 6642 6659 c300 0000 0000 00              fBfY.......

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