Tentang Representasi Zeckendorf / Nomor Fibonacci Dasar
Ini adalah sistem angka yang menggunakan angka Fibonacci sebagai basisnya. Angka-angka terdiri dari 0 dan 1 dan masing-masing 1 berarti angka tersebut berisi angka Fibonacci yang sesuai, dan 0 berarti tidak.
Sebagai contoh, mari kita konversi semua bilangan asli <= 10 ke basis Fibonacci.
1 akan menjadi 1, karena itu adalah jumlah dari 1, yang merupakan angka Fibonacci,
2 akan menjadi 10, karena itu adalah jumlah dari 2, yang merupakan angka Fibonacci, dan itu tidak perlu 1, karena kami telah mencapai jumlah yang diinginkan.
3 akan menjadi 100, karena itu adalah jumlah dari 3, yang merupakan angka Fibonacci dan tidak perlu 2 atau 1 karena kita sudah mencapai jumlah yang diinginkan.
- 4 akan menjadi 101, karena itu adalah jumlah [3,1], yang keduanya adalah angka Fibonacci.
- 5 akan menjadi 1000, karena itu adalah jumlah dari 5, yang merupakan angka Fibonacci, dan kita tidak memerlukan angka lainnya.
- 6 akan menjadi 1001, karena itu adalah jumlah angka Fibonacci 5 dan 1.
- 7 akan menjadi 1010, karena itu adalah jumlah angka Fibonacci 5 dan 2.
- 8 akan menjadi 10.000, karena itu adalah angka Fibonacci.
- 9 akan menjadi 10001, karena itu adalah jumlah angka Fibonacci 8 dan 1.
- 10 akan menjadi 10010, karena itu adalah jumlah angka-angka Fibonacci 8 dan 2.
Mari kita konversi angka Fibonacci Basis acak, 10101001010 ke desimal: Pertama kita menulis angka Fibonacci yang sesuai. Kemudian kami menghitung jumlah angka di bawah 1.
1 0 1 0 1 0 0 1 0 1 0
144 89 55 34 21 13 8 5 3 2 1 -> 144+55+21+5+2 = 227.
Baca lebih lanjut tentang angka Fibonacci Dasar: tautan , ini juga memiliki alat yang mengubah bilangan bulat reguler ke Fibonacci dasar. Anda bisa bereksperimen dengannya.
Sekarang Pertanyaannya:
Tugas Anda adalah mengambil nomor di Representasi Zeckendorf, dan menampilkan nilai desimalnya.
Input adalah string yang hanya berisi 0 dan 1 (walaupun Anda dapat mengambil input dengan cara apa pun yang Anda inginkan).
Keluarkan satu angka dalam desimal.
Test case: (dalam format input-> output)
1001 -> 6
100101000 -> 73
1000000000 -> 89
1001000000100100010 -> 8432
1010000010001000100001010000 -> 723452
Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang.
Catatan: Input tidak akan berisi 0 terkemuka atau 1 berturut-turut.
Jawaban:
Taksi ,
19871927 byte-60 byte karena kesadaran bahwa linebreak adalah opsional.
Cobalah online!
Karena saya tidak kembali ke Garasi Taksi pada akhirnya, bos saya memecat saya, sehingga keluar dengan kesalahan.
sumber
Joyless Park
tampaknya tempat yang bagus untuk dikunjungiSunny Skies Park
.Perl 6 ,
2823 byteCobalah online!
Codeblock anonim yang mengambil daftar
1
s dan0
s di LSB memesan dan mengembalikan nomor.Penjelasan:
sumber
Jelly , 5 byte
Tautan monadik yang menerima daftar dalam bentuk Little-endian (yaitu dari LSB di kiri ke MSB di kanan).
Cobalah online!
sumber
J‘ÆḞḋṚ
.Bahasa Wolfram (Mathematica) ,
35322928 byteCobalah online!
sumber
Haskell , 38 byte
Cobalah online!
Mengambil input sebagai daftar 1s dan 0s.
Penjelasan
Membuat daftar angka Fibonacci tanpa yang pertama, dalam variabel
f
.Mengambil daftar input
reverse
dan mengalikan setiap entri dengan entri yang sesuaif
, lalusum
hasilnya.Haskell , 30 byte
Cobalah online!
Jika kita mengambil input dengan bit paling signifikan terlebih dahulu, kita tidak perlu
reverse
sehingga kita bisa menghemat 8 byte.sumber
Python 2 , 43 byte
Cobalah online!
Mengambil input sebagai daftar. Pembaruan adalah versi yang lebih pendek
a,b=b+x,a+b+x
, yang seperti pembaruan Fibonaccia,b=b,a+b
jika Anda abaikanx
.Python 2 , 45 byte
Cobalah online!
Mengambil input sebagai angka desimal.
sumber
Pyth, 13 byte
Sebagian besar (8 byte) ini hanya menghasilkan angka Fibonacci.
Cobalah dengan test suite ini!
Penjelasan:
sumber
Brain-Flak ,
110,102,96,94,78, 74 byteCobalah online!
sumber
J ,
2414 byteCobalah online!
Menurunkan versi 24-byte yang menggunakan basis campuran untuk Fibonacci.
Bagaimana itu bekerja
J , 21 byte
Cobalah online!
Versi olahan dari solusi 25-byte Galen Ivanov .
Menggunakan jumlah diagonal dari segitiga Pascal, yang setara dengan jumlah koefisien binomial:
Bagaimana itu bekerja
J , 24 byte
Cobalah online!
Kata kerja eksplisit monadik. Menghasilkan basis campuran yang mewakili basis Fibonacci, dan kemudian dimasukkan ke dalam konversi basis
#.
.Bagaimana itu bekerja
Alternatif
J , 27 byte
Cobalah online!
Ide:
J , 30 byte
Cobalah online!
Yang ini paling membutuhkan upaya untuk membangun. Menggunakan ekspresi bentuk tertutup dengan trik pembulatan. Dalam ekspresi, nilai 0 dan 1 masing-masing adalah 0 dan 1, jadi angka sebenarnya harus dimulai dengan 2.
Sementara kesalahan (
((1-sqrt(5))/2)^n
istilah) dapat meningkat, tidak pernah melebihi 0,5, jadi trik pembulatan bekerja hingga tak terbatas. Secara matematis:sumber
MathGolf ,
86 byteCobalah online!
Penjelasan
Disimpan 1 byte berkat JoKing, dan satu byte lagi berkat pemesanan LSB.
sumber
05AB1E ,
1198 byteCobalah online!
Penjelasan:
sumber
Θ
.1
sudah benar di 05AB1E. :) Juga2+
bisaÌ
.Python 3 , 63 byte
Cobalah online!
Mengambil input melalui STDIN sebagai string.
sumber
Merah ,
142, 126106 byteCobalah online!
sumber
Ruby , 39 byte
Cobalah online!
sumber
Stax , 6 byte
Jalankan dan debug itu
Cukup lurus ke depan. Pemesanan LSB.
sumber
Brain-Flak , 40 byte
Cobalah online!
sumber
C (gcc) , 63 byte
Mengambil input sebagai array
1
's dan0
' s, bersama dengan panjang array. Solusi ini adalah loop mundur yang agak lurus ke depan.Cobalah online!
sumber
Prolog (SWI) , 74 byte
Cobalah online!
Mengambil input sebagai daftar bilangan bulat 1 dan 0 dengan bit paling signifikan terlebih dahulu.
sumber
Retina 0.8.2 , 23 byte
Cobalah online! Tautan termasuk kasus uji lebih cepat. Penjelasan:
Masukkan pemisah di mana-mana dan hapus angka nol apa pun. Misalnya,
1001
menjadi;1;;;1;
.Ganti masing
1
- masing dengan yang berulang1
di masing-masing dua tempat berikutnya, karena jumlah nilainya sama dengan nilai aslinya1
.1
Karena itu bermigrasi dan mengakumulasikan hingga mencapai dua tempat terakhir, yang (karena pemisah yang baru ditambahkan) sekarang keduanya memiliki nilai1
.Hitung
1
s.sumber
Japt
-x
, 9 byteCobalah
sumber
JavaScript (Node.js) , 41 byte
Port jawaban xnor . Mengambil input sebagai literal BigInt.
Cobalah online!
JavaScript (ES6), 44 byte
Mengambil input sebagai array karakter, dalam urutan LSB-pertama.
Cobalah online!
sumber
Sebenarnya , 8 byte
Cobalah online!
Input diambil sebagai daftar bit dalam urutan pertama LSB.
Penjelasan:
sumber
Powershell, 68 byte
Skrip uji:
Keluaran:
sumber
Java (OpenJDK 8) , 65 byte
Cukup kecil untuk jawaban Java saya senang dengan itu. Mengambil input sebagai array int pertama yang dipesan LSB.
Cobalah online!
Tidak disatukan
sumber
Z80Golf , 34 byte
Contoh dengan input 1001-Coba online!
Contoh dengan input 100101000-Coba online!
Majelis:
sumber