Tantangannya adalah menghitung jumlah digit faktorial suatu angka.
Contoh
Input: 10
Output: 27
10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, dan jumlah digit dalam angka 10! adalah 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27
Anda dapat mengharapkan input menjadi bilangan bulat di atas 0. Output dapat berupa jenis apa pun, tetapi jawabannya harus dalam basis standar bahasa pengkodean.
Kasus uji:
10 27
19 45
469 4140
985 10053
NB Beberapa bahasa tidak dapat mendukung angka besar di atas bilangan bulat 32-bit; untuk bahasa-bahasa itu Anda tidak akan diharapkan menghitung faktorial besar.
Tautan OEIS di sini berkat Martin Ender
Ini adalah kode-golf , jadi kode terpendek dalam karakter menang!
code-golf
math
arithmetic
factorial
George
sumber
sumber
n>21
Jawaban:
05AB1E , 3 byte
Cobalah online!
sumber
Jelly , 3 byte
Cobalah online!
Lakukan apa yang Anda harapkan:
sumber
Mathematica, 21 byte
sumber
[#!]
dan tidak@#!
? (Mathematica noob)@
memiliki prioritas lebih tinggi daripada!
.C ++ 11, 58 byte
Sebagai lambda tanpa nama yang memodifikasi inputnya:
Salah satu kasus yang jarang terjadi ketika saya C ++ kode lebih pendek dari kode C .
Jika Anda ingin mendukung kasus yang lebih besar, alihkan ke C ++ 14 dan gunakan:
dan berikan argumen panggilan dengan
ull
akhiran.Pemakaian:
sumber
Ruby,
63615338 bytePendekatan baru berkat manatwork:
Tua:
sumber
eval
cara:->n{eval"#{(1..n).reduce:*}".chars*?+}
.Pyth,
76 byteTerima kasih kepada @Kade karena telah menyelamatkan saya satu byte
sj.!QT
Cobalah online!
Ini adalah pertama kalinya saya menggunakan Pyth, jadi saya yakin bahwa jawaban saya bisa sedikit golf.
Penjelasan:
sumber
10
ditugaskan ke variabelT
, sehingga Anda dapat membuat inisj.!QT
:)ssM`.!
melakukan pekerjaan juga, juga dalam 6 byte.Haskell,
4140 byteContoh penggunaan:
f 985
->10053
.Buat daftar dari
1
hinggax
, hitung produk elemen daftar, ubah menjadi representasi stringnya, ubah setiap karakter menjadi angka dan jumlahkan.Sunting: @Angs menyimpan satu byte. Terima kasih!
sumber
f x=sum$read.pure<$>(show$product[1..x])
menghemat satu bytePython, 54 byte
repl.it
sumber
R,
5853 byteSunting: Disimpan satu byte berkat @Jonathan Carroll dan pasangan berkat @Micky T
Sayangnya, dengan bilangan bulat 32-bit, ini hanya berfungsi untuk
n < 22
. Membawa input dari stdin dan output ke stdout.Jika seseorang menginginkan tingkat presisi yang lebih tinggi, ia harus menggunakan beberapa pustaka eksternal seperti
Rmpfr
:sumber
c(x,"")
vspaste(x)
:sum(as.integer(el(strsplit(c(factorial(scan()),""),""))))
. Memaksa hasil faktorial ke karakter danstrsplit
mengembalikannya sebagai daftar kedua, jadiel
masih berfungsi dan mengekstrak elemen daftar pertama.prod(1:scan())
?as.double
sudah cukupstrtoi
berfungsi sebagai pengganti yang lebih pendekas.double
, saya pikir.Pip , 8 byte
Cobalah online!
Penjelasan
sumber
CJam , 8 byte
Cobalah online!
Penjelasan
sumber
Brachylog , 5 byte
Cobalah online!
Penjelasan
Pada dasarnya algoritma yang dijelaskan:
sumber
Java 7, 148 byte
sumber
Ruby,
63 60 5351 byteTerima kasih kepada Martin untuk bantuan bermain golf.
sumber
Pushy , 4 byte
Memberikan masukan pada baris perintah:
$ pushy facsum.pshy 5
. Berikut rinciannya:sumber
Oktaf, 30 byte
Hitung faktorial dengan mengambil produk dari daftar
[1 2 ... n]
. Mengubahnya menjadi string dan mengurangi48
dari semua elemen (kode ASCII untuk0
). Akhirnya meringkasnya :)sumber
bash (seq, bc, lipat, jq),
3433 byteTentunya bukan yang paling elegan tetapi untuk tantangan
sumber
fold -1
menghemat satu byte.C, 58 byte
Ini tidak sempurna. Hanya yang berfungsi karena harus -1 di awal. Idenya adalah menggunakan dua fungsi rekursif dalam satu fungsi. Itu tidak semudah yang saya pikirkan.
Format penggunaan dan dimengerti:
Sunting: Saya menemukan metode yang memungkinkan menggunakan fungsi ini beberapa waktu tetapi kemudian panjangnya adalah 62 byte.
sumber
Perl 6 , 21 byte
Diperluas:
sumber
Cubix,
3332 byteBentuk bersih:
Cobalah online!
Catatan
Infinity
angka (secara teknis, ini adalah properti objek jendela yang tidak dapat ditulis, tidak dapat dihitung, dan tidak dapat dikonfigurasi).Penjelasan
Program ini terdiri dari dua loop. Yang pertama menghitung faktorial dari input, yang lain membagi hasilnya menjadi digit-nya dan menambahkannya menjadi satu. Kemudian jumlahnya dicetak, dan program selesai.
Mulai
Pertama, kita perlu menyiapkan tumpukan. Untuk bagian itu, kami menggunakan tiga instruksi pertama. IP dimulai pada baris keempat, menunjuk ke timur. Tumpukan kosong.
Kami akan menyimpan jumlah di bagian paling bawah tumpukan, jadi kita harus mulai dengan
0
menjadi jumlah dengan menyimpannya di bagian bawah tumpukan. Maka kita perlu mendorong a1
, karena input awalnya akan dikalikan dengan angka sebelumnya. Jika ini nol, faktorial akan selalu menghasilkan nol juga. Terakhir kita membaca input sebagai integer.Sekarang, tumpukannya
[0, 1, input]
dan IP berada di baris keempat, kolom keempat, menunjuk ke timur.Lingkaran faktorial
Ini adalah loop sederhana yang mengalikan dua elemen teratas dari stack (hasil dari loop sebelumnya dan input - n, dan kemudian mengurangi input. Itu rusak ketika input mencapai 0.
$
Instruksi menyebabkan IP untuk melewatkanu
- turn.Lop adalah bagian dari kubus berikut ini. IP dimulai pada baris keempat, kolom keempat.Karena
^
karakternya, IP mulai bergerak ke utara segera. Kemudianu
berbalik IP dan bergerak satu ke kanan. Di bagian bawah, ada panah lain:<
mengarahkan IP kembali ke^
. Tumpukan dimulai sebagai[previousresult, input-n]
, di manan
jumlah iterasi. Karakter berikut dieksekusi dalam loop:Kemudian bagian atas tumpukan (input berkurang) diperiksa
0
oleh!
instruksi, dan jika ya0
, theu
karakter dilewati.Jumlahkan angka
IP membungkus kubus, berakhir pada karakter terakhir pada baris keempat, awalnya menunjuk ke barat. Loop berikut terdiri dari hampir semua karakter yang tersisa:
Loop pertama-tama menghapus item teratas dari tumpukan (yang merupakan salah satu
10
atau0
), dan kemudian memeriksa apa yang tersisa dari hasil faktorial. Jika itu telah dikurangi menjadi0
, bagian bawah tumpukan (jumlahnya) dicetak dan program berhenti. Jika tidak, instruksi berikut dijalankan (tumpukan dimulai sebagai[oldsum, ..., factorial]
):Dan loop dimulai lagi, hingga
factorial/10
sama dengan 0.sumber
C, 47 byte
pemakaian:
sumber
Python, 57 byte
Cobalah online
sumber
L
sekali faktorial cukup besar untuk menjadi panjang.Batch, 112 byte
Nyaman
set/a
bekerja pada nilai saat ini variabel, jadi itu bekerja secara normal di dalam satu loop. Hanya berfungsi hingga 12 karena keterbatasan tipe integer Batch, jadi secara teori saya bisa menghemat byte dengan mengasumsikanf<1e9
:Tetapi dengan cara itu ada kegilaan ... Saya mungkin juga membuat hard-code daftar dalam hal itu (97 byte):
sumber
JavaScript (ES6), 50 byte
Hanya berfungsi hingga
n=22
karena batasan akurasi floating-point.sumber
Befunge 93 ,
5654 byteTersimpan 2 byte lakukan untuk menggunakan get bukannya kutipan. Ini biarkan saya menggeser 2 baris teratas lebih dari 1, mengurangi ruang putih yang tidak perlu.
Cobalah online!
Penjelasan:
sumber
Javascript ES6 -
6154 BytesEDIT: Terima kasih, Hedi dan ETHproduk karena telah memangkas 7 byte. Saya harus ingat trik t - = - j.
sumber
n=>{a=_=>!_||_*a(~-_);t=0;for(j of''+a(n))t-=-j;return t}
n=>eval(`for(j of''+(a=_=>!_||_*a(~-_))(n,t=0))t-=-j`)
AHK , 60 byte
AutoHotkey tidak memiliki fungsi faktorial bawaan dan fungsi loop memiliki nama panjang untuk variabel bawaannya. Loop pertama adalah faktorial dan yang kedua adalah menambahkan angka bersama.
sumber
J,
1211 byteDisimpan 1 byte berkat cole!
Ini hanya berlaku jumlah (
1#.
) untuk digit (menggunakan kebalikaninv
dari konversi basis#.
dengan basis10
) dari faktorial (!
) argumen.Uji kasus
Catatan: dua test case terakhir adalah bigints, seperti yang ditandai oleh trailing
x
.sumber
"."0":
untuk mendapatkan angka1#.,.&.":@!
yang membutuhkan presisi yang diperluas untuk kasus yang lebih kecil juga (tidak yakin mengapa). Juga 11 byte:1#.10#.inv!
.Brachylog (v2), 3 byte
Cobalah online!
"Algoritma" yang sama dengan jawaban v1 oleh @Fatalize, hanya dengan penyandian yang lebih baik.
sumber
C,
6360 byte-3 byte untuk
do...while
loop.Tidak digabungkan dan digunakan:
sumber
int
default?int
diasumsikan.