ASCII 다시 매핑


36

도전

ASCII 문자를 재정렬하는 프로그램을 작성하십시오!

인쇄 가능한 모든 ASCII 문자를 포함하는 단일 문자열을 정확히 한 번만 출력해야합니다. 이 문자열의 첫 번째 문자에는 값 1이 지정되고 두 번째 문자에는 값 2가 지정됩니다.

일반적으로 두 문자가 서로 옆에 있으면 (문자 코드의 차이가 1 임) 출력에서 ​​서로 옆에 나타나지 않을 수 있습니다.

채점

점수는 프로그램의 출력에 따라 소스 코드의 모든 문자에 대한 값의 합계입니다.

점수를 계산 하려면 인증 섹션을 참조하십시오 .

최저 점수가 이깁니다!

규칙

  • "인쇄 가능한 ASCII"는 문자 코드 32-126을 포함하여 정의됩니다.

  • 당신은 전체 프로그램이나 함수를 작성할 수 있습니다.

  • 코드에는 인쇄 가능한 ASCII 문자와 줄 바꿈 만 포함될 수 있습니다.

  • 프로그램이 입력을받지 못할 수 있습니다.

  • 줄 바꿈은 항상 값 1을 갖습니다. 프로그램의 출력에는 줄 바꿈이 포함되어서는 안됩니다.

확인

이 스택 스 니펫을 사용하여 코드 출력이 유효한지 확인하고 코드 점수를 계산하십시오!


var result = document.getElementById("result");document.getElementById("submit").onclick = function() {var code = document.getElementById("code").value;var output = document.getElementById("output").value;var values = [];for (var i = 0; i < output.length; i++) {var c = output[i];var v = c.charCodeAt();if (v < 32 || v > 126) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + v + ") is out of range.";return;}if (values.indexOf(c) >= 0) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + v + ") was repeated.";return;}if (i > 0) {var d = output[i - 1];var w = d.charCodeAt();if (Math.abs(v - w) == 1) {result.innerHTML = "Invalid output! Reason: `" + d + "` and `" + c + "` (codes " + w + " and " + v + ") cannot appear next to each other in the output.";return;}}values.push(c);}for (var j = 32; j <= 126; j++) {var c = String.fromCharCode(j);if (values.indexOf(c) < 0) {result.innerHTML = "Invalid output! Reason: `" + c + "` (code " + j + ") was missing.";return;}}var score = 0;for (var k = 0; k < code.length; k++) {var s = values.indexOf(code[k]) + 1;if (s <= 0) s = 1;score += s}result.innerHTML = "Your score is " + score + "!";}
<textarea id="code" rows=10 cols=50>Enter your code here.</textarea><br/><textarea id="output" rows=1 cols=50>Enter your code's output here.</textarea><br/><button id="submit">Submit</button><br/><p id="result"></p>

리더 보드

리더 보드 코드에 대한 이 게시물 에 감사합니다 !


var QUESTION_ID=57914,OVERRIDE_USER=42844;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<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="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><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>


12
유효성 검사 스 니펫을 좋아합니다.
mınxomaτ

2
점수 계산 방법을 간단히 설명해 주시면 답변을 최적화하는 방법을 알고 있습니까?
Fatalize

@Fatalize 기본적으로 아이디어는 출력 된 문자열의 시작 부분에 값을 넣어 사용하는 문자에 낮은 값을 할당하는 프로그램을 작성하는 것입니다. 각 ASCII 문자의 "값"은 코드 출력의 1 기반 색인에 의해 결정됩니다. 코드 골프와 같이 소스의 각 문자를 1로 계산하는 대신 소스의 각 문자는 위에서 설명한대로 해당 값으로 계산됩니다.
jrich

4
이것은 프로그래밍 콘테스트에서 공백을 사용하기에 좋은 시간 인 것 같습니다 ...
C0deH4cker

3
@ C0deH4cker 불행히도 인쇄 가능한 ASCII 문자 나 줄 바꿈이 아닌 탭이 필요하므로 유효하지 않습니다.
jrich

답변:


21

CJam, 356 186 168 131 126 111 99 96 94

"_|`'~,Y/G>z`|"_~

CJam 통역사 에서 온라인으로 사용해보십시오 .

산출

