フィボナッチオリアル


36

定義

F(n)正整数のフィボナッチ数列は、次のように定義されます。

1. F(1) = 1
2. F(2) = 1
3. F(n) = F(n-1) + F(n-2), where n is an integer and n > 2

正の整数のフィボナッチ口径はの積です[F(1), F(2), ..., F(n)]

仕事

正の整数が与えられた場合n、のフィボナッチオリアルを見つけますn

スペック

のフィボナッチオリアルは100、合理的なコンピューターで5秒未満で計算する必要があります。

テストケース

n   Fibonacci-orial of n
1   1
2   1
3   2
4   6
5   30
6   240
7   3120
8   65520
9   2227680
10  122522400
11  10904493600
12  1570247078400
13  365867569267200
14  137932073613734400
15  84138564904377984000
16  83044763560621070208000
17  132622487406311849122176000
18  342696507457909818131702784000
19  1432814097681520949608649339904000
20  9692987370815489224102512784450560000
100 3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225261757371666449068625033999573552165524529725467628060170886602001077137613803027158648329335507728698605769992818756765633305318529965186184043999696650407246193257877568825245646129366994079739720698147440310773871269639752334356493678913424390564535389212240038895626811627949132978086070255082668392290037141141291484839596694182152062726390364094447642643912371532491388089634845995941928089653751672688740718152064107169357399466473375804972260594768969952507346694189050233823596316467570584434128052398891223730335019092974935617029638919358286124350711360361279157416837428904150054292406756317837582840596331363581207781793070936765786629772999832857257349696094416616259974304208756997835360702840912518532683324936435856348020736000000000000000000000000

参照資料



1
@LuisMendoフィボナッチの合計は...あなたが推測したように、フィボナッチです。まあ、マイナス1。
リーキー修道女

2
@LeakyNun現在、JavaScriptの回答はテストケースを15までしか完了しません。これは、JavaScriptが2 ^ 53-1を超える数値を正しく比較(または操作)できないためです。サポート番号が大きい
MayorMonty

1
「合理的なコンピューター」とはどういう意味ですか?
エリックアウトゴルファー16

2
-1これは、特に興味深いショートカットなしで、いくつかの課題(範囲、それぞれのフィボナッチ、階乗)が結び付けられているように見えるためです。
エソランジングフルーツ

回答:


63

Mathematica、10バイト

Fibonorial

別のMathematicaビルトインは、ビルトインなしでゴルフ言語に強く打ち込まれています。


49
私…w-what ...なぜ、Mathematica ?!
リン

3
機能が存在することすら忘れていました!
LegionMammal978

3
@Lynn ルール35:存在する場合、そのMathematica関数があります;)
ベータ崩壊

9
@BetaDecay 規則110であることが確立されたと思いました。
マーティンエンダー

1
いいえ、ルール110は非常に異なるものです。Mathematicaにもそのための組み込み機能があると確信していますが。
-AdmBorkBork

27

ゼリー、6 バイト

+С1ḊP

入力100は、ローカルで500ミリ秒で終了します。オンラインでお試しください!

使い方

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

   1    Yield 1.
+       Add the left and right argument.
 С     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.
        Collect all values of the left argument into an array.
    Ḋ   Dequeue; discard the first Fibonacci number (0).
     P  Product; multiply the remaining ones.

では+¡1、n番目のフィボナッチに組み込まれていないの+С1は、最初のn個のフィボナッチ数ですか?
コイアリンガーアーイング

@cairdcoinheringaahingかなり。
デニス

フィボナッチ関数が組み込まれていると思いましたか?
MilkyWay90

21

実は、4バイト

0.2秒以内に入力100を実行します。コード:

R♂Fπ

説明:

R     # Get the range [1, ..., input].
 ♂F   # Map over the array with the fibonacci command.
   π  # Take the product.

CP-437エンコードを使用します。オンラインでお試しください!


1
これは仕事に最適なツールです:) Leaky Nunがしばらく前に行ったフィボナッチ関数の改善のおかげで、100テストケースはTIOで0.1秒で実行されます。
メゴ

16

Brainfuck、1198 1067 817 770 741 657 611 603

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

コメント付きの非圧縮:

