Tentang Seri
Saya akan menjalankan serangkaian tantangan kode-golf berputar di sekitar tema keacakan. Ini pada dasarnya akan menjadi Lapangan Golf 9-Lubang , tetapi tersebar di beberapa pertanyaan. Anda dapat berpartisipasi dalam setiap tantangan secara individual seolah-olah itu adalah pertanyaan normal.
Namun, saya akan mempertahankan papan peringkat di semua tantangan. Serial ini akan membahas lebih dari 9 tantangan (untuk saat ini), satu diposting setiap beberapa hari. Setiap pengguna yang berpartisipasi dalam 9 tantangan memenuhi syarat untuk memenangkan seluruh seri. Skor keseluruhan mereka adalah jumlah dari kiriman terpendek mereka pada setiap tantangan (jadi jika Anda menjawab tantangan dua kali, hanya jawaban yang lebih baik yang dihitung untuk skor tersebut). Jika ada yang memegang posisi teratas di papan peringkat keseluruhan ini selama 28 hari, saya akan memberi mereka hadiah 500 rep .
Meskipun saya memiliki banyak ide untuk seri ini, tantangan di masa depan belum ditetapkan. Jika Anda memiliki saran, beri tahu saya di pos kotak pasir yang relevan .
Lubang 1: Kocok Array
Tugas pertama cukup sederhana: diberi array integer yang tidak kosong, kocok secara acak. Ada beberapa aturan:
- Setiap permutasi yang mungkin harus dikembalikan dengan probabilitas yang sama (sehingga shuffle harus memiliki distribusi yang seragam). Anda dapat memeriksa apakah algoritme Anda seragam / tidak memihak dengan mengimplementasikannya dalam JavaScript pada Will it Shuffle , yang akan menghasilkan matriks bias - hasilnya akan terlihat sama seragamnya dengan Fisher-Yates bawaannya atau urutkan (urutan acak) .
- Anda tidak boleh menggunakan metode bawaan atau pihak ketiga untuk mengocok array atau menghasilkan permutasi acak (atau menghitung semua permutasi). Secara khusus, satu-satunya fungsi acak bawaan yang dapat Anda gunakan adalah mendapatkan satu nomor acak sekaligus . Anda dapat mengasumsikan bahwa setiap metode bilangan acak bawaan berjalan di O (1) dan sangat seragam selama interval yang diminta (dalam pengertian matematika - Anda dapat mengabaikan detail representasi titik mengambang di sini). Jika bahasa Anda memungkinkan Anda memperoleh daftar angka acak m sekaligus, Anda dapat menggunakan fasilitas ini, asalkan angka-angka m independen satu sama lain, dan Anda menghitungnya sebagai O (m).
- Implementasi Anda tidak boleh melebihi kompleksitas waktu O (N) , di mana N adalah ukuran array yang akan dikocok. Misalnya, Anda tidak dapat "mengurutkan berdasarkan angka acak".
- Anda dapat mengocok array di tempat, atau membuat array baru (dalam hal ini array lama dapat diubah sesuka Anda).
Anda dapat menulis program atau fungsi lengkap dan mengambil input melalui STDIN, argumen baris perintah, argumen fungsi atau prompt dan menghasilkan output melalui nilai balik atau dengan mencetak ke STDOUT (atau alternatif terdekat). Jika Anda menulis fungsi yang mengocok array di tempatnya, Anda tidak perlu mengembalikannya tentu saja (asalkan bahasa Anda memungkinkan Anda mengakses array yang diubah setelah fungsi kembali).
Input dan output mungkin dalam format string atau daftar yang mudah digunakan, tetapi harus mendukung bilangan bulat sewenang-wenang dalam rentang -2 31 ≤ x <2 31 . Pada prinsipnya, kode Anda harus bekerja untuk array hingga panjang 2 31 , meskipun ini tidak harus sesuai dengan memori Anda atau selesai dalam jumlah waktu yang wajar. (Saya hanya tidak ingin melihat batas ukuran sewenang-wenang untuk loop hardcode atau sesuatu.)
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.
Papan peringkat
Cuplikan berikut akan menghasilkan papan peringkat di semua tantangan seri.
Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Bahasa saat ini tidak ditampilkan, tetapi cuplikan memang membutuhkan dan menguraikannya, dan saya dapat menambahkan leaderboard berdasarkan bahasa di masa mendatang.)
/* Configuration */
var QUESTION_IDs = [45302, 45447, 46991, 49394, 51222, 66319, 89621, 120472]; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!.FjwQBrX2KXuFkv6p2lChi_RjzM19";
/* App */
var answers = [], page = 1, currentQ = -1;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_IDs.join(";") + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function getAnswers() {
$.ajax({
url: answersUrl(page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
if (data.has_more) getAnswers();
else process();
}
});
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>((?!>).)*<\/s>|((?!>).)+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^\n,]+)(?=,)/;//
function shouldHaveHeading(a) {
var pass = false;
var lines = a.body_markdown.split("\n");
try {
pass |= /^#/.test(a.body_markdown);
pass |= ["-", "="]
.indexOf(lines[1][0]) > -1;
pass &= LANGUAGE_REG.test(a.body_markdown);
} catch (ex) {}
return pass;
}
function shouldHaveScore(a) {
var pass = false;
try {
pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
} catch (ex) {}
if (!pass) console.log(a);
return pass;
}
function getAuthorName(a) {
return a.owner.display_name;
}
function getAuthorId(a) {
return a.owner.user_id;
}
function process() {
answers = answers.filter(shouldHaveScore)
.filter(shouldHaveHeading);
answers.sort(function (a, b) {
var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
return aB - bB
});
var users = {};
answers.forEach(function (a) {
var headline = a.body_markdown.split("\n")[0];
var question = QUESTION_IDs.indexOf(a.question_id);
var size = parseInt((headline.match(SIZE_REG)||[0])[0]);
var language = headline.match(LANGUAGE_REG)[1];
var user = getAuthorName(a);
var userId = getAuthorId(a);
if (!users[userId]) users[userId] = {name: user, nAnswer: 0, answers: []};
if (!users[userId].answers[question]) {
users[userId].answers[question] = {size: Infinity};
users[userId].nAnswer++;
}
if (users[userId].answers[question].size > size) {
users[userId].answers[question] = {size: size, link: a.share_link}
}
});
var sortedUsers = [];
for (var userId in users)
if (users.hasOwnProperty(userId)) {
var user = users[userId];
user.score = 0;
user.completedAll = true;
for (var i = 0; i < QUESTION_IDs.length; ++i) {
if (user.answers[i])
user.score += user.answers[i].size;
else
user.completedAll = false;
}
sortedUsers.push(user);
}
sortedUsers.sort(function (a, b) {
if (a.nAnswer > b.nAnswer) return -1;
if (b.nAnswer > a.nAnswer) return 1;
return a.score - b.score;
});
var place = 1;
for (var i = 0; i < sortedUsers.length; ++i) {
var user = sortedUsers[i];
var row = '<tr><td>'+ place++ +'.</td><td>'+user.name+'</td>';
for (var j = 0; j < QUESTION_IDs.length; ++j) {
var answer = user.answers[j];
if (answer)
row += '<td><a href="'+answer.link+'">'+answer.size+'</a></td>';
else
row += '<td class="missing"></td>';
}
row += '<td></td>';
if (user.completedAll)
row += '<td class="total">'+user.score+'</td>';
else
row += '<td class="total missing">'+user.score+'</td>';
row += '</tr>';
$("#users").append(row);
}
}
body { text-align: left !important}
#leaderboard {
width: 500px;
}
#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;
}
td.total {
font-weight: bold;
text-align: right;
}
td.missing {
background: #bbbbbb;
}
<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="leaderboard">
<h2>Leaderboard</h2>
<p>
Missing scores are shown as grey cells. A grey total indicates that the user has not participated in all challenges and is not eligible for the overall victory yet.
</p>
<table class="_user-list">
<thead>
<tr><td></td><td>User</td>
<td><a href="https://codegolf.stackexchange.com/q/45302/8478">#1</a></td>
<td><a href="https://codegolf.stackexchange.com/q/45447/8478">#2</a></td>
<td><a href="https://codegolf.stackexchange.com/q/46991/8478">#3</a></td>
<td><a href="https://codegolf.stackexchange.com/q/49394/8478">#4</a></td>
<td><a href="https://codegolf.stackexchange.com/q/51222/8478">#5</a></td>
<td><a href="https://codegolf.stackexchange.com/q/66319/8478">#6</a></td>
<td><a href="https://codegolf.stackexchange.com/q/89621/8478">#7</a></td>
<td><a href="https://codegolf.stackexchange.com/q/120472/8478">#8</a></td>
<td></td><td>Total</td>
</tr>
</thead>
<tbody id="users">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><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>