"_|`'~,Y/G>z[ \$&(*.02468:<@BDFHJLNPRTVXZ^bdfhjlnprtvx!#%)+-13579;=?ACEIKMOQSUW]acegikmoqsuwy{}

생각

CJam quines에서 일반적으로 사용되는 기술의 변형을 사용하여 인쇄 가능한 ASCII 문자가 소스 코드에 나타나는지 여부와 표시되지 않는 문자를 코드 포인트의 패리티 비트에 따라 두 가지 예외를 제외하고 정렬합니다.

적절한 소스 레이아웃을 사용하여 소스 코드 문자를 빈도별로 정렬 할 수 있습니다 (한 가지 예외는 제외).

소스 코드에서 두 개의 인접한 문자가 처음으로 하나씩 나타나지 않도록 특별한주의를 기울여야합니다. 이렇게하면 답이 무효가됩니다.

암호

"             "_~  Push a string, duplicate it and evaluate the copy.
 _|                Perform the set union of the original string with itself.
                   This is just an "excuse" to introduce the underscore.
   `               Inspect the string (surrounds it with double quotes).
    '~,            Push the string of Unicode characters before the tilde.
       Y/          Divide it into pairs.
         G>        Discard the first 16 pairs (control characters).
           z       Zip. This interleaves the pairs, ordering the characters
                   by their code points' parities.
            `      Inspect the array, i.e., push its string representation.
             |     Perform set union with the string of source code characters.

CJam이 이기고 있다는 사실에 놀라지 않을 것입니다 .Pyth에는 간단한 quines 또는 ASCII 문자가 내장되어 있지 않습니다.
orlp

1
CJam에는 ASCII 문자 용 내장 기능도 없습니다. 단항 범위를 사용하고 제어 문자를 버립니다.
Dennis

14

브레인 퍽, 1692 826 765

(아직도) 최적화되지 않았습니다. 나는 그것에 대해 노력하고 있습니다 (의견에 옵트를 남겨 두십시오).

++[------>+<]>.++.---[-->+++<]>-.[->+++++++++<]>.--[----->+<]>.[-->+++<]>+.++.>+++[<---------->-]<-[-->+<]>-++.>++[>+++<-]>[<<++.>>-]<<++++.++.++.++.++.++.++++>>++++[<++++++++>-]<[<++.>-]<---.++.-->+++[>+++++<-]>-[<<--.>>-]<<---->++++[>+++++<-]>++[<<--.>>-]<<------.--.--.--.--.

산출:

+->.<[] "$&(*,02468:@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~{}ywusqomkigeca_YWUSQOMKIGECA?=;97531/)'%#!

나는 이미 8 비트 셀에서 오버플로를 어느 정도 사용하고 있지만 여전히 최적화 할 수 있다고 생각합니다. 그것은 싼 문자의 사용을 줄이지 만 :).


2
나는 매우 순진한 프로그램으로 576을 얻었습니다. 내 생각을 자유롭게 섞어보세요. +1.
Level River St

12

피스, 173 170

암호

-so%CN2rd\~p"p~\dr2NC%os-

산출

p~\dr2NC%os- "$&(*,.0468:<>@BDFHJLPRTVXZ^`bfhjlntvxz|!#')+/13579;=?AEGIKMOQSUWY[]_acegikmquwy{}

quine-like 문자열을 하드 코딩합니다. 편리하게도 "캐릭터는 생성 된 문자열의 시작 부분에 매우 가깝습니다. "quine"다음에 홀수 문자를 인쇄합니다.

3 포인트를 절약하고 코드를 palindome으로 만든 데니스에게 감사드립니다!

여기 사용해보십시오


부수적으로, 나는 Pyth r가이 모드에서 사용될 때 문자열 목록을 반환해야 한다고 생각하지 않습니다 .
FryAmTheEggman

1
\~문자 범위에 사용하면 점수가 3 점 향상됩니다. (또한 코드를 회문으로 만들 수도 있습니다.)
Dennis

@Dennis 감사합니다! ~어떻게 든 범위에 추가 할 필요없이 "퀸"부분에 쓸 수 있다는 것을 깨닫기에는 너무 오래 걸렸습니다 ... : d
FryAmTheEggman

10

자바, 3518 3189 2692

짝수 문자를 출력 한 다음 승산하는 간단한 루프. 초기 ASCII를 최적화하기 위해 몇 가지를 시도했지만 대부분 전체적으로 더 길어졌고 더 높은 점수로 끝났습니다.

