Tantangan:
Tulis program atau fungsi yang menginput angka positif dan mengembalikan faktorialnya .
Catatan: Ini adalah pertanyaan troll kode . Tolong jangan menganggap pertanyaan dan / atau jawaban dengan serius. Informasi lebih lanjut di sini . Setiap pertanyaan troll kode juga merupakan pertanyaan kontes-popularitas , sehingga jawaban dengan suara terbanyak menang.
popularity-contest
code-trolling
alephalpha
sumber
sumber
Jawaban:
Ini adalah masalah komputasi numerik yang sangat sederhana yang bisa kita pecahkan dengan perkiraan Stirling :
Seperti yang Anda lihat, rumus itu memiliki akar kuadrat, yang juga akan membutuhkan cara perkiraan. Kami akan memilih apa yang disebut "metode Babel" untuk itu karena ini bisa dibilang yang paling sederhana:
Perhatikan bahwa menghitung akar kuadrat dengan cara ini adalah contoh rekursi yang baik.
Menyatukan semuanya dalam program Python memberi kami solusi berikut untuk masalah Anda:
Dengan modifikasi sederhana, program di atas dapat menampilkan tabel faktorial yang rapi:
Metode ini harus cukup akurat untuk sebagian besar aplikasi.
sumber
C #
Maaf, tapi saya benci fungsi rekursif.
sumber
Jawa
sumber
Python
Tentu saja cara terbaik untuk menyelesaikan masalah adalah dengan menggunakan ekspresi reguler:
sumber
Haskell
Kode pendek adalah kode yang efisien, jadi coba ini.
Mengapa ini trolling:
Saya akan menertawakan pembuat kode yang menulis ini ... Inefisiensi itu indah. Mungkin juga tidak bisa dipahami oleh programmer Haskell yang sebenarnya tidak bisa menulis fungsi faktorial.
Sunting: Saya memposting ini beberapa waktu yang lalu sekarang, tetapi saya pikir saya akan mengklarifikasi untuk orang-orang masa depan dan orang-orang yang tidak dapat membaca Haskell.
Kode di sini mengambil daftar angka 1 ke n, membuat daftar semua permutasi dari daftar itu, dan mengembalikan panjang daftar itu. Di komputer saya, dibutuhkan sekitar 20 menit selama 13 !. Dan kemudian harus memakan waktu empat jam selama 14! dan kemudian dua setengah hari selama 15 !. Kecuali bahwa di beberapa titik di sana Anda kehabisan memori.
Sunting 2: Sebenarnya Anda mungkin tidak akan kehabisan memori karena ini adalah Haskell (lihat komentar di bawah). Anda mungkin dapat memaksanya untuk mengevaluasi daftar dan menyimpannya dalam memori entah bagaimana, tapi saya tidak cukup tahu tentang mengoptimalkan (dan tidak mengoptimalkan) Haskell untuk tahu persis bagaimana melakukan itu.
sumber
[1..n]
. - Satu permutasi khusus[1..n]
, dikontribusikan ke thunk untuk sisa permutasi (polinomial inn
). - Akumulator untuklength
fungsi tersebut.C #
Karena ini adalah masalah matematika, masuk akal untuk menggunakan aplikasi yang dirancang khusus untuk menyelesaikan masalah matematika untuk melakukan perhitungan ini ...
Langkah 1:
Instal MATLAB. Percobaan akan berhasil, saya pikir, tetapi masalah yang sangat rumit ini mungkin cukup penting untuk pantas membeli versi lengkap aplikasi.
Langkah 2:
Sertakan komponen MATLAB COM dalam aplikasi Anda.
Langkah 3:
sumber
C #
Factorials adalah operasi matematika tingkat yang lebih tinggi yang bisa sulit dicerna semua dalam satu waktu. Solusi terbaik dalam masalah pemrograman seperti ini, adalah memecah satu tugas besar menjadi tugas yang lebih kecil.
Sekarang, n! didefinisikan sebagai 1 * 2 * ... * n, jadi, pada dasarnya penggandaan berulang, dan penggandaan tidak lain adalah penambahan berulang. Jadi, dengan mengingat hal itu, yang berikut menyelesaikan masalah ini:
sumber
Troll:
z = n - 1 + 1
) sebenarnya mendokumentasikan diri sendiri jika Anda tahu apa yang terjadi.p[]
menggunakan perhitungan rekursif dari koefisien seri!(Ini perkiraan Lanczos dari fungsi gamma )
sumber
- 1 + 1
sini? Kompiler saya mengoptimalkannya (ini bukan angka floating point di mana optimisasi kode seperti ini bisa berbahaya), jadi sepertinya tidak dibutuhkan.double z = n - 1
adalah bagian dari perkiraan fungsi gamma. The+ 1
adalah dari hubungan yanggamma(n + 1) = n!
untuk integer n.Kita semua tahu dari perguruan tinggi bahwa cara paling efisien untuk menghitung perkalian adalah melalui penggunaan logaritma. Lagi pula, mengapa lagi orang menggunakan tabel logaritma selama ratusan tahun?
Jadi dari identitas
a*b=e^(log(a)+log(b))
kita membentuk kode Python berikut:Itu membuat daftar angka dari
1
kex
, (+1
diperlukan karena Python menyebalkan) menghitung logaritma masing-masing, menjumlahkan angka, menaikkan e ke kekuatan jumlah dan akhirnya membulatkan nilai ke bilangan bulat terdekat (karena Python menyebalkan) . Python memiliki fungsi bawaan untuk menghitung faktorial, tetapi hanya berfungsi untuk bilangan bulat, sehingga tidak dapat menghasilkan angka besar (karena Python menyebalkan). Inilah sebabnya mengapa fungsi di atas diperlukan.Btw, tip umum untuk siswa adalah bahwa jika sesuatu tidak berfungsi seperti yang diharapkan, itu mungkin karena bahasanya menyebalkan.
sumber
Sayangnya, Javascript tidak memiliki cara bawaan untuk menghitung faktorial. Namun, Anda dapat menggunakan maknanya dalam kombinatorik untuk menentukan nilai:
Faktorial dari angka n adalah jumlah permutasi dari daftar ukuran itu.
Jadi, kita dapat menghasilkan setiap daftar nomor n-digit, memeriksa apakah itu permutasi, dan jika demikian, tambahkan penghitung:
Troll:
O(n)
, bukanO(n!)
, tapiO(n^n)
. Ini saja sudah cukup untuk memenuhi syarat di sini.number.toString(base)
, tetapi itu tidak berhasil untuk pangkalan di atas 36. Ya, saya tahu 36! adalah banyak , tapi masih ...Math.pow
? Tidak? Baiklah.++
luar for-loop membuatnya lebih misterius. Juga==
buruk.$i
.new Array
,document.write
(dengan teman) danalert
(bukan prompt atau label input) membentuk trifecta lengkap dari dosa-dosa pilihan fungsi. Mengapa input ditambahkan secara dinamis?=
membuatnya lebih sulit untuk dibaca.sumber
Ruby dan WolframAlpha
Solusi ini menggunakan WolframAlpha REST API untuk menghitung faktorial, dengan RestClient untuk mengambil solusi dan Nokogiri untuk menguraikannya. Itu tidak menemukan kembali roda dan menggunakan teknologi yang teruji dan populer untuk mendapatkan hasil dengan cara yang paling modern.
sumber
Javascript
Javascript adalah bahasa pemrograman fungsional, ini berarti Anda harus menggunakan fungsi untuk semuanya karena lebih cepat.
sumber
r = -~(function(){})
pasti akan menyelesaikannya.Menggunakan Bogo-Sort di Java
Ini sebenarnya berfungsi, sangat lambat, dan tidak akurat untuk angka yang lebih tinggi.
sumber
PERL
Faktorial bisa menjadi masalah yang sulit. Teknik pemetaan / pengurangan seperti - sama seperti penggunaan Google - dapat membagi matematika dengan menghapus banyak proses dan mengumpulkan hasilnya. Ini akan memanfaatkan semua inti atau CPU dalam sistem Anda pada malam musim dingin.
Simpan sebagai f.perl dan chmod 755 untuk memastikan Anda dapat menjalankannya. Anda memang telah menginstal Lister Patologis Eklektik Eklektik, bukan?
Troll:
sumber
ARGV[0]
sebenarnya argumen pertama dan bukan skrip!$ARGV[0]
Python
Hanya sebuah algoritma O (n! * N ^ 2) untuk menemukan faktorial. Kasus dasar ditangani. Tidak ada luapan.
sumber
Nah, ada solusi mudah di Golfscript. Anda bisa menggunakan penerjemah Golfscript dan menjalankan kode ini:
Mudah ya :) Semoga Sukses!
sumber
!
Mathematica
Tampaknya tidak berfungsi untuk angka yang lebih besar dari 11, dan faktorial [11] membekukan komputer saya.
sumber
Rubi
Satu kalimat paling lambat yang bisa saya bayangkan. Diperlukan 2 menit pada prosesor i7 untuk menghitung
6!
.sumber
Pendekatan yang benar untuk masalah matematika yang sulit ini adalah DSL. Jadi saya akan memodelkan ini dalam bahasa yang sederhana
Untuk menulis DSL kami dengan baik, sangat membantu untuk melihatnya sebagai monad gratis yang dihasilkan oleh functor aljabar
Kita bisa menulis ini di Haskell sebagai
Saya akan menyerahkannya kepada pembaca untuk mendapatkan implementasi sepele dari
Sekarang kita dapat mendeskripsikan operasi untuk memodelkan faktorial dalam DSL ini
Sekarang kita telah memodelkan ini, kita hanya perlu menyediakan fungsi interpretasi aktual untuk monad gratis kita.
Dan saya akan menyerahkan sisa denotasi kepada pembaca.
Untuk meningkatkan keterbacaan, terkadang membantu untuk menyajikan AST konkret dari formulir tersebut
dan kemudian merefleksikan hal yang sepele
dan kemudian sangat mudah untuk secara rekursif mengevaluasi AST.
sumber
Python
Di bawah ini adalah versi Python dari solusi, yang tidak terbatas pada batas 32 bit (atau 64 bit pada sistem yang sangat baru) untuk angka integer dalam Python. Untuk mengatasi batasan ini, kita akan menggunakan string sebagai input dan output untukfactorial
rutin dan secara internal membagi string dalam digit itu untuk dapat melakukan perkalian.Jadi di sini adalah kodenya:
getDigits
fungsi membagi sebuah string yang mewakili angka ke dalam digitnya, jadi "1234" menjadi[ 4, 3, 2, 1 ]
(urutan terbalik hanya membuatincrease
danmultiply
fungsinya lebih sederhana). Theincrease
fungsi mengambil daftar dan meningkat dengan satu tersebut. Seperti namanya,multiply
fungsi ini berlipat ganda, misalnyamultiply([2, 1], [3])
kembali[ 6, 3 ]
karena 12 kali 3 adalah 36. Ini berfungsi dengan cara yang sama seperti Anda akan melipatgandakan sesuatu dengan pena dan kertas.Kemudian akhirnya,
factorial
fungsi tersebut menggunakan fungsi pembantu ini untuk menghitung faktorial yang sebenarnya, misalnyafactorial("9")
memberi"362880"
sebagai outputnya.Catatan
Dalam python integer tidak memiliki batas, jadi jika Anda ingin melakukan ini secara manual, Anda bisa melakukannya
Ada juga fungsi yang sangat nyaman
math.factorial(n)
.Solusi ini jelas jauh lebih kompleks daripada yang seharusnya, tetapi itu berfungsi dan bahkan menggambarkan bagaimana Anda dapat menghitung faktorial jika Anda dibatasi oleh 32 atau 64 bit. Jadi, sementara tidak ada yang akan percaya ini adalah solusi yang Anda buat untuk masalah sederhana ini (setidaknya dengan Python), Anda sebenarnya dapat mempelajari sesuatu.
sumber
Python
Solusi yang paling masuk akal jelas untuk memeriksa semua angka sampai Anda menemukan satu yang merupakan faktorial dari nomor yang diberikan.
sumber
Solusi rekursif paling elegan di C
Setiap orang tahu solusi yang paling elegan untuk faktorial bersifat rekursif.
Faktorial:
Tetapi multiplikasi juga dapat didefinisikan secara rekursif sebagai tambahan yang berurutan.
Perkalian:
Dan juga dapat ditambahkan sebagai peningkatan berturut-turut.
Tambahan:
Di
C
, kita dapat menggunakan++x
dan--x
menangani primitif(x + 1)
dan(x - 1)
masing - masing, sehingga kita memiliki segalanya yang ditentukan.Mari kita coba:
Sempurna, meski 8! butuh waktu lama untuk beberapa alasan. Oh well, solusi paling elegan tidak selalu tercepat. Ayo lanjutkan:
Hmm, aku akan memberitahumu kapan itu kembali ...
sumber
Python
Seperti yang ditunjukkan oleh jawaban @ Matt_Sieker, faktorial dapat dipecah menjadi tambahan- mengapa, memecah tugas adalah inti dari pemrograman. Tapi, kita bisa memecahnya menjadi 1 dengan tambahan!
Saya pikir kode ini menjamin Kesalahan SO, karena
Rekursi - menghangatkannya
Setiap lapisan menghasilkan panggilan untuk berkembang biak
yang menghasilkan panggilan ke nomor tambahan
yang menghasilkan panggilan ke addby1!
Terlalu banyak fungsi, bukan?
sumber
Cukup buka Google dan ketik faktorial Anda:
http://lmgtfy.com/?q=5!
sumber
TI-Basic 84
Ini benar-benar bekerja :)
sumber
Javascript
Jelas tugas seorang programmer adalah melakukan sesedikit mungkin pekerjaan, dan menggunakan sebanyak mungkin perpustakaan. Oleh karena itu, kami ingin mengimpor jQuery dan math.js . Sekarang, tugasnya sederhana seperti ini:
sumber
Python
Dengan hanya sedikit modifikasi dari implementasi faktorial rekursif standar, itu menjadi sangat lambat untuk n> 10.
sumber
Pesta
sumber
Mari kita coba melakukannya dengan Metode Monte Carlo . Kita semua tahu bahwa probabilitas dua n acak -permutasi menjadi sama persis 1 / n! . Karena itu kita bisa memeriksa berapa banyak tes yang diperlukan (sebut saja nomor ini b ) sampai kita mendapatkan c hit. Lalu, n! ~ b / c .
Sage, harus bekerja dengan Python juga
sumber
pesta
Faktorial mudah ditentukan dengan alat baris perintah terkenal dari bash.
Seperti @Aaron Davies yang disebutkan dalam komentar, ini terlihat jauh lebih rapi dan kita semua menginginkan program yang bagus dan rapi, bukan?
sumber
paste
:seq 1 $n | paste -sd\* | bc
paste
memang terlihat seperti kata bahasa Inggris biasa dan mudah diingat. Apakah kita benar-benar menginginkannya? ; o)