이 과제는 전통적인 코드 골프 와 거의 비슷하게 작동합니다 . 유일한 차이점은 문자 또는 바이트 수로 답변의 점수를 매기는 대신 사용자가 주석에서 다른 문자에 가중치 를 할당 하고 누적 가중치가 가장 낮은 프로그램이 승리한다는 것입니다.
도전
당신의 임무는 첫 번째 문자가 중앙에서 시작하고 후속 문자가 마지막에 놓인 문자 세트와 직교하는 빈 공간을 차지하는 문자열을 가져 와서 다이아몬드 모양을 인쇄하는 프로그램을 작성하는 것입니다. 공백 ( )이 패딩에 사용됩니다.
예를 들어 입력 CAT
하면
T
TAT
TACAT
TAT
T
그리고 ()
생산할 것이다
)
)()
)
그리고 desserts
생산할 것이다
s
sts
strts
strerts
streserts
stressserts
stressesserts
stressedesserts
stressed desserts
stressedesserts
stressesserts
stressserts
streserts
strerts
strts
sts
s
및 9
생산 것이다 9
.
세부
코드에는 인쇄 가능한 ASCII 및 줄 바꿈 만 포함될 수 있습니다 . (아래 이유를 참조하십시오.)
입력 / 출력은 stdin / stdout을 통해 이루어 지거나 가능하지 않은 경우 비슷한 대안을 사용해야합니다.
입력 문자열에 인쇄 가능한 ASCII (공백 포함) 만 포함되어 있다고 가정 할 수 있습니다.
다이아몬드 패턴의 일부를 포함하지 않는 선행 공간의 열은 출력에 허용 되지 않습니다. 후행 공백의 양과 조합이 허용됩니다.
출력에 후행 줄 바꿈이 선택적으로있을 수 있습니다.
원하는만큼 답을 편집 할 수 있습니다.
채점
모든 코드는 개행과 95 개의 인쇄 가능한 ASCII 문자 만 사용하여 작성해야합니다.
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Stack Exchange는 탭을 코드 블록의 공백으로 렌더링하므로 탭이 허용되지 않습니다.
이 96 자 각각에는 가중치 값이 있습니다. 기본적으로 모든 가중치는 97입니다.
프로그램의 점수는 각 문자의 가중치 값의 합계입니다. 예를 들어, 프로그램이 print(4)
있고 가중치 4
가 70이지만 다른 모든 것에는 변경되지 않은 경우 점수는입니다 749 = 97+97+97+97+97+97+70+97
.
이 질문의 활동이 거의 아무것도 해결되지 않으면, 가장 낮은 점수 제출이 이깁니다. 아마 동점 일 가능성이없는 경우, 승리는 가장 높은 투표 응답으로갑니다.
무게 변경
응답 여부에 관계없이 모든 사용자는 96 자 중 하나의 가중치를 1에서 96 사이의 고유 한 값으로 변경할 수 있습니다. 이렇게하려면이 질문에 주석을 추가하십시오. #### W -> C ####
여기서 W는 정수입니다. 1에서 96까지, C는 문자 (따옴표 자체, 역 따옴표 없음)입니다. 스택 교환은 3 개의 공백을 연속으로 압축하므로 줄 \n
바꿈과 \s
공백 에 C 대신 사용하십시오 . print(4)
위 의 예는 주석을 가지고 있었을 것 #### 70 -> 4 ####
입니다.
각 사용자는 이와 같이 하나의 주석 만 작성할 수 있으며, 이전에 작성된 주석에 문자와 가중치가 모두 사용되지 않은 경우에만 유효합니다. 따라서 결국 #### W -> C ####
다른 사용자에 의해 다른 문자에 할당 된 서로 다른 가중치를 가진 96 개의 주석 이있을 수 있습니다 .
사용자는 원하는 경우 자신의 댓글을 삭제하여 자신이나 다른 사람이 다시 댓글을 달 때까지 캐릭터의 무게를 97로 다시 설정할 수 있습니다. 또한 편집 할 수도 있습니다. 개별 사용자 / 무게 / 캐릭터에 관한 규칙을 따르지 않는 의견은 삭제되거나 "비 건설적"으로 표시되어야합니다. 규칙 및 기타 사항에 대한 일반적인 의견은 훌륭하지만 최소한으로 유지해야합니다.
이 스택 스 니펫은이 질문의 공식 리더 보드입니다. 주석이 실행될 때마다 주석에서 가중치를 수집하여 모든 제출에 대한 점수를 자동으로 계산합니다. 동점을 처리하지 않습니다. 또한 프로그램의 점수를 확인하는 데 사용할 수도 있습니다.
아마도 right-click -> Open link in new tab
링크 가 필요할 것입니다 .
function compute(){var e=computeScore($("#code").val());$("#score").val(e==-1?"Invalid characters":e)}function computeScore(e){var t=0;for(var n=0;n<e.length;n++){if(weights.hasOwnProperty(e[n])){t+=weights[e[n]]}else{return-1}}return t}function htmlDecode(e){var t=document.createElement("div");t.innerHTML=e;return t.childNodes.length===0?"":t.childNodes[0].nodeValue}function addLeaderboard(){validAnswers.sort(function(e,t){return e.score>t.score});var e=1;var t="";for(var n=0;n<validAnswers.length;n++){var r=validAnswers[n];t+="<tr><td>"+e+"</td><td><a href='"+r.link+"'>"+r.owner.display_name+"</a></td><td>"+r.score+"</td><td>"+r.length+"</td></tr>";if(n+1<validAnswers.length&&validAnswers[n+1].score>r.score){e++}}$("#leaderboard").append(t)}function addAnalytics(){var e="";for(var t in weights){if(weights.hasOwnProperty(t)&&weights[t]!=defaultWeight){e+=(t=="\n"?"\\n":t)+"="+weights[t]+" "}}$("#weights").val(e);var n="";for(var t in usedChars){if(usedChars.hasOwnProperty(t)&&usedChars[t]==false){n+=t=="\n"?"\\n":t}}$("#unusedc").val(n);var r="";for(var t in usedWeights){if(usedWeights.hasOwnProperty(t)&&usedWeights[t]==false){r+=t+" "}}$("#unusedw").val(r);var i="";if(invalidComments.length>0){for(var s=0;s<invalidComments.length;s++){var o=invalidComments[s];i+="<a href='#"+o.link+"'>"+o.owner.display_name+"</a> "}}else{i="none"}$("#comments").html(i);var u="";if(invalidAnswers.length>0){for(var s=0;s<invalidAnswers.length;s++){var a=invalidAnswers[s];u+="<a href='#"+a.link+"'>"+a.owner.display_name+"</a> "}}else{u="none"}$("#answers").html(u)}function checkAnswers(e){for(var t=0;t<e.items.length;t++){var n=e.items[t];var r=answerPattern.exec(n.body);if(r){var i=htmlDecode(r[1]);var s=computeScore(i);if(s==-1){invalidAnswers.push(n)}else{n.length=i.length;n.score=s;validAnswers.push(n)}}else{invalidAnswers.push(n)}}addLeaderboard();addAnalytics()}function checkComments(e){for(var t=0;t<e.items.length;t++){var n=e.items[t];var r=commentPattern.exec(htmlDecode(n.body));if(r){var i=n.owner.user_id;var s=parseInt(r[1]);var o=r[2]=="\\n"?"\n":r[2]=="\\s"?" ":r[2];if(userIDs.hasOwnProperty(i)||!usedWeights.hasOwnProperty(s)||usedWeights[s]||!usedChars.hasOwnProperty(o)||usedChars[o]){invalidComments.push(n)}else{userIDs[i]=true;usedWeights[s]=true;usedChars[o]=true;weights[o]=s}}}$.get(answersURL,checkAnswers)}function refresh(){$.get(commentsURL,checkComments)}questionID=45040;commentsURL="https://api.stackexchange.com/2.2/questions/"+questionID+"/comments?order=asc&sort=creation&site=codegolf&filter=!t)IWLXOkOvAuPe8m2xJrXOknWcw(ZqZ";answersURL="https://api.stackexchange.com/2.2/questions/"+questionID+"/answers?order=desc&sort=activity&site=codegolf&filter=!.FjsvG2LuND(frE*)WTvqQev1.lyu";commentPattern=/^#### (\d+) -> (\\(?:n|s)|[ -~]) ####$/;answerPattern=/<pre><code>((?:\n|.)*?)\n<\/code><\/pre>/;chars="\n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";validAnswers=[];invalidAnswers=[];invalidComments=[];userIDs={};usedWeights={};usedChars={};weights={};defaultWeight=chars.length+1;for(var i=0;i<chars.length;i++){usedChars[chars[i]]=false;usedWeights[i+1]=false;weights[chars[i]]=defaultWeight}refresh()
*{font-family:Helvetica,Arial,sans-serif}table{border:3px solid green;border-collapse:collapse}button{font-size:100%}th{background-color:green;color:#fff;padding:6pt}td{border:1px solid green;padding:6pt}.large{font-size:140%}.title{font-weight:700;margin:6pt 0}textarea{font-family:"Courier New";white-space:nowrap;overflow:auto}input[readonly]{background-color:#dcdcdc}.analytics{font-size:90%;padding:4pt 0 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div class='large title'>Leaderboard</div><table id='leaderboard'> <tr> <th>Place</th> <th>Submitter</th> <th>Score</th> <th>Program Length</th> </tr></table><br><div class='title'>Compute Score</div><textarea id='code' rows='5' cols='40' placeholder='paste code here...'></textarea><br><button type='button' onclick='compute()'>Compute</button> Score: <input type='text' id='score' readonly><br><br><div class='title'>Analytics</div><div class='analytics'>Assigned weights: <input type='text' id='weights' readonly></div><div class='analytics'>Unused characters: <input type='text' id='unusedc' readonly> (all weight 97)</div><div class='analytics'>Unused weights: <input type='text' id='unusedw' readonly></div><div class='analytics'>Invalid comments (duplicate user/char/weight): <span id='comments'></span></div><div class='analytics'>Invalid answers (illegal characters or no code block): <span id='answers'><span></div><br><button type='button' onclick='refresh'>Refresh</button>
이 리더 보드가 작동하려면 주석이 위에서 설명한 정확한 형식이어야하며 프로그램 코드가 답의 첫 번째 다중 라인 코드 블록 ( <pre><code>...</code></pre>
하나)에 있어야 합니다. 구문 강조를 사용하지 마십시오. 그렇지 않으면 코드를 올바르게 읽을 수 없습니다. 스 니펫은 업데이트되기까지 1-2 분 정도 걸릴 수 있습니다.
나는 스 니펫을 철저히 테스트하지는 않았지만이 콘테스트가 진행되는 동안 계속 지켜 볼 것입니다. 당신이 어떤 버그를 발견하면 알려주십시오. 축소되지 않은 버전은 다음과 같습니다.
이 스코어링 시스템은 완전히 새롭고 실험적이라는 점을 명심하십시오. 다행스럽게도 Stack Exchange는 많은 의견이 필요하다는 것을 신경 쓰지 않습니다. :피
관련 도전 : 이 다이아몬드 인쇄