void A(){for(char A=31;A!=126;System.out.print(A+=2))A=A==125?30:A;}

출력은 다음과 같습니다

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

편집 : 처음에 점수를 잘못 이해했습니다. 홀수 첫째로 뒤집기 후 다음 심지어 더 많이 그것을 기록했다.


10

옥타브, 628

암호

["" 32:2:126 33:2:125]

산출:

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

두 범위는 암시 적으로 문자열로 변환됩니다. Ans로 반환해도 괜찮은지 확실하지 않으며 암시 적 변환에 대한 경고도 표시합니다. 다른 범위 벡터를 시도했지만 더 효율적인 것을 찾을 수 없었습니다.


답을 돌려주는 것은 괜찮습니다.
jrich

8

C, 42 바이트, 점수 1539

main(i){for(;i-191;i+=2)putchar(32+i%95);}

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

C, 39 바이트, 1687 점

main(i){for(;i-96;)i=putchar(32+i%95);}

!Aa"Bb#Cc$Dd%Ee&Ff'Gg(Hh)Ii*Jj+Kk,Ll-Mm.Nn/Oo0Pp1Qq2Rr3Ss4Tt5Uu6Vv7Ww8Xx9Yy:Zz;[{<\|=]}>^~?_ @`

두 경우 모두 i명령 줄에서 문자열 수로 초기화됩니다 (인수가 주어지지 않으므로 1입니다).

첫 번째 버전은 모듈로 95를 사용하여 모든 승산 다음에 모든 짝수를 인쇄하여 2 씩 증가하는 명확한 방법을 수행합니다.

두 번째 버전은 putchar가 인쇄 된 문자를 반환한다는 사실을 이용합니다. 32는 95의 코 프라임이므로 문자를 순환 할 수 있습니다. C에 많은 소문자가 포함되어 있기 때문에 짧을뿐만 아니라 더 낮은 점수를 얻었지만 불행히도 그렇지 않습니다.


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}점수 1472, 내 생각
squeamish ossifrage

@squeamishossifrage 잘 발견, 그것은 실제로 않습니다! 저것을 찾는 데 얼마나 걸렸습니까? 나는 C에 지루 해졌고, 내 brainfuck 답변이 훨씬 좋습니다.
Level River St

이 답변 을 생성하는 데 사용한 Perl 스크립트로 주위를 돌아 다니며 :-)
squeamish ossifrage

두 경우 모두가 a아니라 변수 이름으로 점수를 낮출 수 있습니다 i.
409_ 충돌

8

비 펀지 - 93 801 797 724 699 627 612

암호:

"!  "     ^
v     _@#$<
>:,2+:"~"`|
^         <

산출:

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

원한다면 여기서 시도해 볼 수 있습니다 .

32-126 짝수를 출력 한 다음 33-125 확률을 출력하여 작동합니다. 누구든지 설명을 원한다면 기꺼이 할 것입니다.

나는 brainf ***보다 나을 때까지 골프를 쳤다. 골프 전략에 관해서는 아스키 문자를 생성 한 다음 값 비싼 문자를 더 싼 문자 (1과 2)로 바꾸려고했습니다. 그 이후 g로 너무 비싸다는 것을 알았습니다 . 매 반복마다 126을 계산하는 것이 좋습니다. 나 ^보다 싸기 때문에 상단도 감쌌 습니다 v.

801-> 797 : 최근 변경으로 인해 유물 인 여분의 공간이 제거되었습니다 g.

797-> 724 : 매번 tilde를 읽는 것으로 매번 126 계산을 변경했습니다 "~". 이것은 또한 공백을 제거 할 수있게했습니다 (그리고 나는 BF 답변 중 하나를 다시 치고 있습니다)

724-> 699 : 마지막 변경과 마찬가지로 ""는 32를 얻는 매우 저렴한 (4 포인트) 방법입니다.

699-> 627 : 두 번째 행 패스를 한 번만 수행하기 때문에 스택에 다른 값을 유지하고 값을 추가하는 대신 33을 설정으로 변경했습니다.

627-> 612 : 문자열 입력으로 최대한 이동했습니다. 더 이상 골프를 치기 위해 디자인을 크게 바꿔야 할 것입니다.

비 골프 언어 중 하나가 더 낮은 솔루션을 얻지 않는 한 이것은 아마도 최종 반복 일 것입니다.



7

브레인 퍽, 점수 576 667

그것에 대해 생각하면 576은 사실 ​​인 것 같았습니다. 나는 약간의 추정을하고 95 * 6 + 45 * 2 = 660 정도의 점수를 얻었습니다. 처음 유효성 검사기를 실행할 때 문제가 발생했을 것입니다. 정확한 점수는 내 추정치에 더 가깝습니다. 여전히 나쁜 점수는 아닙니다.

+++++++++++++++++++++++++++++++++++++++++++++.--.+++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.++.---.++.----.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.--.---.--.--.--.--.--.--.+++.--.++++.++.++.

간단하게 유지하십시오.

기본적으로 ASCII 세트를 위아래로 걸어 문자를 인쇄합니다. 프로그램에 사용 된 세 문자가 먼저 인쇄됩니다. 양쪽 끝을 돌면서 조금 까다로 웠습니다.

-+.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~{}ywusqomkigeca_][YWUSQOMKIGECA?=;97531/,*(&$" #!%')

6

루비 2.2, 1157

eval s='srand 1;([*s.bytes].shuffle|[*33..0x7e].shuffle).map{|c|putc c}'

산출:

f.p|cahu]xens7*0{)3tbmdy[}l1; r(o@&gN/MjzSVv~>D4I`L\KB92=i%PHE?5TQw,W-#6U'^Y!$R"XkO_q+CAGZF<8:J

