重新映射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基本上,这个想法是编写一个程序,该程序的输出将低值分配给它使用的字符,方法是将它们放在输出字符串的开头。每个ASCII字符的“值”由代码输出中基于1的索引确定。如上所述,与其将源代码中的每个字符都计数为1(而不是像代码高尔夫),而是将源代码中的每个字符都计为其值。
jrich 2015年

4
这似乎是在编程竞赛中使用空白的好时机...
C0deH4cker 2015年

3
@ C0deH4cker不幸的是,这将需要制表符,这些制表符不是可打印的ASCII字符或换行符,因此将无效。
jrich

Answers:


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字符是否出现在源代码中以及不出现的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 2015年

1
CJam也没有内置的ASCII字符。我使用的是一元范围,然后丢弃控制字符。
丹尼斯

14

Brainfuck,1692 826 765

(仍然)未优化,我知道。我正在努力(请留在评论中)。

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

输出:

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

我已经在某种程度上利用了8位单元的溢出,但是我想您仍然可以对其进行优化。虽然那样会减少使用廉价字符:)。


2
我有一个非常幼稚的程序576。随意混搭我的想法。+1。
Level River St

12

Pyth,173 170

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

输出量

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

硬编码类似quine的字符串。方便地,该"字符非常靠近生成的字符串的开头。在“ quine”之后打印偶数甚至奇数字符。

非常感谢Dennis节省了3分,并使代码成为一个回文枪!

在这里尝试


附带说明一下,我不认为Pyth r在此模式下使用时应返回字符串列表。
FryAmTheEggman 2015年

1
使用\~字符范围可将您的分数提高3分。(它还允许您将代码设为回文。)
Dennis 2015年

@丹尼斯谢谢!我花了很长时间才意识到我可以将其~写入“ quine”部分,而无需以某种方式将其添加到范围中……: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。)

第一个版本以明显的方式处理事务,以2为模,以95为模,然后打印所有赔率,然后打印所有偶数。

第二个版本利用了putchar返回打印字符的事实。由于32是95的互质数,因此我们可以循环浏览字符。由于C包含许多小写字符,因此我希望这种语言除了较短以外,其分数也较低,但不幸的是,情况并非如此。


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}我认为1472分
吱吱作响的ossifrage

@squeamishossifrage很好发现,的确的!找到那个花了多长时间?我对C感到无聊,我的头脑回答好多了。
水平河

只是在我用来生成此答案的Perl脚本周围闲逛:-)
挤压ossifrage

您可以使用a变量名称来降低得分,而不是i在两种情况下都可以降低得分。
409_Conflict 2015年

8

Befunge-93,801 797 724 699 627 612

码:

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

输出:

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

如果需要,可以在这里尝试。

通过输出32-126的偶数,然后输出33-125的几率来工作。如果有人想要解释,我会愿意的。

我一直打高尔夫球,直到获得比Brainf ***更好的成绩为止,我认为这是我所能达到的最低水平。至于打高尔夫球的策略,我生成了ascii角色,然后尝试用便宜的角色替换昂贵的角色(例如1到2)。我发现这g是如此昂贵,因此每次迭代计算126更好。因为^比便宜,我还缠在顶端v

801-> 797:最近的更改是从中删除了多余的空格g

797-> 724:我每次将126的计算更改为仅使用读取波浪号"~"。这也可以消除空白(我再次击败了BF答案之一)

724-> 699:与最后一次更改类似,“”是获得32点的极便宜的方法(4分)

699-> 627:由于我只经过了第二行,所以我只是将其更改为设置33,而不是在堆栈上保留另一个值并添加一个。

627-> 612:尽可能多地输入字符串。我很确定设计需要进行大幅度更改以进一步打高尔夫球。

除非其中一种非高尔夫语言获得了较低的解决方案,否则这可能是最终的迭代。


7

哈斯克尔830

['!','#'..'}']++[' ','\"'..'~']

评估为字符串:

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

受到@Jørgen的回答的启发,与我自己的完全不同。


7

Brainfuck,总分576 667

考虑一下,576似乎是对的:我做了一些估算,得出的分数约为95 * 6 + 45 * 2 =660。我第一次运行验证程序时肯定出了点问题。正确的分数更接近我的估计。分数仍然不错。

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

把事情简单化。

基本上只是在ASCII集上上下移动,打印字符。程序中使用的三个字符将首先打印。在两端转弯都有些棘手。

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

6

Ruby 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 2015年

5

CBM BASIC V2、2553

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

输出(通过pc上的python脚本以ASCII格式转换):

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

5

gawk,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#!

用法

将以下内容复制并粘贴到控制台
(mawk无法正常工作,因为它对printf 的要求严格了)

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在端部的信号的输入的结束,所以END块将被执行。

我基本上交织了来自底部和来自顶部的字符。然后,我分析了程序中使用最多的字符,并按频率顺序首先打印了它们。然后,我必须确保没有字符被打印超过一次。方向相反的编织使得更可能的是,已使用的字符不会导致打印邻居。但是他们在的中间相遇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。我承认这有点hacky,有些人可能认为它作弊,但我想这是一个不错的选择。一,程序及输出:

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的答案相同的方法对字符进行排序,并执行与此答案类似的操作来更改字符。


3

英国广播公司BASIC,2554

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

输出量

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

3

Fortran 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因为它们是Fortran隐式声明为整数的输出字符串中的前两个字母。


3

Perl,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-我不知道您可以用这种方式编写循环。
吱吱作响的ossifrage

如果用换行符替换空格,则print chr$_*63%95+32for 31..125得分为799。–
Dennis

3

JavaScript,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+ 

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哇,我怎么没想到呢!您刚刚从我的最佳成绩中
砍了

轻松改进:使用换行符代替分号来分隔语句。
换行符

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
我认为您可以;用换行符替换其中的一些- 换行符
-nimi

1
你可以拿到3分出来,起始地址n='nr i(a…,而不是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,交换围绕操作数<+运算符; 挤的修改$T32+$T;
  • 变量($T$f)的名称是输出的第一个字母;
  • 我尝试$T4或进行初始化,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。我尝试以相反的顺序打印,但这大大提高了得分。只需更改乘数和循环准则,其他模式也是可能的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.