フィボナッチ数列の線形補間


20

あなたの仕事はn 番目のフィボナッチ数を見つけることですが、nは必ずしも整数ではありません。

0から始まるフィボナッチ数列は次のとおりです。

0, 1, 2, 3, 4, 5,  6,  7, ...

1, 1, 2, 3, 5, 8, 13, 21, ...

しかし、2 .4 番目の数字が必要な場合はどうなりますか?

2.4 番目の数は3との間の0.4倍の差であるRD及び2 番目のフィボナッチ数プラス2 番目のフィボナッチ数。したがって、2.4 番目のフィボナッチ数は2 + 0.4 * (3 – 2) = 2.4です。

同様に、6.35 番目のフィボナッチ数は13 + 0.35 * (21 – 13) = 15.8です。

あなたの仕事は見つけることであるNを番目ように、フィボナッチ数nが 0以上です。

インデックスをゼロまたは1にすることもできますが、どちらを使用しているかを言ってください。

これはなので、バイト単位の最短コードが勝ちです!

さらにいくつかの例:

0        1
4.5    6.5
0.7      1
7       21

2
ここで行っている操作は、「線形補間」と呼ばれます。(それを反映するために投稿のタイトルを変更してもかまいませんか?)フィボナッチプロパティf(n-2)+ f(n-1)= f(n)があるようですので、これはフィボナッチ数列の合理的な一般化。(標準的な一般化があるかどうかは

@ ais523、質問を改善すると思われる場合は、はい、投稿のタイトルを変更できます。
ダニエル

誰かが似たような質問をすると、将来的に質問を見つけやすくなり、たとえば「関連」リストの内容が明確になると思います。したがって、回答者を適切な場所に導くのを支援することにより、質問をより良くします。

2
@aisビネット式の一般化があるように見えます:mathworld.wolfram.com/FibonacciNumber.html
ニール

1
コードゴルフは要求を正当化する必要はありませんが(推測)、これは奇妙な操作のようです。それによると、以来F_0 = 0F_2 = 1、私たちは持っているはずですF_1 = (1/2)(F_0 + F_2) = 1/2
-LSpice

回答:


7

ゼリー、5バイト

_Ḟ1+¡

これは、組み込みのない反復ソリューションです。チャレンジ仕様と同じインデックスを使用します。

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

バックグラウンド

してみましょうfはチャレンジ仕様とで定義された関数であるF(とすなわち、いつものように定義されたフィボナッチ関数F(0)= 0)。非負整数nの場合f(n)= F(n + 1)があります。場合0≤X <1 、チャレンジスペック定義F(N + X)としてF(N)+(F(N + 1) - F(n))を、X

明らかに、これは基本ケースにのみ影響しますが、再帰式には影響しません。つまり、f(n)= f(n-1)+ f(n-2)Fの場合のように成り立ちます。これは、非整数引数の定義をより簡単なf(n)= f(n)+ f(n-1)xに簡素化できることを意味します。

他の人が答えで指摘したように、非整数の引数についても再帰的な関係が成り立ちます。これは簡単に検証できます。

証明

以降、F(0)= F(1)= 1F区間で一定で[0、1]およびF(0 + X)= 1のすべてのためのx。さらに、f(-1)= F(0)= 0なのでf(-1 + x)= f(-1)+(f(0)-f(-1))x = 0 + 1x = xです。これらのベースケースは[-1、1)でカバーするため、再帰的な式と一緒にfの定義を完成させます。

使い方

前と同様に、n + xをモナドプログラムの唯一の引数とします。

¡迅速なそれはその左にいくつかのリンクを消費しにそれらを回すことを意味し、クイックリンク¡特に、1つまたは2つのリンクを消費します。

  • <F:monad|dyad><N:any>リンクNを呼び出してrを返し、Fを合計r回実行します。

  • <nilad|missing><F:monad|dyad>セットは、rは最後のコマンドライン引数(またはその非存在下でSTDINからの入力)と実行にFの合計のR回。

以来1nilad(引数なしリンク)であり、第二のケースが適用され、そして実行される+ N倍(非整数の引数を切り捨て)。を呼び出すたび+に、クイックリンクの左の引数が戻り値に置き換えられ、右の引数が左の引数の前の値に置き換えられます。

プログラム全体に関しては、入力をフロアリングしてnを生成します。次に_、入力から結果を減算し、** xを返します。これが戻り値になります。

1+¡次に、前述のように、左引数1 = f(0 + x)および右引数x = f(-1 + x)を呼び出して、目的の出力を計算します。


ああ、フィボナッチチャレンジにとってどれほど役に立つか。¡ダイアドでフィボナッチのような仕事をすることは意図的でしたか?
エリックアウトゴルファー

うーん- %1+¡:線形補間との間のN×F(N)においてN及びN×F(N-1)+ F(N)におけるN-εとの間にステップアップN-εおよびN
ジョナサンアラン

@EriktheOutgolferまあ、多かれ少なかれ。Jellyには変数がないため、それ以外の場合は以前のシーケンスメンバーにアクセスできなくなります。したがって、このように実装することは理にかなっています。
デニス

@ジョナサンアラン私は理解しているかわかりません。何を%1+¡すべきか?
デニス

@Dennis ERM、意味、よく\ _o_ / ...しかし、それは実験をどう思われるものである:D
ジョナサン・アラン

5

Mathematica、32バイト

If[#<2,1~Max~#,#0[#-1]+#0[#-2]]&

入力として非負の実数を取り、実数を返す純粋な関数。1~Max~#に置き換えられた場合1、これは整数引数の0インデックス付きフィボナッチ数の標準的な再帰的定義になります。しかし1~Max~#、0から2までの実際の入力に対する正しい区分的線形関数であり、残りの部分は再帰によって処理されます。(トリビア事実:これを1インデックスのフィボナッチ数に変更するMaxには、単にMinです!)

組み込みで取得できる最短の長さは37バイト(b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&です。



3

JavaScript(ES6)、30バイト

f=x=>x<1?1:x<2?x:f(x-1)+f(x-2)
<input type=number value=2.4 oninput="O.value=f(value)"> <input id=O value=2.4 disabled>

ゼロインデックスの再帰フィボナッチ数列定義の簡単な変更。一部の入力でわずかな丸め誤差が生じる場合があります。


これは賢いです。うまくいかないと思った。
リーキー修道女

1

ゼリー17 12バイト

’Ñ+Ñ
’»0‘ÇỊ?

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

非組み込みソリューション。

説明

ヘルパー機能 1Ŀ

’Ñ+Ñ
 Ñ    Call the main program on
’       {the input} - 1;
   Ñ  Call the main program on {the input};
  +   Add those results{and return the result}

主なプログラム

’»0‘ÇỊ?
’        Subtract 1
 »0      but replace negative results with 0
     Ị?  If the result is less than or equal to 1
   ‘     Return the result plus 1
    Ç    else return the result

したがって、0〜1の範囲の入力は0に飽和減算されます。したがって、1を追加してF(0)= F(1)= 1を取得します。1〜2の範囲の入力は、それ自体を返します。これらの基本ケースは、典型的なフィボナッチ再帰を行い、そこから他の値を計算するのに十分です。


1

Excel、137124119113102 97バイト

非再帰的/反復的アプローチ。(n番目の項を直接計算します)これは、インデックス1つの方法を使用します。追加すると、インデックスがゼロ+1=TRUNC(B1)変更されます。

=A7+(A8-A7)*MOD(B1,1)
=5^.5
=(1+A2)/2
=TRUNC(B1)
=A4+1
=-1/A3
=(A3^A4-A6^A4)/A2
=(A3^A5-A6^A5)/A2

コードスニペットは、セルA1から開始することを意図しています。

入力セルはB1です。出力セルはA1です。


1

JavaScript(ES6)、67 64バイト

丸めにいくつかの問題がある

n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)

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

f=
n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)
console.log(f(2.4))
console.log(f(6.35))
console.log(f(42.42))



0

ゼリー13 9バイト

,‘ḞÆḞḅ%1$

これは、チャレンジ仕様と同じインデックスを使用します。

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

バックグラウンド

仕様に従って、自然なnおよび0≤x <1 に対してF(n + x)= F(n)+(F(n + 1)-F(n))xがあります。以来、F(N + 1)= F(N)+ F(N - 1) 、これはのように書き換えることができる- X F(N + X)= F(N)+ F(1 N)

さらに、チャレンジ仕様で使用されるインデックスは関数f(n)= F(n + 1)Fは通常のフィボナッチ関数、つまりF(0)= 0)を定義するため、式f(n + x)= F(n + 1)+ F(n)x

