সিরিজ সম্পর্কে
আমি এলোমেলোতার থিমের চারদিকে ঘোরে কোড-গল্ফ চ্যালেঞ্জগুলির একটি সামান্য সিরিজ চালিয়ে যাব। এটি মূলত একটি 9-হোল গল্ফ কোর্স হবে , তবে বিভিন্ন প্রশ্নের মধ্যে ছড়িয়ে পড়ে। আপনি স্বতন্ত্রভাবে যে কোনও চ্যালেঞ্জে অংশ নিতে পারেন যেন এটি একটি সাধারণ প্রশ্ন।
যাইহোক, আমি সমস্ত চ্যালেঞ্জ জুড়ে একটি লিডারবোর্ড বজায় রাখব। সিরিজটি 9 টি চ্যালেঞ্জের (এখনকার জন্য) চলবে, প্রতি কয়েকদিন পর পর একটি পোস্ট করা হয়। সমস্ত 9 টি চ্যালেঞ্জে অংশ নেওয়া প্রত্যেক ব্যবহারকারী পুরো সিরিজ জয়ের জন্য যোগ্য। তাদের সামগ্রিক স্কোর হ'ল প্রতিটি চ্যালেঞ্জের তাদের সংক্ষিপ্ততম জমাগুলির সমষ্টি (সুতরাং আপনি যদি চ্যালেঞ্জের উত্তর দুটিবার দেন তবে কেবলমাত্র উত্তরের উত্তরটি স্কোরের দিকে গণনা করা হয়)। 28 দিনের জন্য যদি কেউ এই সামগ্রিক লিডারবোর্ডে শীর্ষ স্থান ধরে রাখে আমি তাদের 500 টাকার সম্মাননা প্রদান করব ।
যদিও এই সিরিজের জন্য আমার কাছে অনেকগুলি ধারণাগুলি রয়েছে, ভবিষ্যতের চ্যালেঞ্জগুলি এখনও প্রস্তর হিসাবে স্থাপন করা হয়নি। যদি আপনার কোন পরামর্শ থাকে, তাহলে আমাকে দয়া করে প্রাসঙ্গিক স্যান্ডবক্স পোস্টে ।
ছিদ্র 1: একটি অ্যারে পরিবর্তন করুন
প্রথম কাজটি বেশ সহজ: খালি খালি পূর্ণসংখ্যার পূর্ণ বিন্যাসের পরে এলোমেলোভাবে এলোমেলো করুন। কয়েকটি নিয়ম রয়েছে যদিও:
- প্রতিটি সম্ভাব্য পারমিটেশনটি একই সম্ভাবনার সাথে ফেরত দিতে হবে (সুতরাং এলোমেলোভাবে একটি সমান বিতরণ হওয়া উচিত)। আপনার অ্যালগরিদমটি জাভা স্ক্রিপ্টে উইল ইট শফলে প্রয়োগ করে এটি অভিন্ন / নিরপেক্ষ কিনা তা যাচাই করতে পারেন , যা বায়াসগুলির একটি ম্যাট্রিক্স তৈরি করবে - ফলাফলটি তাদের বিল্ট-ইনগুলির মতো সমান দেখানো উচিত ফিশার-ইয়েটস বা সাজানোর (এলোমেলো ক্রম) এর ।
- অ্যারে বদলানোর জন্য বা এলোমেলো ক্রমান্বয়ে উত্পন্ন করতে (বা সমস্ত ক্রমশক্তি গণনা করতে) আপনার অবশ্যই কোনও অন্তর্নির্মিত বা তৃতীয় পক্ষের পদ্ধতি ব্যবহার করবেন না। বিশেষত, আপনি যে বিল্ট-ইন র্যান্ডম ফাংশনটি ব্যবহার করতে পারেন তা হ'ল একসাথে একক র্যান্ডম নম্বর । আপনি পারে অনুমান যে কোনো হে (1) বিল্ট-ইন র্যান্ডম সংখ্যা পদ্ধতি রানে অনুরোধ ব্যবধান ধরে পুরোপুরি অভিন্ন আছে (একটি গাণিতিক অর্থে - আপনি এখানে ফ্লোটিং পয়েন্ট উপস্থাপনা বিবরণ উপেক্ষা পারে)। যদি আপনার ভাষা আপনাকে মিঃ এলোমেলো সংখ্যার তালিকা একবারে পেতে দেয় তবে আপনি এই সুবিধাটি ব্যবহার করতে পারেন, তবে এম সংখ্যাগুলি একে অপরের চেয়ে স্বতন্ত্র থাকে এবং আপনি এটি (ও) হিসাবে গণনা করেন।
- আপনার বাস্তবায়ন অবশ্যই ও (এন) এর সময় জটিলতার চেয়ে বেশি হবে না যেখানে এন পরিবর্তন হওয়ার মতো অ্যারের আকার। উদাহরণস্বরূপ, আপনি "এলোমেলো সংখ্যা অনুসারে বাছাই" করতে পারবেন না।
- আপনি হয় জায়গায় অ্যারে পরিবর্তন করতে পারেন, বা একটি নতুন অ্যারে তৈরি করতে পারেন (সেক্ষেত্রে আপনার পছন্দ মতো পুরানো অ্যারে সংশোধন করা যেতে পারে)।
আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং এসটিডিআইএন, কমান্ড-লাইন আর্গুমেন্ট, ফাংশন আর্গুমেন্ট বা প্রম্পটের মাধ্যমে ইনপুট নিতে পারেন এবং রিটার্ন ভ্যালুতে বা এসটিডিআউট (বা নিকটতম বিকল্প) এ মুদ্রণ করে আউটপুট উত্পাদন করতে পারেন। আপনি যদি এমন কোনও ফাংশন লিখেন যা অ্যারেটি স্থান পরিবর্তন করে, আপনার অবশ্যই এটি ফেরত দেওয়ার দরকার নেই (আপনার ভাষা আপনাকে ফাংশন ফেরার পরে পরিবর্তিত অ্যারে অ্যাক্সেস করতে দেয়) তবে।
ইনপুট এবং আউটপুট যে কোনও সুবিধাজনক তালিকা বা স্ট্রিং ফর্ম্যাটে হতে পারে, তবে অবশ্যই -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>