交互フィボナッチ


17

交互フィボナッチ数列では、最初に起動1し、1いつものように。

ただし、最後の2つの値を常に追加して次の番号を取得する代わりに、追加から始め、代わりに減算するたびに交互に実行します。

シーケンスは次のように始まります。

1
1
2    # 1 + 1
-1   # 1 - 2
1    # 2 + -1
-2   # -1 - 1
-1   # 1 + -2
-1   # -2 - -1
-2   # -1 + -1
1    # -1 - -2
-1   # -2 + 1
2    # 1 - -1
1    # -1 + 2
1    # 2 - 1

それが到達したら、それはオーバー開始後ということに注意してください11もう一度。

数値Nを指定すると、Nが出力されます交互フィボナッチ数列の第用語。

これはであるため、バイト数が最小のコードが優先されます。


シーケンスは0インデックス付きですか、それとも1インデックス付きですか(またはいずれか)?
ドアノブ

@Doorknobどちらか。回答で指定してください。
オリバーNi

私たちは、返すことができるtrueため1
ETHproductions

最初の2つの1値は出力の初期値としてカウントされますか?それとも、直接開始し2ますか?
ルイスメンドー

@LuisMendo最初の2つのカウント。
オリバーNi

回答:


17

JavaScript(ES6)、25バイト

n=>"334130110314"[n%12]-2

0インデックス。わずかに再帰的なバージョンで文字列を短縮できますが、6バイト追加されます。

f=n=>"3341301"[n]-2||f(13-n%12)

これはまだ決定的な再帰式よりも短いです:

f=n=>n<2||f(n-2)+f(n-1)*(-n%2|1)

8

Python、31バイト

lambda n:2-33107256/5**(n%12)%5

値を計算しようとして気にしません。[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]基数5で圧縮されているperoidic length-12リストを調べるだけです。

1のを使用した再帰的ソリューション(37バイト)と比較してくださいTrue

f=lambda n:n<2or(-1)**n*f(n-1)+f(n-2)

または文字列ストレージに

lambda n:int('334130110314'[n%12])-2

または算術式の試行。

lambda n:4**n%7%3*(-1)**((n+n%2*4)/6)




4

ゼリー、12バイト

“½Ġ⁻S’b5_2⁸ị

TryItOnline!

1から始まり、1番目と2番目の値が 1

これがまだ短いかどうかはまだわかりませんが、このためにシリーズの期間は12であることに注意しました。
[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]