# parse input (max 255)
,[>++++++[-<-------->]<<[->++++++++++<]>>,]
>+>+>>+>+<<<<<<
[->>>
  # compute next fibonacci number
  [[-]<
    [->+<]>>
    [-<+<+>>]<
    # perform carries
    [->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<
      [->[-]>>>>>>+>+<<<<<<<<[->+<]]
    ]]]]]]]]]+>>>>>>>>
  ]<<<<<<<<
  # multiplication
  [->
    # extract next digit of F_n (most significant first)
    [-<+<<+>>>]<
    [->+<]>>>
    # move back to the end
    [<<<<<
      [->>>>>>>>+<<<<<<<<]>>>>>>>>>>>>>
    ]<<<<<<<<
    # digit wise multiplication (shifting current digit)
    [->>>
      [-<<<<<<<<+>>>>
        [->+>>+<<<]>
        [-<+>]>>>
      ]<<
      # shift previous total over one gap (in effect multiplying by 10)
      [->>>>>>>+>+<<<<<<<<]<+<<<<<<<<
    ]>>>[-]>>>>>
    # add product to total
    [[-]>
      [->+<]>
      # perform carries
      [-<+>
        [-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>
          [->>>>>>+>+<<<<<<<<[-]]
        ]]]]]]]]>
      ]<<[<]+>>>>>>>>
    ]<<<<<<<<
    [<<<<<<<<]>>>>>
    [>>>>>>>>]+<<<<<<<<
  ]>>>>>>>>>>>
  # overwrite previous product
  [<[-]>>
    [-<<+>>]>>>>>>>
  ]<<<<<<<<
  [<<<<<<<<]>>
]>>>>>>
# output product
[>>>>>>>>]<<<<<<<<
[+++++
  [-<++++++++>]<.<<<<<<<
]

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

n = 100のランタイム、オンラインインタープリターで1秒未満です(ローカルで自分のインタープリターを使用して約0.2秒)。最大入力は255ですが、インタープリターが〜54000セルをサポートする必要があります(オンラインインタープリターは64kでラップするようです)。


変更ログ

現在の桁をより適切に抽出して乗算し、加算とキャリーを単一パスにマージすることにより、約130バイトを節約しました。また、少し速いようです。

さらに250バイトを保存しました。乗算スクラッチパッドを2セル減らすことができました。これにより、桁間を移動する必要がないため、どこでもバイトを節約できます。また、桁を乗算してキャリーをドロップし、代わりに現在の合計に加算しながらフルキャリーを実行しました。

さらに50を切り刻みました。最初の反復で前方に移動せずに、現在の桁をより適切に抽出して乗算します。いくつかのマイクロ最適化は、さらに約10バイトを占めます。

30がなくなった。すでに使用されている数字を1ではなく0でマークすると、見つけやすくなります。また、乗算ループが多少簡単に終了したかどうかのチェックも行います。

80バイト分、スクラッチパッドを別のセルだけ減らしました。以前の製品のマーカーと現在の現在の合計をマージすることでこれを行いました。これにより、ギャップ間のシフトが減少し、簿記が少し簡単になります。

さらに別のセルを削除し、フィボナッチ桁のマーカーを再利用して最後の桁もマークすることにより、さらに50を節約しました。また、ループをマージして、前の合計を桁ごとの乗算ループでシフトすることができました。

入力解析時に8バイトを保存しました。おっとっと。


14

Python、45バイト

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

入力は標準入力から取得されます。n = 100の出力は、正確に時間を調整するには速すぎます。n = 1000は約1秒かかります。

サンプルの使用法

$ echo 10 | python fib-orial.py
122522400

$ echo 100 | python fib-orial.py
3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225261757371666449068625033999573552165524529725467628060170886602001077137613803027158648329335507728698605769992818756765633305318529965186184043999696650407246193257877568825245646129366994079739720698147440310773871269639752334356493678913424390564535389212240038895626811627949132978086070255082668392290037141141291484839596694182152062726390364094447642643912371532491388089634845995941928089653751672688740718152064107169357399466473375804972260594768969952507346694189050233823596316467570584434128052398891223730335019092974935617029638919358286124350711360361279157416837428904150054292406756317837582840596331363581207781793070936765786629772999832857257349696094416616259974304208756997835360702840912518532683324936435856348020736000000000000000000000000

13

ハスケル41 29バイト

@Laikoniのコメントにより1 + 11バイトが節約されました。

f=1:scanl(+)1f
(scanl(*)1f!!)

