Informazioni sulla serie
Farò una piccola serie di sfide di code-golf che ruotano attorno al tema della casualità. Questo sarà fondamentalmente un campo da golf a 9 buche , ma si sviluppa su diverse domande. Puoi partecipare a qualsiasi sfida individualmente come se fosse una domanda normale.
Tuttavia, manterrò una classifica per tutte le sfide. La serie supererà 9 sfide (per ora), una pubblicata ogni pochi giorni. Ogni utente che partecipa a tutte e 9 le sfide è idoneo a vincere l'intera serie. Il loro punteggio complessivo è la somma dei loro contributi più brevi per ogni sfida (quindi se si risponde a una sfida due volte, viene conteggiata solo la risposta migliore per il punteggio). Se qualcuno deterrà il primo posto in questa classifica generale per 28 giorni , assegnerò loro un premio di 500 rappresentanti .
Anche se ho un sacco di idee in programma per la serie, le sfide future non sono ancora state messe sulla pietra. Se hai qualche suggerimento, per favore fatemelo sapere sul post sandbox pertinente .
Hole 1: Shuffle an Array
Il primo compito è piuttosto semplice: dato un array di numeri interi non vuoto, mescolarlo in modo casuale. Ci sono alcune regole però:
- Ogni possibile permutazione deve essere restituita con la stessa probabilità (quindi lo shuffle dovrebbe avere una distribuzione uniforme). Puoi verificare se il tuo algoritmo è uniforme / imparziale implementandolo in JavaScript su Will It Shuffle , che produrrà una matrice dei pregiudizi - il risultato dovrebbe apparire uniforme come i loro Fisher-Yates o l' ordinamento (ordine casuale) .
- Non è necessario utilizzare alcun metodo incorporato o di terze parti per mescolare l'array o generare una permutazione casuale (o enumerare tutte le permutazioni). In particolare, l'unica funzione casuale incorporata che è possibile utilizzare è ottenere un singolo numero casuale alla volta . Si può supporre che qualsiasi built-in casuali piste metodo numero in O (1) ed è perfettamente uniforme sull'intervallo richiesto (in senso matematico - puoi ignorare i dettagli della rappresentazione in virgola mobile qui). Se la tua lingua ti consente di ottenere un elenco di m numeri casuali contemporaneamente, puoi utilizzare questa funzione, a condizione che i numeri m siano indipendenti l'uno dall'altro e lo conti come O (m).
- L'implementazione non deve superare una complessità temporale di O (N) , in cui N è la dimensione dell'array da mescolare. Ad esempio, non è possibile "ordinare per numeri casuali".
- Puoi mescolare l'array in posizione oppure creare un nuovo array (nel qual caso il vecchio array può essere modificato come preferisci).
È possibile scrivere un programma completo o una funzione e accettare input tramite STDIN, argomento della riga di comando, argomento della funzione o prompt e produrre output tramite il valore restituito o stampando su STDOUT (o l'alternativa più vicina). Se si scrive una funzione che mescola l'array in posizione, non è necessario restituirlo naturalmente (a condizione che la propria lingua consenta di accedere all'array modificato dopo il ritorno della funzione).
L'input e l'output possono essere in qualsiasi elenco o formato stringa conveniente, ma devono supportare numeri interi arbitrari nell'intervallo -2 31 ≤ x <2 31 . In linea di principio, il codice dovrebbe funzionare per array fino alla lunghezza 2 31 , sebbene ciò non debba necessariamente adattarsi alla memoria o completarsi entro un ragionevole lasso di tempo. (Non voglio vedere limiti di dimensione arbitraria per loop hardcode o qualcosa del genere.)
Questo è il golf del codice, quindi vince l'invio più breve (in byte).
Classifica
Il frammento seguente genererà una classifica in tutte le sfide della serie.
Per assicurarti che le tue risposte vengano visualizzate, inizia ogni risposta con un titolo, utilizzando il seguente modello Markdown:
# Language Name, N bytes
dov'è N
la dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(La lingua non è attualmente mostrata, ma lo snippet richiede e analizza, e potrei aggiungere una classifica per lingua in futuro.)
/* 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>