最初のn個の偶数フィボナッチ数の合計


19

このコンテストはまだ開催されていないようです。

タスクは簡単です。n偶数であるフィボナッチ数列の最初の数を追加し、結果を出力します。

これはOEIS A099919によって与えられますが、シーケンスはからではfib(1) = 0なく、1ずつシフトされfib(1) = 1ます。

これはコードゴルフです。最も少ないバイト数が優先されます。

n sum
1 0
2 2
3 10
4 44
5 188
6 798
7 3382
8 14328
9 60696

関連する



@EasterlyIrkテストケースは後者を意味しますが、明示的に記述する必要があります。
メゴ

@Megoええ、私もそう思いました。
Rɪᴋᴇʀ

9
すぐに回答を受け入れないでください。それはたった1時間で、ゴルファーの答え入る可能性があります。編集:まだ受け入れられていない短い答えがすでにあるようです。
Rɪᴋᴇʀ

6
多くの人が回答をチャレンジがアクティブではなくなった兆候として解釈するため、回答を受け入れるまで少なくとも1週間待つのが慣習です。
ズガルブ

回答:


8

オアシス 8 7 5バイト

@ETHProductionsのおかげで1バイト、@ Adnanのおかげでさらに2バイト節約されました!

zc»+U

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

説明:

これは、MATLの回答と同じ繰り返し式を使用します。


1
Oasisのinfo.txtではU、コード内でがに置き換えられていると書かれていますが00、これでバイトを節約できますか?
ETHproductions

@ETHproductionsありがとう!私はそれを忘れていた
ルイスメンドー

1
いいね!あなたは置き換えることができ4*z2+して»:)
アドナン・

@アドナンありがとうございます!私は本当にドキュメントを読む必要があります:
ルイスメンドー

17

Python、33バイト

c=2+5**.5
lambda n:(7-c)*c**n//20

オンラインで試す

魔法のフォーミュラ!


3
うん 2行目の20を「コメントアウト」している理由を理解するのに必要な時間よりもはるかに時間がかかりまし
テオ

@xnor、この魔法の式への参照はありますか?
TheChetan

@TheChetan:多分a(n) = (-10 + (5-3*sqrt(5))*(2-sqrt(5))^n + (2+sqrt(5))^n*(5+3*sqrt(5)))/20(Colin Barker、2016年11月26日)OEISページから
タイタス


7

実際には、6バイト

r3*♂FΣ

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

説明:

3番目ごとのフィボナッチ数(から始まるF_0 = 0)は偶数です。したがって、最初のn偶数フィボナッチ数はのF_{i*3}iなり[0, n)ます。

r3*♂FΣ
r       [0, n)
 3*     multiply each element by 3
   ♂F   retrieve the corresponding element in the Fibonacci sequence
     Σ  sum

7

JavaScript(ES6)、27バイト

f=x=>x>1&&4*f(x-1)+f(x-2)+2

救助への回帰!これは、OEISページのいずれかの式を使用します。

f(n <1)= 0、f(n)= 4 * a(n + 1)+ a(n)+2

(ただし、チャレンジによって1つシフトされるため、1つシフトされます)



4

Perl 6の 38の35  32バイト

{[+] grep(*%%2,(1,&[+]...*))[^($_-1)]}

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

{[+] grep(*%%2,(0,1,*+*...*))[^$_]}

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

{[+] (0,1,*+*...*)[3,6...^$_*3]}

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

拡張:

{  # bare block lambda with implicit parameter 「$_」

  [+]                       # reduce with 「&infix:<+>」

    ( 0, 1, * + * ... * )\  # fibonacci sequence with leading 0

    [ 3, 6 ...^ $_ * 3 ]    # every 3rd value up to
                            # and excluding the value indexed by
                            # the input times 3

}

3

オクターブ36 35 33バイト

@(n)filter(2,'FAD'-69,(1:n)>1)(n)

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

説明

この無名関数は、差分方程式a(n) = 4*a(n-1)+a(n-2)+2再帰フィルターとして実装します

Y = filter(B,A,X)ベクター内のデータをフィルタリングXベクトルによって記述されるフィルタとAし、Bフィルタリングされたデータを作成しますY。このフィルターは、標準差分方程式の「直接形式II転置」実装です。

a(1)*y(n) = b(1)*x(n) + b(2)*x(n-1) + ... + b(nb+1)*x(n-nb) - a(2)*y(n-1) - ... - a(na+1)*y(n-na)

私たちの場合A = [1 -4 -1]B = 2および入力はx出力の最後のエントリとして表示される結果と、1のベクトルでなければなりませんy。ただし、必要に応じて出力に0イニシャル0が表示されるように、入力の最初の値に設定します。

