Jangan bingung dengan Cari faktorial!
pengantar
Faktorial bilangan bulat n
dapat dihitung dengan
Ini relatif mudah dan bukan hal yang baru. Namun, faktorial dapat diperluas menjadi faktorial ganda , sehingga
untuk bilangan genap, dan
untuk angka ganjil. Tapi kami tidak terbatas pada faktorial ganda. Misalnya
atau
atau
tergantung pada nilai awal.
Secara ringkas:
mana
Atau, dalam bahasa Inggris polos: Kurangi jumlah faktorial dari angka dasar berulang kali dan gandakan semua bilangan bulat positif yang dihasilkan.
Tantangan
Tulis fungsi yang akan menghitung segala faktorial berulang untuk bilangan bulat non-negatif.
Memasukkan
Antara
- Sebuah string yang mengandung bilangan bulat basis-non-negatif, diikuti oleh 1 atau lebih tanda seru. Misalnya
"6!"
atau"9!!"
atau"40!!!!!!!!!!!!!!!!!!!!"
.
atau
- Nilai yang sama diwakili oleh dua bilangan bulat: satu nilai dasar non-negatif dan satu nilai positif yang mewakili jumlah faktorial. Ini dapat dilakukan sesuai dengan format apa pun dari aturan I / O default.
Keluaran
Hasil perhitungan tersebut.
Komentar tantangan
0!
sama1
dengan definisi. Kode Anda harus menjelaskan hal ini.- Hitungan faktorial dibatasi oleh nilai luar rentang ini, Anda bebas untuk menghasilkan apa pun. Selain itu , yang merupakan satu-satunya pengecualian untuk aturan ini.
0!
Contohnya
Input Output
3!!! 3
0! 1
6! 720
9!! 945
10!!!!!!!! 20
40!!!!!!!!!!!!!!!!!!!! 800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41697106428257280000000000000000
Cobalah dengan implementasi Python yang ungolfed: Cobalah online!
Komentar umum
- Ini adalah kode-golf , jadi jawabannya menggunakan byte paling sedikit di setiap bahasa yang menang.
- Aturan standar , aturan I / O, dan aturan celah berlaku.
- Harap sertakan tautan Try it Online- untuk menunjukkan bahwa kode Anda berfungsi.
- Harap motivasikan jawaban Anda dengan penjelasan kode Anda.
0!
tetapi pernyataan tantangan mengatakan bahwa jumlah faktorial akan kurang dari atau sama dengan nilai dasar.3!!!!!!!
seharusnya tidak didefinisikan — itu hanya akan menghasilkan jawaban3
. Itu sama dengan1!!=1
(tidak terdefinisi). Spesifikasi input Anda juga mengatakan bahwa akan selalu ada setidaknya satu!
, jadi contoh pertama3
tidak sesuai dengan spesifikasi.(3!)!
malah menghapus istilah dari faktorial. Itu nama yang menyesatkan; Saya datang dengan asumsi itu akan menerapkan fungsi faktorial berulang kali dalam sebuah rantai dan harus membaca dengan cermat untuk melihat apa itu sebenarnya. Untungnya pertanyaan itu menjelaskannya dengan jelas. Nama yang lebih baik mungkin adalah langkah faktorial atau faktorial langkah atau sesuatu.Jawaban:
R , 33 byte
Cobalah online!
Menangani dengan menambahkan negasi logis dari .n=0 n
sumber
ArnoldC ,
702 698634 byteCobalah online!
Diterjemahkan ke pseudocode:
Catatan: ArnoldC hanya memiliki satu jenis data: integer bertanda 16-bit. Karena itu saya tidak dapat menguji
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
kasus ini.sumber
c
variabel sebenarnya menyimpan nilai perbandingan antaran
dan0
.Jelly , 4 byte
Cobalah online!
Bagaimana? Dengan dan , ia pertama-tama menghasilkan kisaran (with ), lalu dengan itu membuat setiap elemen dari rentang ini (jadi ), dan akhirnya mengalikannya dengan menggunakan .n k n,⋯,1 k th n , n - k , n - 2 k , ⋯ , n - ⌊ n / k ⌋ kkth n,n−k,n−2k,⋯,n−⌊n/k⌋k
RṚ
m
P
sumber
RṚ
m
P
r1mP
.APL (Dyalog Extended) , 7 byte SBCS
Fungsi awalan diam-diam anonim. Dibawa
[n,b]
sebagai argumen.Cobalah online!
1¨
satu untuk setiap elemen argumen;[1,1]
-\
perbedaan kumulatif;[n,n-b]
…
rentang menggunakan elemen kedua dari argumen kiri sebagai indikator langkah, misalnya[9,7]
dilanjutkan dengan5
×/
produksumber
Haskell , 21 byte
Cobalah online!
Menggabungkan fungsi produk bawaan dengan enumerasi range melangkah mengalahkan apa yang saya bisa kode secara rekursif (bahkan dengan flawr menyimpan byte).
22 byte
Cobalah online!
Inilah solusi mengambil input dalam format string seperti
9!!
, yang menurut saya lebih menarik.42 byte
Cobalah online!
sumber
n%a|n<1=1|m<-n-a=n*m%a
Pyth , 6 byte
Ini semua adalah setara 6-byters:
Cobalah online! (
*F:Q1E
)Atau, 11 byte , mengambil input sebagai string:
Suite uji.
sumber
JavaScript (ES6), 21 byte
Mengambil input sebagai
(k)(n)
.Cobalah online!
Atau 24 byte untuk mendukung BigInts.
JavaScript (ES6), 55 byte
Mengambil input sebagai string, menggunakan format yang dijelaskan dalam tantangan.
Cobalah online!
sumber
Spasi , 91 byte
Huruf
S
(spasi),T
(tab), danN
(baris baru) ditambahkan hanya sebagai penyorotan.[..._some_action]
ditambahkan sebagai penjelasan saja.Cobalah online (dengan spasi, tab, dan baris baru saja).
Penjelasan dalam pseudo-code:
sumber
Python 2 , 29 byte
Cobalah online!
sumber
Perl 6 , 22 byte
Cobalah online!
Kode kunci anonim yang mengembalikan produk dari rentang mulai dari input pertama, menurun oleh yang kedua sampai di bawah
1
, tidak termasuk nomor terakhir. Ini berfungsi untuk0
, karena kasus dasar dari pengurangan oleh produk adalah 1, jadi outputnya adalah 1.sumber
05AB1E ,
1087 byteInput sebagai dua input yang terpisah: input pertama adalah
base
; input kedua adalahfactorial
.Cobalah secara online atau verifikasi semua kasus uji .
-2 byte terima kasih kepada @ Mr.Xcoder .
-1 byte terima kasih kepada @JonathanAllan .
Penjelasan:
Jawaban 10 byte asli :
Input sebagai dua input yang terpisah: input pertama adalah
base
; input kedua adalahfactorial
.Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
LR²ιнP
( Coba online! ) Berfungsi untuk setiap test case, kecuali 0.LR²ιн0KP
selama 8 byte?0K
seharusnya tidak perlu karena0!
merupakan input yang tidak valid oleh spesifikasi (meskipun sudah termasuk dalam contoh) - Saya telah berkomentar tentang ini.0!
ada dalam domain inputݦRXιнP
menghemat satu byte.kode mesin x86-64, 12 byte
Kode mesin yang sama melakukan hal yang sama dalam mode 32-bit, dan untuk bilangan bulat 16-bit dalam mode 16-bit.
Ini adalah fungsi, callable dengan args
n=RCX
,k=ESI
. Nilai pengembalian 32-bit dalamEAX
.Dapat dihubungi dari C dengan konvensi pemanggilan Sistem V x86-64 dengan dummy args untuk memasukkan args yang sebenarnya ke dalam register yang benar.
uint32_t factk(int, uint32_t k, int, uint64_t n);
Saya tidak bisa hanya menggunakan Windows x64 karena 1-operanmul
clobbers RDX, dan kami tidak ingin awalan REX mengakses R8 / R9.n
tidak boleh ada sampah di 32 bit tinggi sehingga JRCXZ berfungsi, tetapi selain itu semuanya 32-bit.Daftar NASM (alamat relatif, kode mesin, sumber)
0xc = 12 byte
Atau 10 byte jika kita tidak perlu menangani
n=0
case khusus, meninggalkanjrcxz
.Untuk faktorial standar, Anda akan menggunakan
loop
alih-alih sub / ja untuk menyimpan 2 byte, tetapi sebaliknya kode yang sama persis.Uji penelepon yang lolos
argc
sebagaik
, dengann
hard-coded.sumber
APL (Dyalog Unicode) , 11 byte SBCS
Fungsi infiks diam-diam anonim. Dibawa
n
sebagai argumen kanan danb
sebagai argumen kiri.Cobalah online!
×∘⍳
kalikanb
dengan ɩ ntegers 1 sampain
⊢-
kurangi itu darin
⊢,
lebih dulun
1⌈
maks satu dan masing-masing×/
produksumber
Ruby , 25 byte
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
2221 byteCobalah online!
-1 terima kasih untuk attinat:
Times --> 1##&
Penjelasan: gunakan
Range
untuk membuat daftar nilai{n, n-k, n-2k, n-3k, ...}
, berhenti sebelum pergi di bawah 1 (yaitu, berhenti tepat). Kemudian gandakan semua angka dalam daftar ini denganTimes
(atau1##&
).sumber
1##&
bukannyaTimes
Java 10, 44 byte
Mengambil faktorial sebagai input pertama, basis sebagai kedua.
Cobalah online.
Ini di atas tidak berfungsi untuk kasus uji terbesar karena rentang integer terbatas (32-bit). Untuk mengatasinya kita bisa menggunakan
BigIntegers
, yangkebetulanadalahtepat dua ukuran - 8879 bytes :-9 byte terima kasih kepada @ OlivierGrégoire .
Cobalah online.
Penjelasan:
sumber
Japt , 8 byte
Cobalah
-1 Berkat EoI yang menunjukkan betapa bodohnya Shaggy tanpa kafein!
sumber
kT
dapat diganti denganf
untuk 1 byteC (gcc) , 41 byte
Cobalah online!
sumber
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}
untuk C (gcc)MathGolf ,
76 byteCobalah online!
Menemukan cara cerdas untuk menangani 0! tanpa mengubah kasus uji lainnya. Mengambil input sebagai
k n
(urutan terbalik), yang membantu dengan muncul secara implisit.Penjelasan
sumber
Attache ,
2119 byteCobalah online! Implementasi rekursif yang cukup langsung. (Catatan:
true
pada dasarnya1
, karena dapat digunakan dalam operasi aritmatika sebagai1
.) Ini adalah salah satu dari beberapa program yang saya tulis untuk situs ini di mana menggunakan operator unicode menghemat byte (1, tepatnya).Alternatif
20 byte:
${x<y or x*$[x-y,y]}
21 byte:
Prod@${{_%y=x%y}\1:x}
27 byte:
${x*[`1,$][x>y][x-y,y]∨1}
27 byte:
${If[x>y,x*$[x-y,y],_or 1]}
27 byte:
${x*[`1,$][x>y][x-y,y]or 1}
29 byte:
${If[x>y,x*$[x-y,y],_+not _]}
sumber
Rust ,
927361 byteSaya baru mulai belajar karat, jadi saya yakin ini bisa lebih pendek. Akan diperbarui saat saya belajar. Nilai pengembalian harus
i128
untuk menghitung tes terakhir.Sunting: Rekursi lebih pendek.
Cobalah online!
Anda dapat menambahkan tes Anda sendiri, atau mengedit salah satu yang sudah ada.
sumber
q ,
59 57 5553 bytepenjelasan:
di sini juga adalah versi dalam k (logika yang sama),
4241 bytesumber
Physica , 22 byte
Cobalah online!
26 byte
Belajar kembali bagaimana menggunakan "bahasa" saya sendiri \ o / ... Jika saya tahu cara menulis parser 2 tahun yang lalu, ini akan menjadi 20 byte :(
atau
Cobalah online!
sumber
Retina , 66 byte
Cobalah online! Tautan mencakup test case yang lebih cepat. Nomor maul tanpa tanda seru. Penjelasan:
Perbaiki
0!
.Konversikan
n
ke unary dan tambahkan pemisah.Berulang kali kurangi
k
darin
sementaran>k
, dan mengumpulkan hasil.Ganti
k
dengan1
(dalam desimal).Kalikan dengan masing-masing nilai perantara secara bergantian, konversikan ke desimal.
sumber
Japt , 8 byte
Cobalah
sumber
JavaScript (Node.js) , 35 byte
Cobalah online!
sumber
Keempat (gforth) , 50 byte
Cobalah online!
Penjelasan Kode
sumber
Perl 5
-Mbigint -p
, 45 byteCobalah online!
sumber
Stax , 6 byte
Jalankan dan debug itu
Dibutuhkan input dalam formulir
{count} {base}
.sumber
Gaia , 6 byte
Cobalah online!
Mengambil input sebagai
n
,k
sehingga masukan dari3 4
akan3!!!!
.sumber