交互のフィボナッチ数列


24

定義

交互電力フィボナッチ数列は次のように形成されます。

  1. 空のシーケンスから始めて、n1に設定します。

  2. f nn 番目の非負のフィボナッチ数)を繰り返し計算します。
    0は最初、1は2番目、3番目、2は4番目です。他のすべては、シーケンス内の前の2つの数値を合計することによって取得されるため、3 = 1 + 2は5番目、5 = 2 + 3は6番目などです

  3. nが奇数の場合、f nの符号を変更します。

  4. 追加2 N-1のコピーF N配列。

  5. nをインクリメントし、手順2に戻ります。

これらは、APFシーケンスの最初の100の用語です。

 0  1  1 -1 -1 -1 -1  2  2  2  2  2  2  2  2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3
-3 -3 -3 -3 -3 -3  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
 5  5  5  5  5  5  5  5  5  5  5  5  5 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8
-8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8 -8

仕事

入力として正の整数nを取り、APFシーケンスのn 番目の項を出力または返す完全なプログラムまたは関数を作成します。

0ベースのインデックス付けを希望する場合は、代わりに、負でない整数nを取り、インデックスnでAPF番号を出力または返すことができます。

これはです。バイト単位の最短コードが勝つかもしれません!

テストケース(1ベース)

    1 ->    0
    2 ->    1
    3 ->    1
    4 ->   -1
    7 ->   -1
    8 ->    2
  100 ->   -8
  250 ->   13
  500 ->  -21
 1000 ->   34
11111 ->  233
22222 -> -377
33333 ->  610

テストケース(0ベース)

    0 ->    0
    1 ->    1
    2 ->    1
    3 ->   -1
    6 ->   -1
    7 ->    2
   99 ->   -8
  249 ->   13
  499 ->  -21
  999 ->   34
11110 ->  233
22221 -> -377
33332 ->  610

nに制約はありますか?
Okx

2
アルゴリズムがnの任意の大きな値に対して機能する限り、データ型に適合すると仮定できます。
デニス

1
これにはOEIS番号がありますか?
マインドウィン

@Mindwinありません。
デニス

回答:


12

ゼリー、5 バイト

BLCÆḞ

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

どうやって?

フィボナッチ数列を負のインデックスに戻して、関係f(i) = f(i-2) + f(i-1)が保持されるようにします。

  i   ...   -8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   4   5 ...
f(i)  ...  -21  13  -8   5  -3   2  -1   1   0   1   1   2   3   5   8 ...

i=0数値から戻ると、2 n-1回繰り返す必要があります。Jellyのフィボナッチが組み込まれ、ÆḞこれらが計算されます。

-iのビット長を取得してn減算することで、必要な(正の数)を見つけることができます1

私たちが望むのでi(負の数)を、我々は代わりに実行することができます1-bitLengthし、ゼリーはのために原子あり1-xC補完モナドを、。

BLCÆḞ - Main link: n               e.g.  500
B     - convert n to a binary list      [1,1,1,1,1,0,1,0,0]
 L    - get the length                   9
  C   - complement                      -8
   ÆḞ - Fibonacci                       -21

私は短い道があることを知っていたではなく、その分だけ、それは削除する方法で7つのバイトだろうと思ったµ
マイル

あなたの繰り返された否定は賢明でした、私はマイナス1の累乗を見ていたので、マイナスのフィボナッチ値について思い出し、それらをJellyのモナドに差し込もうとしました。
ジョナサンアラン

4
正直なところ、Jellyには数字の2進数の長さを取得するための1バイトの組み込み機能がないことに驚いています
...-ETHproductions

22

Python 2、30バイト

f=lambda n:n<1or f(n/4)-f(n/2)

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

ワンインデックス。

シーケンスはパズルのように感じました。それは、デニスが短い方法で表現することで生成したものです。2のべき乗の繰り返しは、ビットシフト(2でのフロア分割)による再帰を示唆しています。交互符号フィボナッチ再帰f(n)=f(n-2)-f(n-1)は、デクリメントの代わりにビットシフトに適応できます。すべてがに到達するため、ベースケースはうまく機能しn=0ます。


6

Mathematica、43 36 24バイト

Fibonacci@-Floor@Log2@#&

@GregMartinのおかげで7バイト、@ JungHwanMinのおかげでさらに12バイト節約されました。


1
を使用してFloor@Log2@#Fibonacci[t=...](および最後の指数のスペースを削除することで)数バイトを節約できます。
グレッグマーティン

1
-12バイト:Fibonacci@-Floor@Log2@#&- Fibonacci負の引数をとることもできます(記号を処理します)。
ジョンファンミン

5

MATL19 17 16 11バイト

lOiB"yy-]x&

入力は1ベースです。

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

使い方

1ベースの入力nの場合、mnのバイナリ展開の桁数とします。出力シーケンスのn番目の項は、フィボナッチシーケンスのm番目の項であり、符号が変更されている可能性があります。

