시리즈 정보
나는 무작위성이라는 주제를 중심으로 일련의 코드 골프 과제를 진행할 것입니다. 기본적으로 9 홀 골프 코스 가되지만 몇 가지 질문이 있습니다. 일반적인 질문 인 것처럼 도전에 개별적으로 참여할 수 있습니다.
그러나 모든 과제에서 리더 보드를 유지합니다. 이 시리즈는 며칠에 한 번 게시 된 9 가지 이상의 과제를 진행할 예정입니다 (현재). 9 가지 도전 과제 에 모두 참여한 모든 사용자 는 전체 시리즈에서 우승 할 수 있습니다. 전체 점수는 각 챌린지에 대한 최단 제출의 합계입니다 (따라서 챌린지에 두 번 답변하면 더 나은 답변 만 점수에 포함됩니다). 누군가이 28 일 동안 이 전체 순위표에서 1 위를 차지하면 500 명의 보상금을 받게됩니다 .
시리즈에 대한 아이디어가 많이 있지만 미래의 과제는 아직 해결되지 않았습니다. 제안 사항이 있으면 관련 샌드 박스 게시물에 알려주십시오 .
1 번 홀 : 배열 섞기
첫 번째 작업은 매우 간단합니다. 비어 있지 않은 정수 배열이 있으면 무작위로 섞습니다. 그래도 몇 가지 규칙이 있습니다.
- 가능한 모든 순열은 같은 확률로 반환되어야합니다 (따라서 셔플은 균일 한 분포를 가져야합니다). 편견 의 행렬을 생성하는 Will it Shuffle 에서 JavaScript로 알고리즘을 구현하여 알고리즘이 균일 / 비 편향인지 확인할 수 있습니다 . 결과는 바이어스의 매트릭스를 생성합니다. 결과는 내장 된 Fisher-Yates 또는 정렬 (임의 순서) 처럼 균일해야합니다 .
- 내장 또는 타사 방법을 사용하여 배열을 섞거나 임의 순열을 생성하거나 모든 순열을 열거해서는 안됩니다. 특히, 사용할 수 있는 유일한 내장 임의 함수는 한 번에 하나의 난수를 얻는 것 입니다. 내장 난수 방법이 O (1)에서 실행되고 요청 된 간격 동안 완벽하게 균일하다고 가정 할 수 있습니다 (수학적 의미에서 부동 소수점 표현의 세부 사항은 여기에서 무시할 수 있음). 귀하의 언어로 m 개의 난수 목록을 한 번에 얻을 수있는 경우, m 수가 서로 독립적이며 O (m)으로 계산하면 이 기능을 사용할 수 있습니다 .
- 구현은 시간 복잡도 O (N)을 초과해서는 안됩니다 . 여기서 N 은 셔플 할 배열의 크기입니다. 예를 들어 "임의의 숫자로 정렬"할 수 없습니다.
- 배열을 순서대로 섞거나 새 배열을 만들 수 있습니다 (이 경우 이전 배열은 원하는대로 수정할 수 있음).
전체 프로그램 또는 함수를 작성하고 STDIN, 명령 행 인수, 함수 인수 또는 프롬프트를 통해 입력을 받고 리턴 값을 통해 또는 STDOUT (또는 가장 가까운 대안)으로 인쇄하여 출력을 생성 할 수 있습니다. 배열을 셔플하는 함수를 작성하는 경우 물론 반환 할 필요가 없습니다 (제공된 언어는 함수가 반환 된 후 수정 된 배열에 액세스 할 수있는 경우).
입력 및 출력은 편리한 목록 또는 문자열 형식 일 수 있지만 -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>