O serii
Będę prowadził serię golfowych wyzwań związanych z przypadkowością. Będzie to w zasadzie 9-dołkowe pole golfowe , ale rozłożone na kilka pytań. Możesz brać udział w każdym wyzwaniu indywidualnie, jakby to było normalne pytanie.
Będę jednak utrzymywać tabelę wyników we wszystkich wyzwaniach. Serial obejmie 9 wyzwań (na razie), jedno publikowane co kilka dni. Każdy użytkownik, który bierze udział we wszystkich 9 wyzwaniach, może wygrać całą serię. Ich ogólny wynik to suma ich najkrótszych zgłoszeń na każde wyzwanie (więc jeśli odpowiesz dwukrotnie na wyzwanie, tylko lepsza odpowiedź jest liczona do wyniku). Jeśli ktokolwiek będzie zajmował najwyższe miejsce w ogólnej tabeli liderów przez 28 dni , przyznam mu nagrodę w wysokości 500 powtórzeń .
Chociaż mam szereg pomysłów w szeregu, przyszłe wyzwania nie są jeszcze ustalone. Jeśli masz jakieś sugestie, daj mi znać w odpowiednim poście z piaskownicą .
Hole 1: Shuffle an Array
Pierwsze zadanie jest dość proste: biorąc pod uwagę niepustą tablicę liczb całkowitych, losowo ją potasuj. Istnieje jednak kilka zasad:
- Każda możliwa permutacja musi zostać zwrócona z takim samym prawdopodobieństwem (dlatego losowanie powinno mieć jednolity rozkład). Możesz sprawdzić, czy twój algorytm jest jednorodny / bezstronny, implementując go w JavaScript w Will it Shuffle , co wytworzy matrycę tendencyjności - wynik powinien wyglądać tak jednolicie, jak wbudowane Fisher-Yates lub sortować (kolejność losowa) .
- Nie wolno używać żadnej wbudowanej lub innej firmy metody tasowania tablicy lub generowania losowej permutacji (lub wyliczenia wszystkich permutacji). W szczególności jedyną wbudowaną funkcją losową, której możesz użyć, jest uzyskanie pojedynczej liczby losowej na raz . Państwo może założyć, że każdy wbudowaną losowych przebiegów metoda numer w czasie O (1) i jest idealnie równomierne na wymaganym przedziale (w sensie matematycznym - można zignorować szczegóły reprezentacji zmiennoprzecinkowej tutaj). Jeśli twój język pozwala ci uzyskać listę m liczb losowych naraz, możesz skorzystać z tej funkcji, pod warunkiem, że m liczb jest od siebie niezależnych i policzysz je jako O (m).
- Implementacja nie może przekraczać złożoności czasowej O (N) , gdzie N jest rozmiarem tablicy, która ma być tasowana. Na przykład nie można „sortować według liczb losowych”.
- Możesz albo przetasować tablicę na miejscu, albo utworzyć nową tablicę (w takim przypadku stara tablica może zostać zmodyfikowana w dowolny sposób).
Możesz napisać pełny program lub funkcję i pobrać dane wejściowe za pomocą STDIN, argumentu wiersza poleceń, argumentu funkcji lub pytania i wygenerować dane wyjściowe za pomocą wartości zwracanej lub drukując do STDOUT (lub najbliższej alternatywy). Jeśli napiszesz funkcję, która przetasowuje tablicę w miejscu, nie musisz jej oczywiście zwracać (pod warunkiem, że Twój język pozwala na dostęp do zmodyfikowanej tablicy po powrocie funkcji).
Dane wejściowe i wyjściowe mogą być w dowolnym dogodnym formacie listy lub ciągu, ale muszą obsługiwać dowolne liczby całkowite z zakresu -2 31 ≤ x <2 31 . W zasadzie, Twój kod powinien działać dla tablic do długości 2 do 31 , choć niekoniecznie muszą zmieścić się w pamięci lub kompletne w rozsądnym czasie. (Po prostu nie chcę widzieć dowolnych limitów wielkości pętli kodu twardego itp.)
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach).
Tabela liderów
Poniższy fragment wygeneruje tabelę wyników we wszystkich wyzwaniach serii.
Aby mieć pewność, że Twoje odpowiedzi się pojawią, zacznij każdą odpowiedź od nagłówka, używając następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Język nie jest obecnie wyświetlany, ale fragment go wymaga i analizuje, a w przyszłości mogę dodać tabelę wyników według języków).
/* 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>