이것은 꽤 멍청한 해결책입니다 (그리고 나는 휴대 성이 크게 감소하기 때문에 srand가 표준 허점이되어서는 안된다는 것을 확신하지 못합니다). 자체 소스 코드에서 바이트 (대부분)를 섞고 나머지를 섞은 다음 배열을 고유하게하고 연결합니다. 임의의 시드를 사용하여 출력이 합법적입니다 (한 자릿수라는 사실은 행운입니다).


1
재미있는 해결책! 나는 동일한 시드가 주어지면 항상 동일한 결과를 산출 할 것이기 때문에 이것을 합법적 인 것으로 분류 할 것이다. 또한 다양한 접근 방식이 항상 더 흥미 롭습니다.
jrich

5

CBM 기본 V2, 2553

1FORI=0TO47:PRINTCHR$(32+I*2);:NEXT
2FORI=0TO47:PRINTCHR$(33+I*2);:NEXT 

출력 (PC의 파이썬 스크립트에 의해 ASCII로 변환) :

<blank>"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

5

개크, 2782 1988 1821

END{for(rrf=rrr="rf(3)+=;1\"$?:~ptoin[<-EN% ^.|P";fr++<333;$fr=(ff=sprintf("%c",fr))~"[[(]"?f:ff);for(;r++<33+13+1;rrf=f)printf(rrf)(rrr~(rr=$(31+1+r+r))?f:rr)(rrr~(rr=$(133-(3+3+r+r)))?f:rr)}

산출

rf(3)+=;1"$?:~ptoin[<-EN% ^.|P}{&yw*u,sq02m4k68gec>a@_B]DFYHWJULSQORMTKVIXGZ\CA`bd9h7j5l/vx'z#!

용법

다음 내용을 콘솔에 복사하여 붙여 넣습니다. printf에서는 너무 엄격하여
mawk가 작동하지 않습니다.

awk 'END{for(rrf=rrr="rf(3)+=;1\"$?:~ptoin[<-EN% ^.|P";fr++<333;$fr=(ff=sprintf("%c",fr))~"[[(]"?f:ff);for(;r++<33+13+1;rrf=f)printf(rrf)(rrr~(rr=$(31+1+r+r))?f:rr)(rrr~(rr=$(133-(3+3+r+r)))?f:rr)}' < /dev/null

< /dev/null엔드 블록이 수행 될 수 있도록 단부가 입력의 종료 신호를 보낸다.

