ASCIIの再マッピング


36

チャレンジ

ASCII文字を並べ替えるプログラムを作成してください!

すべての印刷可能なASCII文字を1回だけ含む単一の文字列を出力する必要があります。この文字列の最初の文字には値1が割り当てられ、2番目の文字には値2などが割り当てられます。

通常、2つの文字が隣り合っている場合(文字コードの違いが1である場合)、出力ではそれらが隣り合って表示されない場合があります。

得点

スコアは、プログラムの出力によって決定されるように、ソースコード内のすべての文字の値の合計になります。

確認セクションを参照して、スコアを計算してください。

最低スコアが勝ちます!

ルール

  • 「Printable 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

4
これは、プログラミングコンテストでホワイトスペースを使用する良い
機会のよう

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文字をソースコードに表示されるかどうか、および表示されないASCII文字をコードポイントのパリティビットで並べ替えます。

適切なソースレイアウトを使用して、1つの例外を除き、ソースコードの文字を頻度で並べ替えることもできます。

ソースコードに2つの隣接する文字が最初から順番に表示されないように、特別な注意が必要です。これにより、回答が無効になるためです。

コード

"             "_~  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には単純なクインもASCII文字も組み込まれていません。
orlp

1
CJamにはASCII文字の組み込み機能もありません。私は単項範囲を使用しており、制御文字を破棄しています。
デニス

14

Brainfuck、1692 826 765

(それでも)最適化されていません。私はそれに取り組んでいます(コメントにオプトを残します)。

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

出力:

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

私はすでに8ビットセルである程度オーバーフローを利用していますが、それでも最適化できると思います。それは安い文字の使用を減らすだろうが:)。


2
非常に素朴なプログラムで576を獲得しました。私のアイデアを自由に組み合わせてください。+1。
レベルリバーセント

12

ピス、173 170

コード

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

出力

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

クインのような文字列をハードコーディングします。便利なことに、"文字は生成された文字列の開始点に非常に近いです。「クイン」の後に偶数文字を印刷します。

3ポイントを節約し、コードを回文にしてくれたDennisに感謝します!

ここで試してみてください


補足として、私はPyth rがこのモードで使用されたときに文字列のリストを返すとは思わない。
FryAmTheEggman

1
\~文字範囲に使用すると、スコアが3ポイント向上します。(また、コードをパリンドロームにすることもできます。)
デニス

@デニスありがとう!~どういうわけか範囲に追加するのではなく、「クイン」部分に書き込むことができることに気付くのに時間がかかりすぎました...:d
FryAmTheEggman

10

Java、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{}

暗黙的に文字列に変換される2つの範囲。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を取り、すべてのオッズ、次にすべてのイーブンを印刷します。

2番目のバージョンは、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

8

Befunge-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:毎回126の計算を変更して、チルダを読むだけにしました"~"。これにより、空白を削除することもできました(そして、BFの回答の1つをもう一度叩いています)

724-> 699:最後の変更と同様に、「」は非常に安価な(4ポイント)32

699-> 627:2行目のパスを1回だけ通過するため、スタックの別の値を維持して1を追加する代わりに、33に設定するように変更しました。

627-> 612:文字列入力にできる限り移動しました。ゴルフをするためには、デザインを大幅に変更する必要があると確信しています。

非ゴルフ言語のいずれかがより低いソリューションを取得しない限り、これはおそらく最後の反復です。


7

ハスケル、830

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

文字列を評価します:

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

@Jørgenの答えに触発され、とはまったく異なります。


7

Brainfuck、スコア576 667

それについて考えると、576は本当であるように思えました:私は少し見積もりをして、約95 * 6 + 45 * 2 = 660であると私のスコアを計算しました。正しいスコアは私の見積もりに近いです。まだ悪いスコアではありません。

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

複雑にしないでおく。

基本的には、ASCIIセットを上下に移動して文字を印刷するだけです。プログラムで使用される3文字が最初に印刷されます。どちらかの端で回るのは少し難しい。

-+.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桁であるという事実は完全に幸運です)。


1
興味深いソリューション!同じシードが与えられた場合、(正しく理解していれば)常に同じ出力を生成するため、これを合法として分類します。また、さまざまな異なるアプローチを持つことは常に興味深いです。
-jrich

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

ガウク、 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/nullENDブロックが実行されるように、端部では、入力の終了を知らせます。

基本的に、下から来るキャラクターと上から来るキャラクターを織り交ぜました。次に、プログラムで最も使用された文字を分析し、頻度の順に最初に印刷しました。次に、文字が複数回印刷されないようにする必要がありました。反対方向への製織により、すでに使用されているキャラクターが隣人を印刷しない可能性が高くなりました。しかし、彼らは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

おそらく、プログラムを改善する1つの方法は、浮動小数点シードも試してみることです。たとえば、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

Java、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

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列目から始まることを要求します。一方、言語は大文字と小文字を区別しないため、簡単に改善できます。ループカウンターはJLFortranによって暗黙的に整数として宣言された出力文字列の最初の2文字であるためです。


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に感謝—ループをそのように記述できるとは思いもしませんでした。
squeamish ossifrage

スペースを改行で置き換えるとprint chr$_*63%95+32for 31..125、スコア799を達成します。-
デニス

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--;)ので、0falsyで、1, 2, 3...truthyです。
-jrich

@UndefinedFunctionうわー、どうして私はそれを考えなかったの!あなたはちょうど私のベストから56ポイントを削り、今2144に持ってきました:Dそれでも2000の下にそれを取得しようとしています
...-Mwr247

簡単な改善:セミコロンの代わりに改行を使用してステートメントを分離します。改行は1としてカウントされます
jrich

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…代わりに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、周りのオペランドスワップ<+オペレータと、$Tinto の修正を絞り込み32+$Tます。
  • 変数の名前($Tおよび$f)は、出力の最初の文字です。
  • 私は初期化しようとした$T411が、スコアは悪かったです。始まる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}

オンラインでお試しください!

1文字おきに印刷してから、空白を埋め直すことから始めます。印刷される最初の文字はfです。逆順で印刷しようとしましたが、それによりスコアが大幅に増加しました。他のパターンは、乗数とループ基準を変更するだけで可能です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.