'FAD'-69は、係数ベクトルを生成するための短い方法A = [1 -4 -1]です。(1:n)>1入力ベクトルを生成しますx = [0 1 1 ... 1]


3

dc25 22バイト

9k5v1+2/3?*1-^5v/0k2/p

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

または、プログラムをファイルに保存し、次のように入力して実行します

dc -f *filename*

プログラムは、stdinで負でない整数nを受け入れ、stdoutで最初のn個の偶数フィボナッチ数の合計を出力します。(フィボナッチ数列は、OPの例に従って0から始まると解釈されます。)


このプログラムは、最初のn個の偶数フィボナッチ数の合計に式(F(3n-1)-1)/ 2を使用します。ここで、Fは通常のフィボナッチ関数であり、F(0)= 0、F(1)= 1、F(n)= F(n-2)+ F(n-1)(n> = 2)


dcはスタックベースの計算機です。詳細な説明は次のとおりです。

9k  # Sets the precision to 9 decimal places (which is more than sufficient).

5v  # Push the square root of 5

1+  # Add 1 to the number at the top of the stack.

2/  # Divide the number at the top of the stack by 2.

この時点で、数字(1 + sqrt(5))/ 2はスタックの一番上にあります。

3   # Push 3 on top of the stack.

?   # Read a number from stdin, and push it.

\*  # Pop two numbers from the stack, multiply them, and push the product

1-  # Subtract 1 from the number at the top of the stack.

この時点で、3n-1はスタックの最上部(nは入力)にあり、(1 + sqrt(5))/ 2は最上部から2番目です。

^   # Pop two numbers from the stack (x, then y), compute the power y^x, and push that back on the stack.

5v/ # Divide the top of the stack by sqrt(5).

この時点で、スタックの一番上の数字は(((1 + sqrt(5))/ 2)^(3n-1))/ sqrt(5)です。この数に最も近い整数はF(3n-1)です。F(3n-1)は常に奇数であることに注意してください。

0k # Change precision to 0 decimal places.

2/ # Divide the top of the stack by 2, truncating to an integer.

p # Print the top of the stack on stdout.

3

Mathematica、 27 21バイト

代替式を指摘してくれたxnor、開始インデックスを修正してくれたalephalphaに感謝

Fibonacci[3#-1]/2-.5&

1
かもしれない(Fibonacci(3*n+2)-1)/2式が短くなりますか?
-xnor

2

MATL15 14バイト

OOi:"t4*b+2+]x

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

説明

これは、OEISの繰り返し式のいずれかを使用します。

a(n)= 4 * a(n-1)+ a(n-2)+2

入力Nの場合、コードはN回繰り返されますが、これは必要な回数より2回多くなります。これを設定することによって補償される00(代わりに02初期値として、そして最後に得られた値を削除して、以前のいずれかを表示することによって)。

OO      % Push two zeros as initial values of a(n-2), a(n-1)
i       % Input N
:"      % Do this N times
  t     %   Duplicate a(n-1)
  4*    %   Multiply by 4
  b+    %   Bubble up a(n-2) and add to 4*a(n-1)
  2+    %   Add 2. Now we have 4*a(n-1)+a(n-2)+2 as a(n), on top of a(n-1)
]       % End
x       % Delete last value, a(n). Implicitly display the remaining value, a(n-1)

2

バッチ、80バイト

@set/at=x=0,y=1
@for /l %%i in (2,1,%1)do @set/az=x+y,y=z+x,t+=x=y+z
@echo %t%

3つごとのフィボナッチ数が偶数であるという事実を使用し、それらを一度に3つだけ計算します(値を入れ替える必要がないため、実際には一度に複数を計算する方が簡単です)。(Fibonacci(3*n+2)-1)/2定式化を試みましたが、実際には数バイト長くなります(t+=コードサイズの点で非常に効率的であることがわかりました)。


2

C、82 38 36バイト

@BrainSteelのおかげで2バイト節約

OEISページの式により、はるかに短くなりました。

a(n){return--n<1?0:4*a(n)+a(n-1)+2;}

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

82バイト:

x,s,p,n,c;f(N){s=0;p=n=1;c=2;while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}

最初のバージョンは75バイトですが、常に前の呼び出しfよりNも大きい値で呼び出す場合を除き、関数は再利用できません:-)

x,s,p=1,n=1,c=2;f(N){while(n<N){if(~c&1)s+=c,n++;x=p+c;p=c;c=x;}return s;}

ここで私の最初の答え。他の回答もOEISもチェックしませんでした。私はそれを短くするために適用できるいくつかのトリックがあると思います:-)


1
少しシャッフルして、これを少し短くすることができます:a(n){return--n<1?0:4*a(n)+a(n-1)+2;}(36バイト)
-BrainSteel

1

