Tujuan golf kode ini adalah untuk membuat program atau fungsi yang menghitung dan mengeluarkan akar pangkat tiga dari angka yang diberikan sebagai input.
Aturan:
- Tidak ada sumber daya eksternal
- Tidak menggunakan fungsi akar pangkat tiga bawaan.
- Tidak menggunakan metode / operator yang dapat meningkatkan angka ke daya (yang mencakup akar kuadrat, akar ke-4, dll.).
- Fungsi / program Anda harus dapat menerima angka titik-mengambang dan angka negatif sebagai input.
- Jika akar pangkat tiga adalah angka floating-point, maka bulatkan ke 4 angka setelah titik desimal.
- Ini adalah kode golf, kode terpendek dalam byte menang.
Kasus uji:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Anda dapat menggunakan semua kasus uji di atas untuk menguji angka negatif ( -27 --> -3
, -64 --> -4
...)
Jawaban:
J: 16 karakter
Terjemahan Haskell yang longgar:
Kasus uji:
Ini berfungsi seperti ini:
Dalam kata kata:
Bukan salah satu terjemahan bertele-tele terbaik, karena ada garpu diad dan
~
hak di akhir.sumber
Haskell - 35
Contoh berjalan:
Selain itu, jika Anda mengimpor
Data.Complex
, itu bahkan berfungsi pada bilangan kompleks, ia mengembalikan salah satu akar bilangan (ada 3):The
:+
Operator harus dibaca sebagai 'ditambah i kali'sumber
x=(2*x+n/x/x)/3
dapat, dapatkah Anda menjelaskan mengapa Anda dapat menggunakannyax=(x+n/x/x)/2
? Konvergen lebih lambat tapi saya tidak bisa menjelaskan mengapa konvergen ...x=cbrt(n)
, makax=(x+n/x/x)/2
itu benar. Jadi, apakah itu benar untuk ekspresimuSageMath, (69) 62 byte
Namun, jangan pernah percaya itu akan memberi Anda hasilnya, sangat sulit untuk melewati semua angka secara acak:
jika Anda tidak bersikeras memotong:
SageMath, 12 byte, jika
exp
diizinkanBerfungsi untuk semua hal: positif, negatif, nol, kompleks, ...
sumber
exp
diizinkan, saya turun ke 12 dan tidak bodoh sama sekali :)exp
kependekan dari "fungsi eksponensial", yaitu "fungsi yang nilainya adalah konstanta dinaikkan ke kekuatan argumen, terutama fungsi di mana konstanta adalah e.", Dan ada "Tidak ada penggunaan metode / operator yang dapat menaikkan angka ke daya ",exp
tidak diizinkan.Python - 62 byte
Mengevaluasi ke presisi titik mengambang penuh. Metode yang digunakan adalah metode Halley . Karena setiap iterasi menghasilkan 3 kali lebih banyak digit yang benar daripada yang terakhir, 99 iterasi sedikit berlebihan.
Input output:
sumber
0
-2
, maaf untuk itu.v**(1/.3)
akan menjadi pemenang yang pasti.Javascript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
BONUS, formulasi umum untuk semua akar
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
Untuk root cube, cukup gunakan
f(n,3)
, root kuadratf(n,2)
, dll ... Contoh:f(1024,10)
mengembalikan2
.Penjelasan
Berdasarkan metode Newton:
Cari
f(x) = x^3 - n = 0
:, solusinya adalahn = x^3
Derivasi:
f'(x) = 3*x^2
Pengulangan :
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
Tes
sumber
function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
PHP - 81 byte
Solusi berulang:
sumber
0.0001
dapat digantikan oleh1e-4
dan0.00001
oleh1e.5
.0/0
berikanNAN
dalam PHP 7).$i=0;
tidak perlu (-5 byte. Jika tidak,for
akan menghemat satu byte.) Ruang setelahprint
tidak diperlukan (-1 byte).-R
dapat menghemat 3 byte dengan$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 byte).Perl, 92 byte
a
mengembalikan string dengan nomor tanpa bagian fraksi yang tidak perlu atau nol yang tidak signifikan di ujung kanan.Hasil:
Dihasilkan oleh
Perhitungan didasarkan pada metode Newton :
sumber
APL - 31
Menggunakan fakta bahwa
cbrt(x)=e^(ln(x)/3)
, tetapi bukannya melakukan⋆
eksponensial naif , itu menghitunge^x
menggunakan seri Taylor / Maclaurin.Sampel berjalan:
Melihat ada jawaban J dalam 16 karakter, saya pasti sangat buruk di APL ...
sumber
Jawa,
207182181Kadang-kadang ketika saya bermain golf, saya memiliki dua bir dan bermain sangat buruk
Metode Pendekatan Iteratif Newton, menjalankan 99 iterasi.
Inilah yang belum disatukan:
sumber
args
variabel menjadi sepertiz
, mengurangi 6 karakter. Anda dapat menghapus ruang dan kurung kurawal di badan for-loop, mengurangi 3 karakter. Anda dapat mengganti10000.0
dengan1e4
, mengurangi 6 karakter. Kelas tidak perlu bersifat publik, sehingga Anda dapat mengurangi lebih dari 7 karakter. Dengan cara ini akan dikurangi menjadi 185 karakter.TI-Basic,
2624 bytesumber
^
operator, bukan. Itu dilarang oleh aturane^
ada satu operator pada seri TI-83? Saya tidak ingat. Either way, itu melanggar semangat aturan.exp(ln(x)/3)
ataue^(ln(x/3))
jika Anda mengizinkan salah satu dari kedua bahasa ini. Tapi entah bagaimana saya mengertiexp(ln(x)/a)
terlalu banyak setara dengan yangx^(1/a)
diizinkan oleh aturan: - /Js 57 byte
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
sumber
Javascript: 73/72 karakter
Algoritma ini lumpuh, dan mengeksploitasi fakta bahwa pertanyaan ini dibatasi hingga 4 digit setelah titik desimal. Ini adalah versi modifikasi dari algoritma yang saya sarankan di kotak pasir untuk tujuan pengerjaan ulang pertanyaan. Itu dihitung dari nol hingga tak terbatas
h*h*h<a
, hanya dengan trik perkalian dan pembagian untuk menangani pecahan 4 angka desimal.Sunting, 4 tahun kemudian: Seperti yang disarankan oleh Luis felipe De jesus Munoz, dengan menggunakan
**
kode lebih pendek, tetapi fitur itu tidak tersedia pada tahun 2014 ketika saya menulis jawaban ini. Bagaimanapun, dengan menggunakannya, kami mencukur karakter tambahan:sumber
h*h*h
Anda dapat melakukanh**3
dan menghemat 1 byte**
Operator ini diusulkan pada 2015 dan diterima sebagai bagian dari ECMAScript 7 pada 2016. Jadi, pada saat saya menulis itu, tidak ada**
bahasa.Javascript - 157 karakter
Fungsi ini:
Versi yang dijelaskan Ungolfed:
sumber
PHP, 61
Berdasarkan metode Newton. Versi Michael jawaban yang sedikit dimodifikasi :
Ia bekerja dengan angka negatif, dapat menangani angka floating point, dan membulatkan hasilnya menjadi 4 angka setelah titik desimal jika hasilnya adalah angka floating point.
Demo kerja
sumber
for($x=1;++$i<100;)...
. Tetapi menggunakan variabel yang telah ditetapkan sebagai input umumnya disukai . Penggunaan yang lebih baik$argv[1]
atau$argn
.Befunge 98 - Pekerjaan sedang berlangsung
Bahasa ini tidak mendukung angka floating point; ini mencoba untuk meniru mereka. Saat ini berfungsi untuk angka positif yang tidak dimulai dengan
0
setelah titik desimal (kebanyakan). Namun, itu hanya menghasilkan 2 tempat desimal.Ia bekerja dengan memasukkan bagian sebelum titik desimal, mengalikannya dengan
100000
, kemudian memasukkan bagian setelah titik dan menambahkan dua angka bersamaan. Baris kedua melakukan penghitung sampai kubus lebih besar dari angka yang dimasukkan. Kemudian baris ketiga mengekstrak angka desimal dari bilangan bulat.Jika ada yang bisa memberi tahu saya mengapa baris ketiga hanya dibagi
100
untuk mendapatkan nilai yang benar, tolong beri tahu saya.IO:
sumber
Smalltalk, 37
kredit jatuh ke mniip untuk algoritme; Versi Smalltalk dari kodenya:
masukan dalam n; output dalam x:
atau, sebagai blok
sumber
Bahasa GameMaker, 51 byte
sumber
Haskell: 99C
Tidak bisa mengalahkan @mniip dalam kepintaran. Saya hanya pergi dengan pencarian biner.
Tidak Disatukan:
sumber
d
(suka(l#h)x
) untuk menyimpan byte untuk setiap panggilan.c
kemudian menjadiid>>=(0#)
.c < x
.1>0
bukanTrue
.J 28
Menggunakan metode Newtons, menemukan akar dari
x^3 - X
langkah pembaruan adalahx - (x^3 - C)/(3*x^2)
, di mana x adalah dugaan saat ini, dan C input. Melakukan perhitungan matematika yang satu ini menghasilkan ekspresi sederhana yang sangat sederhana(2*x+C/x^2) /3
. Perawatan harus diambil untuk angka negatif.Diimplementasikan dalam J, dari kanan ke kiri:
|
Ambil abs dari kedua argumen, teruskan^:_
Lakukan sampai konvergensi(%*~@])
adalahC / x^2
(*~ y
setara dengany * y
)+:@]
adalah2 x
3%~
mempertiga. Ini menghasilkan akar positif*@[ * positive_root
mengalikan akar positif dengan signum C.Uji coba:
sumber
AWK, 53 byte
Contoh penggunaan:
Terima kasih buka @Mig untuk
JavaScript
solusi dari mana ini berasal. Ini berjalan sangat cepat mengingat bahwafor
loop membutuhkan iterasi untuk berhenti berubah.sumber
C, 69 byte
Hanya implementasi lain dari metode Newton. Cobalah online!
sumber
Stax , 10 byte CP437
Jalankan dan debug online!
Penjelasan
Gunakan versi yang belum dibongkar untuk menjelaskan.
sumber
Solusi JAWA
kubus BigDecimal publik (Nomor BigDecimal) {
sumber
Solusi Python
sumber