Tulis kode terpendek yang akan mengambil bilangan real lebih besar dari 1 sebagai input dan akan menampilkan faktorial terbalik positifnya. Dengan kata lain, itu menjawab pertanyaan "nomor faktorial apa yang sama dengan angka ini?". Gunakan fungsi Gamma untuk memperluas definisi faktorial ke bilangan real apa pun seperti dijelaskan di sini .
Sebagai contoh:
input=6 output=3
input=10 output=3.390077654
karena 3! = 6
dan3.390077654! = 10
Aturan
- Dilarang menggunakan fungsi faktorial atau fungsi gamma bawaan, atau fungsi yang mengandalkan fungsi ini.
- Program harus dapat menghitungnya hingga 5 digit desimal, dengan kemampuan teoritis untuk menghitungnya dengan presisi apa pun (Ini harus mengandung angka yang dapat dibuat arbitrer besar atau kecil untuk mendapatkan presisi arbitrer)
- Bahasa apa pun diizinkan, kode terpendek dalam karakter akan menang.
Saya membuat contoh kerja di sini . Silahkan lihat.
Jawaban:
Javascript (116)
Magics hitam di sini! Memberikan hasil dalam beberapa milidetik .
Hanya fungsi matematika dasar yang digunakan:
ln
,pow
,exponential
Sayang sekali LaTeX tidak didukung pada codegolf tetapi pada dasarnya, saya kode a pemecah newton untuk
f(y)=gamma(y)-n=0
danx=y-1
(karenax!
merupakangamma(x+1)
) dan perkiraan untuk gamma dan fungsi digamma.Perkiraan gamma adalah Stirling Perkiraan
Digamma menggunakan rumus Euler Maclaurin
Fungsi digamma adalah turunan dari fungsi gamma dibagi dengan fungsi gamma:
f'(y)=gamma(y)*digamma(y)
Tidak Disatukan:
Kasus uji:
sumber
n=prompt(M=Math)
Mathematica -
745449Cara yang tepat akan menjadi
Jika kita hanya membatalkan tes
?NumberQ
itu masih akan berfungsi, tetapi membuang beberapa peringatan buruk, yang akan hilang jika kita beralih ke integrasi simbolisIntegrate
, tetapi ini akan ilegal (saya kira), karena fungsi akan secara otomatis dikonversi menjadiGamma
fungsi. Kita juga bisa menyingkirkan fungsi eksternal dengan cara itu.Bagaimanapun
Untuk melakukan input yang tepat, cukup definisi fungsi (tidak bisa membiarkan MatLab menang)
Jika faktorial bawaan diizinkan
Di atas tidak memberikan bilangan bulat (yang merupakan argumen untuk fungsi faktorial yang benar). Berikut ini tidak:
sumber
NumberQ
tes pola diperlukan? Atau mengasuhE^(-t)
? Apakah kecurangan untuk mengubahNIntegrate
keIntegrate
? Mungkin ... :)ised:
7246 karakterIni hampir sangat cocok ... ada "bahasa" di luar sana yang tampaknya dimaksudkan untuk matematika golf: ised . Sintaksnya yang dikaburkan membuat kode yang sangat singkat (tidak ada variabel bernama, hanya slot memori integer dan banyak operator char tunggal yang serbaguna). Mendefinisikan fungsi gamma menggunakan integral, saya dapat 80 karakter acak
Di sini, slot memori $ 4 adalah fungsi faktorial, slot memori $ 6 fungsi pembagian dan slot memori $ 2 diharapkan akan disetel ke input (diberikan sebelum mengambil kode ini). Slot $ 0 dan $ 1 adalah batas pembelahan dua. Contoh panggilan (dengan asumsi kode di atas ada dalam file
inversefactorial.ised
)Tentu saja, Anda bisa menggunakan builtin! operator, dalam hal ini Anda turun ke 45 karakter
Hati-hati, prioritas operator terkadang aneh.
Edit: ingat untuk sebaris fungsi daripada menyimpannya. Kalahkan Mathematica dengan 72 karakter!
Dan menggunakan! builtin Anda mendapatkan 41.
Pembaruan tertunda setahun:
Saya baru menyadari ini sangat tidak efisien. Diturunkan hingga 60 karakter:
Jika utf-8 digunakan (Mathematica juga melakukannya), kita dapat 57:
Menulis ulang yang sedikit berbeda dapat memotongnya menjadi 46 (atau 27 jika menggunakan builtin!):
Dua karakter terakhir dapat dihapus jika Anda setuju dengan jawaban dicetak dua kali.
sumber
MATLAB
5447Jika saya memilih tantangan yang tepat, MATLAB sangat bagus untuk bermain golf :). Dalam kode saya, saya menemukan solusi untuk persamaan (ux!) = 0 di mana Anda adalah input pengguna, dan x variabel untuk dipecahkan. Ini berarti bahwa u = 6 akan mengarah ke x = 3, dll ...
Akurasi dapat diubah dengan mengubah batas atas integral, yang ditetapkan pada 99. Menurunkan ini akan mengubah keakuratan output sebagai berikut. Misalnya untuk input 10:
dll.
sumber
Python - 199 karakter
Ok, jadi Anda akan membutuhkan banyak ruang stack dan banyak waktu, tapi hei, itu akan sampai di sana!
Berikut ini pendekatan lain dengan rekursi yang lebih banyak lagi.
Keduanya dapat diuji dengan
>>>f(10,1)
ketentuan Anda menetapkan batas rekursi sekitar 10.000. Akurasi lebih dari satu desimal kemungkinan tidak akan lengkap dengan batas rekursi yang realistis.Menggabungkan komentar dan beberapa modifikasi, hingga 199 karakter.
sumber
code-golf
pertanyaan, jadi Anda harus memberikan jawaban terpendek, yang menyatakan lamanya solusi Anda.Python 2.7 -
215189 karakterPemakaian:
Untuk mengubah presisi: ubah
1e-5
ke angka yang lebih kecil untuk presisi yang lebih besar, angka yang lebih besar untuk presisi yang lebih buruk. Untuk presisi yang lebih baik Anda mungkin ingin memberikan nilai yang lebih baike
.Ini hanya mengimplementasikan fungsi faktorial sebagai
f
, dan kemudian melakukan pencarian biner untuk mengasah nilai paling akurat dari kebalikan dari input. Asumsikan jawabannya kurang dari atau sama dengan 99 (itu tidak akan berhasil untuk jawaban 365 pasti, saya mendapatkan kesalahan matematika melimpah). Penggunaan ruang dan waktu yang sangat wajar, selalu berakhir.Atau, ganti
if abs(n-f(x))<=10**-5: print x;break
denganprint x
untuk mencukur 50 karakter . Ini akan berulang selamanya, memberi Anda perkiraan yang lebih dan lebih akurat. Tidak yakin apakah ini akan sesuai dengan aturan.sumber
cat file | wc -c
.dg -
131133 byteKarena dg menghasilkan bytecode CPython, ini juga harus dihitung untuk Python, tetapi oh ... Beberapa contoh:
EDIT: Menambahkan dua byte karena saya tidak ingat bahwa itu juga harus menerima float!
sumber
42.8006566063
, sehingga mereka cocok dalam 5 digit presisi!1e100
itu memberi:,69.95780520000001
untuk1e150
itu output96.10586423000002
, sedangkan untuk1e200
itu meledak. Tapi sungguh saya tidak tahu apakah hasil itu dapat diandalkan ...R , 92 byte
Suatu fungsi,,
g
yang mengambil inputz
dan menghasilkan faktorial terbalik dari angka ituHampir bisa dipastikan ada golf lagi, jadi jika Anda melihat sesuatu yang dapat saya tingkatkan, beri tahu saya.
Cobalah online!
Tidak Disatukan dan Dikomentari
Cobalah online!
sumber
Javascript (tanpa menggunakan loop!)
Untuk melakukan ini, saya menggunakan perkiraan numerik yang terkenal dari kebalikan dari perkiraan faktor Stirling , (dan juga mendapat inspirasi dari ini .. batuk .. batuk .. kode orang lain ...)
sumber