/* Configuration */
var QUESTION_ID = 79762; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 43444; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
n
berupa string input?n!
akan masuk ke dalam tipe integer Anda! Yah, mungkin lain kali.Jawaban:
Python 2, 27 byte
Nol akhir dibatasi oleh faktor 5. Jumlah kelipatan
5
yang paling banyakn
adalahn/5
(dengan pembagian lantai), tetapi ini tidak menghitung faktor berulang dalam kelipatan25, 125, ...
. Untuk mendapatkannya, bagin
dengan 5 dan ulangi.sumber
Jelly , 5 byte
Menggunakan pendekatan kontraproduktif untuk menemukan faktorial lalu memfaktorkannya kembali, memeriksa eksponen 5 dalam factorisation utama.
Cobalah online!
sumber
Mornington Crescent,
19491909 byte-40 byte terima kasih kepada NieDzejkob
sumber
Mornington Crescent
ditantang akan menjadi keren. :)Pyth, 6 byte
Coba di sini.
Alternatif 7-byte :
Kumulatif mengurangi
.u/N5
berulang-ulang lantai-terbagi5
sampai mendapat pengulangan, yang dalam hal ini terjadi setelah mencapai 0.Elemen pertama kemudian dihapus (
t
) dan sisanya dijumlahkan (s
).sumber
Sebenarnya 10 byte
Cobalah online!
Perhatikan bahwa test case terakhir gagal ketika menjalankan Serius pada CPython karena
math.factorial
menggunakan ekstensi C (yang terbatas pada bilangan bulat 64-bit). Menjalankan Seriously on PyPy berfungsi dengan baik.Penjelasan:
sumber
Haskell, 26 byte
Floor-membagi input dengan
5
, kemudian menambahkan hasilnya ke fungsi yang dipanggil itu. Ekspresi(+)=<<f
mengambil inputx
dan outputx+(f x)
.Disingkat dari:
Ekspresi non-rekursif memberi 28 byte:
sumber
i
counter dari1..n
?log_5(n)
penting, sisanya memberi 0.MATL , 9 byte
Cobalah online!
Ini berfungsi untuk angka yang sangat besar, karena menghindari penghitungan faktorial.
Seperti jawaban lain, ini mengeksploitasi fakta bahwa jumlah kali
2
muncul sebagai pembagi faktorial lebih besar atau sama dengan jumlah kali5
muncul.sumber
05AB1E, 5 byte
Akan menjadi 4 byte jika kami dapat menjamin n> 4
Kode:
Penjelasan:
Alternatif, lebih cepat, solusi 6 byte: Terinspirasi oleh jawaban MATL dari Luis Mendo
Penjelasan:
Edit: solusi yang dihapus menggunakan ¢ (hitungan) karena semua bilangan prima yang mengandung 5 akan dihitung sebagai 5 misalnya 53.
Sunting 2: menambahkan solusi yang lebih efisien untuk input yang lebih tinggi sebagai perbandingan.
sumber
5¢
,5Q
harus bekerja. Jawaban yang bagus! :)Ó
adalah lambatÎ!Ó2é
. Bug telah diperbaiki kemarin .Î!Ó7è
adalah 8 byte, dan solusi "6 byte" adalah 10 byteMatlab
(59) (54)(39)Hei dawg !!!! kami mendengarmu menyukai matematika ....
Ini berdasarkan jawaban yang saya buat dalam ulasan kode .
lebih jauh dari apa yang disebutkan dalam jawaban saya dalam tinjauan kode, rumus untuk jumlah nol dalam faktorial (n) adalah Jumlah (n / (5 ^ k)) di mana k bervariasi antara 1 dan log_5 (n)
Satu-satunya alasan sepele mengapa tidak bisa bermain golf adalah karena
log5
tidak tersedia di matlab sebagai builtin, jadi saya mengganti log (5) dengan 1,6, tidak masalah karena itu akan tetap lantai.Cobalah
sumber
Mathematica, 20 byte
IntegerExponent
menghitung nol. Untuk bersenang-senang, inilah versi yang tidak menghitung faktorial:sumber
Array
menghemat satu byte pada solusi kedua.C, 28 byte
Penjelasan
Jumlah nol tambahan sama dengan jumlah balita yang membentuk faktorial. Dari semua itu
1..n
, seperlima dari mereka berkontribusi lima, jadi kita mulai dengann/5
. Dari jumlah tersebutn/5
, yang kelima adalah kelipatan dari 25, jadi berkontribusi lima tambahan, dan seterusnya. Kita berakhir denganf(n) = n/5 + n/25 + n/125 + ...
, yaituf(n) = n/5 + f(n/5)
. Kita perlu menghentikan rekursi ketikan
mencapai nol; kami juga memanfaatkan titik sekuens?:
untuk membagin
sebelum penambahan.Sebagai bonus, kode ini jauh lebih cepat daripada yang mengunjungi masing-masing
1..n
(dan jauh, lebih cepat daripada menghitung faktorial).Program uji
Uji keluaran
sumber
JavaScript ES6, 20 byte
Taktik yang sama seperti pada jawaban xnor, tetapi lebih pendek.
sumber
Julia,
343130 byteIni adalah fungsi anonim yang menerima semua jenis bilangan bulat yang ditandatangani dan mengembalikan bilangan bulat. Untuk menyebutnya, tetapkan ke variabel. Kasus uji yang lebih besar memerlukan kelulusan
n
sebagai jenis yang lebih besar, seperti aBigInt
.Kami menghitung faktorial
n
(menggunakan secara manualprod
lebih pendek dari built-infactorial
), mendapatkan arraydigits
dalam urutan terbalik,find
indeks elemen bukan-nol, mendapatkan indeks pertama seperti itu, dan mengurangi 1.Cobalah online! (termasuk semua kecuali test case terakhir karena yang terakhir terlalu lama)
Menyimpan satu byte berkat Dennis!
sumber
C, 36
Metode yang sama dengan jawaban @ xnor tentang penghitungan 5s, tetapi hanya menggunakan loop sederhana sebagai ganti rekursi.
Ideone .
sumber
Retina , 33 byte
Mengambil input di unary.
Mengembalikan output di unary.
(Perhatikan garis-makan garis.)
Cobalah online!
Bagaimana itu bekerja:
Tahap pertama:
Sedikit tidak berbulu:
Apa fungsinya:
11111
yang bisa dicocokkan.5
.(?=1)
memastikan bahwa angka itu positif.+`
berarti ulangi sampai idempoten.Jika inputnya 100 (dalam unary), maka teksnya sekarang:
Tahap kedua:
Hanya menghapus semua titik koma.
sumber
Ruby, 22 byte
Salah satu dari beberapa kali di mana Ruby
0
menjadi benar adalah masalah untuk jumlah byte.sumber
0
kebenaran?nil
danfalse
itu falsey, dan tidak ada yang lain. Ada banyak kasus di mana membantu dalam golf, karena0
menjadi jujur berarti indeks dan fungsi indeks regex di Ruby kembalinil
jika tidak ada yang cocok-1
, dan beberapa di mana itu adalah masalah, seperti string kosong masih menjadi kebenaran.Perl 6 , 23 byte
Saya bisa membuatnya lebih pendek jika
^...
ditambahkan ke Perl 6{sum $_,*div 5^...0}
.Seharusnya lebih hemat memori untuk angka yang lebih besar jika Anda menambahkan
lazy
pengubah antarasum
dan generator urutan.Penjelasan:
Uji:
(Baris terakhir itu agak menyesatkan, karena MoarVM harus memulai, memuat kompiler dan runtime Perl, mengkompilasi kode, dan menjalankannya. Jadi sebenarnya dibutuhkan sekitar satu setengah detik totalnya.
Itu masih jauh lebih cepat daripada itu adalah untuk memeriksa hasil tes terakhir dengan WolframAlpha.com)
sumber
Mathcad, [tbd] byte
Mathcad adalah semacam "papan tulis" matematika yang memungkinkan entri 2D ekspresi, teks dan plot. Ini menggunakan simbol matematika untuk banyak operasi, seperti penjumlahan, diferensiasi dan integrasi. Operator pemrograman adalah simbol khusus, biasanya dimasukkan sebagai kombinasi kontrol keyboard tunggal dan / atau bergeser pada tombol standar.
Apa yang Anda lihat di atas adalah persis bagaimana lembar kerja Mathcad terlihat seperti yang diketikkan dan saat Mathcad mengevaluasinya. Misalnya, mengubah n dari 2016 ke nilai lain akan menyebabkan Mathcad memperbarui hasil dari 502 ke apa pun nilai baru tersebut.
http://www.ptc.com/engineering-math-software/mathcad/free-download
Metode penilaian ekivalensi byte Mathcad belum ditentukan. Mengambil kesetaraan simbol, solusinya membutuhkan sekitar 24 "byte" (operator sementara hanya dapat dimasukkan menggunakan kombinasi tombol "ctl-]" (atau dari bilah alat)). Metode Matlab Agawa001 memakan waktu sekitar 37 byte ketika diterjemahkan ke dalam Mathcad (operator penjumlahan dimasukkan oleh ctl-shft- $).
sumber
dc, 12 byte
Ini mendefinisikan fungsi
f
yang mengkonsumsi inputnya dari atas stack, dan meninggalkan outputnya di atas stack. Lihat jawaban C saya untuk dasar matematika. Kami berulang kali membaginya dengan 5, mengumpulkan nilai-nilai pada tumpukan, lalu menambahkan semua hasil:Program uji
Uji keluaran
sumber
Jolf, 13 byte
Menentukan fungsi rekursif yang dipanggil pada input. Coba di sini!
sumber
J,
281716 byteHampir sama dengan teknik non-rekursif dari jawaban xnor.
Ini versi yang lebih lama yang saya simpan di sini karena saya pribadi lebih menyukainya, dengan kecepatan 28 byte:
Meskipun tidak diperlukan, saya telah memasukkan
x:
dalam kasus uji untuk presisi yang diperpanjang.Angka terakhir tidak berfungsi dengan fungsi ini.
Penjelasan
Ini bekerja dengan menghitung
n!
, mengubahnya menjadi string, dan memeriksa setiap anggota untuk kesetaraan dengan'0'
. Untukn = 15
, proses ini adalah:Sekarang, kita gunakan
;._1
untuk membagi daftar pada elemen pertama (nol), meninju setiap hasil split, menghasilkan kotak yang diisi dengan ace (a:
) atau menjalankan1
s, seperti:Kami sederhana mendapatkan anggota terakhir (
{:
), unbox itu (>
), dan melakukan penjumlahan di atasnya+/
, menghasilkan jumlah nol.Ini adalah versi yang lebih mudah dibaca:
sumber
>:@i.
dapat ditulis1+i.
untuk menyimpan byte.[:#.~'0'=":@!
13 byte dengan mengubah metode penghitungan trailing 1s.Python 3, 52 byte
sumber
Pyke, 5 byte
Coba di sini!
sumber
KEMBALI , 17 byte
Try it here.
Lambda operator rekursif. Pemakaian:
Penjelasan
sumber
Perl,
2422 +1 (-p
bendera) = 23 byteMenggunakan:
Program lengkap:
sumber
Java, 38 byte
Program lengkap, dengan metode ungolfed:
sumber
J, 7 byte
Fungsi monadik, mengambil argumen di sebelah kanan.
Jika
x
positif,x q: y
kembalikan eksponen dalam faktorisasi utamay
, hanya untukx
bilangan prima pertama . The3
prime -rd adalah 5 dan{:
mengambil ekor daftar.Perhatikan bahwa Anda harus memasukkan bilangan bulat dengan
x
di akhir, atau J akan memperlakukannya sebagai float.Cobalah sendiri di tryj.tk , meskipun diperingatkan bahwa penerjemah online ini akan mengeluh jika Anda mencoba sesuatu yang lebih besar dari 1343.
Jika Anda menginginkan sesuatu yang tidak menghitung n ! dan karenanya tidak memerlukannya masuk dalam bilangan bulat, gunakan solusi rekursif
<.@%&5(+$:@)^:*
. (tryj.tk masih cengeng pada input besar.)sumber
Ruby,
70615149 byteVersi 3 dengan terima kasih kepada Kenny Lau dan daniero
Sunting: Ternyata Anda dapat menyimpan dua byte dengan memetakan
to_i
sebelum Andareduce
. Aneh: PFungsi ini mengurangi jumlah
n
digit basis 5 darin
dan kemudian membagi hasilnya dengan 4. Ini terkait dengan jumlah deret geometri1+5+25+..+5**n = (5**n+1)/4
.Sebagai contoh (sekali lagi, dengan terima kasih kepada Kenny Lau), pertimbangkan
358
(2413
pada basis 5) dikurangi basisnya 5 digit.Bagi
348
dengan4
dan Anda dapatkanf(358) = 87
.Versi 2 dengan terimakasih untuk Kenny Lau
Fungsi ini menghitung
n!
kemudian mengurangi yangsize
darin!
darisize
dari(n!).reverse.to_i.to_s
, yang menghilangkan semua nol, dengan demikian, mengembalikansize
dari nol sendiri.Versi 1
Ini variasi dari "Berapa banyak
5
yang ada di faktorisasi utaman!
?" trik yang menggunakan builtin konversi basis sederhana Ruby.Golf adalah sedikit rasa sakit meskipun, dengan mengkonversi dari
Integer
keString
keArray
, meraih bagian dariArray
dan mengkonversi yang untukString
keInteger
lagi untukreduce
. Setiap saran bermain golf dipersilakan.sumber
to_i
sebelum mengurangi:->n{(n-n.to_s(5).chars.map(&:to_i).reduce(:+))/4}
(menghemat dua byte)Julia,
2119 byteMenggunakan rumus rekursif dari jawaban xnor .
Cobalah online!
sumber
Dyalog APL , 9 byte
⎕
meminta nomor!
memfaktorkan⍕
merangkai'0'=
periksa kesetaraan ke karakter nol⊥⍨
menghitung trailing trues ** Secara harfiah ini adalah konversi basis campuran ke basis-10, menggunakan daftar boolean sebagai angka dan basis:
⊥⍨0 1 0 1 1
sama dengan0 1 0 1 1⊥⍨0 1 0 1 1
yang0×(0×1×0×1×1) 1×(1×0×1×1) 0×(0×1×1) 1×(1×1) + 1×(1)
mana lagi adalah dua (jumlah trailing 1s).sumber