だから、私はそれを取り、それを ベース番号に変換し、それをベース番号に変換して追加2しました:( これは)です。
[3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
5250
[11, 197, 140, 84]
184222584

“½Ġ⁻S’b5_2⁸ị - Main link: n
“½Ġ⁻S’       - base 250 number      184222584
      b5     - convert to base 5   [3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
        _2   - subtract 2          [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]
          ⁸  - left argument, n
           ị - index into (1-based and modular)


3

Mathematica、40バイト

ETHproductionsの答えのように、ルックアップテーブルを作成して周期的にアクセスするだけです。名前のない関数、1インデックス付き。

Join[s={2,1,1,2,-1,1},-s][[#~Mod~12+1]]&

3

MATL17 16 15バイト

'"Bl)e'F5Za2-i)

入力は1ベースです。

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

説明

シーケンスにはperiodがあり[1 1 2 -1 1 -2 -1 -1 -2 1 -1 2]ます。

'"Bl)e     % Compressed array [1 1 2 -1 1 -2 -1 -1 -2 1 -1 2] with source 
           % alphabet [-2 -1 0 1 2]
F5Za       % Decompress with target alphabet [0 1 2 3 4]
2-         % Subtract 2 to transform alphabet into [-2 -1 0 1 2]
i)         % Input N and use as (modular, 1-based) index into the sequence

3

WinDbg、26バイト

?(85824331b>>@$t0%c*3&7)-2

入力は、疑似レジスタを介して渡されます$t0。0インデックス。シーケンス内の各用語の+2は3ビットで保存されます85824331b

使い方:

? (85824331b >> @$t0 % c * 3 & 7) - 2 ;*? Evalutes the expression. Shifts 85824331b to get
                                       *the 3 bits for the @$t0'th term (mod c (12) when
                                       *the sequence repeats). Bitwise AND by 7 to get the
                                       *desired 3 bits, finally subtract 2 since the terms
                                       *where stored as +2.

サンプル出力、シーケンスの最初の14個の値を出力するループ:

0:000> .for(r$t0=0;@$t0<e;r$t0=@$t0+1){?(85824331b>>@$t0%c*3&7)-2}
Evaluate expression: 1 = 00000001
Evaluate expression: 1 = 00000001
Evaluate expression: 2 = 00000002
Evaluate expression: -1 = ffffffff
Evaluate expression: 1 = 00000001
Evaluate expression: -2 = fffffffe
Evaluate expression: -1 = ffffffff
Evaluate expression: -1 = ffffffff
Evaluate expression: -2 = fffffffe
Evaluate expression: 1 = 00000001
Evaluate expression: -1 = ffffffff
Evaluate expression: 2 = 00000002
Evaluate expression: 1 = 00000001
Evaluate expression: 1 = 00000001

3

Java、32バイト

n->"334130110314".charAt(n%12)-50

これはJavaなので、答えは0から始まります。

テストと未使用:

class Ideone {
  public static void main (String[] args) throws Exception {
    java.util.function.IntFunction f = n->"334130110314".charAt(n%12)-50;
    for (int i = 0; i < 12; i++) {
      System.out.printf("%d -> %d%n", i, f.apply(i));
    }
  }
}

Ideoneでテストする


2

Mathematica、45 41 38バイト

3バイトの@MartinEnderに感謝します。

±0=±1=1;±n_:=±(n-2)+±(n-1)(1-2n~Mod~2)

0インデックス付き。

使用法

±5

-2


2
±関数の代わりに単項演算子を定義することで、おそらく3バイトを節約できますa
マーティンエンダー


1

C#、117バイト

ゴルフ:

int A(int n){var f=new List<int>{0,1,1};for(int i=3;i<=n;i++){f.Add(i%2>0?f[i-1]+f[i-2]:f[i-2]-f[i-1]);}return f[n];}

ゴルフをしていない:

public int A(int n)
{
  var f = new List<int> { 0, 1, 1 };

  for (int i = 3; i <= n; i++)
  {
    f.Add(i % 2 > 0 ? f[i - 1] + f[i - 2] : f[i - 2] - f[i - 1]);
  }

  return f[n];
}

テスト:

var alternatingFibonacci = new AlternatingFibonacci();
Console.WriteLine(alternatingFibonacci.B(10));
1

Func <int型、int型>へのコンパイルはとてもpublic int A(int n)n=>、あなたは2つのバイトを保存する文の周りにカッコを削除することができ、あなたが増分事前できるiループIEで++i <= nとセットi = 2それが削除されますので、3つのバイトを保存するi++文の終わりに
TheLethalCoder

また、以前の変数のリストを作成するのではなく、以前の変数を追跡していた場合は、私の答えを参照してください
-TheLethalCoder

1

R、38バイト

@ETHproductions JSアンサーに触発されたルックアップテーブルソリューションを使用します。

c(s<-c(2,1,1,2,-1,1),-s)[scan()%%12+1]

編集:これは1インデックス付きであることを忘れていました。



1

Java 7、88 82 79バイト

ゴルフ:

int f(int n){int c,i=0,a=1,b=1;for(;i<n;){c=i++%2>0?a-b:a+b;a=b;b=c;}return b;}

なし:

int f(int n)
{
    int c, i = 0, a = 1, b = 1;
    for (; i < n;)
    {
        c = i++ % 2 > 0 ? a - b : a + b;
        a = b;
        b = c;
    }
    return b;
}

オンラインで試す


1
「論理的」な方法で進むためのヒントを次に示します。1 int.戻り値の型として宣言するのを忘れた。2. 0の割り当てをi:int c,i=0およびの宣言に移動することにより、バイトを節約できますfor(;i<n;){。3.三項演算子の条件を囲む括弧を削除できます。
オリヴィエグレゴワール

1
@OlivierGrégoireありがとう、男:)修正。良いソリューションbtw
ピーチ

1

DC、55バイト

?sd[ln1+snly[[+2Q]sEln2%1=E-]xlyrsylnld>r]sr1sy0sn1lrxp

0インデックス付き。

?sd                                                     takes input and stores
                                                        it in register d

                                            1sy0sn1     stores 1 in register y
                                                        and 0 in register n and
                                                        appends 1 to the stack

   [ln1+snly                                            adds 1 to register n and
                                                        appends the value of
                                                        register y to the stack

            [[+2Q]sEln2%1=E-]                           adds or subtracts the
                                                        the two values on the
                                                        stack depending on
                                                        parity of n

                             xlyrsylnld>r]              does the rest of the
                                                        stuff required to store
                                                        the new values properly
                                                        and quits if it has
                                                        done enough iterations

                                          sr            stores the main macro
                                                        in register r

                                                   lrxp executes the macro and
                                                        prints the stack

レジスタdは、値のインデックスを格納します。レジスタnは、完了した反復回数をカウントします。レジスターrにはメインマクロが格納されます。レジスタyにはシーケンス内の新しい値が格納され、スタックにはシーケンス内の古い値が含まれます。

大きなループで起こっていることの視覚的な説明(追加を想定):

register: y=1     y=1   y=1    y=1   y=1    y=2
stack:     1      1 1    2     2 1   1 2     1
               ly     +     ly     r     sy

加算するか減算するかを決定するチェックは、2を法とするカウンターを取り、このトリックを使用してif then else構造を作成します。

最後に、スタックには、目的の値である単一の数値が含まれます。 pます。

(私はが初めてなdcので、ここでいくつかの明らかな改善が期待されます。)


0

ForceLang、153バイト

def s set
s a 1
s b 1
s p 1
s k io.readnum()
if k=0
goto b
label a
s c b.mult p
s c a+c
s a b
s b c
s p p.mult -1
s k k+-1
if k
goto a
label b
io.write a

0

タートルード、35バイト

#112-1_--_1-2#?:[*l+].(-r'1)(_"-2")

0インデックス付き

説明:

#112-1_--_1-2#                      the 12 values of sequence. - is -1, _ is -2
              ?:                    input a number and move right that many
                [*l+]               move back to the asterisk on start cell, 
                                    increment sting pointer by amount moved
                     .              write pointed char
                      (-r'1)        if it was -, move right, write 1
                            (_"-2") if it was _, write "-2"
      [print grid]

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


0

ABCR、43バイト

)AAB)ABB..A))A..A)AA(ABB.)A+A)))AiB5aAb(Bxo

説明:最初の部分()AAB)ABB..A))A..A)AA(ABB.)A+A)))A)は、[1、1、2、-1、1、-2、-1、-1、-2、1、-1、2]を含むようにキューAをセットアップし、他のすべてのキューを空のままにします。 iB目的の用語を保存し、ループ5aAb(Bxは何回もキューを循環します。 oキューの先頭を数値として出力します。これが望ましい答えになります。


0

バッチ、49バイト

@cmd/cset/a"n=%1%%12,~!(n%%3)*(1|-!(n%%5*(n/4)))"

入力をコマンドラインパラメーターとして受け取ります。説明:閉じたフォームは次の観察結果を使用します。

  • シーケンスは周期12で周期的です
  • 3項ごとに±2で、他の項は±1
  • 3番目以降の項は、5の倍数を除いて負です(モジュロ12を減らした後)

したがって、モジュロ12を減らすことから始めます(2バイトを節約するため)。次に、モジュロ3を減らして結果を反転します。これは、3の倍数の場合は1、それ以外の場合は0です。次に、その値ではなくビット単位で、3の倍数の場合は-2、そうでない場合は-1を返します。次に、モジュロ5を削減し、4で個別に除算して、用語1、2、3、5、10、および12(0)にゼロを与えます。反転と否定により、これらの値は-1になり、他の値はゼロになります。次に、ビット単位または1を使用して、以前の計算で乗算します。


0

TI-Basic、26バイト

残念ながら、非常に面白くないアプローチです。もっと短いものは見つかりませんでした。リストは1からインデックス付けされています。

Input :{1,1,2,-1,1,-2:augment(Ans,-Ans:Ans(X

0

C#、73 71バイト

これは、nの0インデックス値を使用します。

n=>{int a=1,b=1,i=0,r;for(;++i<n;){r=i%2>0?a+b:a-b;a=b;b=r;}return b;};

フォーマット済みバージョン:

Func<int, int> f = n =>
{
    int a = 1, b = 1, i = 0, r;

    for(; ++i < n;)
    {
        r = i % 2 > 0 ? a + b : a - b;
        a = b;
        b = r;
    }

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