Latar Belakang
Sebagian besar orang akrab dengan angka Fibonacci F(n)
:
0, 1, 1, 2, 3, 5, 8, 13, 21 ...
Ini dibentuk oleh fungsi rekursi F(n) = F(n-1) + F(n-2)
dengan F(0)=0
dan F(1)=1
. A000045
Urutan yang terkait erat adalah angka Lucas L(m)
:
2, 1, 3, 4, 7, 11, 18, 29 ...
Ini dibentuk oleh fungsi rekursi L(m) = L(m-1) + L(m-2)
dengan L(0)=2
dan L(1)=1
. A000032
Kita dapat bergantian antara dua urutan berdasarkan indeks genap / ganjil, dengan konstruksi
A(x) = F(x)
jika x mod 2 = 0
dan A(x) = L(x)
sebaliknya. Misalnya, A(4)
sama dengan F(4)
sejak 4 mod 2 = 0
. Kami akan memanggil urutan ini Nomor Lucas-nacci , A(x)
:
0, 1, 1, 4, 3, 11, 8, 29, 21, 76 ...
Hal ini dapat dibentuk oleh fungsi rekursi A(x) = 3*A(x-2) - A(x-4)
dengan A(0)=0
, A(1)=1
, A(2)=1
, dan A(3)=4
. A005013
Tantangan
Input yang diberikan n
, output urutan n+1
angka hingga dan termasuk A(n)
seperti yang dijelaskan di atas. Bytes paling sedikit (atau byte-setara, seperti untuk LabVIEW , sebagaimana ditentukan secara individual pada Meta) menang.
Memasukkan
Bilangan bulat non-negatif tunggal n
.
Keluaran
Daftar nomor yang sesuai dengan urutan nomor Lucas-nacci dari A(0)
hingga A(n)
. Daftar harus berurutan seperti dijelaskan di atas.
Aturan
- Aturan standar kode golf dan pembatasan lubang berlaku.
- Aturan input / output standar berlaku.
- Nomor input dapat dalam format yang sesuai: unary atau desimal, baca dari STDIN, argumen fungsi atau baris perintah, dll. - pilihan Anda.
- Output dapat dicetak ke STDOUT atau dikembalikan sebagai hasil dari panggilan fungsi. Jika dicetak, pembatas yang sesuai untuk membedakan angka harus dimasukkan (dipisahkan spasi, dipisahkan koma, dll.).
- Selain itu, jika output ke STDOUT, spasi putih di sekitar, trailing newline, dll. Semuanya opsional.
- Jika inputnya adalah non-integer atau integer negatif, program dapat melakukan apa saja atau tidak sama sekali, karena perilaku tidak terdefinisi.
Contohnya
Input -> Output
0 -> 0
5 -> 0, 1, 1, 4, 3, 11
18 -> 0, 1, 1, 4, 3, 11, 8, 29, 21, 76, 55, 199, 144, 521, 377, 1364, 987, 3571, 2584
Jawaban:
Jelly, 12 byte
Cobalah online!
Latar Belakang
Kita dapat memperluas F dan L ke -1 dengan mendefinisikan F (-1) = 1 dan L (-1) = -1. Ini konsisten dengan fungsi rekursif.
Program kami dimulai dengan
Di setiap langkah, untuk membentuk pasangan berikutnya, kami membalikkan pasangan terakhir dan menambahkannya ke pasangan kedua dari belakang. Sebagai contoh:
Jika kami melanjutkan proses ini untuk beberapa langkah lagi, kami mendapatkannya
Urutan Lucas-nacci hanyalah kolom kiri.
Bagaimana itu bekerja
‡
С
mengintip dua tautan ke kiri:2
danU+¥
. Karena yang paling kiri adalah nilad, itu tidak bisa menjadi badan loop. Oleh karena itu,U+¥
digunakan sebagai badan dan angka dibaca dari input. Karena tidak ada argumen baris perintah, angka itu dibaca dari STDIN.sumber
CJam,
2120 byteTerima kasih kepada Sp3000 untuk menghemat 1 byte.
Uji di sini.
Penjelasan
Cukup gunakan perulangan yang diberikan dalam spec tantangan.
sumber
Perl 6, 42 byte
pemakaian
sumber
{( (0,1,*+*...*) Z (2,1,*+*...*) ).flat.rotor( 1=>2, 1=>0 )[ 0..$_ ].flat}
(0,1,1,4,{$^b;$^d;3*$^c-$^a}...*)[^(n+1)]
.Haskell,
59,57,56,52, 51 byteDefinisi seri diadaptasi dari jawaban ini .
Kurang bermain golf:
fibLike start
memberikan daftar yang tak terbatas, yang didefinisikan:f(0)=start, f(1)=1, f(n)=f(n-1) + f(n-2)
.whichStart i
mengembalikan 2 untuk input ganjil (seri Lucas) atau 0 untuk genap (seri Fibonacci).lucasNacci i
memberi nomor Lucas-nacci ke-i.firstN n
peta di atas daftar.Satu byte disimpan oleh Boomerang.
sumber
2*mod i 2
kel
kemudian Anda dapat menghapus tanda kurung. Seperti ini:l a=2*mod a 2:scanl(+)1(l a)
danf n=[l i!!i|i<-[0..n]]
ES6, 65 byte
Menggunakan relasi perulangan yang diberikan dalam pertanyaan.
sumber
Retina ,
706259 byteCobalah online
1?
$`¶
- Buat garis untuk setiap angka dari 0 hingga n :, 1, 11, 111, 1111, ...
m`^(11)*1$
$&ff
- Tambahkanff
garis ganjil. Ini akan menaburkan fungsi dengan L (0) = 2.m`$
f
- Tambahkanf
ke semua baris (perhatikan spasi). Ini menaburkan fungsi dengan 0 dan 1 untuk angka Fibonacci, dan 2 dan 1 untuk angka Lucas.+`1(f*) (f*)
$2 $2$1
- Loop: menghitung F (n + 1) = F (n) + F (n-1) saat masih ada 1s.f*
- Hapus F (n +1) dari ujung setiap baris.
f
kembali ke 1s. Jika ini tidak diperlukan dan kita bisa tetap denganf
s, panjangnya hanya 55 byte.sumber
Oracle SQL 11.2,
218216201 byteTidak bermain golf
Saya berhasil mendapatkan beberapa byte dengan menggunakan (menyalahgunakan?) Fungsi SIGN untuk menghasilkan 3 elemen pertama dari urutan.
sumber
Japt,
252221 byteUji secara online!
Latar Belakang
Agak sulit untuk membuat urutan Fibonacci di Japt, tetapi kami memiliki bawaan
Mg
untuk melakukannya untuk kami. Namun, ini hanya memberi kita urutan Fibonacci, bukan urutan Lucas. Kita dapat menyelesaikan urutan Lucas dengan cukup mudah menggunakan trik ini:Seperti yang Anda lihat,
F(N-1) + F(N+1)
samaL(N)
untuk semuaN
. Namun, karena kita hanya membutuhkan angka Lucas pada indeks ganjil, kita dapat menggabungkan dua rumus menjadi satu:Bagaimana itu bekerja
sumber
Mathematica,
5251 byteIde yang sangat mirip dengan Martin di atas, saya meluangkan waktu mencoba mencari cara yang lebih pendek untuk mendefinisikan "kasus dasar" untuk fungsi. Interpolasi polinomial adalah sebuah kegagalan, jadi saya menggunakan ini, menggunakan ekstensi menjadi negatif untuk menghasilkan definisi yang cukup singkat.
sumber
Mathematica, 56 byte
Implementasi yang sangat mudah. Menentukan fungsi helper
f
dan kemudian mengevaluasi ke fungsi yang tidak disebutkan namanya yang berlakuf
untuk rentang untuk mendapatkan semua hasil. Ini terasa tidak perlu rumit.Fungsi tunggal yang tidak disebutkan namanya tampaknya satu byte lebih lama:
sumber
MATL , 17
18byteTerjemahan hampir langsung dari jawaban Martin CJam .
Cobalah online!
sumber
Brachylog , 51 byte
Ini mengambil nomor sebagai input dan mencetak untuk STDOUT daftar, dengan spasi memisahkan setiap nomor.
Penjelasan
Pemotongan
!
dalam aturan pertama dari sub-predikat 1 diperlukan sehingga ketika kita mundur (\
), kita tidak berakhir dalam loop tak terbatas di mana penerjemah akan mencoba aturan kedua untuk input yang kurang dari 4.sumber
Mathematica, 41 byte
sumber
Groovy, 50 Bytes
Ini mendefinisikan fungsi x, yang mengambil n sebagai argumen pertama dan memiliki kasus dasar dari empat angka pertama dalam urutan Fibocas sebagai argumen default untuk sisa fungsi.
a di sini adalah n. b, c, d, dan e adalah empat elemen berikutnya dalam urutan.
Ini mengurangi n dan berulang sampai n kurang dari nol - ketika berulang, itu menambah nilai pengembalian akhir elemen pertama dalam urutan saat ini. Nilai baru untuk empat elemen berikutnya dalam urutan diberikan ke panggilan rekursif - tiga elemen terakhir digeser menjadi tiga yang pertama, dan elemen keempat yang baru dihasilkan dari dua elemen sebelumnya menggunakan 3 * db.
Ini membatasi nilai-nilai baru dengan daftar sarang, karena asyik dapat mengembalikan beberapa nilai dengan memasukkannya ke dalam daftar - sehingga setiap panggilan mengembalikan elemen pertama saat ini dan hasil rekursi, yang akan menjadi daftar sendiri.
sumber
R , 55 byte
Cobalah online!
sumber
Pylons , 19
Ini adalah terjemahan langsung dari pendekatan Martin.
Bagaimana itu bekerja:
sumber
DUP , 32 byte
Try it here!
Lambda anonim yang meninggalkan urutan angka di tumpukan. Pemakaian:
Penjelasan
sumber
Python 2, 71 byte
Ini sepertinya terlalu lama. Namun, saya senang bisa menggunakan
not
operator bitwise ... dua kali. Sekali sebagai semacam paritas bolak-balik, dan sekali untuk mengakhiri rekursi ketikan
mencapai-1
.Variabel
p
akan selalu berupa0
atau-1
, sehingga akan bergantian antara entri0
atau-1
daftar. (Memilih entri-1
daftar Python berarti memilih elemen terakhir.)sumber
C ++ Template Meta Programming, 130 byte
Definisi rekursif, entah bagaimana, menangis untuk C ++ TMP, penggunaan:
dengan
x
menjadi yangA(x)
kamu suka.sumber