1fおよび!!は個別のトークンです。最初の行はフィボナッチ数列を定義し、2行目はフィボナッチ数列を計算し、指定されたnのn番目を返す関数です。n = 1000の場合でも、すぐに数字の印刷を開始します。


1
スペースを取り除くことができます(scanl(*)1f!!)
ライコニ

2
短いフィボナッチジェネレータがあり、ここでf=1:scanl(+)1f
Laikoni

@Laikoniそれはすごい、ありがとう!
クリスチャンシーバーズ

2
@WillNess私は他のユーザーが行うことによって正当化されるだけでなく、meta.codegolf.stackexchange.com / questions / 2419 / およびmeta.codegolf.stackexchange.com/questions/9031/…によっても正当化されると思います(しかし、もっと多く、私はすべてを読んでいません)
クリスチャンシーバーズ

1
@flawr 42+42を追加する関数として受け入れますか?それは単なる未完成の表現なので、そうすべきではありません。しかしHaskell では、括弧を追加してセクション を取得でき(42+)ます\n->42+n。これは、関数を記述する方法です。ここでは同じですが、より複雑な第1オペランドの!!代わりに(インデックス作成用の二項中置演算子)のみが+あります。
クリスチャンシーバーズ

11

Python 2、39バイト

f=lambda n,a=1,b=1:n<1or a*f(n-1,b,a+b)

Ideoneでテストします。


True場合によっては返すように指定することもできます。
リーキー修道女

5
これはTrue、入力0に対してのみ返されますが、これは正ではありません。
デニス

6

J、17 16バイト

1バイトは、さらに優れたソリューションでマイル単位でゴルフされます。

