Tantangan
Angka plastik adalah angka yang terkait dengan rasio emas, dengan banyak sifat matematika yang menarik. Karena itu, ada banyak pendekatan yang dapat digunakan untuk menghitung angka.
Untuk menentukan secara tepat angka untuk tujuan tantangan ini, kami akan menggunakan definisi berikut (meskipun ada banyak definisi yang setara, dan Anda dapat menggunakan definisi apa pun yang Anda inginkan asalkan sampai ke nomor yang sama):
Angka plastik adalah bilangan real ρ sehingga ρ ³ = ρ +1.
Tantangan Anda adalah menulis sebuah program atau fungsi yang mengambil integer x sebagai input (dengan x > 1), dan menghasilkan perkiraan untuk ρ sebagai output, sehingga semakin besar nilai x didapat, semakin dekat output ke ρ ( dengan paling banyak pengecualian, bertahan pada nilai yang sama dengan "lebih dekat" untuk tujuan ini), dan untuk setiap angka positif δ , ada beberapa input x untuk program Anda yang menghasilkan output yang berada dalam δ dari ρ .
Klarifikasi
- Jika Anda mengeluarkan melalui metode yang secara inheren mengeluarkan string (misalnya aliran output standar), Anda dapat memformat output dalam bentuk desimal (misalnya
1.3247179572
), atau sebagai rasio dua bilangan bulat dengan/
karakter di antara mereka. - Jika Anda menghasilkan sebagai nilai dalam bahasa pemrograman Anda (misalnya kembali dari suatu fungsi), itu harus dari titik tetap, titik mengambang, atau jenis rasional. (Secara khusus, Anda tidak dapat menggunakan tipe data yang menyimpan angka secara simbolis, kecuali jika mereka hanya digunakan untuk menahan rasio dua bilangan bulat. Jadi, jika Anda menggunakan Mathematica atau bahasa yang serupa, Anda harus menyertakan tambahan kode untuk benar-benar menghasilkan digit dari output.)
- Jawaban Anda harus bekerja dalam varian hipotetis dari bahasa Anda di mana bilangan bulat dapat secara sewenang-wenang besar, dan memori (termasuk tumpukan) tidak terbatas. Anda tidak boleh berasumsi bahwa aritmatika titik-mengambang dalam bahasa Anda akurat secara sewenang-wenang, tetapi sebaliknya harus menggunakan keakuratannya yang sebenarnya (artinya mengeluarkan nomor titik-mengambang hanya akan mungkin dilakukan dalam bahasa-bahasa di mana akurasi angka-angka titik-mengambang dapat dikontrol saat runtime).
- x dapat memiliki makna apa pun yang Anda inginkan (selama meningkatkannya memberikan hasil yang lebih akurat). Saya membayangkan bahwa sebagian besar pengiriman akan mengontrol jumlah digit output yang akan dihasilkan, atau jumlah iterasi dari algoritma yang digunakan oleh program Anda untuk berkumpul pada nomor plastik, tetapi makna lain dapat diterima.
Kasus cobaan
Berikut adalah beberapa digit pertama nomor plastik:
1.32471795724474602596090885
Lebih banyak digit tersedia di OEIS .
Kondisi kemenangan
Seperti biasa untuk kode-golf , lebih pendek lebih baik, diukur dalam byte. Namun, jangan ragu untuk mengirim jawaban meskipun mereka tidak menang, asalkan mereka menambahkan sesuatu (misalnya bahasa yang berbeda, atau algoritma yang berbeda) ke jawaban yang ada.
Jawaban:
Python 2 , 49 byte
Cobalah online!
Idenya adalah untuk mengekspresikan
ρ
denganρ³=ρ+1
sebagai pecahann/x
yang penyebutnyax
adalah parameter akurasi input. Kami mengambil(n/x)³=n/x+1
dan menghapus penyebut untuk mendapatkann³=x²(x+n)
.Karena LHS meningkat
n
lebih cepat daripada RHS, kita dapat memperkirakan titik persamaann
sebagai yang terkeciln³≥x²(x+n)
. Kode ini dihitungn
hingga hal ini terjadi, mulai darix
yang lebih kecil.Hemat byte kecil adalah untuk membagi kedua sisi dengan
x²
menulisn³/x²≥x+n
(dinegasikan dalamwhile
kondisi). Ini adalah pembagian lantai dalam kode, tetapi bagian pecahan yang hilang dapat diabaikan.Alternatif dengan panjang yang sama digunakan
x
sebagai pembilang:Python 2 , 49 byte
Cobalah online!
sumber
2**input()
bukan hanyainput()
; kemudian, masing-masing perkiraan akan seakurat yang sebelumnya.Mathematica, 20 byte
Root
Fungsi builtin Mathematica memberikan solusi untuk persamaan polinomialf[x] == 0
.Penjelasan
Contoh I / O
sumber
Root[x^3-x-1,1]~N~#&
berfungsi dengan baik (meskipun tidak mengatakan itux
adalah variabel) untuk jumlah byte yang sama.Mathematica, 27 byte
-1 byte dari Martin
-2 byte dari ovs
memasukkan
keluaran
sumber
Solve[x^3==x+1>2,x]~N~#&
untuk 24 byte{{x -> 1.32...}}
. Anda mungkin ingin memeriksa dengan apakah ini format output yang valid.{1.32...}
sebenarnya, tetapi format itu mungkin kurang kontroversial.sed ,
6760 (59 +1) byteCobalah online!
+1 untuk
-E
bendera (ERE bukan BRE). Input dan output keduanya unary: input 11111 untuk x = 5 misalnya Output adalah sebagian kecil dari dua angka unary: input 11111 tersebut menghasilkan output 11111/1111 (5/4 dalam desimal).Perkiraan angka plastik sebagai fraksi antara elemen berurutan dari urutan Padovan .
sumber
b
perintah, tetapi Anda dapat membuatnya lebih pendek dengan menggunakan label kosong (:
danb
tanpa argumen). tio.run/#%23K05N@f@/…t
alih-alihb
, jadi itu adalah save yang cukup bagus. Terima kasih :)Mathematica, 27 byte
Menggunakan pendekatan terpotong dari bentuk radikal kubik bersarang ³√ (1 + ³√ (1 + ³√ (1 + ...)))) . Sementara output akan selalu memiliki tempat desimal x-1 , hasilnya sebenarnya kurang akurat dari itu, karena ekspresi menyatu lebih lambat dari satu digit per iterasi ( x juga digunakan sebagai jumlah radikal bersarang yang dihitung). Misalnya x = 100 memberi
di mana bagian yang digarisbawahi benar.
sumber
dc
, tetapi terhalang karena ternyata tidak memiliki operasi root cube, dan meningkatkan angka ke kekuatan power tidak berfungsi baik :-( Setidaknya Anda selalu dapat mengandalkan Mathematica memilikiCubeRoot
tapi tidak ada yang punya byte untuk itu.Oktaf , 50 byte
Cobalah online!
Menentukan fungsi anonim, dengan
n
jumlah digit output yang diinginkan.Jawaban ini menyalahgunakan yang
digits
mengembalikan pengaturan saat ini untuk jumlah digit dalam aritmatika presisi variabel. Ini berarti kita bisa menggunakannya dalam fungsi anonim tanpa kesalahan tentang 'Terlalu banyak argumen keluaran'.Selain itu, ini sangat mudah:
vpasolve
kependekan dari Variable-Precision Arithmetic Solve, dengan ketepatan yang ditetapkan oleh panggilan terakhirdigits
. Karenavpa
merupakan tipe data simbolik dalam Oktaf, yang dilarang per spec, kami hanya membungkus seluruh fungsichar(...)
untuk mendapatkan output string. Perhatikan bahwa disolve
danvpasolve
,f==0
tersirat, jadir^3==r+1
telah diganti olehr^3-r-1 (==0)
sumber
MATL (
2728 byte)Solusi pertama saya (27 byte)
Cobalah online!
Ini tentu tidak optimal, saya masih terbiasa dengan MATL.
Penjelasan:
Saya membuat urutan Padovan hingga memasukkan + 3 kemudian menemukan rasio dari dua angka terakhir.
Output fraksi yang tepat
(35 byte)(28 byte, @Sanchises):Namun, solusi pertama tidak memenuhi kebutuhan akan presisi yang berubah-ubah menjadi batas titik mengambang dari pengaturan MATL default. Jadi, daripada menambahkan beberapa byte untuk memperpanjang presisi ini, itu mudah untuk mengambil rute fraksi yang tepat dan menulis sebagian kecil dari akhir dua bilangan bulat dalam (N-1) th dan N th elemen dari urutan Padovan terpotong.
mis. "114/86"
7BG: "t @) y @ 1 +) + h] tG3 +) V '/' YcyG2 +) VYcAtas perkenan pengguna @Sanchises. :)
Cobalah online!
Evaluasi non-iteratif:
Khususnya, kode terpendek saya untuk versi 'tepat' adalah (23 byte):
Cobalah online!
... tetapi tidak memberikan presisi yang sewenang-wenang. Saya bertanya-tanya apakah ada yang bisa menyesuaikan ini untuk memenuhi aturan (gunakan input dll) dan masih menambahkan kurang dari 5 byte? : P
sumber
1+
dapat disingkat menjadi.Q
Dengan mengingat hal itu, Anda dapat menggantinya@)y@1+)+
dengan adil@tQh)s
. Selanjutnya, Anda bisa menggunakanJ
untuk menunjukkan akhir dari array; dan akhirnya, MATL tidak membedakan antara array normal dan array karakter, sehingga Anda dapat menggantinyaYc
denganh
(Anda tidak memerlukan fungsionalitas tambahanYc
). Ini hanya memberikan 28 byte:7BG:"t@tQh)sh]tJ)V47hyJq)Vh&
(perhatikan&
untuk mencegah output berlebihan, dan ganti'/'
dengan 47).7B
, jauh lebih baik daripada mendorong secara naiflllv
J
secara default berisi1j
, tetapi clipboardL
juga mengandung banyak fungsi pengindeksan yang berguna (perhatikan bahwa1j
sama denganend
di MATL).M ,
1514 byteCobalah online!
Algoritma
Ini menggunakan rasional dan metode Newton. Khususnya, untuk input x , iterasi x pertama dengan nilai awal x diterapkan.
Kami mencoba menemukan akar spesifik dari polinomial p (t) = t³ - t - 1 . Metode Newton mencapai ini dengan mengambil nilai awal t 0 - cukup dekat dengan ρ - dan secara rekursif mendefinisikan urutan dengan
t n + 1 = t n - p (t n ) / p '(t n ) .
Karena p '(t) = 3t² -1 , kita mendapatkan
t n + 1 = t n - (t n ³ - t n - 1) / (3t n ² - 1) = (3t n ³ - t n - t n ³ + t n + 1) / (3t n ² - 1) = (2t n ³ + 1) / (3t n ² - 1) .
Perhatikan bahwa perkiraan awal x semakin memburuk dengan meningkatnya x . Sementara output untuk x = 3 sedikit kurang tepat daripada output untuk x = 2 , karena metode Newton konvergen secara kuadrat ke ρ , ini seharusnya tidak menjadi masalah untuk nilai x yang besar .
Bagaimana itu bekerja
sumber
µ¡
...Julia 0,5 ,
4440 byteMenggunakan rasional dan metode Newton.
Cobalah online!
sumber
05AB1E , 23 byte
Cobalah online!
Port langsung /codegolf//a/126822/59376 oleh xnor.
sumber
Arang , 28 byte
Cobalah online! Tautan ke mode verbose. Saya juga tampaknya kacau
Divide
danIntDivide
: |Menggunakan metode yang sama dengan jawaban Python dan JavaScript.
sumber
NewStack , 14 byte
Kerusakan:
Bagaimana itu bekerja:
Rumus (2x 3 1) / (3x 2 -1) berasal dari penyederhanaan metode Newton untuk equasion x 3 = x + 1. Anda dapat menemukannya di sini . Mengulangi proses ini dengan jumlah kali tak terbatas yang menyatu dengan nomor plastik. Tingkat konvergensi agak cepat di sekitar 2,6 desimal per iterasi.
Alternatif urutan Padovan,
272517 byteKerusakan:
-2 byte dengan memilih strategi cetak yang lebih baik
-8 byte dengan memilih cara yang lebih baik untuk mengindeks tumpukan
Bagaimana itu bekerja:
Sebagai urutan Padovan berlanjut, rasio dari dua elemen terakhir bertemu dengan nomor plastik.
sumber
Clojure, 46 byte
Menggunakan formula cube-root iterated. Ini sedikit lebih menarik tetapi lebih lama:
sumber
Javascript, 36 byte
Bekerja sama dengan jawaban python atas. Tidak
console.log
dimasukkan karena jika Anda menjalankanf(x)
di konsol itu akan dicatat secara otomatis.sumber
> <> , 38 + 3 = 41 byte
Mengharapkan input untuk hadir pada stack pada saat program mulai, jadi +3 byte untuk
-v
flag.Cobalah online!
Secara efektif melakukan pencarian biner untuk mempersempit nilai output. Semakin banyak
x
meningkatkan jumlah iterasi untuk melakukan.Sunting: kalkulasi refactored sedikit untuk menghemat 1 byte, versi sebelumnya:
sumber
k, 27 byte
Cobalah online! Ini mengasumsikan bilangan bulat tak terbatas (yang, sayangnya, tidak benar). Ia menggunakan urutan Padovan .
sumber
TI-BASIC, 21 byte
Gunakan formula rekursif ini .
Menariknya, mengkode angka dan membulatkannya memberikan byte-count yang sama:
TI-BASIC, 21 byte
Menggunakan rumus trigonometri ini .
sumber
Your answer must work in a hypothetical variant of your language in which integers can be arbitrarily large, and memory (including stack) is unlimited. You may not assume that floating-point arithmetic in your language is arbitrarily accurate, but must instead use its actual accuracy (meaning that outputting a floating-point number is only going to be possible in languages where the accuracy of floating-point numbers can be controlled at runtime).
C # , 317 byte
Ini mengembalikan hasilnya sebagai sebagian kecil.
Penjelasan
Ia menggunakan metode Newton dengan x iterasi untuk menemukan akar polinomial p ^ 3-p-1 = 0. Rumusnya adalah x_n = 1- (f (x_ (n-1))) / (f '(x_ (n-1)))), dan x_0 adalah titik awal.
Turunan polinomialnya adalah 3p ^ 2-1, dan katakanlah x_ (n-1) = b / c. Kemudian, dengan menggunakan rumus di atas kita dapatkan, bahwa x_n = (2 b ^ 3 + c ^ 3) / (3 b ^ 2 cc ^ 3). Katakan juga, bahwa kita mulai dari 1, ini akan terjadi, ketika x = 2, karena x> 1, dan merupakan bilangan bulat. Kode idented, dan komentar:
sumber
PHP, 86 byte
PHP Sandbox Online
Menciptakan Padovan Spiral dan mencetak rasio dari dua angka terakhir.
sumber
Aksioma, 96 byte
hasil
bagaimana Anda bisa melihat h (2) harus 1,32 dan bukan 1,33 sehingga ada beberapa kesalahan dalam digit terakhir
Maka akan ada yang satu ini dari 110 byte
Ini menggunakan rumus untuk menyelesaikan persamaan kelas III tipe x ^ 3-3 * p * x-2 * q = 0 dalam kasus q ^ 2-p ^ 3> = 0 yaitu m = sqrt (q ^ 2- p ^ 3) dan x = (q + m) ^ (1/3) + (qm) ^ (1/3)
Dalam kasus kami r ^ 3-r-1 = 0 ini dapat ditulis sebagai r ^ 3-3 * (1/3) r-2 * (1/2) = 0 jadi p = 1/3 q = 1/2 m = 1 / 4-1 / 27 = 23/108 x = (0,5 + m) ^ (1/3) + (0,5-m) ^ (1/3)
ini yang menggunakan iterasi Newton dengan titik awal r = 1
itu berubah dalam fungsi, nilai digit untuk mendapatkan satu objek n + 1 digit di atas titik float. Pada akhirnya nilai digit () ditugaskan kembali ke nilai sebelumnya.
sumber
Ruby , 35 byte
Cobalah online!
sumber