Tantangan
Tantangan menulis sebuah program yang membutuhkan positif angka a
dan nol nomor b
dan output a^b
(a pangkat b). Anda hanya dapat menggunakan + - * / abs()
fungsi / operator matematika. Ini hanya bisa diterapkan pada nilai skalar, tetapi tidak untuk seluruh daftar atau array.
Contoh:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Relevan: http://xkcd.com/217/
Detail
Anda dapat menulis fungsi atau konstruksi serupa untuk digunakan di konsol. Jika Anda tidak dapat menggunakan input konsol, Anda dapat mengasumsikan bahwa kedua angka tersebut disimpan dalam variabel dan di-output melalui output standar atau menulis ke file. Output harus benar minimal 4 digit signifikan. Anda dapat berasumsi bahwa keduanya a
dan b
bukan nol. Runtime lebih dari 1 menit secara signifikan tidak dapat diterima. Jumlah byte terkecil akan menang. Tolong jelaskan program dan algoritma Anda.
EDIT: Hanya basis positif yang harus dipertimbangkan. Anda bisa berasumsi a>0
. Ketahuilah bahwa kedua angka tidak harus bilangan bulat !!!
sumber
-0.5 ** 0.5
?Jawaban:
Python, 77
Seperti beberapa jawaban lain ini didasarkan pada log dan exp. Tetapi fungsi dihitung dengan memecahkan persamaan diferensial biasa secara numerik.
Apakah memenuhi persyaratan? Untuk contoh-contoh dalam pertanyaan, ya. Untuk yang besar, itu akan memakan waktu yang sangat lama. Untuk a atau b besar, itu akan menjadi tidak akurat.
Contoh:
Pembaruan: flawr meminta lebih detail tentang matematika jadi begini. Saya mempertimbangkan masalah nilai awal berikut:
Jika saya dapat menemukan nilai t sehingga x (t) = a, maka saya akan memiliki y (t) = exp (bt) = a ^ b. Cara paling sederhana untuk menyelesaikan masalah nilai awal secara numerik adalah metode Euler . Anda menghitung turunan fungsi seharusnya, dan kemudian mengambil, langkah, ke arah turunan, dan sebanding dengan itu, tetapi diskalakan oleh konstanta kecil. Jadi itulah yang saya lakukan, ambil langkah kecil sampai x sebesar a, dan kemudian lihat apa y pada saat itu. Yah, begitulah cara saya memikirkannya. Dalam kode saya, t tidak pernah dihitung secara eksplisit (itu adalah 1e-7 * jumlah langkah dari while loop), dan saya menyimpan beberapa karakter dengan melakukan perhitungan untuk x dengan gantinya.
sumber
JavaScript (E6) 155
174 191Sunting 2 Seperti yang disarankan oleh @bebe, menggunakan fungsi rekursif (berkinerja lebih buruk tapi lebih pendek)
Sedikit mengubah fungsi R untuk menghindari 'terlalu banyak rekursi'.
Test suite ditambahkan. Fungsi berkinerja baik untuk pangkalan <3000 dan eksponen dalam kisaran -50..50.
Sunting Golf lebih presisi dan lebih baik
Setiap bilangan real dapat diperkirakan dengan bilangan rasional (dan bilangan rasional 'nyata' standar IEEE sebenarnya). Setiap bilangan rasional dapat dinyatakan sebagai pecahan a / b dengan a dan b bilangan bulat. x ^ (a / b) adalah root b dari (x ^ a) atau (root b of x) ^ a. Eksponensial integer cukup mudah dengan mengkuadratkan. Root integer dapat diperkirakan dengan menggunakan metode numerik.
Kode
Tes di FireFox atau konsol FireBug
sumber
e&1&&(r*=b)
fungsinya, kecuali mengalikanr
denganb
?if(e&1 != 0) r *= b
P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))
(saya pasti lelah)Haskell, 85
90Algoritma exp-log standar. Sekarang dengan nama yang berbeda, mengurangi beberapa karakter:
raise
sekarang disebut(%)
, atau%
dalam notasi infiks, bahkan membuat penggunaannya memakan lebih sedikit byte:4.5%(-4.5)
Versi ungolfed juga hanya menggunakan 172 byte:
sumber
JS (ES6), 103 byte
Contoh:
Gunakan seri Taylor.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
dengan perkiraan logaritma natural :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
Saya menggunakan 128 iterasi untuk menghitung
b^x
(iterasi lebih sulit karena faktorial) dan 262144 iterasi untukln(b)
sumber
e(80,5) ->1555962210.2240903
- seharusnya 3276800000golflua 120
Saya menggunakan fakta itu
dan menulis fungsi saya sendiri
log
&exp
. Nilai-nilaia
danb
perlu dimasukkan pada baris baru saat dijalankan di terminal:Sampel berjalan:
Versi Lua ungolfed adalah,
sumber