1つのアイデアは、フィボナッチ数列の項を計算するためにm回反復することです。これはfor each、2進数の配列を使用したループを使用すると簡単です。フィボナッチ数列が0で初期化された場合、通常どおり1回、m回反復するとスタック上でm + 2の項になるため、上位2つの数値を削除する必要があります。代わりに、1、次に0で初期化します。その方法は、次の生成された用語である112、...とだけ1削除が必要とされています。

別のループを使用して符号をm回変更することにより、符号を処理できます。しかし、それは高価です。2つのループを統合することをお勧めします。これは、フィボナッチ反復で加算する代わりに減算するだけで実行されます。

l       % Push 1
O       % Push 0
iB      % Input converted to binary array
"       % For each
  yy    %   Duplicate top two elements
  -     %   Subtract. This computes the new Fibonacci term with the sign changes
]       % End
x       % Delete top number
&       % Specify that implicit display should take only one input
        % Implicitly display the top of the stack



3

ゼリー、9バイト

BLµ’ÆḞN⁸¡

1ベースのインデックスを使用します。

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

説明

このメソッドは、フィボナッチ関数が負でない引数のみをサポートする場合に機能します。

BLµ’ÆḞN⁸¡  Input: integer n
B          Binary digits of n
 L         Length. len(bin(2)) = floor(log2(n)))
  µ        Start new monadic chain on x = len(bin(2))
   ’       Decrement
    ÆḞ     Get Fibonacci(x-1)
       ⁸¡  Repeat x times on that
      N      Negate.
           Return Fibonacci(x-1) if x is even else -Fibonacci(x-1)

3

Japt、6バイト

Mg1-¢l

オンラインでテストしてください!

使い方

他の回答で述べたように、N 番目の交流サインフィボナッチ数列における用語は、同じである-n 番目の正規シリーズの用語。nは、入力のビット長を取得して1を減算することで見つけることができます。これを否定すると、1からビット長が減算されます。

Mg1-¢l
    ¢l  // Calculate the length of the input in binary.
  1-    // Subtract this from 1.
Mg      // Get the Fibonacci number at this index.

3

05AB1E11 10バイト

1ベースのインデックスを使用します

05AB1Eのフィボナッチ関数は、nより小さい正のfib数を返します。これは、必要以上の数を生成し、インデックスで正しい数を取得してから、符号を計算する必要があることを意味します。したがって、数値に基づいて繰り返し計算するよりも、それを基にした方法が短いとは思いません。

Luis MendoのMATL answerで説明されているように1, 0、ケースを処理するために逆にスタックを初期化できるという認識を使用しますn=1

XÎbgG‚D«`-

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

説明

X             # push 1
 Î            # push 0 and input
  b           # convert input to binary
   g          # get length of binary number
    G         # for N in [1...len(bin(input))-1] do:
     ‚        # pair the top 2 elements of the stack in a list
      D       # duplicate the list 
       «      # concatenate the 2 lists together
        `     # split into separate elements on the stack
         -    # subtract the top 2 elements

2

Perl 6、53バイト

{flat(((0,1,*+*...*)Z*|<-1 1>xx*)Zxx(1,2,4...*))[$_]}

シーケンスの簡単な実装、それが記述された方法。
ゼロベース。


2

ジュリア0.5、19バイト

!n=n<1||!(n/=4)-!2n

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

使い方

これは、@ xnorのPython answerと同じ式を使用します。回帰関係
g(n)= g(n-2)+ g(n-1)は、フィボナッチ数列の負の項を生成します。これは、符号が交互に変わる正の項に等しくなります。同じ数字の2 k回の繰り返しのどこからでも、インデックスを24で除算することにより、前の2 k-1の数字と2 k-2の数字の繰り返しを選択できます。

単純ではなく

f(n)=n<1||f(n÷4)-f(n÷2) # 25 bytes

目的に合わせて演算子を再定義できます。また、fはfloatと同じように機能するため、次のようになります。

!n=n<1||!(n/4)-!(n/2)   # 21 bytes

最後に、4による除算でnを更新すると、w / 22nとしてn / 2を記述し、ペアのペアを省略することができ、この回答で19バイトの関数定義になります。


1

J、18バイト

(%>:-*:)t.@<:@#@#:

1ベースのインデックスを使用します。入力整数n > 0を取り、floor(log2(n))そのバイナリ表現の長さを見つけて計算し、その値を1減らします。次に、生成関数x /(1 + x - x 2)のfloor(log2(n))-1th係数を見つけます。これは、負のインデックスのフィボナッチ値のgfです。

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

説明

(%>:-*:)t.@<:@#@#:  Input: integer n
                #:  Binary
              #@    Length
           <:@      Decrement
(      )            The generating function x/(1+x-x^2)
  >:                  Increment x
     *:               Square x
    -                 Subtract
 %                    Divide x by previous
        t.          Get series coefficient at the index given by previous value
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.