新しい注文#5:フィボナッチとビーティがワイトフで出会う場所


16

はじめに(無視してもよい)

すべての正の数を規則正しい順序(1、2、3、...)で並べるのは少し退屈ですよね?そのため、すべての正数の順列(再編成)に関する一連の課題があります。これは、このシリーズの5番目のチャレンジです(1番目2番目3番目4番目のチャレンジへのリンク)。

このチャレンジでは、フィボナッチ数列とビーティ数列の絡み合った雪崩であるWythoff配列に出会います!

フィボナッチ数は、おそらくよく知らシーケンスあなたのほとんどのためにあります。2つの開始番号とが与えられると、次のは次のように与えられます: for。F0F1FnFn=Fn1+Fn2n>2

パラメーターが与えられた場合Beattyシーケンスは、 forです。Beattyシーケンスのプロパティの1つは、すべてのパラメーターに対して1つのパラメーター、これらのパラメーターのBeattyシーケンスが分離され結合されることです。 0(例:)。rBnr=rnn1rs=r/(r1)BrBr/(r1)=N{0}

ここで驚くべき部分があります。各行がフィボナッチ数列であり、各列がビーティー数列である配列を作成できます。この配列はWythoff配列です。最良の部分は、すべての正の数がこの配列に1回だけ出現することです!配列は次のようになります。

   1    2    3    5    8   13   21   34   55   89  144 ...
   4    7   11   18   29   47   76  123  199  322  521 ...
   6   10   16   26   42   68  110  178  288  466  754 ...
   9   15   24   39   63  102  165  267  432  699 1131 ...
  12   20   32   52   84  136  220  356  576  932 1508 ...
  14   23   37   60   97  157  254  411  665 1076 1741 ...
  17   28   45   73  118  191  309  500  809 1309 2118 ...
  19   31   50   81  131  212  343  555  898 1453 2351 ...
  22   36   58   94  152  246  398  644 1042 1686 2728 ...
  25   41   66  107  173  280  453  733 1186 1919 3105 ...
  27   44   71  115  186  301  487  788 1275 2063 3338 ...
  ...

行および列の要素は、次のように定義されます。mn

