Fibonacci Bergantian

17

Dalam deret Fibonacci bergantian, Anda pertama kali mulai dengan 1dan 1seperti biasa.

Namun, alih-alih selalu menambahkan dua nilai terakhir untuk mendapatkan angka berikutnya, Anda bergantian mulai dengan menambahkan, dan setiap kali Anda kurangi saja.

Urutannya dimulai seperti ini:

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

dll.

Perhatikan bahwa setelah dimulai kembali setelah sampai ke 1dan 1lagi.

Diberi angka N , cetak suku ke- N dari urutan fibonacci yang bergantian.

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Oliver Ni
sumber
Apakah urutan 0-diindeks atau 1-diindeks (atau salah satu)?
Gagang Pintu
@ Doorknob Salah satunya. Tentukan jawaban Anda.
Oliver Ni
Bisakah kita kembali trueuntuk 1?
ETHproduksi
Apakah dua 1nilai pertama dihitung sebagai nilai awal untuk output? Atau apakah kita mulai langsung dengan 2?
Luis Mendo
@LuisMendo Dua hitungan pertama.
Oliver Ni

Jawaban:

17

JavaScript (ES6), 25 byte

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

Diindeks 0. Anda dapat mempersingkat string dengan versi yang sedikit rekursif, meskipun menambahkan 6 byte:

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

Ini masih lebih pendek dari rumus rekursif definitif:

f=n=>n<2||f(n-2)+f(n-1)*(-n%2|1)
Produksi ETH
sumber
8

Python, 31 byte

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

Tidak repot mencoba menghitung nilainya. Lihat saja dalam daftar peroidic-12 panjang [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2], yang dikompresi di basis 5.

Bandingkan dengan solusi rekursif (37 byte) dengan Trueuntuk 1:

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

atau ke penyimpanan string

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

atau upaya ekspresi aritmatika.

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

Oasis , 10 byte

Mengingatkan saya untuk mengimplementasikan beberapa lebih built-in: p. Masukan diindeks 0 .

Kode:

n>2%x<*c+V

Versi yang diterjemahkan:

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

Dan menghitung jangka ke- n .

Cobalah online!

Adnan
sumber
5

05AB1E , 10 byte

•É&†º•sèÍ

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
Saya pikir saya harus mulai belajar 05AB1E daripada Jelly.
Erik yang Outgolfer
4

Jelly, 12 byte

“½Ġ⁻S’b5_2⁸ị

TryItOnline!

Berbasis 1, diberi nilai pertama dan kedua adalah 1.

Tidak yakin apakah ini lebih pendek, tetapi untuk ini saya mencatat bahwa seri memiliki periode 12:
[1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2]

Jadi, saya mengambilnya dan menambahkan 2untuk memberi
[3, 3, 4, 1, 3, 0, 1, 1, 0, 3, 1, 4]
lalu mengonversinya sebagai angka dasar 5ke basis 250, untuk memberikan:
[11, 197, 140, 84]
(yang mana 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)
Jonathan Allan
sumber
4

Haskell, 33 26 byte

a!b=a:b:(a+b)!(-a)
(1!1!!)

Pendekatan rekursif. Diindeks 0. Cobalah di Ideone.
Disimpan 7 byte berkat xnor .

Pemakaian:

Prelude> (1!1!!)11
2
Laikoni
sumber
Terlihat lebih pendek untuk dilakukan a!b=a:b:(a+b)!(-a).
xnor
3

Mathematica, 40 byte

Hanya membuat tabel pencarian dan mengaksesnya secara siklis, seperti dalam jawaban ETHproductions. Fungsi yang tidak disebutkan namanya, 1-diindeks.

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

MATL , 17 16 15 byte

'"Bl)e'F5Za2-i)

Input berbasis 1.

Cobalah online!

Penjelasan

