フィボナッチ指数


11

このチャレンジでは、いくつかの数値の合計の結果を出力します。これらの数字は何ですか?さて、あなたは(、入力が与えられab整数(正、負、またはゼロ)、である、) a != b、およびa < b、および内の各整数aおよびb(それらを含む)フィボナッチ数に応じて指数を持つことになります。わかりにくいので、例を示します。

Input: (-2, 2)
Output: -2**1 + (-1**1) + 0**2 + 1**3 + 2**5 =
          -2  +    -1   +   0  +   1  +   32 = 30

最初のフィボナッチ数がで表されるf(0)場合、式は次のとおりです。

a**f(0) + ... + b**f(b-a+1) 

入力、処理、出力

上記を明確にするために、いくつかのテストケース、入力の処理、および予想される出力を以下に示します。

Input: (1, 2)
Processing: 1**1 + 2**1
Output: 3

Input: (4, 8)
Processing: 4**1 + 5**1 + 6**2 + 7**3 + 8**5
Output: 33156

Input: (-1, 2)
Processing: -1**1 + 0**1 + 1**2 + 2**3
Output: 8

Input: (-4, -1)
Processing: -4**1 + -3**1 + -2**2 + -1**3
Output: -4

ルール

  • 標準的な抜け穴は許可されていません

  • 指数はフィボナッチ数列に従った順序でなければなりません

  • 上記のテストケースでコードが機能する必要があります

  • 出力のみを返す必要があります

受賞基準

最短のコードが勝ちます!


だから、0ここではフィボナッチ数には含まれていませんか?
FlipTack 16

0は、フィボナッチ数ではなく、入力のための有効な選択肢である
アンソニー・ファム

6
33165または33156?
ニール

@ニールあなたが正しいと思う
アンソニーファム

上記の「a f(0)+ ... + b f(b-a + 1)」は間違っています。たとえば、a = 1およびb = 2の場合、1 f(0)+2 f(2 )。私はa f(0)+ ... + b f(ba); ここでf(0)= 0 not 1
RosLuP

回答:


2

05AB1E、9バイト

ŸDg!ÅFsmO

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

Ÿ         # Push [a, ..., b].
 Dg!      # Calculate ([a..b].length())! because factorial grows faster than fibbonacci...
    ÅF    # Get Fibonacci numbers up to FACTORIAL([a..b].length()).
      s   # Swap the arguments because the fibb numbers will be longer.
       m  # Vectorized exponentiation, dropping extra numbers of Fibonacci sequence.
        O # Sum.

ab(EG [a..b].length() > 25)の間の大きな不一致に対してTIOで機能しません。

ただし、ここでの平均的な回答よりも大きな数値で機能するようです。

効率が悪いのは、までのフィボナッチ数列n!を計算するためです。これは、を計算するために必要な量よりも多く、ここでnはの数列の長さですa..b


5

Mathematica、38バイト 37バイト 31バイト