Amn={mφφ もし n=1mφφ2 もし n=2Amn2+Amn1 もし n>2

ここで黄金比である:。φφ=1+52

この配列の対角線をたどると、このチャレンジのターゲットシーケンスであるA035513を取得します(このシーケンスはNeil Sloane自身がOEISに追加することに注意してください!)。これは「純粋なシーケンス」チャレンジであるため、タスクは与えられたを入力として出力することです。ここではA035513です。annan

に到達するために従うことのできるさまざまな戦略があり、この挑戦​​を(私の意見では)本当に興味深いものにします。an

仕事

整数入力与えられると、整数形式の出力ます。ここではA035513です。nanan

注:ここでは、1ベースのインデックス付けが想定されています。0から始まるインデックスを使用できます。aなどa0=1;a1=2

テストケース

Input | Output
---------------
1     |  1
5     |  7
20    |  20
50    |  136
78    |  30
123   |  3194
1234  |  8212236486
3000  |  814
9999  |  108240
29890 |  637

それは最大のことを知っていて楽しいかもしれませんためのであるan1n32767a32642=512653048485188394162163283930413917147479973138989971=F2562φ+F255

ルール

  • 入力と出力は整数です
  • プログラムは、少なくとも1〜32767の範囲の入力をサポートする必要があります。はこの範囲で最大30桁の数字になることに注意しください...an
  • 無効な入力(0、フロート、文字列、負の値など)は、予期しない出力、エラー、または(未)定義された動作につながる可能性があります。
  • デフォルトのI / Oルールが適用されます。
  • デフォルトの抜け穴は禁止されています。
  • これはなので、バイト単位の最短回答が勝ちます

2
では、ここでの新しい注文の参照は何ですか?
ルイスメンドー

2
@LuisMendo:フィボナッチ数列とビーティ数列の雪崩で、Wythoff配列を形成します...
agtoever

ああ、私はそれを完全に逃しました!今、私は後悔しています...
ルイス・メンド

1
phiの浮動小数点表現(またはrt(5))と再帰の適用は範囲の要件を満たしますか?
ジョナサンアラン

1
9番目のテストケースを修正してください。修正されて999いません9999
J42161217

回答:


4

ゼリー27 24バイト

p`SÞ⁸ịð’;×ØpḞ¥×⁹r‘ÆḞ¤Sð/

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

1ベースのインデックス作成を使用したモナドリンク。行と列を取得してn3バイトを節約するより良い方法を提供してくれた@JonathanAllanに感謝します。最短の形式では、TIOでnを大きくするには遅すぎるため、次のようにオンラインで試してください!行と列の初期リストのサイズを3バイトのコストで削減します。

説明

p`                       | Cartesian product of the range from 1..input with itself   
  SÞ                     | Sort by sum
    ⁸ị                   | Find the tuple at the position indicated by the input - this is the row and column
      ð               ð/ | Start a new dyadic chain using the row as the left and column as the right argument
       ’                 | Increase the row by 1
        ;    ¥           | Concatenate to:
         ×Øp             |   row × φ
            Ḟ            |   rounded down
              ×     ¤    | Multiply this pair by
                  ÆḞ     |   the Fibonacci numbers at positions
               ⁹         |   column index and
                r‘       |   column index plus one
                     S   | sum

これは、OEISページのPythonコードの説明に基づいていることに注意してください。


1
...×⁹r‘ÆḞ¤Sð/合併バージョン(TIO)で1つを保存します
ジョナサンアラン

6

R143の 130 124 123バイト

function(n){k=0:n+1
`~`=rbind
m=k-1~(k*(1+5^.5)/2)%/%1
for(i in k)m=m~m[i,]+m[i+1,]
m=m[-1:-2,]
m[order(row(m)+col(m))][n]}

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

Tn1=n1;Tn0=nϕ;Tnk=Tnk1+Tnk2splitsk単に強制的に防ぐために存在しているdrop=F中で、引数をm[-1:-2,]ケースについてn=1

1バイトのゴルフを指摘してくれたニールに感謝します。

R150の 138 132バイト

function(n){T[2]=1
for(j in 2:n-1)T=c(T,T[j]+T[j+1])
m=T[-1]%o%((1:n*(.5+5^.5/2))%/%1)+T[-1-n]%o%(1:n-1)
m[order(row(m)+col(m))][n]}

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

Tnk=Fbk+1nϕ+Fbkn1splitsnth

フィボナッチ数列を生成するためのトリックをくれたRobin Ryderに感謝しT[2]=1ます。


どちらのソリューションも非常に非効率的で、R がオーバーフローすると自動的に(32ビット符号付き)に昇格するためnxn(ほとんどdoubleの場合)sのマトリックスを作成integerdoubleますが、2番目のソリューションは非常に高速です。n呼び出しを使用して、bignumとしての取得が自動的に機能するgmp::as.bigz(n)必要doubleがありますR + gmp


(1+5^.5)/2代わりに使用できます(.5+5^.5/2)か?
ニール

@ニール...はい、できます。ありがとうございました!一番上に編集するつもりはありませんが、2番目のものをもっとたくさんゴルフする方法を見つけられない限り。
ジュゼッペ


2

ゼリー、30 バイト

p`SÞ⁸ịð;Øp,²;\¤×Ḟ¥/;+ƝQƊ⁹¡ị@ð/

オンラインでお試しください!
これは少し遅いですが、Ḥ½Ċこの test-suiteのように(double、square-root、ceiling)のプレフィックスを付けると大幅に改善されます


2
あなたが正しいです!740496902結果は999
J42161217

あなたの最初の部分と私の2番目の部分を組み合わせると、25バイトになります。私たちのどれが結合バージョンを持つべきかわからない!
ニックケネディ

@NickKennedy-いいね
ジョナサンアラン

2

、54バイト

Nθ≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι⊞υθF⁺²⁻θη⊞υΣ…⮌υ²I⊟υ

オンラインでお試しください!リンクは、コードの詳細バージョンです。0インデックス。整数演算のみを使用するため、任意の大きな値に対して機能します。説明:

Nθ

入力q

≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»

数の増加これまで引くことによってantidiagonalを計算しq、対象行番号で終わるていますm

⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι

A019446の最初のm+1項を計算しますが、これはthにのみ興味があります。m

⊞υθF⁺²⁻θη⊞υΣ…⮌υ²

n+4で始まる一般化フィボナッチ数列の最初の項を計算し[a(m), m]ます。このシーケンスのm用語は、A019446A001477A000201A003622A035336のth番目の用語です。これらの最後の2つは、Wythoff配列の最初の2列であるため、このシーケンスは配列の残りのmth行から続きます。

I⊟υ

希望する用語を出力します。

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