Giới thiệu về bộ
Tôi sẽ thực hiện một loạt các thử thách golf-golf xoay quanh chủ đề ngẫu nhiên. Về cơ bản, đây sẽ là một sân gôn 9 lỗ , nhưng trải rộng qua nhiều câu hỏi. Bạn có thể tham gia vào bất kỳ thử thách nào như thể đó là một câu hỏi bình thường.
Tuy nhiên, tôi sẽ duy trì bảng xếp hạng trên tất cả các thử thách. Loạt phim sẽ chạy qua 9 thử thách (hiện tại), một bài được đăng mỗi vài ngày. Mỗi người dùng tham gia vào tất cả 9 thử thách đều đủ điều kiện để giành chiến thắng trong toàn bộ chuỗi. Điểm tổng thể của họ là tổng số bài nộp ngắn nhất của họ cho mỗi thử thách (vì vậy nếu bạn trả lời một thử thách hai lần, chỉ có câu trả lời tốt hơn được tính vào điểm số). Nếu bất cứ ai giữ vị trí hàng đầu trên bảng xếp hạng tổng thể này trong 28 ngày, tôi sẽ thưởng cho họ tiền thưởng 500 rep .
Mặc dù tôi có một loạt các ý tưởng được xếp hàng cho loạt bài này, những thách thức trong tương lai vẫn chưa được đặt ra. Nếu bạn có bất kỳ đề xuất nào, xin vui lòng cho tôi biết trên bài đăng hộp cát có liên quan .
Lỗ 1: Xáo trộn một mảng
Nhiệm vụ đầu tiên khá đơn giản: đưa ra một mảng số nguyên không trống, xáo trộn ngẫu nhiên. Có một vài quy tắc mặc dù:
- Mọi hoán vị có thể phải được trả về với cùng một xác suất (vì vậy việc xáo trộn phải có phân phối đồng đều). Bạn có thể kiểm tra xem thuật toán của bạn có đồng nhất / không thiên vị hay không bằng cách triển khai nó trong JavaScript trên Will it Shuffle , nó sẽ tạo ra một ma trận các thành kiến - kết quả sẽ trông giống như các hàm Fisher-Yates hoặc sắp xếp (thứ tự ngẫu nhiên) của chúng .
- Bạn không được sử dụng bất kỳ phương thức tích hợp hoặc bên thứ 3 nào để xáo trộn mảng hoặc tạo hoán vị ngẫu nhiên (hoặc liệt kê tất cả các hoán vị). Cụ thể, chức năng ngẫu nhiên tích hợp duy nhất bạn có thể sử dụng là nhận một số ngẫu nhiên duy nhất tại một thời điểm . Bạn có thể giả sử rằng bất kỳ phương pháp số ngẫu nhiên tích hợp nào chạy trong O (1) và hoàn toàn thống nhất trong khoảng thời gian được yêu cầu (theo nghĩa toán học - bạn có thể bỏ qua chi tiết về biểu diễn dấu phẩy động ở đây). Nếu ngôn ngữ của bạn cho phép bạn có được danh sách m số ngẫu nhiên cùng một lúc, bạn có thể sử dụng cơ sở này, miễn là các số m độc lập với nhau và bạn tính nó là O (m).
- Việc triển khai của bạn không được vượt quá độ phức tạp thời gian của O (N) , trong đó N là kích thước của mảng được xáo trộn. Chẳng hạn, bạn không thể "sắp xếp theo số ngẫu nhiên".
- Bạn có thể xáo trộn mảng tại chỗ hoặc tạo một mảng mới (trong trường hợp đó mảng cũ có thể được sửa đổi theo cách bạn muốn).
Bạn có thể viết một chương trình đầy đủ hoặc một hàm và nhận đầu vào thông qua STDIN, đối số dòng lệnh, đối số chức năng hoặc lời nhắc và tạo đầu ra thông qua giá trị trả về hoặc bằng cách in ra STDOUT (hoặc thay thế gần nhất). Nếu bạn viết một hàm xáo trộn mảng tại chỗ, bạn không cần phải trả lại khóa đó (với điều kiện ngôn ngữ của bạn cho phép bạn truy cập vào mảng đã sửa đổi sau khi hàm trả về).
Đầu vào và đầu ra có thể ở bất kỳ định dạng chuỗi hoặc danh sách thuận tiện nào, nhưng phải hỗ trợ các số nguyên tùy ý trong phạm vi -2 31 x <2 31 . Về nguyên tắc, mã của bạn sẽ hoạt động cho các mảng có độ dài lên đến 2 31 , mặc dù điều này không nhất thiết phải phù hợp với bộ nhớ của bạn hoặc hoàn thành trong một khoảng thời gian hợp lý. (Tôi chỉ không muốn thấy giới hạn kích thước tùy ý đối với các vòng lặp mã cứng hoặc thứ gì đó.)
Đây là mã golf, vì vậy bài nộp ngắn nhất (tính bằng byte) sẽ thắng.
Bảng xếp hạng
Đoạn mã sau sẽ tạo bảng xếp hạng trong tất cả các thử thách của chuỗi.
Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu mọi câu trả lời bằng tiêu đề, sử dụng mẫu Markdown sau:
# Language Name, N bytes
nơi N
là kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Ngôn ngữ hiện không được hiển thị, nhưng đoạn mã yêu cầu và phân tích nó và tôi có thể thêm bảng xếp hạng ngôn ngữ trong tương lai.)
/* 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>