Definisi
Urutan Fibonacci Kekuatan Bergantian dibentuk sebagai berikut.
Mulai dengan urutan kosong dan atur n ke 1 .
Hitung f n , yang n th non-negatif Fibonacci nomor , dengan pengulangan.
0 adalah yang pertama, 1 adalah yang kedua dan yang ketiga, 2 adalah yang keempat. Semua yang lain diperoleh dengan menjumlahkan dua angka sebelumnya dalam urutan, sehingga 3 = 1 + 2 adalah yang kelima, 5 = 2 + 3 adalah yang keenam, dll.Jika n ganjil, ubah tanda f n .
Append 2 n-1 salinan f n ke urutan.
Kenaikan n dan kembali ke langkah 2.
Ini adalah seratus syarat pertama dari urutan APF.
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
Tugas
Tulis program lengkap atau fungsi yang mengambil bilangan bulat positif n sebagai input dan mencetak atau mengembalikan istilah ke- n dari urutan APF.
Jika Anda lebih suka pengindeksan 0 berbasis, Anda alternatif dapat mengambil integer non-negatif n dan mencetak atau kembali jumlah APF pada indeks n .
Ini adalah kode-golf ; semoga kode terpendek dalam byte menang!
Uji kasus (berbasis 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
Test case (berbasis-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
Jawaban:
Jelly , 5 byte
Cobalah online!
Bagaimana?
Memperluas seri Fibonacci kembali ke indeks negatif sehingga hubungan
f(i) = f(i-2) + f(i-1)
masih berlaku:Kembali dari
i=0
angka adalah yang kita perlu ulangi 2 n-1 kali, dan Fibonacci bawaan JellyÆḞ
, akan menghitungnya.Kita dapat menemukan
-i
(angka positif) yang kita butuhkan dengan mengambil bit-length ofn
dan kurangi1
.Karena kita menginginkan
i
(angka negatif) kita dapat melakukan1-bitLength
dan Jelly memiliki atom untuk1-x
,,C
monad komplemen.sumber
µ
dan⁸
Python 2 , 30 byte
Cobalah online!
Diindeks satu.
Urutannya terasa seperti teka-teki, sesuatu yang dihasilkan Dennis dengan memiliki cara singkat untuk mengekspresikannya. Kekuatan-dari-pengulangan menyarankan berulang dengan menggeser-bit (lantai-membagi dengan 2). Rekursi Fibonacci-tanda bolak
f(n)=f(n-2)-f(n-1)
dapat disesuaikan dengan bithift sebagai pengganti decrementing. Kasing dasar bekerja dengan baik karena semuanya menyalurkan ken=0
.sumber
Mathematica,
433624 byte7 byte disimpan berkat @GregMartin, dan 12 byte lagi berkat @JungHwanMin.
sumber
Floor@Log2@#
, dan dengan menulisFibonacci[t=...]
(dan dengan menghapus spasi di eksponen terakhir).Fibonacci@-Floor@Log2@#&
-Fibonacci
dapat mengambil argumen negatif juga (mengurus tanda untuk Anda).MATL ,
19171611 byteInput berbasis 1.
Cobalah online! Atau verifikasi semua kasus uji .
Bagaimana itu bekerja
Untuk input n berbasis 1 , misalkan m adalah jumlah digit dalam ekspansi biner dari n . Istilah n -th dalam urutan output adalah istilah ke- m dalam urutan Fibonacci, mungkin dengan tandanya berubah.
Satu ide akan iterate m kali untuk menghitung hal deret Fibonacci. Ini mudah dengan
for each
loop menggunakan array angka biner. Jika deret Fibonacci diinisialisasi dengan 0 , maka 1 seperti biasa, iterasi m kali akan menghasilkan istilah m + 2 pada tumpukan, sehingga dua angka teratas harus dihapus. Sebagai gantinya, kami memulai dengan 1 , lalu 0 . Dengan begitu istilah yang dihasilkan berikutnya adalah 1 , 1 , 2 , ... dan hanya satu penghapusan yang diperlukan.Tanda bisa ditangani dengan menggunakan loop lain untuk mengubah kali tanda m . Tapi itu mahal. Lebih baik untuk mengintegrasikan dua loop, yang dilakukan hanya dengan mengurangi daripada menambahkan dalam iterasi Fibonacci.
sumber
JavaScript (ES6), 33 byte
1-diindeks.
Port jawaban xnor adalah 23:
sumber
Python 2 ,
838279 byteCobalah online!
sumber
or -1
.Jelly , 9 byte
Menggunakan pengindeksan berbasis satu.
Cobalah online!
Penjelasan
Metode ini berfungsi jika fungsi Fibonacci Anda hanya mendukung argumen non-negatif.
sumber
Japt , 6 byte
Uji secara online!
Bagaimana itu bekerja
Seperti disebutkan dalam jawaban lain, suku ke- n dalam seri Fibonacci tanda-bertanda adalah sama dengan suku ke- n dalam seri reguler. n dapat ditemukan dengan mengambil bit-length dari input dan mengurangi satu; meniadakan ini menghasilkan 1 dikurangi bit-length.
sumber
05AB1E ,
1110 byteMenggunakan pengindeksan berbasis 1
Fungsi Fibonacci 05AB1E mengembalikan angka fib positif kurang dari n , artinya kita harus menghasilkan lebih dari yang diperlukan, dapatkan yang benar dengan indeks dan kemudian hitung tandanya. Jadi saya ragu metode apa pun yang berbasis di sekitar itu akan lebih pendek daripada menghitung angka secara iteratif.
Menggunakan kesadaran bahwa kita dapat menginisialisasi tumpukan dengan
1, 0
terbalik untuk menangani kasus ketikan=1
seperti yang dijelaskan dalam jawaban MATL Luis Mendo .Cobalah online!
Penjelasan
sumber
Perl 6 , 53 byte
Implementasi sederhana dari urutan, seperti yang dijelaskan.
Berbasis nol.
sumber
Julia 0,5 , 19 byte
Cobalah online!
Bagaimana itu bekerja
Ini menggunakan rumus yang sama dengan jawaban Python @ xnor . Hubungan perulangan
g (n) = g (n-2) + g (n-1) menghasilkan istilah negatif dari deret Fibonacci, yang sama dengan syarat positif dengan tanda-tanda yang bergantian. Dari mana saja dalam menjalankan pengulangan 2 k dari angka yang sama, kita dapat memilih pengulangan apa pun dari pengerjaan sebelumnya dari 2 k-1 angka dan menjalankan 2 k-2 angka sebelumnya dengan membagi indeks dengan 2 dan 4 .
Alih-alih langsung
kita dapat mendefinisikan kembali operator untuk tujuan kita. Juga, f akan bekerja sama baiknya dengan mengapung, jadi kita dapatkan
Akhirnya, jika kita memperbarui n dengan pembagian dengan 4 , kita dapat menulis n / 2 sebagai 2n dan menghilangkan sepasang parens, yang mengarah ke definisi fungsi 19-byte dalam jawaban ini.
sumber
J , 18 byte
Menggunakan pengindeksan berbasis satu. Mengambil integer input n > 0 dan menghitung
floor(log2(n))
dengan menemukan panjang representasi binernya dan kemudian menurunkan nilai tersebut satu. Kemudian menemukan koefisienfloor(log2(n))-1
th dari fungsi menghasilkan x / (1 + x - x 2 ) yang merupakan gf untuk nilai-nilai Fibonacci yang diindeks negatif.Cobalah online!
Penjelasan
sumber