Seperti yang mungkin Anda ketahui, Angka Fibonacci adalah angka yang merupakan jumlah dari dua angka sebelumnya dalam seri.
Digit Fibonacci ™ adalah angka yang merupakan jumlah dari dua digit sebelumnya .
Misalnya, untuk seri awal 1,1
, seri akan menjadi 1,1,2,3,5,8,13,4,7,11,2...
Perubahan terjadi setelah 13
, di mana, alih-alih menambahkan 8+13
, Anda menambahkan 1+3
. Serial loop di akhir, di mana 4+7=11
, dan 1+1=2
, sama dengan seri dimulai.
Sebagai contoh lain, seri awal 2,2
: 2,2,4,6,10,1,1,2,3,5,8,13,4,7,11,2,3...
. Yang satu ini dimulai secara unik, tetapi setelah jumlah digit 10
, Anda berakhir dengan 1+0=1, 0+1=1
, dan seri berlanjut - dan loop - dengan cara yang sama seperti 1,1
seri.
Tantangan
Diberikan input integer 0≤n≤99
, hitung loop dalam seri Fibonacci Digit yang dimulai dengan dua digit itu. (Anda tentu saja diperbolehkan untuk mempertimbangkan bilangan bulat di luar rentang ini, tetapi itu tidak diperlukan.) Jika diberi input satu digit, kode Anda harus menafsirkannya untuk menunjukkan awal seri 0,n
.
Semua angka dalam loop yang dua digit harus dikeluarkan sebagai dua digit. Jadi, misalnya, loop untuk 1,1
berisi 13
, bukan 1,3
.
Output dimulai dengan angka pertama dalam loop. Jadi, berdasarkan batasan di atas, loop untuk 1,1
dimulai dengan 2
, sejak 1,1
dan 11
dihitung secara terpisah.
Setiap jumlah output dapat dipisahkan oleh apa pun yang Anda inginkan, asalkan konsisten. Dalam semua contoh saya, saya menggunakan koma, tetapi spasi, jeda baris, huruf acak, dll. Semua diperbolehkan, selama Anda selalu menggunakan pemisahan yang sama. Jadi 2g3g5g8g13g4g7g11
adalah hasil hukum untuk 1
, tetapi 2j3g5i8s13m4g7sk11
tidak. Anda dapat menggunakan string, daftar, array, apa pun, asalkan Anda memiliki angka yang benar dalam urutan yang benar dipisahkan oleh pemisah yang konsisten. Membatasi seluruh output juga diperbolehkan (mis. (5,9,14)
Atau [5,9,14]
, dll.).
Kasus uji:
1 -> 2,3,5,8,13,4,7,11
2 -> 2,3,5,8,13,4,7,11
3 -> 11,2,3,5,8,13,4,7
4 -> 3,5,8,13,4,7,11,2
5 -> 2,3,5,8,13,4,7,11
6 -> 3,5,8,13,4,7,11,2
7 -> 14,5,9
8 -> 13,4,7,11,2,3,5,8
9 -> 11,2,3,5,8,13,4,7
0 -> 0
14 -> 5,9,14
59 -> 5,9,14
Ini adalah kode-golf , sehingga jumlah byte terendah menang.
14
dan59
memberikan hasil yang sama. Jika59
diartikan sebagai awal5,9
dan membiarkan itu sebagai bagian dari loop maka tentunya14
harus menjadi awal dari loopnya?0,1,1,2,3,5,8,13,4,7,11,2,3
. Pertama kali loop berulang adalah pada detik2
.1,4,5,9,14,5
dan5,9,14,5,9
. Keduanya diulang mulai dengan yang kedua5
. Seperti yang saya katakan sebelumnya, hanya input yang dipisahkan; nomor-nomor selanjutnya menyimpan digit mereka bersama-sama dalam urutan.Jawaban:
Jelly , 15 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Perl 6 ,
96 7875 byte-3 byte terima kasih kepada nwellnhof
Cobalah online!
0 menghasilkan 0, dan angka lainnya mengembalikan objek Match yang bersesuaian dengan angka yang dipisahkan oleh spasi dengan spasi tambahan di awal.
Penjelasan:
sumber
JavaScript (ES6),
111 104103 byteCobalah online!
Berkomentar
sumber
Python 3 ,
1871761581391381291211201129695120116 byteCobalah online!
Sunting: Seperti dicatat oleh @ Jules , solusi yang lebih pendek berlaku untuk Python 3.6+.Tidak ada lagi solusi berbeda untuk Python 3 / 3.6+Edit: Pengindeksan
z
terlalu bertele-tele. Tanpa itu sekarang tidak ada keuntungan dalam menggunakaneval
.Sunting: Temuan yang disederhanakan jika dua elemen terakhir sudah muncul dalam urutan.
Edit: Mengubah format output dari daftar ke tuple + diganti
lambda
dengandef
Sunting: Kembali ke
lambda
tetapi disematkant
kef
.Sunting: Input
n
sebenarnya dapat diartikan sebagai kepala koleksi tumbuhz
yang akan mewakili ekor dalam pendekatan rekursif. Juga mengalahkan solusi @ Arbo lagi.Sunting: Sebenarnya Anda dapat membongkar dua item dari kepala yang memotong 16 byte lainnya.
Sunting: Sebenarnya 17 byte.
Sunting: Seperti dicatat oleh @ solusi Arbo memberi jawaban untuk
14
dan59
kasus karena mereka dalam kasus uji awal yang terbukti kemudian salah. Untuk saat ini ini tidak terlalu pendek tetapi setidaknya berfungsi dengan benar.Cukup penyalahgunaan
f-strings
daneval
. Kode ungolfed asli walaupun saya menduga itu bisa dilakukan dengan lebih mudah:sumber
59
hasil(14, 5, 9)
C (gcc) ,
114112109 byteCobalah online!
-3 dari ceilingcat
Termasuk ruang tambahan.
sumber
do...while
tidak perlu kawat gigi jika itu adalah satu pernyataan O_oPerl 5,
9076 byteTIO
sumber
Java (JDK) , 194 byte
Cobalah online!
Hardcoded sepertinya yang terpendek mengingat Python sudah memiliki jawaban 187 ...
sumber
Haskell, 100 byte
Cobalah online!
sumber
Python 2 ,
123114113 byteCobalah online!
Program ini membangun tuple
p
dari semua pasangan 2-nilai yang telah terjadi dalam urutan, yang diinisialisasi dengan junk untuk menyimpan beberapa byte. Urutan itu sendiri dibangun di tuplel
, dan dua elemen terakhir dari tuple ini disimpan dalamb
untuk referensi yang mudah (dan pendek). Begitu mengulang ditemukan, kita dapat melihat indeksb
dip
tahu di mana loop dimulai.EDIT: Membersihkan ini sedikit, dan memotong satu byte lagi ... Metode saya tampaknya mendekati batas jumlah byte, dan saya benar-benar harus berhenti bekerja pada ini.
sumber
Arang , 46 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Masukkan nomor, gabungkan menjadi 2 karakter, lalu ambil jumlah digital setiap karakter, dan simpan daftar yang dihasilkan.
Ulangi saat daftar loop kosong.
Hitung jumlah dari dua digit sebelumnya dan tambahkan ke daftar Fibonacci.
Ambil semua sufiks nontrivial dari daftar.
Saring yang tidak berulang dan simpan hasilnya di daftar loop.
Keluarkan daftar loop ke string dan cetak.
sumber
Merah ,
189178164137 byteCobalah online!
sumber
Python 2 ,
149139 byteCobalah online!
Mengharapkan bilangan bulat non-negatif sebagai input. Bytecount lebih kecil, tetapi kemungkinan tidak akan lagi berfungsi untuk bilangan bulat> 99.
Penjelasan:
sumber