ハスケル( 32 31バイト)

@ChristianSieversのおかげで1バイト節約できました。

OEISに記載されている式を使用:a(n) = 4*a(n-1)+a(n-2)+2, n>1Gary Detlefs著

a n|n>1=4*a(n-1)+a(n-2)+2|n<2=0


n<=1整数のゴルファーの言い方はn<2です。また、2番目の条件は最初の条件の否定である必要はありません(イディオムotherwiseは単純ですTrue)ので、ゴルフのようなもの1<2は通常使用されます。
クリスチャンシーバーズ

@ChristianSievers確かに、n <2は明らかな改善です、ありがとう。2番目の方法も同様に機能しますが、この場合は何も保存されません。私はいまだにHaskellを学んでおり、そのような警備員がいることに気がつきませんでした。ありがとうございました!
ディランミース

1

Mathematica、32 27バイト

Fibonacci[3Input[]-1]/2-1/2

功績XNOR。ジョンファンミンのおかげで5バイト節約されました。


確かにMathematicaにはフィボナッチがあり、どちらかを実行するか(Fibonacci(3*n+2) - 1)/2、墨を書く方が短いですか?
-xnor

@JungHwanMinこれは盗作ではありません。OEISページに言及しています。また、これはコミュニティWikiの候補ではありません。コミュニティWikiの使用方法を参照してください
デニス

@devRichter投稿の削除を取り消してすみませんが、会話が必要でした。削除したままにしておきたい場合はお知らせください。この会話をチャットルームに移動します。
デニス

@Dennisはまだ、Vincenzo Librandiに明示的にクレジットを与えるべきだと思います-(最後のコメントを誤って削除しました...削除を取り消すことができますか?)
ジョンファンミン

私が意味したのは、投稿に彼の名前を記載することでした...(または(* Vincenzo Librandi, Mar 15 2014 *)、OEISのように、投稿にMathematicaコメントを含めることもできます。)
ジョンファンミン

1

R、42バイト

ここで @rtrunbullによる以前のソリューションとは対照的に、非再帰的なソリューション。

for(i in 1:scan())F=F+gmp::fibnum(3*i-3);F

フィボナッチ数列の3番目の各値が偶数であるというプロパティを使用します。また、という事実を悪用F、デフォルトで次のように定義されします。FALSE=0、値を追加するための基礎として使用できるようにします。


1

R、42 41バイト

sum(DescTools::Fibonacci(3*(scan():2-1)))

scan()nstdinから取得します。

scan():2-1:から整数を生成nする2ことにより減少し、1n-11

3*(scan():2-1) :3つごとにフィボナッチ数が偶数であるため、3を掛けます。

DescTools::Fibonacci(3*(scan():2-1)) :これらのフィボナッチ数(すなわち、 3を介して(n-1)*3)。

sum(DescTools::Fibonacci(3*(scan():2-1))) :結果を合計します。

以前は、OEISの式の1つを使用してこの興味深いソリューションがありました。

a=function(n)`if`(n<2,0,4*a(n-1)+a(n-2)+2)

私は再帰なしであなたのバイト数を一致させることができました:)
JAD

@JarkoDubbeldamいいね!私も再帰を捨て、1バイト改善しました:)
rturnbull

ニース、それは何がdesctools::fibonacciできませんnumbers::fibonacciか?その霧が少し短くなるからです。
JAD

ああ、気にしないで、見つけた。甘い、私が見つけた他の実装は、一度に複数の数字を要求することをサポートしていません。
JAD

1
うん@JarkoDubbeldam、タイプの`` GMP :: fibnum「」を返すオブジェクトbigz*apply関数変換のクラスが入力するrawための理由...
rturnbull


1

PHP、73 70バイト

for(${0}=1;$i++<$argv[1];$$x=${0}+${1})${$x^=1}&1?$i--:$s+=$$x;echo$s;

変数変数を紹介します。に)。で実行し-nrます。

壊す

for(${0}=1;         # init first two fibonaccis (${1}=NULL evaluates to 0 in addition)
                    # the loop will switch between $0 and $1 as target.
    $i++<$argv[1];  # loop until $i reaches input
    $$x=${0}+${1}       # 3. generate next Fibonacci
)
    ${$x^=1}            # 1. toggle index (NULL => 1 => 0 => 1 ...)
    &1?$i--             # 2. if current Fibonacci is odd, undo increment
    :$s+=$$x;           #    else add Fibonacci to sum
echo$s;             # print result

数字は、PHPで完全に有効な変数名です。
しかし、リテラルについては、中括弧が必要です。すなわち${0}、ない$0

36バイト、O(1)

<?=(7-$c=2+5**.5)*$c**$argv[1]/20|0;

xnor´sの回答のポート


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