使い方

,‘ḞÆḞḅ%1$  Main link. Argument: n + x

 ‘         Increment; yield n + 1 + x.
,          Pair; yield [n + x, n + 1 + x].
  Ḟ        Floor; yield [n, n + 1].
   ÆḞ      Fibonacci; yield [F(n), F(n + 1)].
      %1$  Modulus 1; yield (n + x) % 1 = x.
     ḅ     Unbase; yield F(n)x + F(n + 1).

0

Perl 6の 48の  38バイト

48

{$/=(1,1,*+*...*)[$_,$_+1];$0+($_-.Int)*($1-$0)}

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

38

sub f(\n){3>n??max 1,n!!f(n-1)+f(n-2)}

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

拡張:

48

{
  $/ =          # store here so we can use $0 and $1
  (
    1,1,*+*...* # Fibonacci sequence
  )[
    $_,         # get the value by using floor of the input
    $_ + 1      # and get the next value
  ];

    $0            # the first value from above
  +
    ( $_ - .Int ) # the fractional part of the input
  *
    ( $1 - $0 )   # the difference between the two values in the sequence
}

$0$1の略である$/[0]$/[1]

38

sub f (\n) {
    3 > n           # if n is below 3
  ??
    max 1, n        # return it if it is above 1, or return 1
                    # if it was below 1, the answer would be 1
                    # the result for numbers between 1 and 3
                    # would be the same as the input anyway
  !!
    f(n-1) + f(n-2) # the recursive way to get a fibonacci number
}

これは、他のPythonおよびJavascriptソリューションに触発されました


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