श्रृंखला के बारे में
मैं यादृच्छिकता के विषय के इर्द-गिर्द घूमती कोड-गोल्फ चुनौतियों की एक छोटी श्रृंखला चला रहा हूँ। यह मूल रूप से एक 9-होल गोल्फ कोर्स होगा , लेकिन कई सवालों पर फैला हुआ है। आप व्यक्तिगत रूप से किसी भी चुनौती में भाग ले सकते हैं जैसे कि यह एक सामान्य प्रश्न था।
हालांकि, मैं सभी चुनौतियों के बीच एक लीडरबोर्ड को बनाए रखूंगा। श्रृंखला 9 चुनौतियों (अब के लिए) पर चलेगी, हर कुछ दिनों में एक पोस्ट की गई है। प्रत्येक उपयोगकर्ता जो सभी 9 चुनौतियों में भाग लेता है , पूरी श्रृंखला जीतने के लिए पात्र है। उनका समग्र स्कोर प्रत्येक चुनौती पर उनके सबसे छोटे सबमिशन का योग है (इसलिए यदि आप दो बार चुनौती का जवाब देते हैं, तो केवल बेहतर उत्तर स्कोर की ओर गिना जाता है)। अगर कोई भी 28 दिनों के लिए इस समग्र लीडरबोर्ड पर शीर्ष स्थान रखता है, तो मैं उन्हें 500 प्रतिनिधि का इनाम दूंगा ।
यद्यपि मेरे पास श्रृंखला के लिए विचारों का एक समूह है, लेकिन भविष्य की चुनौतियां अभी तक पत्थर में सेट नहीं हैं। यदि आपके कोई सुझाव हैं, तो कृपया मुझे संबंधित सैंडबॉक्स पोस्ट पर बताएं ।
छेद 1: एक सरणी फेरबदल
पहला कार्य बहुत सरल है: पूर्णांक के एक गैर-खाली सरणी को देखते हुए, इसे यादृच्छिक रूप से फेरबदल करें। हालांकि कुछ नियम हैं:
- हर संभव क्रमचय को उसी संभावना के साथ लौटाया जाना चाहिए (ताकि फेरबदल में एक समान वितरण हो)। आप यह जांच सकते हैं कि क्या आपका एल्गोरिदम जावास्क्रिप्ट में इसे लागू करने से एकरूपता / निष्पक्ष है , क्या यह फेरबदल करेगा , जो पक्षपात के एक मैट्रिक्स का उत्पादन करेगा - परिणाम उनके अंतर्निहित इन्स -फ़िशर-येट्स या सॉर्ट (यादृच्छिक क्रम) के रूप में समान दिखना चाहिए ।
- आपको सरणी में फेरबदल करने के लिए या यादृच्छिक क्रमपरिवर्तन उत्पन्न करने के लिए किसी भी अंतर्निहित या 3-पक्षीय विधि का उपयोग नहीं करना चाहिए (या सभी क्रमपरिवर्तन की गणना करें)। विशेष रूप से, आपके द्वारा उपयोग किया जाने वाला एकमात्र अंतर्निहित यादृच्छिक फ़ंक्शन एक बार में एक ही यादृच्छिक संख्या प्राप्त कर रहा है । आप मान सकते हैं कि कोई भी निर्मित यादृच्छिक संख्या विधि O (1) में चलती है और अनुरोधित अंतराल पर पूरी तरह से समान है (गणितीय अर्थ में - आप यहां फ्लोटिंग-पॉइंट प्रतिनिधित्व के विवरण को अनदेखा कर सकते हैं)। यदि आपकी भाषा आपको एक साथ m यादृच्छिक संख्याओं की सूची प्राप्त करने देती है , तो आप इस सुविधा का उपयोग कर सकते हैं, बशर्ते कि m संख्याएँ एक दूसरे से स्वतंत्र हों, और आप इसे O (m) के रूप में गिनते हैं।
- आपका कार्यान्वयन O (N) की समय जटिलता से अधिक नहीं होना चाहिए , जहां N को फेरबदल करने के लिए सरणी का आकार है। उदाहरण के लिए, आप "यादृच्छिक संख्याओं द्वारा क्रमबद्ध" नहीं कर सकते।
- आप या तो सरणी को जगह में फेरबदल कर सकते हैं, या एक नया सरणी बना सकते हैं (जिस स्थिति में पुराना सरणी आप की तरह संशोधित किया जा सकता है)।
आप एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं और एसटीडीआईएन, कमांड-लाइन तर्क, फ़ंक्शन तर्क या प्रॉम्प्ट के माध्यम से इनपुट ले सकते हैं और रिटर्न वैल्यू के माध्यम से या एसटीडीयूएसटी (या निकटतम विकल्प) पर प्रिंट करके आउटपुट का उत्पादन कर सकते हैं। यदि आप एक ऐसा फ़ंक्शन लिखते हैं जो सरणी को जगह में बदल देता है, तो आपको इसे वापस करने की आवश्यकता नहीं है (बशर्ते आपकी भाषा आपको फ़ंक्शन के बाद संशोधित सरणी तक पहुंचने की अनुमति देती है)।
इनपुट और आउटपुट किसी भी सुविधाजनक सूची या स्ट्रिंग प्रारूप में हो सकते हैं, लेकिन -2 -2 31 x <2 31 की सीमा में मनमाने ढंग से पूर्णांकों का समर्थन करना चाहिए । सिद्धांत रूप में, आपके कोड को सरणियों के लिए 2 31 की लंबाई तक काम करना चाहिए , हालांकि यह जरूरी नहीं कि आपकी मेमोरी में फिट हो या उचित समय के भीतर पूरा हो। (मैं बस हार्डकोड छोरों या कुछ के लिए मनमाने आकार की सीमाएं नहीं देखना चाहता हूं।)
यह कोड गोल्फ है, इसलिए सबसे छोटा सबमिशन (बाइट्स में) जीतता है।
लीडरबोर्ड
निम्नलिखित स्निपेट श्रृंखला की सभी चुनौतियों के बीच एक लीडरबोर्ड उत्पन्न करेगा।
यह सुनिश्चित करने के लिए कि आपके उत्तर दिखाए गए हैं, कृपया प्रत्येक मार्कलाइन के साथ निम्नलिखित मार्कडाउन टेम्प्लेट का उपयोग करके प्रत्येक उत्तर को शुरू करें:
# 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>