Melihat ada banyak sekali tantangan Fibonacci normal, saya memutuskan bahwa mungkin menarik untuk menghitung konstanta Fibonacci Reciprocal - yaitu, jumlah kebalikan dari urutan Fibonacci.
Tantangannya adalah untuk menghitung konstanta Fibonacci Reciprocal dengan jumlah seri Fibonacci untuk menggunakan digit yang diberikan sebagai input, yaitu input 10 berarti menghitung berdasarkan pada kebalikan dari 10 angka Fibonacci pertama. Dalam kasus kemungkinan seri, kode terpendek menang.
Pemenang akan dipilih dalam tiga minggu melalui aturan standar kode-golf.
φ
builtin. (bukan APL untuk perubahan)Jawaban:
K (19)
(atau 17 jika Anda melewatkan mendefinisikannya sebagai fungsi)
Diuji pada Kona.
Pada dasarnya, ini menghasilkan nilai x pertama dari urutan fibonacci ke dalam array (tanpa menggunakan builtin), membagi 1 dengan setiap nilai dari seluruh array, mentranspos dan menjumlahkannya.
(terima kasih kepada @tmartin untuk metode penjumlahan yang lebih baik)
sumber
{+/*+%x(|+\)\|!2}
Perl - 35 byte
Penggunaan sampel:
Analisis lebih lanjut
Sangat menarik untuk dicatat bahwa jumlahnya
konvergen. Andaikata kita ingin menghitung beberapa ribu digit atau lebih, pendekatan naif itu hampir mencukupi. Konvergensi pada awalnya cukup lambat, tetapi mempercepat dengan cepat, sehingga 1000 digit hanya membutuhkan sekitar 4800 istilah. Contoh implementasi Python mungkin:
yang setelah satu atau dua keluaran:
(Empat digit terakhir tidak cukup konvergen, tapi kami akan mengabaikannya untuk saat ini.)
Mari kita coba sedikit mempercepat konvergensi. Trik standar adalah dengan menggunakan Transform Euler . Setelah ekspansi dan penyederhanaan, ini menghasilkan hasil yang lebih bagus:
Seharusnya cukup jelas mengapa ini bertemu lebih cepat; setiap istilah memiliki 3 istilah dalam penyebut daripada hanya satu. Menghitung 1000 digit hanya membutuhkan istilah 1600 (sepertiga lebih banyak):
Keluaran:
(Di sini lagi, 4 digit terakhir tidak bertemu.)
Kami belum selesai. Jika kami menggabungkan istilah yang berdekatan, kami berakhir dengan yang berikut:
Anjak setiap istilah dari sisa penjumlahan memberikan ekspresi bersarang:
Sekarang kita pergi ke suatu tempat. Perhatikan bahwa pembilang dari mengikuti OEIS A206351 (dengan pengecualian dari istilah pertama, yang dua kali lipat):
dan penyebutnya mengikuti OEIS A081016 (digeser satu istilah):
Masing-masing memiliki hubungan perulangan yang sangat sederhana, yaitu:
dan
masing-masing. Menyatukan semuanya, kami menemukan bahwa kami hanya membutuhkan 800 iterasi untuk 1000 digit:
yang keluaran:
(Di sini, akhirnya, 4 digit terakhir bertemu dengan benar.)
Tapi itu masih belum semuanya. Jika kita mengamati nilai-nilai perantara untuk s , kami menemukan bahwa nilai itu konvergen ke nilai yang berbeda sepenuhnya sebelum konvergen pada titik konvergensi yang sebenarnya. Alasan untuk ini adalah sebagai berikut:
Pemecahan untuk stabil s , kita menemukan bahwa:
Karena ini adalah root sederhana, kita dapat menggunakan Metode Newton untuk membawa kita ke sebagian besar jalan ke sana, dan kemudian melompat pada titik yang jauh lebih belakangan dalam iterasi. Hanya diperlukan sekitar 400 digit presisi (karena nilai b dan c tidak lebih besar dari itu), yang dapat dicapai hanya dengan 7 iterasi, sekaligus menghemat 320 iterasi dari loop utama:
Output identik dengan yang sebelumnya, runtime sekitar 0,02s pada sistem saya menggunakan PyPy v2.1. Meskipun perlu sepersepuluh jumlah iterasi seperti aslinya, ini jauh lebih cepat dari 10x karena mengalikan dan membaginya dengan istilah yang jauh lebih kecil. Saya tidak berpikir banyak yang bisa diubah, meskipun saya akan senang ditampilkan salah.
sumber
Mathematica (32 karakter tanpa Fibonacci bawaan)
Di sini saya menggunakan rumus pembulatan untuk angka Fibonacci
di mana
φ
rasio emas.sumber
Kona (
2521)Mungkin bisa dibuat lebih kecil oleh para ahli, tetapi saya masih belajar bahasa.
Yang terakhir sebenarnya tidak membutuhkan waktu lebih lama daripada yang lain.
sumber
%
sebagai fungsi timbal balik alih-alih melakukan1.%
-{+/%(x(|+\)\1 1)[;1]}
untuk 21 karakterf 0
hasil1.0
,f 1 -> 2.0
dan sebagainya.Mathematica
3024Dengan 6 karakter tersimpan, terima kasih kepada ybeltukov.
Sebelum menambahkan persyaratan:
Dengan tambahan termasuk:
sumber
Fibonacci
isListable
:) Dapat direduksi menjadiTr[1/Fibonacci@Range@#]&
APL, 21 karakter / byte *
Contoh
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL dapat ditulis dalam charset byte tunggal (lama) yang memetakan simbol APL ke nilai 128 byte atas. Oleh karena itu, untuk tujuan penilaian, program karakter N yang hanya menggunakan karakter ASCII dan simbol APL dapat dianggap sebagai panjang N byte.
sumber
Javascript, 33
Memasukkan:
n = 10
Berbasis di posting pertama saya di Perl, ini adalah hasil langsung dari Google Chrome Console .
sumber
K, 22
...
sumber
GTB , 35
Berjalan pada kalkulator TI-84
1
diY
dan0
diX
N
sebagai masukanFor
loopX
Y
diZ
danX+Y
diY
Z
diX
For
loopsumber
BC - 116
panggil r (n) dengan n untuk menyelesaikannya. Ketepatan dapat diatur secara sewenang-wenang, jadi ini adalah solusi paling akurat.
sumber
PERL,
6243Edit:
Setelah beberapa waktu melihat kode saya, saya dapat menyimpan 19 karakter:
sumber
Keempat, 64
pemakaian:
sumber
Python (
5551)Dalam mode interaktif:
sumber
Perl 6 , 27 byte
Cobalah online!
kalau tidak
Cobalah online!
sumber
Japt
-mx
, 6 byteCobalah
sumber
C # (.NET Core) , 66 byte
Cobalah online!
Tidak dapat menggunakan pelampung karena ketidaktepatan.
Contoh di mana input = 8:
Tidak Disatukan:
sumber
RPL (HP 49G / G + / 50g), 50 byte
Contoh:
10 -> 3.33046904076
11 -> 3.34170499582
30 -> 3.35988372158
55 -> 3.35988566622
Secara teori, jumlah dari 55 digit pertama akan memberikan 12 digit yang benar. Digit terakhir harus '4' bukan '2'. Ini harus diperbaiki dengan menambahkan syarat mundur, tetapi kode akan sedikit lebih lama.
Jika konstanta dihitung hingga 1000 tempat desimal menggunakan definisi, jumlah harus dilakukan setidaknya 4747 istilah pertama, yang akan memakan terlalu banyak waktu pada HP 50g, jika mungkin sama sekali. Untuk tugas ini diperlukan metode yang lebih efisien, seperti yang digunakan dalam program RPL berikut (464 bytes, checksum # 207Eh) yang argumennya adalah jumlah tempat desimal yang diinginkan:
1000 RFC ->
3.3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(22 menit 23 detik, pada HP 50g asli)
Untuk seribu digit, 50 syarat pertama dari seri tersebut ditambah 50 syarat dari fraksi lanjutan dievaluasi, dua sekaligus dalam hanya 25 iterasi (48 syarat masing-masing akan mencukupi, meskipun). Program DECIMAL BASIC yang setara hanya membutuhkan 10 milidetik pada komputer saya (Intel (R) Core (TM) Duo CPU E4700 @ 2.6 GHz).
sumber
JAEL,
97 byteMengubah diakritik dari satu karakter ke karakter lain memberi saya 1 byte
Masih bekerja pada pengkodean SBCS.
Penjelasan (dihasilkan secara otomatis):
sumber
u.
. Pada topik SBCS, Anda mungkin mengalami masalah karena dokumen Anda mencantumkan lebih dari 600 perintah atau kombinasi perintah, dan bahasa SBCS hanya dapat memiliki 256 perintah byte tunggal. Di sisi lain, ada sejumlah besar terjemahan yang tidak berguna ...Jeli , 5 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Pertanyaan ,
1311 byteCobalah online!
Penjelasan
sumber