나는 기본적으로 바닥에서 나오는 캐릭터와 위쪽에서 나오는 캐릭터를 섞어 냈습니다. 그런 다음 프로그램에서 가장 많이 사용 된 문자를 분석하여 빈도 순으로 먼저 인쇄했습니다. 그런 다음 한 번 이상 문자가 인쇄되지 않도록해야했습니다. 반대 방향으로 직조하면 이미 사용 된 캐릭터가 이웃을 인쇄하지 않을 가능성이 높아졌습니다. 그러나 그들은 중간에 만났 P으므로 처음에도 그것을 인쇄해야했습니다. 그런 다음 정규 표현식에 사용되는 문자에 문제가있었습니다. 그런 다음 변수의 이름을 싸게 바꾸고 전체를 다시 수행했습니다. 그런 다음 프로그램에서 대체 할 수있는 문자를 발견하고 모든 일을 다시 끝냈습니다. 그리고 계속해서 .. 나는 마침내 테스트를 통해 선호하는 문자로 문자열을 약간 조정했습니다.

다 끝났어 :D

프로세스 중에 명령 줄에서 프로그램을 실행 한 적이 없지만 스크립트 내부에서 실행 된 문자열을 구성하여 출력이 정확한지 분석하고 점수와 결과를 얻습니다. 그 점수 결과는 많은 도움이되었습니다. 물론 나는 여기에서 다시 확인했지만 (당신은 결코 알지 못하지만) 그것은 같은 결과를 얻었습니다.

프로그램은 다음과 같습니다

p=sprintf("END{"\
"for(rrf=rrr=%c%s%c;fr++<333;$fr=(ff=sprintf(%c%cc%c,fr))~%c[[(]%c?f:ff);"\
"for(;r++<33+13+1;rrf=f)printf"\
"(rrf)(rrr~(rr=$(31+1+r+r))?f:rr)(rrr~(rr=$(133-(3+3+r+r)))?f:rr)}"\
,34,s=sprintf("rf(3)+=;1%c%c$?:~ptoin[<-EN%c ^.|P",92,34,37),34,34,37,34,34,34)

5

MATLAB, 763

물론, MATLAB에서 Octave 솔루션을 능가하는 것은 불가능 "합니다 .ASCII 범위에는 '초기' 가 없기 때문 입니다. 그러나 나는 약간의 창의력을 발휘하기로 결정하고 남용하는 것으로 보입니다 randperm. 나는 약간 해키이며 일부는 속임수라고 생각할 수 있지만, 좋은 터치라고 생각합니다. 먼저 프로그램과 출력 :

rng(1194663);['' randperm(95)+31]

출력 :

p2)[]913r~jZe:'Xf +b(Atd@LHT*7&xmN>6!?CJgwsaSh|/McO4_EkK=$5VP-%D<"Gz#Yq08n};WB`{.l\Quy^vR,IFoiU

적절한 씨앗을 계산하기 위해 씨앗 = 4648029 (즉, 요리가 끝날 때까지)까지 실행되는 다음 프로그램을 사용했습니다.

