Seriler Hakkında
Rasgeleğin teması etrafında dönen bir dizi kod-golf mücadelesi yapacağım. Bu, temel olarak 9 Delikli Golf Sahası olacak , ancak birkaç soruya dağıttı. Herhangi bir mücadeleye, normal bir soru olmuş gibi bireysel olarak katılabilirsiniz.
Bununla birlikte, tüm zorluklarda lider tablosu koruyacağım. Dizi, birkaç günde bir yayınlanan 9'un üzerinde mücadele verecek (şimdilik). 9 yarışmaya katılan her kullanıcı , tüm seriyi kazanmaya hak kazanıyor. Genel puanları, her meydan okuma için en kısa gönderimlerinin toplamıdır (bu nedenle, iki kez bir mücadeleye cevap verirseniz, sadece puan için daha iyi bir cevap sayılır). Birisi bu genel liderlik tablosunda 28 gün boyunca en üst sırada yer alırsa onlara 500 temsilcilik ödül vereceğim .
Dizi için sıraya giren bir sürü fikrim olmasına rağmen, gelecekteki zorluklar henüz kesin olarak belirlenmedi. Herhangi bir öneriniz varsa, lütfen bana bildirin ilgili sanal alan gönderisini .
Delik 1: Bir Diziyi Karıştır
İlk görev oldukça basittir: boş olmayan bir tamsayı dizisi verildiğinde, rasgele karıştırın. Yine de birkaç kural var:
- Her olası permütasyon aynı olasılıkta döndürülmelidir (bu nedenle, karışık dağılım düzgün bir dağılıma sahip olmalıdır). Algoritmanızın düzgün / tarafsız olup olmadığını, önyargı matrisini üretecek olan Shuffle Will Will Shuffle'daki JavaScript'te uygulayarak kontrol edebilirsiniz - sonuç, yerleşik Fisher-Yates veya sıralama (rastgele sıra) kadar düzgün görünmelidir .
- Diziyi karıştırmak veya rastgele bir permütasyon oluşturmak için (veya tüm permütasyonları numaralandırmak) herhangi bir yerleşik veya 3. taraf yöntemini kullanmamalısınız. Özellikle, kullanabileceğiniz tek dahili rastgele işlev bir kerede tek bir rasgele sayı elde etmektir . Sen olabilecek herhangi O (1) 'de rasgele sayı yöntemi çalışır dahili ve istenen aralık boyunca tek düze bir olduğunu varsayalım (matematiksel anlamda - Burada kayan nokta gösterimi ayrıntılarını göz ardı edebilirler). Diliniz bir kerede m rastgele sayılar listesi elde etmenize izin veriyorsa , bu özelliği kullanabilirsiniz. m sayısının birbirinden bağımsız olması ve O (m) olarak sayınız.
- Sizin uygulaması aşmamalıdır O (N) zaman karmaşıklığı , N karıştırılacak dizinin büyüklüğüdür. Örneğin, "rasgele sayılarla sıralayabilirsiniz".
- Diziyi yerinde dağıtabilirsiniz veya yeni bir dizi oluşturabilirsiniz (bu durumda eski dizi istediğiniz gibi değiştirilebilir).
Tam bir program veya bir işlev yazabilir ve STDIN, komut satırı argümanı, işlev argümanı veya komut istemi üzerinden girdi alabilir ve geri dönüş değeri üzerinden veya STDOUT'a (veya en yakın alternatife) yazdırarak çıktı üretebilirsiniz. Diziyi yerinde kaydıran bir işlev yazarsanız, onu elbette döndürmeniz gerekmez (işlev döndükten sonra dilinizin değiştirilmiş diziye erişmenize izin vermesi şartıyla).
Giriş ve çıkış, herhangi bir uygun liste veya dize biçiminde olabilir, ancak -2 31 ≤ x <2 31 aralığında rasgele tamsayıları desteklemesi gerekir . Prensip olarak, kodunuz 2 31'e kadar olan diziler için çalışmalıdır , bunun için mutlaka belleğinize sığması veya makul bir süre içinde tamamlaması gerekmez. (Sabit kod döngülerine veya başka şeylere rasgele boyut sınırları görmek istemiyorum.)
Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.
Liderler Sıralaması
Aşağıdaki kod parçası, dizinin tüm zorluklarına karşı bir liderlik tablosu oluşturacaktır.
Yanıtlarınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak her bir başlığa başlıkla başlayın:
# Language Name, N bytes
Gönderinizin N
büyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Dil şu anda gösterilmiyor, ancak snippet bunu gerektiriyor ve ayrıştırıyor ve gelecekte bir dilin lider tahtası ekleyebilirim.)
/* 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>