Urutannya memiliki periode [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
Luis Mendo
sumber
3

WinDbg, 26 byte

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

Input diteruskan melalui pseudo-register $t0. Diindeks 0. +2 dari setiap istilah dalam urutan disimpan dalam pembuatan 3 bit 85824331b.

Bagaimana itu bekerja:

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

Output sampel, loop mencetak 14 nilai pertama dari urutan:

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
susu
sumber
3

Java, 32 byte

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

Karena ini adalah Java, jawabannya adalah 0-diindeks.

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

Uji Ideone

Olivier Grégoire
sumber
2

Mathematica, 45 41 38 byte

Terima kasih kepada @MartinEnder selama 3 byte.

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

Diindeks 0.

Pemakaian

±5

-2

JungHwan Min
sumber
2
Anda mungkin dapat menyimpan tiga byte dengan mendefinisikan operator unary, ±bukan fungsi a.
Martin Ender
1

Perl 6 ,  39 35  32 byte

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

C #, 117 Bytes

Golf:

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

Tidak Disatukan:

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

Pengujian:

var alternatingFibonacci = new AlternatingFibonacci();
Console.WriteLine(alternatingFibonacci.B(10));
1
Pete Arden
sumber
Kompilasi ke Fungsi <int, int> demikian public int A(int n)juga sekarang n=>, Anda dapat menghapus kurung kurawal di sekitar untuk pernyataan yang menyimpan 2 byte, Anda dapat pra menambahkan selisih idalam loop yaitu ++i <= ndan mengatur i = 2penghematan 3 byte karena menghilangkan i++di akhir pernyataan
TheLethalCoder
Lihat juga jawaban saya jika Anda melacak variabel sebelumnya alih-alih membuat daftar semua itu jauh lebih pendek
TheLethalCoder
1

R, 38 byte

Menggunakan solusi tabel pencarian yang terinspirasi oleh @ETHproduk JS.

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

Sunting: Lupa menyebutkan bahwa ini adalah indeks 1.

Billywob
sumber
1

Sebenarnya , 22 byte

34*@%"334130110314"E≈¬

Cobalah online!

Penjelasan:

34*@%"334130110314"E≈¬
34*@%                   input % 12
     "334130110314"E    get that character in the string
                    ≈¬  convert to int, subtract 2
Mego
sumber
1

Java 7, 88 82 79 byte

golf:

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

Cobalah online

Peech
sumber
1
Karena Anda menggunakan cara "logis", berikut adalah beberapa petunjuk: 1. Anda lupa menyatakan intsebagai tipe pengembalian. 2. Anda dapat menyimpan byte dengan memindahkan penugasan 0 ke deklarasi i: int c,i=0and for(;i<n;){. 3. Anda dapat menghapus tanda kurung di sekitar kondisi operator ternary.
Olivier Grégoire
1
@ OlivierGrégoire terima kasih Bung :) diperbaiki. solusi bagus btw
peech
1

DC, 55 byte

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

Diindeks 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

Daftar d menyimpan indeks nilai. Mendaftar dan menghitung jumlah iterasi yang diselesaikan. Daftar r menyimpan makro utama. Daftarkan y menyimpan nilai nanti dalam urutan, sementara tumpukan berisi nilai sebelumnya dalam urutan.

Penjelasan visual tentang apa yang terjadi dalam lingkaran besar (dengan asumsi penambahan):

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

Pemeriksaan untuk menentukan apakah menambah atau mengurangi mengambil modulo counter dua dan menggunakan trik ini untuk membuat konstruksi if then else.

Pada akhirnya tumpukan berisi angka tunggal, nilai yang diinginkan, yang dicetak bersama p.

(Saya masih baru dc, jadi saya berharap ada beberapa perbaikan yang jelas dilakukan di sini.)

poi830
sumber
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
SuperJedi224
sumber
0

Turtlèd , 35 byte

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

0 diindeks

Penjelasan:

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

Cobalah online!

Lemon dirusak
sumber
0

ABCR, 43 byte

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

Penjelasan: bagian pertama ( )AAB)ABB..A))A..A)AA(ABB.)A+A)))A) mengatur antrian A untuk memuat [1, 1, 2, -1, 1, -2, -1, -1, -2, 1, -1, 2], menjaga semua antrian lainnya kosong . iBmenyimpan istilah yang kita inginkan, dan perulangan 5aAb(Bxsiklus melalui antrian yang berkali-kali. omencetak bagian depan antrian sebagai angka, yang kemudian akan menjadi jawaban yang kita inginkan.

Steven H.
sumber
0

Batch, 49 byte

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

Mengambil input sebagai parameter baris perintah. Penjelasan: Formulir tertutup menggunakan pengamatan berikut:

  • Urutan bersifat siklik dengan periode 12
  • Setiap istilah ketiga adalah ± 2 sedangkan istilah lainnya adalah ± 1
  • Persyaratan setelah yang ketiga negatif kecuali kelipatan 5 (setelah mengurangi modulo 12)

Karena itu kami mulai dengan mengurangi modulo 12 (untuk menyimpan 2 byte). Kami kemudian mengurangi modulo tiga dan membalikkan hasilnya, yaitu 1 untuk kelipatan 3 atau 0 sebaliknya. Kami kemudian bitwise bukan nilai itu, memberi kami -2 untuk kelipatan 3 atau -1 sebaliknya. Kami kemudian mengurangi modulo 5 dan secara terpisah membaginya dengan 4, memberikan nol untuk istilah 1, 2, 3, 5, 10 dan 12 (0). Pembalikan dan peniadaan memberi kita -1 untuk nilai-nilai itu dan nol untuk nilai-nilai lain. Kami kemudian bitwise atau itu dengan 1 dan kalikan dengan perhitungan sebelumnya.

Neil
sumber
0

TI-Basic, 26 byte

Sayangnya, pendekatannya sangat tidak menarik. Saya tidak dapat menemukan yang lebih pendek. Daftar ini diindeks 1.

Input :{1,1,2,-1,1,-2:augment(Ans,-Ans:Ans(X
Timtech
sumber
0

C #, 73 71 byte

Ini menggunakan nilai terindeks 0 dari 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;};

Versi yang diformat:

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