Kita semua akrab dengan deret Fibonacci :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765
Namun, alih-alih, f(n) = f(n-1) + f(n-2)
kami akan mengambil jumlah digital dari 2 entri sebelumnya.
Urutan masih harus dimulai dengan 0, 1
, setelah itu perbedaannya jelas dengan cepat. Daftar ini diindeks 0, Anda dapat menggunakan 1-diindeks juga, menyatakan yang Anda gunakan.
f(0) = 0
f(1) = 1
f(2) = 1 # 0 + 1
f(3) = 2 # 1 + 1
f(4) = 3 # 1 + 2
f(5) = 5 # 2 + 3
f(6) = 8 # 3 + 5
f(7) = 13 # 8 + 5
f(8) = 12 # 8 + 1 + 3
f(9) = 7 # 1 + 3 + 1 + 2
f(10) = 10 # 1 + 2 + 7
f(11) = 8 # 7 + 1 + 0
f(12) = 9 # 1 + 0 + 8
f(13) = 17 # 8 + 9
f(14) = 17 # 9 + 1 + 7
f(15) = 16 # 1 + 7 + 1 + 7
f(16) = 15 # 1 + 7 + 1 + 6
f(17) = 13 # 1 + 6 + 1 + 5
f(18) = 10 # 1 + 5 + 1 + 3
f(19) = 5 # 1 + 3 + 1 + 0
f(20) = 6 # 1 + 0 + 5
f(21) = 11 # 5 + 6
f(22) = 8 # 6 + 1 + 1
f(23) = 10 # 1 + 1 + 8
f(24) = 9 # 8 + 1 + 0
f(25) = 10 # 1 + 0 + 9
f(26) = 10 # 9 + 1 + 0
f(27) = 2 # 1 + 0 + 1 + 0
(After this point it repeats at the 3rd term, 0-indexed)
Catatan: Saya tidak melihat pengulangan sampai saya memposting tantangan itu sendiri, dan di sini saya berpikir tidak mungkin untuk menulis tantangan Fibonacci novel baru.
Tugas Anda adalah, diberi nomor n
, menampilkan digit ke-n dari urutan ini.
Pertama 3 digit: [0,1,1]
,
Pola berulang 24 digit: [2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,10,9,10,10]
Petunjuk: Anda mungkin dapat memanfaatkan pengulangan ini untuk keuntungan Anda.
Ini adalah kode-golf , byte-count terendah adalah pemenangnya.
BONUS: Jika Anda menggunakan pengulangan dalam jawaban Anda, saya akan memberikan jawaban byte-count terendah yang mengambil keuntungan dari pengulangan dalam urutan hadiah 100 poin. Ini harus diserahkan sebagai bagian dari jawaban awal Anda, setelah jawaban awal Anda. Lihat posting ini sebagai contoh dari apa yang saya bicarakan: https://codegolf.stackexchange.com/a/108972/59376
Agar memenuhi syarat untuk bonus ini, kode Anda harus dijalankan dalam waktu yang konstan ( O(1)
) dengan penjelasan.
Pemenang Bonus: Dennis https://codegolf.stackexchange.com/a/108967/59376 <Dennis menang.
Implementasi Paling Unik: https://codegolf.stackexchange.com/a/108970/59376
(Juga akan menerima 100 poin, diselesaikan setelah jawaban yang benar dipilih)
sumber
%24
solusi "normal"?O(1)
. Kode Anda harus berjalan dalam waktu yang konstan, jika itu benar-benar mengeksploitasi pengulangan.Jawaban:
Oasis , 5 byte
Kode:
Cobalah online!
Versi yang diperluas:
Penjelasan:
sumber
JavaScript (ES6), 45 byte
x
dany
tidak bisa keduanya9
, karena itu akan membutuhkan nomor sebelumnya0
, jadi jumlah digital mereka tidak dapat melebihi17
. Ini berarti bahwa akar digital untuk angka lebih besar dari9
sama dengan modulo sisanya9
.sumber
Python 2, 53 byte
Fungsi rekursif. Kasus dasar
n=0
dann=1
hasiln
, angka yang lebih besar menghitung nilai dengan memanggilf(n-1)
danf(n-2)
mengonversikan masing-masing menjadi string, menggabungkan dua string, mengubah setiap karakter menjadi integer menggunakan fungsi,map
denganint
fungsi, dan kemudian menjumlahkan daftar yang dihasilkan.Menggunakan informasi modulo-24 saat ini saya bisa mendapatkan fungsi tanpa nama non-rekursif 56 byte:
sumber
JavaScript (ES6), 34 byte
Dapat membekukan browser Anda untuk input di atas 27 atau lebih, tetapi itu berfungsi untuk semua nilai input. Ini dapat diverifikasi dengan cache sederhana:
Seperti yang ditunjukkan dalam jawaban brilian Neil , output tidak pernah bisa melebihi 17, sehingga jumlah digital dari setiap output di atas 9 sama dengan
n%9
. Ini juga bekerja dengan output di bawah 9; kita dapat membuatnya bekerja untuk 9 juga dengan mengurangi 1 dengan~-
sebelum modulus, lalu menambahkan kembali 1 setelah.Yang terbaik yang bisa saya lakukan dengan hardcoding adalah 50 byte:
sumber
Jelly , 8 byte
Cobalah online!
Bagaimana itu bekerja
Solusi alternatif, 19 byte, waktu konstan
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6),
52 4645 bytePemakaian
Keluaran
Penjelasan
Fungsi ini memeriksa apakah input lebih kecil dari 2, dan jika demikian, ia mengembalikan input. Kalau tidak, itu menciptakan array dari dua nilai yang ditambahkan satu sama lain sebagai string. Kedua nilai tersebut adalah hasil dari memanggil fungsi dengan
input - 1
daninput - 2
.The
...
Operator membagi string ini ke dalam array dari karakter, yang kemudian dikonversi ke string lagi, tapi sekarang dengan+
es antara nilai-nilai. String ini kemudian diartikan sebagai kode, sehingga jumlahnya dihitung, yang kemudian dikembalikan.Ini adalah algoritma rekursif ganda, yang membuatnya tidak efisien. Perlu 2
n-2
panggilan fungsi untuk inputn
. Karena itu, inilah solusi yang lebih panjang tetapi lebih cepat. Terima kasih kepada ETHproductions untuk datang dengan itu.sumber
[..._(--$)+[_(--$)]]
:-)05AB1E , 8 byte
Cobalah online!
Penjelasan
sumber
CJam,
2220 byteDisimpan 2 byte berkat Martin Ender
Algoritma rekursif langsung, tidak ada yang mewah. Diindeks 0.
Cobalah online! atau tes untuk 0-50 (sebenarnya berjalan cukup cepat).
Penjelasan
CJam, 42 byte
Solusi menggunakan pengulangan. Algoritma serupa dengan solusi Jonathan Allan.
Cobalah online!
sumber
Perl 6 ,
4137 byteCobalah
Cobalah
sumber
*.comb.sum+*.comb.sum
.MATL , 15 byte
Cobalah online!
sumber
Python 2 ,
5446 byteSangat terinspirasi oleh jawaban ES6 dari @ETHproductions .
Cobalah online!
sumber
C, 96 byte
atau 61 byte menghitung kode melarikan diri masing-masing 1 byte
0 diindeks. Mirip dengan beberapa jawaban lain saya mengindeks tabel pencarian nilai tetapi saya telah mengompresnya menjadi potongan 4 byte. Saya tidak repot-repot menyelidiki versi mod 24 karena saya tidak berpikir itu menarik karena yang lain sudah melakukannya tetapi mari kita hadapi itu, C tidak akan menang lagi.
penjelasan:
Cobalah online!
sumber
Japt ,
2725 byteCobalah online!
Disimpan 2 byte berkat produk ETH.
sumber
´
di tempat--
untuk menyimpan dua byte.Haskell , 54 byte
Cobalah online! Pemakaian:
(g!!) 12
sumber
Mathematica, 49 byte
Definisi rekursif langsung. Akan sangat lambat setelah beberapa saat.
Mathematica,
7971 byteHardcoding pola periodik. Petir cepat dan memuaskan kasar untuk Mathematica :) Terima kasih kepada JungHwan Min untuk menghemat 8 byte!
sumber
LetterNumber@"JJBCEHMLGJHIQQPOMJEFKHJ"
adalah 8 byte lebih pendek dari43626804920391712116157158790~IntegerDigits~18
.LetterNumber
....Python 2 , 56 byte
Solusi berulang sederhana.
Cobalah online!
Penggunaan
(a%9or a)+(b%9or b)
sebenarnya ternyata lebih pendek darisum(map(int(`a`+`b`)))
!sumber
sum(map(int,a+b))
(tidak tahu cara menggunakan `dalam komentar)PowerShell , 79 byte
Cobalah online!
Solusi iteratif membosankan yang panjang yang melakukan perhitungan digit-sum langsung setiap
for
loop. Pada akhir dari loop, angka yang kita inginkan ada$b
, jadi yang tersisa di pipeline dan outputnya implisit. Perhatikan bahwa jika inputnya adalah0
, maka loop tidak akan masuk karena kondisinya salah, jadi$b
tetap0
.sumber
Batch, 85 byte
Saya bertanya-tanya bagaimana saya akan mem-porting jawaban JavaScript saya ke batch tetapi petunjuknya ada pada solusi Python @ Dennis.
sumber
Pyth, 20 byte
Suatu program yang mengambil input dari bilangan bulat yang diindeks nol dan mencetak hasilnya.
Test suite (Bagian pertama untuk pemformatan)
Bagaimana itu bekerja
[Penjelasan datang nanti]
sumber
Ruby, 58 byte
Solusi hardcoded sederhana.
sumber
ditumpuk , 40 byte
Lambda ini setara dengan lambda berikut:
Cobalah online!
sumber
Oktaf, 148 byte
sumber
Haskell, 151 byte
Aktifkan fungsi dengan
f 123456789012345678901234567890123456789012345678
, misalnya.Kode ini juga berfungsi dengan indeks yang sangat besar. Karena fungsionalitas modulo 24 yang diterapkan sangat cepat.
Kode tidak terkompresi:
sumber
R, 90 byte
Solusi yang sangat panjang, tapi ini lebih baik daripada yang semula saya miliki. Saya curiga ada banyak cara yang lebih baik untuk melakukan ini, tetapi saya tidak bisa melihatnya saat ini.
Ini adalah fungsi tanpa nama yang menggunakan
gsub
danscan(t=
untuk membagi angka-angka dalam vektor menjadi digit. Jumlahnya ditambahkan ke vektor sementara item pertama dijatuhkan.repeat
digunakan untuk melangkah melalui urutann
waktu dan hasilnya adalah item pertama dari vektor.sumber
PHP, 80 Bytes
Versi Online
sumber
Mathematica, 67 byte
sumber