Wechselnde Fibonacci


17

In der alternierenden Fibonacci-Sequenz beginnen Sie zunächst mit 1und 1wie gewohnt.

Anstatt jedoch immer die letzten beiden Werte zu addieren, um die nächste Zahl zu erhalten, beginnen Sie abwechselnd mit dem Addieren und subtrahieren stattdessen jedes weitere Mal.

Die Sequenz beginnt wie folgt:

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

etc.

Beachten Sie, dass nach dem Start zu Ende , wenn es bekommt 1und 1wieder.

Bei einer gegebenen Zahl N wird der N- te Term der alternierenden Fibonacci-Sequenz gedruckt .

Denken Sie daran, dies ist , also gewinnt der Code mit der geringsten Anzahl von Bytes.


Ist die Sequenz 0-indiziert oder 1-indiziert (oder eine der beiden)?
Türknauf

@Doorknob Entweder einer. Geben Sie in Ihrer Antwort an.
Oliver Ni

Können wir zurückkehren truezu 1?
ETHproductions

1Zählen die ersten beiden Werte als Anfangswerte für die Ausgabe? Oder fangen wir direkt mit dem an 2?
Luis Mendo

@ LuisMendo Die ersten beiden zählen.
Oliver Ni

Antworten:


17

JavaScript (ES6), 25 Byte

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

0-indiziert. Sie können die Zeichenfolge mit einer leicht rekursiven Version kürzen, obwohl 6 Bytes hinzugefügt werden:

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

Dies ist immer noch kürzer als die endgültige rekursive Formel:

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

8

Python, 31 Bytes

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

Macht sich nicht die Mühe, den Wert zu berechnen. Schlägt einfach in der Liste der peroidischen Länge 12 nach [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2], die in Basis 5 komprimiert ist.

Vergleiche mit einer rekursiven Lösung (37 Bytes) mit True's for 1:

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

oder zur String-Speicherung

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

oder ein Versuch eines arithmetischen Ausdrucks.

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

7

Oase , 10 Bytes

Erinnert mich daran, weitere integrierte Funktionen zu implementieren: p. Die Eingabe ist 0-indiziert .

Code:

n>2%x<*c+V

Übersetzte Version:

a(n) = (2*((n+1)%2)-1) * a(n-1) + a(n-2)
a(1) = 1
a(0) = 1

Und berechnet den n- ten Term.

Probieren Sie es online!




4

Gelee, 12 Bytes

“½Ġ⁻S’b5_2⁸ị

TryItOnline!

1-basiert sind die ersten und zweiten Werte gegeben 1.

Ich bin mir nicht sicher, ob dies noch kürzer ist, aber dafür habe ich festgestellt, dass die Serie eine Periode von 12 hat:
[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]

Also nahm ich das und fügte hinzu 2, um zu geben,
[3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
dann konvertierte ich das als Basiszahl 5zu Basis 250, um zu geben:
[11, 197, 140, 84]
(was ist 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 Bytes

Erstellt einfach eine Nachschlagetabelle und greift zyklisch darauf zu, wie in der Antwort von ETHproductions. Unbenannte Funktion, 1-indiziert.

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

3

MATL , 17 16 15 Bytes

'"Bl)e'F5Za2-i)

Die Eingabe ist 1-basiert.

Probieren Sie es online!

Erläuterung

Die Sequenz hat Punkt [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 Bytes

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

Die Eingabe wird über das Pseudoregister weitergeleitet $t0. 0-indiziert. +2 jedes Terms in der Sequenz wird in 3 Bit gespeichert 85824331b.

Wie es funktioniert:

? (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.

Beispielausgabe, eine Schleife, die die ersten 14 Werte der Sequenz druckt:

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 Bytes

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

Da dies Java ist, ist die Antwort 0-indiziert.

Testen und ungolfed:

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));
    }
  }
}

Test auf Ideone


2

Mathematica, 45 41 38 Bytes

Danke an @MartinEnder für 3 Bytes.

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

0-indiziert.

Verwendung

±5

-2


2
Sie können wahrscheinlich drei Bytes einsparen, indem Sie ±anstelle einer Funktion einen unären Operator definieren a.
Martin Ender

1

Perl 6 ,  39 35  32 Bytes

{(1,1,{|(($/=$^a+$^b),$b-$/)}...*)[$_]}
{(|(334130110314.comb X-2)xx*)[$_]}
{(|334130110314.comb xx*)[$_]-2}
{334130110314.substr($_%12,1)-2}

1