minscore=Inf;
for(seed=1:1e9)
    rng(seed)
    p=randperm(95)+31;
    if(any(abs(diff(p))==1))
        continue
    end
    codestring=sprintf('rng(%d);['''' randperm(95)+31]',seed);
    score=0;
    for(i=1:length(codestring))
        score=score + find(codestring(i)==p,1);
    end
    if(score<minscore)
        minscore=score;
        bestseed=seed;
    end
end

아마도 프로그램을 향상시키는 한 가지 방법은 부동 소수점 시드도 시도하는 것입니다. 예를 들어 2.3e4는 더 긴 시드 길이를 가지지 않고 시드 수를 증가시킵니다. 누군가가 Matlab으로 표현할 수있는 모든 n 문자 숫자를 계산하는 프로그램을 만들고 싶다고 생각한다면 ...;)


나는 이것이 훌륭한 해결책이라고 생각합니다. 그러나, [ '32 : 2 : 126 33 : 2 : 125 (따옴표와 함께) :-) 728 점에서 유효하며 짧은
요르겐

@ Jørgen 알고 있지만 다른 접근법을 시도하고 싶었습니다.). randperm긴 함수 이름이 아니라면 더 흥미로운 결과를 얻었을 것 입니다.
Sanchises

4

하스켈, 1660 1376

""!_="O"
(a:b)!(c:d)=a:c:b!d
a=[' '..'N']!['P'..]

a문자열을 반환 하는 함수 를 정의합니다 .

 P!Q"R#S$T%U&V'W(X)Y*Z+[,\-].^/_0`1a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~O

4

자바, 15470

class A{public static void main(String[]I) throws Exception{java.lang.reflect.Field C=Character.class.getDeclaredClasses()[0].getDeclaredField("cache");C.setAccessible(true);Character[]E=(Character[])C.get(C);for(char A=31,G=31;A!=126;E[G++]=new Character(A+=2))A=A==125?30:A;for(char A=31;A!=126;A++)System.out.printf("%c", A);}}

실제로 최적은 아니지만 수정 된 문자 세트를 인쇄하는 대신 실제로 문자를 다시 매핑합니다.

언 골프 드 :

public class Main {
    public static void main(String[] args) throws Exception {
        java.lang.reflect.Field feild = Character.class.getDeclaredClasses()[0].getDeclaredField("cache");
        feild.setAccessible(true);
        Character[] array = (Character[]) feild.get(args); //Since it's a static field, we can supply whatever we want here, and args is cheaper than null.

        char i = 31;
        for (char c = 31; c != 126; array[i++] = new Character(c += 2)) {
            c = c == 125 ? 30 : c;
        }

        for (char c = 31; c < 126; c++) {
            System.out.printf("%c", c);
        }
    }
}

산출

!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{} "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~

Geobits의 answer 과 동일한 방법으로 문자를 주문하고 문자 를 변경 하기 위해이 답변 과 비슷한 것을 수행 합니다 .


3

BBC 베이직, 2554

암호

n=32
s$=""
REPEAT
  s$+=CHR$(n)
  n+=2
  IFn=128THENn=33
UNTILn=127
PRINTs$

산출

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

3

포트란 90, 1523 1519 1171

이것은 다른 답변과 마찬가지로 중첩 된 출력 루프입니다. 많은 개선이 가능하다는 확신이 들지 않습니다 ...

PRINT*,((CHAR(J),J=L,126,2),L=32,33)
END

산출:

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

편집 : 이 코드에는 Fortran 90이 필요하다는 것을 잊었습니다. 77은 7 번째 열에서 코드를 시작해야합니다. 반면에 언어는 대소 문자를 구분하지 않으므로 쉽게 개선 할 수 있습니다. 루프 카운터는 J하고 L이들이기 때문에 출력 문자열의 첫 두 글자는 암시 적으로 포트란에 의해 정수로 선언했다.


3

펄, 1089 922

42 58 단계로 ASCII 값을 인쇄하면 이 방법으로 가장 낮은 점수를 얻습니다.

print chr$_*58%95+32for 0..94

산출:

 Z5oJ%_:tO*d?yT/iD~Y4nI$^9sN)c>xS.hC}X3mH#]8rM(b=wR-gB|W2lG"\7qL'a<vQ,fA{V1kF![6pK&`;uP+e@zU0jE

1
print chr$_*42%95+32for 0..94이미 925 점을 획득했으며 42가 더 이상 최적이 아닙니다.
Dennis

@Dennis에게 감사드립니다 — 그런 식으로 루프를 작성할 수있을 줄은 몰랐습니다.
squeamish ossifrage

공백을 줄 바꿈 print chr$_*63%95+32for 31..125으로 바꾸면 799 점을 얻습니다.
Dennis

3

자바 스크립트, 3169 2548 2144 2104 2071 1885 1876 1872

암호

t=''
i=S=95
while(i--)t+=String.fromCharCode(i*2291%S-
-32)
alert(t)

산출

ti^SH=2'{peZOD9.#wlaVK@5*~sh]RG<1&zodYNC8-"vk`UJ?4)}rg\QF;0%yncXMB7,!uj_TI>3(|qf[PE:/$xmbWLA6+ 

는 IS v+의 일부가 (v,i)=>v+i*3%95+32필요? 0배열이 0s 로 채워지기 때문에 매번 추가 되는 것 같습니다 .
jrich

@UndefinedFunction 그렇지 않은 것 같습니다. 어쨌든 더 짧은 대안 방법을 연구하고 있었기 때문에 최적화에 너무 집중하지 않았습니다. 감사! =)
Mwr247

for(w=95;w-->0;)거짓 for(w=95;w--;)일 수도 있고 0진실 하기 때문일 수도 있습니다 1, 2, 3....
jrich

@UndefinedFunction 와우, 나는 그것을 어떻게 생각하지 않았다! ... D 아직도하지만 2000 아래를 얻으려고 노력 : 당신은 지금 2144에 데려, 56 점 최선의 면도
Mwr247

쉬운 개선 : 세미콜론 대신 줄 바꿈을 사용하여 문장을 분리하십시오.
줄 바꿈

3

Python 2, 72 바이트 (3188) 116 바이트 (1383) (1306) (1303)

조인 트릭에 대한 @FryAmTheEggman에게 감사합니다.)

감사합니다 @nim (텍스트를 잘못 읽었습니까? : P)

감사합니다 @Mathias Ettinger

n='nr i(a)2:]o[c=fh1+t"3egj,p.7'
a=[chr(r)for r in range(32,127)if not chr(r)in n]
print n+"".join(a[::2]+a[1::2])

산출:

 nr<blank>i(a)2:]o[c=fh1+t"3egj,p.7!$&*/469<?ACEGIKMOQSUWY\_bkmsvxz|~#%'-058;>@BDFHJLNPRTVXZ^`dlquwy{}

4
a=map(chr,range(32,172))그리고"".join(a[::2]+a[1::2])
FryAmTheEggman

1
난 당신이 중 일부를 대체 할 수 있다고 생각 ;1로 계산 개행 문자로
nimi

1
n='nr i(a…대신 다음 으로 시작하여 3 점을 획득 할 수 있습니다.n=' nri(a…
409_Conflict

3

PHP, 1217 1081

코드:

for(;$T!=T;$T=($T+52)%95)echo chr(32+$T);

변수가 초기화되지 않았으므로 실행시 알림을 표시하지 않아야합니다 (PHP는 불평하지만 실행을 계속하고 컨텍스트에 적합한 기본값을 사용합니다 ( 0이 경우)).

$ php -d error_reporting=0 remapping-ascii.php

출력 :

 T)]2f;oDxM"V+_4h=qFzO$X-a6j?sH|Q&Z/c8lAuJ~S(\1e:nCwL!U*^3g<pEyN#W,`5i>rG{P%Y.b7k@tI}R'[0d9mBvK

비고 :

  • 출력은 공백 ( chr(32))으로 시작합니다 .
  • 코드는 공백을 인쇄 한 다음 각 52 번째 문자를 범위를 감싸서 인쇄합니다.
  • 매직 넘버 52는 가능한 오프셋의 전체 범위 (1..94)를 검색하여 "발견"되었습니다. 1은 인쇄 가능한 문자 목록을 ASCII 코드의 오름차순으로 생성하고, 94는 목록을 역순으로 생성합니다. 5와 19의 배수 (95의 제수)는 짧은주기를 생성하고 전체 범위의 값을 포함하지 않습니다 (또한 나쁨).
  • 52마술처럼 보인다; 이 코드에 가장 적합한 오프셋입니다. 그러나 코드의 일부 변형 (약간의 더 큰 점수를 생성)에 가장 적합합니다. 내가 시도의 변화 : 사용 while()하는 대신 for()사용 $f++, $f--또는 --$f대신이 ++$f의 주위에 피연산자 교환 <+연산자; 의 수정 쥐어 짜기 $T로를 32+$T;
  • 변수 이름 ( $T$f)은 출력의 첫 글자입니다.
  • 나는 초기화하는 시도 $T와 함께 4또는 11그러나 점수는 악화했다; 시작으로 4만든다 $출력의 첫 번째 문자; PHP 소스 코드에서 가장 많이 사용되는 문자입니다. 앞에 11온다 +; $그리고 +이 코드에서 가장 많이 사용되는 문자입니다.

이 솔루션에 도달 할 때까지 시도한 코드, 테스트, 증분 변경 사항 및 가능한 모든 단계 값 ( 52최상의 단계로 신뢰할 수있는 공급자)을 테스트 한 스크립트는 github 에서 찾을 수 있습니다 .


2

푸리에, 1236

기본적으로 BBCB 프로그램의 변환

32~N127(Na^^~N{128}{33~N}N)

산출

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}

0

AWK , 49 바이트, 점수 : 1755

BEGIN{for(f=82;++f<178;)printf"%c",(2*f-1)%95+32}

온라인으로 사용해보십시오!

다른 모든 문자를 인쇄 한 다음 공백을 채우는 것부터 시작하십시오. 인쇄 된 첫 문자는 f입니다. 역순으로 인쇄를 시도했지만 점수가 크게 증가했습니다. 승수와 루프 기준을 간단히 변경하여 다른 패턴도 가능합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.