เกี่ยวกับซีรี่ส์
ฉันจะใช้ชุดเล็ก ๆ ของความท้าทายรหัสกอล์ฟหมุนรอบรูปแบบของการสุ่ม โดยทั่วไปจะเป็นสนามกอล์ฟ9-Hole แต่กระจายออกไปหลายคำถาม คุณสามารถเข้าร่วมการท้าทายใด ๆ เป็นรายบุคคลราวกับว่ามันเป็นคำถามปกติ
อย่างไรก็ตามฉันจะรักษากระดานผู้นำในทุกความท้าทาย ซีรีส์นี้จะมีการแข่งขันมากกว่า 9 รายการ (สำหรับตอนนี้) โดยจะมีการโพสต์หนึ่งรายการทุกสองวัน ผู้ใช้ทุกคนที่เข้าร่วมในการท้าทายทั้ง 9 รายการมีสิทธิ์ได้รับรางวัลทั้งชุด คะแนนโดยรวมของพวกเขาคือผลรวมของการส่งที่สั้นที่สุดของพวกเขาในแต่ละการท้าทาย (ดังนั้นหากคุณตอบคำถามที่ท้าทายสองครั้งจะมีเพียงการนับคำตอบที่ดีกว่าเท่านั้นต่อคะแนน) หากใครมีอันดับสูงสุดในกระดานผู้นำโดยรวมนี้เป็นเวลา28 วันฉันจะให้รางวัลแก่พวกเขาเป็นจำนวน500คน
แม้ว่าฉันจะมีไอเดียมากมายสำหรับซีรีส์ แต่ความท้าทายในอนาคตยังไม่เกิดขึ้น หากคุณมีข้อเสนอแนะใด ๆ โปรดแจ้งให้เราทราบเกี่ยวกับการโพสต์ Sandbox ที่เกี่ยวข้อง
หลุมที่ 1: สุ่มอาเรย์
งานแรกนั้นค่อนข้างง่าย: กำหนดอาเรย์ของจำนวนเต็มแบบไม่ว่างเปล่าสุ่มแบบสุ่ม มีกฎบางอย่างที่:
- การสับเปลี่ยนที่เป็นไปได้ทุกครั้งจะต้องส่งคืนด้วยความน่าจะเป็นแบบเดียวกัน (ดังนั้นการสับเปลี่ยนควรมีการแจกแจงแบบเดียวกัน) คุณสามารถตรวจสอบว่าอัลกอริทึมของคุณเป็นชุด / เป็นกลางโดยการใช้ใน JavaScript บนมันจะสลับซึ่งจะผลิตเมทริกซ์ของอคติที่ - ผลควรมีลักษณะเป็นเครื่องแบบเป็นของตัว ins Fisher-Yatesหรือเรียงลำดับ (ลำดับแบบสุ่ม)
- คุณต้องไม่ใช้วิธีการใด ๆ ในตัวหรือของบุคคลที่สามเพื่อสับเปลี่ยนอาร์เรย์หรือสร้างการเรียงสับเปลี่ยนแบบสุ่ม (หรือแจกแจงการเปลี่ยนลำดับทั้งหมด) โดยเฉพาะอย่างยิ่งในตัวฟังก์ชั่นแบบสุ่มคุณอาจจะใช้เพียง แต่จะได้รับจำนวนสุ่มเดียวในเวลา คุณอาจคิดว่าวิธีการสุ่มตัวเลขใด ๆ ในตัวทำงานใน O (1) และมีความสม่ำเสมออย่างสมบูรณ์แบบในช่วงเวลาที่ร้องขอ (ในแง่ทางคณิตศาสตร์ หากภาษาของคุณอนุญาตให้คุณรับรายการหมายเลขสุ่มm ได้ในครั้งเดียวคุณสามารถใช้สิ่งอำนวยความสะดวกนี้ได้หากตัวเลขmเป็นอิสระต่อกันและคุณนับเป็น O (m)
- การใช้งานของคุณต้องไม่ซับซ้อนเกินเวลาที่ O (N)โดยที่Nคือขนาดของอาเรย์ที่จะถูกสับ ตัวอย่างเช่นคุณไม่สามารถ "เรียงตามตัวเลขสุ่ม"
- คุณสามารถสับเปลี่ยนอาเรย์หรือสร้างอาเรย์ใหม่ (ซึ่งในกรณีนี้อาเรย์เก่าอาจถูกปรับเปลี่ยนตามที่คุณต้องการ)
คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบและรับอินพุตผ่าน STDIN อาร์กิวเมนต์บรรทัดคำสั่งอาร์กิวเมนต์ฟังก์ชันหรือพร้อมท์และสร้างเอาต์พุตผ่านค่าส่งคืนหรือโดยการพิมพ์ไปยัง STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) หากคุณเขียนฟังก์ชันที่สับเปลี่ยนอาร์เรย์คุณไม่จำเป็นต้องส่งคืนแน่นอน (หากภาษาของคุณอนุญาตให้คุณเข้าถึงอาร์เรย์ที่ปรับเปลี่ยนหลังจากที่ฟังก์ชันส่งคืนแล้ว)
เข้าและส่งออกอาจจะอยู่ในรายชื่อที่สะดวกใด ๆ หรือรูปแบบสตริง แต่ต้องสนับสนุนจำนวนเต็มโดยพลการในช่วง-2 31 ≤ x <2วันที่ 31 โดยหลักการแล้วรหัสของคุณควรใช้กับอาร์เรย์ที่มีความยาวสูงสุด2 31แม้ว่าจะไม่จำเป็นต้องใส่ในหน่วยความจำของคุณหรือทำให้เสร็จภายในระยะเวลาที่เหมาะสม (ฉันแค่ไม่ต้องการเห็นการ จำกัด ขนาดโดยพลการของลูปฮาร์โค้ดหรือบางอย่าง)
นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) ชนะ
ลีดเดอร์บอร์ด
ตัวอย่างต่อไปนี้จะสร้างกระดานผู้นำสำหรับทุกความท้าทายของซีรี่ส์
เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มต้นทุกคำตอบด้วยพาดหัวโดยใช้เทมเพลต Markdown ต่อไปนี้:
# Language Name, N bytes
ที่N
มีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น
# Ruby, <s>104</s> <s>101</s> 96 bytes
(ภาษาไม่ปรากฏขึ้นในปัจจุบัน แต่ตัวอย่างข้อมูลต้องการและแยกวิเคราะห์และฉันอาจเพิ่มกระดานผู้นำแบบแยกภาษาในอนาคต)
/* 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>