C #, 117 Bytes

Golf gespielt:

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];}

Ungolfed:

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];
}

Testen:

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

Kompilieren Sie zu einem Func <int, int>, so können Sie public int A(int n)jetzt n=>die Klammern um die for-Anweisung entfernen, die 2 Bytes speichert. Sie können die iin der Schleife vorinkrementieren, dh ++i <= nund das i = 2Speichern von 3 Bytes festlegen , da sie die i++am Ende der Anweisung löscht
TheLethalCoder

Siehe auch meine Antwort, wenn Sie die vorherigen Variablen im
Auge

1

R, 38 Bytes

Verwendet die von @ETHproductions JS answer inspirierte Lookup-Table-Lösung.

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

Bearbeiten: Ich habe vergessen zu erwähnen, dass dies 1-indiziert ist.



1

Java 7, 88 82 79 Bytes

Golf gespielt:

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;}

ungolfed:

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;
}

Probieren Sie es online aus


1
Da Sie den "logischen" Weg gehen, sind hier einige Hinweise: 1. Sie haben vergessen, intals Rückgabetyp zu deklarieren . 2. Sie können Bytes sparen, indem Sie die Zuweisung von 0 in die Deklaration von i: int c,i=0und verschieben for(;i<n;){. 3. Sie können Klammern um die ternäre Operatorbedingung entfernen.
Olivier Grégoire

1
@ OlivierGrégoire Danke Kumpel :) behoben. nette lösung übrigens
peech 10.11.16

1

DC, 55 Bytes

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

0-indiziert.

?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

Register d speichert den Index des Wertes. Register n zählt die Anzahl der durchgeführten Iterationen. Register r speichert das Hauptmakro. Register y speichert den späteren Wert in der Sequenz, während der Stapel den früheren Wert in der Sequenz enthält.

Visuelle Erklärung, was in der großen Schleife vor sich geht

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

Die Prüfung, ob addiert oder subtrahiert werden soll, nimmt das Zählermodul zwei und verwendet diesen Trick , um eine If-Then-else-Konstruktion zu erstellen.

Am Ende enthält der Stapel eine einzelne Zahl, den gewünschten Wert, mit dem gedruckt wird p .

(Ich bin neu in dc, daher würde ich erwarten, dass hier einige offensichtliche Verbesserungen vorgenommen werden müssen.)


0

ForceLang , 153 Byte

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

Turtlèd , 35 Bytes

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

0 indiziert

Erläuterung:

#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]

Probieren Sie es online!


0

ABCR, 43 Bytes

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

Erläuterung: Der erste Teil ( )AAB)ABB..A))A..A)AA(ABB.)A+A)))A) richtet die Warteschlange A so ein, dass sie [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2] enthält, wobei alle anderen Warteschlangen leer bleiben . iBspeichert unseren gewünschten Begriff und die Schleife 5aAb(Bxdurchläuft die Warteschlange so oft. odruckt die Vorderseite der Warteschlange als Zahl aus, die dann unsere gewünschte Antwort ist.


0

Batch, 49 Bytes

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

Übernimmt die Eingabe als Befehlszeilenparameter. Erläuterung: In der geschlossenen Form werden die folgenden Beobachtungen verwendet:

  • Die Sequenz ist mit Periode 12 zyklisch
  • Jeder dritte Term ist ± 2, während andere Terme ± 1 sind
  • Terme nach dem dritten sind negativ, mit Ausnahme von Vielfachen von 5 (nach Reduzierung von Modulo 12)

Wir beginnen daher mit der Reduzierung von Modulo 12 (um 2 Bytes zu sparen). Wir reduzieren dann Modulo drei und invertieren das Ergebnis, das sonst 1 für ein Vielfaches von 3 oder 0 ist. Wir geben dann bitweise nicht diesen Wert an, sondern -2 für Vielfache von 3 oder -1. Wir reduzieren dann Modulo 5 und dividieren getrennt durch 4, wobei wir für die Terme 1, 2, 3, 5, 10 und 12 (0) Null ergeben. Invertieren und Negieren ergibt -1 für diese Werte und Null für andere Werte. Wir werden dann bitweise oder das mit 1 und multiplizieren mit der früheren Berechnung.


0

TI-Basic, 26 Bytes

Leider sehr uninteressanter Ansatz. Ich konnte nichts kürzeres finden. Die Liste ist 1-indiziert.

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

0

C # 73 71 Bytes

Dies verwendet 0-indizierte Werte von n.

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;};

Formatierte Version:

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;
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.