Sum[x^Fibonacci[x-#+1],{x,##}]&

これは、Mathematicaに移植されたrahnema1の答えです。以下は私の元のソリューションです:

Tr[Range@##^Fibonacci@Range[#2-#+1]]&

説明:

##は、すべての引数のシーケンスを#表し、最初の引数を#2表し、2番目の引数を表します。二つの引数で呼び出された場合abRange[##]リストを与える{a, a+1, ..., b}Range[#2-#+1]同じ長さのリストが表示されます{1, 2, ..., b-a+1}。以来FibonacciListableFibonacci@Range[#2-#+1]最初のリスト与えるb-a+1フィボナッチ数を。Poweris Listableであるため、同じ長さの2つのリストで呼び出すと、リストにスレッドされます。その後Tr、合計を取ります。

編集:マーティン・エンダーのおかげで1バイトを保存しました。


3
を使用できますRange@##
マーティンエンダー

1
現在はそれほど関連していませんが、元のアプローチはに3バイト改善できますTr[(r=Range@##)^Fibonacci[r-#+1]]&
グレッグマーティン

Range2回使用するのは危険なはずです。ありがとう!
-ngenisis

5

Python、49バイト

かかる再帰ラムダab別々の引数として(あなたはまた、フィボナッチの最初の2つの数値を設定することができ、xかつy: -意図的な、しかし、便利な機能ではない、何でもしたいし)

f=lambda a,b,x=1,y=1:a<=b and a**x+f(a+1,b,y,x+y)

オンラインでお試しください!(テストスイートを含む)

ゴルフの提案を歓迎します。


なぜ-~aではなく、単にa+1-~aマシンに依存していると思います。
タイタス

4

Perl 6の32の 30バイト

{sum $^a..$^b Z**(1,&[+]...*)}

$^aおよび$^bは、関数への2つの引数です。$^a..$^b数値の範囲である$^a$^bによってべき乗とzip形式で、Z**フィボナッチ数列とは、1, &[+] ... *

Brad Gilbertに2バイトを削ってくれてありがとう。


(1,&[+]...*)は1バイト短く、その後のスペースZ**は必要ありません。
ブラッドギルバートb2gills

@ BradGilbertb2gillsクール、フィボナッチ数列がそのように表現できるとは思いもしませんでした。
ショーン

&infix:<+>0、1、または2つの引数を受け入れることができるため、実際に機能します。(&[+]短い書き方です&infix:<+>)。WhateverCode * + *は、正確に2つの引数を受け入れます。(&[0]() == 0したがって1、シーケンスを開始するにはそこにある必要があります)
ブラッドギルバートb2gills



3

JavaScript(ES7)、42バイト

f=(a,b,x=1,y=1)=>a<=b&&a**x+f(a+1,b,y,x+y)

@FlipTackの優れたPython回答の簡単な移植版。


いいですね、JavaScriptでさらに短くなりました!:)
FlipTack 16

3

Haskell、35バイト

f=scanl(+)1(0:f);(?)=sum.zipWith(^)

使用法:

$ ghc fibexps.hs -e '[4..8]?f'
33156

関数oを、のような中置演算子に変換できますa#b=sum...
-nimi

ℕ→... Bのような中置考えられますが単項(ℤ、ℤ)を受け入れるための要件を読んでいた
ローマCzyborra

他の多くの答えは2つの別々の引数をとるので、それでいいと思います。
-nimi

すでに申し上げますが、これでECMAscript7ラムダと同等のレベルになります。しかし、場合、我々は、飼料に許可されている(a,b)としてa?b、なぜ私たちは即時としてそれを準備するために許可されていない[a..b]?f上に(?)=sum.zipWith(^)
ローマンチボラ

これは行き過ぎだと思います。入力は2つの数字(必ずしもペアとしてではなく、2つの別個の引数が行います)ですが、数字のリストと関数をメイン関数に供給しています。
nimi

2

MATL、23バイト

&:ll&Gw-XJq:"yy+]JQ$h^s

オンラインでお試しください!または、すべてのテストケースを確認します

&:      % Binary range between the two implicit inputs: [a a+1 ... b] 
ll      % Push 1, 1. These are the first two Fibonacci numbers
&G      % Push a, b again
w-      % Swap, subtract: gives b-a
XJ      % Copy to cilipboard J
q:      % Array [1 2 ... b-a-1]
"       % For each (repeat b-a-1 times)
  yy    %    Duplicate the top two numbers in the stack
  +     %    Add
]       % End
J       % Push b-a
Q       % Add 1: gives b-a+1
$       % Specify that the next function takes b-a+1 inputs
h       % Concatenate that many elements (Fibonacci numbers) into a row vector
^       % Power, element-wise: each entry in [a a+1 ... b] is raised to the
        % corresponding Fibonacci number
s       % Sum of array. Implicitly display

1

R、51バイト

無名関数。

function(a,b)sum((a:b)^numbers::fibonacci(b-a+1,T))


0

ルビー、46バイト

->a,b{n=s=0;m=1;a.upto(b){|x|s+=x**n=m+m=n};s}

ここで見ると特に賢いものやオリジナルのものはありません。ごめんなさい。


Rubyを話さない私にとって、このℤ.upto(ℤ)メソッドは、Rubyのすべてのオブジェクトの動作の美しさを思い起こさせるものです。コードをさらにゴルフすることは、ネイティブのRubyスピーカーへの演習として残されています。codegolf.stackexchange.com/questions/363/…をまだスキャンしましたか?
ローマンチボラ

0

Java 7、96バイト

ゴルフ済み:

int n(int a, int b){int x=1,y=1,z=0,s=0;while(a<=b){s+=Math.pow(a++,x);z=x+y;x=y;y=z;}return s;}

ゴルフをしていない:

int n(int a, int b)
{
    int x = 1, y = 1, z = 0, s = 0;
    while (a <= b)
    {
        s += Math.pow(a++, x);
        z = x + y;
        x = y;
        y = z;
    }

    return s;
}

0

R、57バイト

x=scan();sum((x[1]:x[2])^numbers::fibonacci(diff(x)+1,T))

とても簡単です。gmp::fibnumは、より短い組み込みですが、引数を追加することによりn、までのシーケンス全体を返すことをサポートしていません。numbers::fibonacciT

最初に、私はgmp::fibnumこの解決策よりも2バイト長くなった、よりトリッキーな解決策がありました。

x=scan();for(i in x[1]:x[2])F=F+i^gmp::fibnum((T<-T+1)-1);F

scan()6バイトを節約するのではなく、匿名関数を使用します。投稿されたソリューションをご覧ください。
-rturnbull

ああ、私の愚かな。
JAD

0

dc、56バイト

?sf?sa0dsbsg1sc[lblcdlfrdsb^lg+sg+sclf1+dsfla!<d]dsdxlgp

[1,30]51秒で入力を終了します。一度実行された2つの別々の行の2つの入力と、ダッシュではなく先頭にアンダースコア_)が付いた負の数を取ります(つまり-4、として入力されます_4)。


0

PHP、77 75バイト

for($b=$argv[$$x=1];$b<=$argv[2];${$x=!$x}=${""}+${1})$s+=$b++**$$x;echo$s;

コマンドライン引数から境界を取ります。で実行し-nrます。
PHPの変数変数を再度紹介します(そして、私がそれらについて知ったもの)

壊す

for($b=$argv[$$x=0}=1]; # $"" to 1st Fibonacci and base to 1st argument
    $b<=$argv[2];           # loop $b up to argument2 inclusive
    ${$x=!$x}                   # 5. toggle $x,             6. store to $1/$""
        =${""}+${1}             # 4. compute next Fibonacci number
)
    $s+=$b++**                  # 2. add exponential to sum,    3. post-increment base
        $$x;                    # 1. take current Fibonacci from $""/$1 as exponent
echo$s;                     # print result

PHPに移植されたFlipTackの回答は70バイトです。

function f($a,$b,$x=1,$y=1){return$a>$b?0:$a**$x+f($a+1,$b,$y,$x+$y);}

0

公理、65バイト

f(a,b)==reduce(+,[i^fibonacci(j)for i in a..b for j in 1..b-a+1])

テストコードと結果

(74) -> f(1,2)
   (74)  3
                                                   Type: Fraction Integer
(75) -> f(4,8)
   (75)  33156
                                                   Type: Fraction Integer
(76) -> f(-1,2)
   (76)  8
                                                   Type: Fraction Integer
(77) -> f(-4,-1)
   (77)  - 4
                                                   Type: Fraction Integer
(78) -> f(3,1)
   >> Error detected within library code:
   reducing over an empty list needs the 3 argument form
    protected-symbol-warn called with (NIL)

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