[:*/+/@(!|.)\@i.

アイデアは元のものと同じですが、マイナーな対角線で動作するマトリックスを形成する代わりに、その場で対角線を形成します。


元の

最初のn個のフィボノミアルを取得するには:

*/\(#{.+//.)!/~i.

右から左へ読み
ます... i.指定されたものまで連続した整数の配列()を作成し、その配列から配列内のすべてのペアから計算される/~二項係数の表()を作成します!。この表は、Pascalの最初の行の終わりと主対角線の下のすべての要素は0です!+/すべてのマイナー対角線(/.)を合計()すると、フィボナッチ数が{.得られますが、結果の配列から#テーブル自体の長さ()と同じだけ多くの最初の要素を取得する必要があります。次に、製品(*/)が連続するプレフィックスに適用され(\配列の)には、所望のフィボノリアル列になります。あなたが望むなら、あなたはもう2バイトを使って最後の1つだけを取ることができますが{:)しかし、私はそれらのすべてを表示することは罪ではないと思いました:)
NB. the previous code block is not a J function

   {:*/\(#{.+//.)!/~i. 10
122522400

x最後に使用するJの大きな数字の場合:

   {:*/\(#{.+//.)!/~i. 100x
3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225...

プログラムはavarage 0.11sで実行されます。

   100 timex '{:*/\(#{.+//.)!/~i.100x'
0.112124

1
関数である代替は、[:*/+/@(!|.)\@i.16バイトを使用しています。を使用し!/~て生成するテーブルに沿って、その同じ二項係数を形成しますが、のプレフィックスを取得することでそれを形成しi.ます。
マイル

4

Pyth、13バイト

u*Gs=[sZhZ)Q1

デモンストレーション

これは賢い非タイプセーフなトリックを採用しています。5つの文字(u*G ... Q1)は、出力が入力された多くの数の積であることを示します。残りのコードは数値を生成します。

=[sZhZ)変数Zをリストに更新します[s(Z), h(Z)]。次にs、そのリストを合計して、乗算します。

Z初期値は0 sです。intでは、恒等関数です。h、その上に、+ 1関数です。したがって、最初の反復ではにZなり[0, 1]ます。s上記のように、リストにはsum関数があります。hヘッド関数です。したがって、2番目の反復は[1, 0]です。

リストは次のとおりです。

Iter  Z          Sum
0     0          Not used
1     [0, 1]     1
2     [1, 0]     1
3     [1, 1]     2
4     [2, 1]     3
5     [3, 2]     5

これらの合計が乗算されて結果が得られます。


4

Mathematica 25 24バイト

Martin Enderに感謝します。

1##&@@Fibonacci@Range@#&

1##&@@Fibonacci@Range@#&@100

タイミング:63マイクロ秒。

{0.000063, 
3371601853146468125386964065447576689828006172937411310662486977801540
6711385898686165008341900290675836651822917015531720110825745874313823
1009903039430687777564739516714333248356092511296002464445971530050748
1235056111434293619038347456390454209587101225261757371666449068625033
9995735521655245297254676280601708866020010771376138030271586483293355
0772869860576999281875676563330531852996518618404399969665040724619325
7877568825245646129366994079739720698147440310773871269639752334356493
6789134243905645353892122400388956268116279491329780860702550826683922
9003714114129148483959669418215206272639036409444764264391237153249138
8089634845995941928089653751672688740718152064107169357399466473375804
9722605947689699525073466941890502338235963164675705844341280523988912
2373033501909297493561702963891935828612435071136036127915741683742890
4150054292406756317837582840596331363581207781793070936765786629772999
8328572573496960944166162599743042087569978353607028409125185326833249
36435856348020736000000000000000000000000}

または、同じバイトカウントで:1##&@@Fibonacci~Array~#&
グレッグマーティン

4

ゼリー、8 バイト

RḶUc$S€P

ゼリーでの私の最初の提出。@Dennisのanswerほど短くはありませんが、別の方法では2バイトだけ長くなります。

ローカルでは、n = 100の@Dennisのバージョンでの380msと比較して約400msが必要です。

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

説明

RḶUc$S€P  Input: n
R         Generate the range [1, 2, ..., n]
          For each value x in that range
 Ḷ          Create another range [0, 1, ..., x-1]
  U         Reverse that list
   c        Compute the binomial coefficients between each pair of values
    $       Bind the last two links (Uc) as a monad
     S€   Sum each list of binomial coefficients
          This will give the first n Fibonacci numbers
       P  Take the product of those to compute the nth Fibonacci-orial

3

PARI / GP、29バイト

f=n->prod(i=1,n,fibonacci(i))

または、代わりに:

f=n->prod(i=a=!b=0,n,b=a+a=b)

3

R、99 96 78 76 66バイト

この答えは、関数と同様にBinetのFormulaを使用していprod(x)ます。Rには組み込みのPhi値がないため、自分で定義しました。

p=(1+sqrt(5))/2;x=1;for(n in 1:scan())x=x*(p^n-(-1/p)^n)/sqrt(5);x

5秒未満で動作しますが、RInfそれらの大きな数字の答えとして与える傾向があります...

アンゴルフド:

r=sqrt(5)
p=(1+r)/2 
x=1
for(n in 1:scan())        
    x=x*(p^n-(-1/p)^n)/r    
x

@Cyoceに感謝-2バイト!
ああ、私はこのサイトが大好きですか!@ user5957401のおかげで-10バイト


sqrt(5)変数に保存することで少し節約できる場合があります
チョイス

N一度しか使用しないので、1:Nビット内でscanを呼び出すだけです。すなわちfor(n in 1:scan())。forループで関数の*代わりに使用するだけで、いくつかの文字を保存することもできprod()ます。forループは1行だけなので、中括弧も必要ありません。
user5957401

Binetの式を使用するのは良い考えです。あなたの精神では53バイトだけですfunction(n,N=1:n,p=5^.5)prod(((1+p)^N-(1-p)^N)/2^N/p)
マイケルM

3

R、8253、49バイト(W /異なる入力スタイル48バイト)

b=d=1;a=0;for(i in 1:scan()){d=d*b;b=a+b;a=b-a};d

入力番号をコードの前に付けることができる場合、48バイトを取得します

->n;b=d=1;a=0;for(i in 1:n){d=d*b;b=a+b;a=b-a};d

編集:新しいコード。オリジナルは以下です:

a=function(n)ifelse(n<3,1,{v=c(1,1,3:n);for(i in 3:n)v[i]=v[i-1]+v[i-2];prod(v)})

Inf以外の何も返さない a(100)ただし。そして、負でない整数以外では機能しません。

ゴルフをしていない:

a=function(n){
   if(n<3) return(1)
   v=c(1,1,3:n)
   for(i in 3:n)
       v[i]=v[i-1]+v[i-2]
   prod(v)
}

3

Java、165バイト

ゴルフ:

BigInteger f(int n){BigInteger[]a={BigInteger.ZERO,BigInteger.ONE,BigInteger.ONE};for(int i=0;i<n;){a[++i%2]=a[0].add(a[1]);a[2]=a[2].multiply(a[i%2]);}return a[2];}

これは、BigInteger数が多いために必要なさらに別のケースです。しかし、テキストBigIntegerを最小限に抑え、サイズを小さくすることができました。また、静的インポートと比較して、全体の長さが長くなりました。

このプログラムは、配列内の3つの数値を追跡することにより機能します。最初の2つは、前の2つのフィボナッチ数です。3番目は累積値です。ループは、次の値を計算し、交互の(0、1、0、1、...)配列インデックスに格納することから始まります。これにより、(ソースサイズの点で)コストのかかる割り当て操作で値をシフトする必要がなくなります。次に、その新しい値を取得し、アキュムレーターに乗算します。

一時オブジェクトを回避し、ループを2つの代入演算子に制限することで、かなりのバイトを絞り出すことができました。

ゴルフをしていない:

import java.math.BigInteger;

public class Fibonacci_orial {

  public static void main(String[] args) {
    // @formatter:off
    String[][] testData = new String[][] {
      { "1", "1" },
      { "2", "1" },
      { "3", "2" },
      { "4", "6" },
      { "5", "30" },
      { "6", "240" },
      { "7", "3120" },
      { "8", "65520" },
      { "9", "2227680" },
      { "10", "122522400" },
      { "11", "10904493600" },
      { "12", "1570247078400" },
      { "13", "365867569267200" },
      { "14", "137932073613734400" },
      { "15", "84138564904377984000" },
      { "16", "83044763560621070208000" },
      { "17", "132622487406311849122176000" },
      { "18", "342696507457909818131702784000" },
      { "19", "1432814097681520949608649339904000" },
      { "20", "9692987370815489224102512784450560000" },
      { "100", "3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225261757371666449068625033999573552165524529725467628060170886602001077137613803027158648329335507728698605769992818756765633305318529965186184043999696650407246193257877568825245646129366994079739720698147440310773871269639752334356493678913424390564535389212240038895626811627949132978086070255082668392290037141141291484839596694182152062726390364094447642643912371532491388089634845995941928089653751672688740718152064107169357399466473375804972260594768969952507346694189050233823596316467570584434128052398891223730335019092974935617029638919358286124350711360361279157416837428904150054292406756317837582840596331363581207781793070936765786629772999832857257349696094416616259974304208756997835360702840912518532683324936435856348020736000000000000000000000000" }
    };
    // @formatter:on

    for (String[] data : testData) {
      System.out.println("Input: " + data[0]);
      System.out.println("Expected: " + data[1]);
      System.out.print("Actual:   ");
      System.out.println(new Fibonacci_orial().f(Integer.parseInt(data[0])));
      System.out.println();
    }
  }

  // Begin golf
  BigInteger f(int n) {
    BigInteger[] a = { BigInteger.ZERO, BigInteger.ONE, BigInteger.ONE };
    for (int i = 0; i < n;) {
      a[++i % 2] = a[0].add(a[1]);
      a[2] = a[2].multiply(a[i % 2]);
    }
    return a[2];
  }
  // End golf

}

プログラム出力:

Input: 1
Expected: 1
Actual:   1

Input: 2
Expected: 1
Actual:   1

Input: 3
Expected: 2
Actual:   2

Input: 4
Expected: 6
Actual:   6

Input: 5
Expected: 30
Actual:   30

Input: 6
Expected: 240
Actual:   240

Input: 7
Expected: 3120
Actual:   3120

Input: 8
Expected: 65520
Actual:   65520

Input: 9
Expected: 2227680
Actual:   2227680

Input: 10
Expected: 122522400
Actual:   122522400

Input: 11
Expected: 10904493600
Actual:   10904493600

Input: 12
Expected: 1570247078400
Actual:   1570247078400

Input: 13
Expected: 365867569267200
Actual:   365867569267200

Input: 14
Expected: 137932073613734400
Actual:   137932073613734400

Input: 15
Expected: 84138564904377984000
Actual:   84138564904377984000

Input: 16
Expected: 83044763560621070208000
Actual:   83044763560621070208000

Input: 17
Expected: 132622487406311849122176000
Actual:   132622487406311849122176000

Input: 18
Expected: 342696507457909818131702784000
Actual:   342696507457909818131702784000

Input: 19
Expected: 1432814097681520949608649339904000
Actual:   1432814097681520949608649339904000

Input: 20
Expected: 9692987370815489224102512784450560000
Actual:   9692987370815489224102512784450560000

Input: 100
Expected: 3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225261757371666449068625033999573552165524529725467628060170886602001077137613803027158648329335507728698605769992818756765633305318529965186184043999696650407246193257877568825245646129366994079739720698147440310773871269639752334356493678913424390564535389212240038895626811627949132978086070255082668392290037141141291484839596694182152062726390364094447642643912371532491388089634845995941928089653751672688740718152064107169357399466473375804972260594768969952507346694189050233823596316467570584434128052398891223730335019092974935617029638919358286124350711360361279157416837428904150054292406756317837582840596331363581207781793070936765786629772999832857257349696094416616259974304208756997835360702840912518532683324936435856348020736000000000000000000000000
Actual:   3371601853146468125386964065447576689828006172937411310662486977801540671138589868616500834190029067583665182291701553172011082574587431382310099030394306877775647395167143332483560925112960024644459715300507481235056111434293619038347456390454209587101225261757371666449068625033999573552165524529725467628060170886602001077137613803027158648329335507728698605769992818756765633305318529965186184043999696650407246193257877568825245646129366994079739720698147440310773871269639752334356493678913424390564535389212240038895626811627949132978086070255082668392290037141141291484839596694182152062726390364094447642643912371532491388089634845995941928089653751672688740718152064107169357399466473375804972260594768969952507346694189050233823596316467570584434128052398891223730335019092974935617029638919358286124350711360361279157416837428904150054292406756317837582840596331363581207781793070936765786629772999832857257349696094416616259974304208756997835360702840912518532683324936435856348020736000000000000000000000000


2

ルビー、39バイト

->n{f=i=b=1;n.times{f,i,b=i,f+i,b*f};b}

36:-> n {f = i = b = 1; n.times {b * = f; i = f + f = i}; b}
GB

2

Javascript(ES6)、51 39バイト

再帰的実装(39バイト)

f=(n,a=p=i=b=1)=>++i<n?f(n,b,p*=b+=a):p

元の実装(51バイト)

n=>{for(i=a=b=p=1;++i<n;){c=a;a=b;p*=b+=c}return p}

注:16のフィボナッチオリアルの丸め誤差を開始します。100は単なるInfinityであり、1秒未満のように見えます。


代替の53バイトバージョンを作成したのは、2バイトを節約する必要のないものをn=>[...Array(n)].reduce(p=>(c=a,a=b,p*=b+=c),a=1,b=0)カウントしたことを発見するためだけf=です。
ニール

公正なポイント。私の論理的根拠は、単に呼び出し可能いうよりは、呼び出し可能かつ再利用可能であるということでした。
パンダコーダー

確かに、誰かがそれを再利用したい場合は、名前を付けるオプションがまだあります。
ニール

@Neilさて、私は行って再実装しましたが、f =は必須であるか、実際には実行できません。:D
パンダコーダー

少なくとも、元の実装のバイトカウントを修正しました。
ニール

2

DC(GNUまたはOpenBSDフレーバー)、36バイト

ファイルA003266-v2.dc

0sA1sB1?[1-d0<LrlBdlA+sBdsA*r]dsLxrp

(末尾の改行なし)

...結果は、名前付きレジスタ(Yバージョン1)を使用する代わりに、スタックに保持されます。このrコマンドはオリジナルでは使用できませんdcRosettaCodeのDcページを参照)。

実行:

$ time dc -f A003266-v2.dc <<< 100
337160185314646812538696406544757668982800617293741131066248697780154\
067113858986861650083419002906758366518229170155317201108257458743138\
231009903039430687777564739516714333248356092511296002464445971530050\
748123505611143429361903834745639045420958710122526175737166644906862\
503399957355216552452972546762806017088660200107713761380302715864832\
933550772869860576999281875676563330531852996518618404399969665040724\
619325787756882524564612936699407973972069814744031077387126963975233\
435649367891342439056453538921224003889562681162794913297808607025508\
266839229003714114129148483959669418215206272639036409444764264391237\
153249138808963484599594192808965375167268874071815206410716935739946\
647337580497226059476896995250734669418905023382359631646757058443412\
805239889122373033501909297493561702963891935828612435071136036127915\
741683742890415005429240675631783758284059633136358120778179307093676\
578662977299983285725734969609441661625997430420875699783536070284091\
2518532683324936435856348020736000000000000000000000000

real    0m0.005s
user    0m0.004s
sys     0m0.000s

説明しよう:

tosスタックの最上部の内容で、削除しないでください。
nos以下の要素tosです。

0 sA # push(0) ; A=pop()
1 sB # push(1) ; B=pop()
1    # push(1)
     # this stack position will incrementally hold the product
?    # push( get user input and evaluate it )
[    # start string
 1-  # push(pop()-1)
 d   # push(tos)
 0   # push(0)
 <L  # if pop() < pop() then evaluate contents of register L
 r   # exchange tos and nos
     # now nos is the loop counter
     # and tos is the bucket for the product of the fibonacci numbers
 lB  # push(B)
 d   # push(tos)
 lA  # push(A)
 +   # push(pop()+pop())
     # now tos is A+B, nos still is B 
 sB  # B=pop()
     # completes B=A+B
 d   # push(tos)
 sA  # A=pop()
     # completes B=A
     # tos (duplicated new A from above) is the next fibonacci number
 *   # push(nos*tos)
     # tos now is the product of all fibonacci numbers calculated so far
 r   # exchange tos and nos
     # now tos is the loop counter, nos is the product bucket
]    # end string and push it
d    # push(tos)
sL   # L=pop()
x    # evaluate(pop())
r    # exchange tos and nos
     # nos now is the former loop counter
     # tos now is the complete product. \o/
p    # print(tos)
     # this does not pop() but who cares? :-P

DC、41バイト

...まっすぐ進む、トリックなし:

ファイルA003266-v1.dc

0sA1sB1sY?[1-d0<LlBdlA+sBdsAlY*sY]dsLxlYp

(末尾の改行なし)

実行:

$ for i in $(seq 4) ; do dc -f A003266-v1.dc <<< $i ; done
1
1
2
6
$ time dc -f A003266-v1.dc <<< 100
337160185314646812538696406544757668982800617293741131066248697780154\
067113858986861650083419002906758366518229170155317201108257458743138\
231009903039430687777564739516714333248356092511296002464445971530050\
748123505611143429361903834745639045420958710122526175737166644906862\
503399957355216552452972546762806017088660200107713761380302715864832\
933550772869860576999281875676563330531852996518618404399969665040724\
619325787756882524564612936699407973972069814744031077387126963975233\
435649367891342439056453538921224003889562681162794913297808607025508\
266839229003714114129148483959669418215206272639036409444764264391237\
153249138808963484599594192808965375167268874071815206410716935739946\
647337580497226059476896995250734669418905023382359631646757058443412\
805239889122373033501909297493561702963891935828612435071136036127915\
741683742890415005429240675631783758284059633136358120778179307093676\
578662977299983285725734969609441661625997430420875699783536070284091\
2518532683324936435856348020736000000000000000000000000

real    0m0.006s
user    0m0.004s
sys     0m0.004s

1
*ため息!* ... dcコードを記述することは説明するよりも間違いなく簡単です

1
ええ、本当にある種のクレイジーなマルチスタックビジュアライゼーションガジェットを備えたIDEが必要です。
ジョー

1
新しいコマンドとして追加するアイデアはいくつかありますが、最も影響力のあるアイデアは次のとおりです。「デフォルトスタックの変更」コマンドを追加します。;-)

2
...またはデフォルトのスタックを名前付きレジスタと交換します。これにより、ユーザーの頭の中に多くの結び目ができますが、デフォルトのスタックに名前を付ける必要はありません...] :-)

1
はい、それは間違いなく便利です!また、単一のアイテムをクリアし、スタックの一番上にないアイテムを回転させ、おそらく一番上のnアイテムを一度に別のスタックにシフトしたいと思います。ただし、今のところ、dcソースからコンパイルする方法はまだわかりません。:/
ジョー

2

C#110 109 107 103 101 94バイト

using i=System.Numerics.BigInteger;i f(i n){i a=0,b=1,x=1;for(;n-->0;)x*=a=(b+=a)-a;return x;}

説明

//Aliasing BigInteger saves a few bytes
using i=System.Numerics.BigInteger;

//Since BigInteger has an implicit from int we can also change the input
//and save two more bytes.
i f(i n)
{
    //using an alternative iterative algorithm (link to source below) to cut out the temp variable
    //b is next iteration, a is current iteration, and x is the running product
    i a = 0, b = 1, x = 1; 

    //post decrement n down to zero instead of creating a loop variable
    for (; n-- > 0;)

        //The bracket portion sets the next iteration             
        //get the current iteration and update our running product
        x *= a = (b += a) - a;

    return x;
}

反復Fibアルゴリズム


これが5秒未満で返される最大Nを見つけたいと思っていたよりもはるかに優れていたので、1540で247441桁の数値が得られました。
JustinM -復活モニカ

印象的。1541は、好奇心から計算にどのくらい時間がかかりますか?
パンダコーダー

@Pandacoderしたがって、最近アルゴリズムが変更されたことにより、大幅に高速化されました。755ミリ秒で1541なので、新しいサブ5最大値をすぐに見つけます。
JustinM -復活モニカ

@Pandacoderですので、実行時間は
100ミリ

その数はどれくらいですか?
パンダコーダー

2

Brain-Flak、54バイト

([{}]<(())>){(({})()<{({}()<([({})]({}{}))>)}{}{}>)}{}

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

Brain-Flakでの乗算は、大きな入力に対して長い時間がかかります。F 100にF 99を掛けるだけを一般的な乗算アルゴリズムで乗算するだけで、数十億年かかります。

幸いなことに、もっと速い方法があります。で始まる一般化フィボナッチ数列(k, 0)は、通常の数列と同じ項を生成しkます。この観測を使用して、Brain-Flakはフィボナッチ数を生成できるのと同じくらい簡単にフィボナッチ数を乗算できます。

スタックの-n後に2つの数値が続く場合、一般化されたフィボナッチ数列の反復を{({}()<([({})]({}{}))>)}{}{}計算nし、最後まですべて破棄します。プログラムの残りの部分は、最初の1を設定し、範囲内のすべての数値に対してこれをループしますn...1

このインタープリターが提供する他の言語の同じアルゴリズムは次のとおりです。

Brain-Flak Classic、52バイト

({}<(())>){(({})[]<{({}[]<(({}<>)<>{}<>)>)}{}{}>)}{}

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

Brain-Flueue、58バイト

<>(<(())>)<>{(({}<>)<{({}({}))({}[()])}{}>[()]<>)}<>({}){}

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

Mini-Flak、62バイト

([{}()](())){(({})()({({}()([({})]({}{}))[({})])}{}{})[{}])}{}

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


1

Mathematica- 32 26バイト

Fibonacci@i~Product~{i,#}&

@MartinEnderは6バイトを切り詰めました!



1

Ruby, 85 Bytes

g =->x{(1..x).to_a.collect{|y|(0..y).inject([1,0]){|(a,b),_|[b, a+b]}[0]}.inject(:*)}

Turned out fine, but there's probably a shorter solution.

Fast Fibonnaci calculation taken from here: link

Test it here


1

Julia, 36 bytes

!x=[([1 1;1 0]^n)[2]for n=1:x]|>prod

1

Brain-Flak, 110 104 100 bytes

Try it online!

({}<((())<>)>){({}[()]<<>(({})<>({}<>)<>)>)}<>{}([[]]()){({}()<({}<>)<>({<({}[()])><>({})<>}{})>)}{}

Explanation

First we run an improved version of the Fibonacci sequence generator curtesy of Dr Green Eggs and Iron Man

({}<((())<>)>){({}[()]<<>(({})<>({}<>)<>)>)}<>{}

Then while the stack has more than one item on it

([[]]()){({}()<...>)}

multiply the top two items

({}<>)<>({<({}[()])><>({})<>}{})

and pop the extra zero

{}

1
Unfortunately, I think this is invalid since it takes over 10 seconds for an input of 25. The algorithm is very inefficient (just like the language is), so calculating it for 100 would probably take hours.
DJMcMayhem

1

Clojure, 70 bytes

Clojure isn't really a good language for code golf. Oh well.

Try it at http://tryclj.com.

(last(nth(iterate(fn[[a b r]][b(+ a b)(* r(+ a b))])[0N 1 1])(dec n)))

1

Forth, 55 bytes

Uses an iterative approach, built upon my Fibonacci answer in Forth. The results overflow arithmetically for n > 10. The answer is case-insensitive.

: f >r 1 1 r@ 0 DO 2dup + LOOP 2drop 1 r> 0 DO * LOOP ;

Try it online



1

JavaScript (ES6), 46 bytes

f=(n,a=1,b=1,c=i=1)=>n==i?c:f(n,b,a+b,c*b,++i)

Uses recursion and accumulator variables. Rounding errors start at f(16).

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