ทำการแมป 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
คุณช่วยอธิบายสั้น ๆ ว่าคะแนนคำนวณได้อย่างไร
ทำให้เสียชีวิต

@Falize โดยทั่วไปความคิดคือการเขียนโปรแกรมที่เอาต์พุตกำหนดค่าต่ำให้กับอักขระที่ใช้โดยวางไว้ที่จุดเริ่มต้นของสตริงเอาต์พุต "ค่า" ของอักขระ ASCII แต่ละตัวจะถูกกำหนดโดยดัชนีที่อ้างอิง 1 ตัวในเอาต์พุตของรหัสของคุณ แทนที่จะนับอักขระแต่ละตัวในแหล่งที่มาของคุณเป็น 1 เช่นเดียวกับรหัสกอล์ฟอักขระแต่ละตัวในแหล่งที่มาของคุณจะถูกนับเป็นค่าตามที่อธิบายไว้ข้างต้น
กริช

4
ดูเหมือนว่าจะเป็นเวลาที่ดีที่จะใช้ Whitespace ในการประกวดเขียนโปรแกรม ...
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 ในตัวเช่นกัน ฉันกำลังใช้ช่วง unary แล้วละทิ้งตัวควบคุม
เดนนิส

14

Brainfuck, 1692 826 765

(ยัง) ไม่ได้เพิ่มประสิทธิภาพฉันรู้ ฉันทำงานกับมัน (ทิ้งไว้ในความคิดเห็น)

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

เอาท์พุท:

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

ฉันใช้ประโยชน์จากโอเวอร์โฟลว์ใน 8 บิตเซลล์ไปบ้างแล้ว แต่ฉันคิดว่าคุณยังสามารถปรับให้เหมาะสมได้ แม้ว่าจะลดการใช้ตัวอักษรราคาถูกลง :)


2
ฉันได้ 576 โปรแกรมที่ไร้เดียงสามาก รู้สึกฟรีเพื่อผสมและตรงกับความคิดของฉัน +1
เลเวลริเวอร์เซนต์

12

Pyth, 173 170

รหัส

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

เอาท์พุต

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

การเข้ารหัสสตริงเหมือน quine สะดวก"อักขระอยู่ใกล้จุดเริ่มต้นของสตริงที่สร้างขึ้น พิมพ์ตัวละครที่แปลกแล้วแม้หลังจาก "ควิน"

ขอบคุณเดนนิสมากสำหรับการบันทึก 3 คะแนนและทำให้โค้ดเป็นที่น่าอัศจรรย์!

ลองที่นี่


จากบันทึกย่อด้านข้างฉันไม่คิดว่า Pyth's rควรส่งคืนรายการสตริงเมื่อใช้ในโหมดนี้
FryAmTheEggman

1
ใช้\~สำหรับช่วงตัวละครช่วยเพิ่มคะแนนของคุณ 3 คะแนน (นอกจากนี้ยังช่วยให้คุณสามารถกำหนดรหัสของคุณให้เป็นแบบ palindrome ได้)
Dennis

@ เดนนิสขอบคุณ! ฉันใช้เวลานานเกินไปที่จะตระหนักว่าฉันสามารถเขียน~ลงในส่วน "ควินิน" แทนที่จะต้องเพิ่มลงในช่วงใด ... : 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{}

สองช่วงที่แปลงเป็นสตริงโดยนัย ไม่แน่ใจว่าการส่งคืนเป็นตอบรับหรือไม่ยอมรับคำเตือนเกี่ยวกับการแปลงโดยนัย พยายามเวกเตอร์พิสัยอื่น ๆ แต่ไม่พบสิ่งใดที่มีประสิทธิภาพมากขึ้น


ตอบกลับเป็นที่ยอมรับได้เป็นงานที่ดี!
กริช

8

C, 42 ไบต์, คะแนน 1,539

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จะถูกกำหนดค่าเริ่มต้นให้เป็นจำนวนสตริงบน commandline (เนื่องจากไม่มีการระบุอาร์กิวเมนต์นี่คือ 1)

รุ่นแรกทำในสิ่งที่เห็นได้ชัดโดยเพิ่มขึ้น 2 รับโมดูโล 95 และก่อนพิมพ์อัตราต่อรองทั้งหมดจากนั้นทั้งหมด

รุ่นที่สองใช้ประโยชน์จากความจริงที่ว่า putchar คืนค่าตัวอักษรที่พิมพ์ออกมา เมื่อ 32 คือ coprime ถึง 95 เราสามารถวนรอบอักขระได้ เนื่องจาก C มีอักขระตัวพิมพ์เล็กจำนวนมากฉันหวังว่าสิ่งนี้นอกจากจะสั้นกว่าแล้วก็จะมีคะแนนต่ำกว่า แต่น่าเสียดายที่ไม่ใช่ในกรณีนี้


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}คะแนน 1472 ฉันคิดว่า
squeamish ossifrage

@squeamishossifrage ด่างดีจริง ๆ ! ใช้เวลานานแค่ไหนในการค้นหาสิ่งนั้น? ฉันเบื่อ C คำตอบที่สมองของฉันดีกว่ามาก
เลเวลริเวอร์เซนต์

เพียงแค่ noodling รอบกับ 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 evens และต่อรอง 33-125 หากใครต้องการคำอธิบายฉันยินดีที่จะ

ฉันเล่นกอล์ฟจนกว่าฉันจะได้รับมันดีกว่า brainf *** ซึ่งฉันถือว่าเป็นระดับต่ำสุดที่ฉันสามารถไปได้ เท่าที่ฉันใช้กลยุทธ์ตีกอล์ฟฉันสร้างตัวละคร ASCII ขึ้นมาและพยายามแทนที่ตัวละครที่มีราคาแพงด้วยตัวที่ถูกกว่า (เช่น 1 กับ 2) ฉันพบว่าตั้งแต่gมีราคาแพงมากการคำนวณ 126 ซ้ำทุกครั้งจะดีกว่า ฉันยังห่อรอบด้านบนตั้งแต่ราคาถูกกว่า^v

801 -> 797 : gการเปลี่ยนแปลงล่าสุดถูกลบช่องว่างพิเศษที่เป็นของที่ระลึกจากการใช้

797 -> 724 : ผมเปลี่ยนการคำนวณ 126 "~"ทุกครั้งที่จะเพียงแค่อ่านตัวหนอนใช้ สิ่งนี้อนุญาตให้ตัดช่องว่าง (และฉันกำลังตีหนึ่งในคำตอบ BF อีกครั้ง)

724 -> 699 : คล้ายกับการเปลี่ยนแปลงล่าสุด "" เป็นวิธีที่ถูกมาก (4 คะแนน) จากการได้รับ 32

699 -> 627 : ตั้งแต่ฉันผ่านแถวที่ 2 เพียงครั้งเดียวฉันก็เปลี่ยนเป็นการตั้งค่า 33 แทนการรักษาค่าอื่นในสแต็กและเพิ่มหนึ่ง

627 -> 612 : ย้ายไปให้มากที่สุดเท่าที่จะทำได้เพื่อป้อนสตริง ฉันค่อนข้างมั่นใจว่าการออกแบบจะต้องเปลี่ยนไปอย่างมากสำหรับการตีกอล์ฟ

นี่อาจเป็นการวนซ้ำขั้นสุดท้ายเว้นแต่ภาษาที่ไม่ใช่กอล์ฟหนึ่งภาษาจะได้รับการแก้ปัญหาที่ต่ำกว่า


7

Haskell, 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

รูบี 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 ไม่ควรเป็นช่องโหว่มาตรฐานโดยเฉพาะเนื่องจากช่วยลดการพกพาได้อย่างมาก) Shuffles (ส่วนใหญ่) ไบต์ในซอร์สโค้ดของมันเองและสับส่วนที่เหลือจากนั้นจึงไม่ซ้ำกันและเชื่อมต่ออาร์เรย์ ใช้เมล็ดสุ่มเลือกเพื่อให้ผลผลิตถูกกฎหมาย (ความจริงที่ว่ามันเป็นตัวเลขหลักเดียวคือโชคบริสุทธิ์)


1
ทางออกที่น่าสนใจ! ฉันจะจัดหมวดหมู่นี้เป็นกฎหมายเพราะมันจะผลิตผลลัพธ์เดียวกันเสมอ (ถ้าฉันเข้าใจถูกต้อง) ให้เมล็ดเดียวกัน นอกจากนี้การมีแนวทางที่แตกต่างหลากหลายน่าสนใจกว่าเสมอ
กริช

5

CBM BASIC V2, 2553

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

ผลลัพธ์ (แปลงเป็น ASCII โดยสคริปต์ python บนพีซี):

<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/nullที่สิ้นสุดสัญญาณสิ้นสุดของการป้อนข้อมูลเพื่อให้บล็อก END จะถูกดำเนินการ

โดยทั่วไปฉันผสมผสานตัวละครที่มาจากด้านล่างและมาจากด้านบน จากนั้นฉันวิเคราะห์ซึ่งอักขระที่ถูกใช้มากที่สุดในโปรแกรมและพิมพ์ออกมาก่อนตามลำดับความถี่ จากนั้นฉันต้องตรวจสอบให้แน่ใจว่าไม่มีการพิมพ์ตัวอักษรมากกว่าหนึ่งครั้ง การทอในทิศทางตรงกันข้ามทำให้มีความเป็นไปได้มากกว่าที่ตัวละครที่ใช้แล้วจะไม่นำไปสู่การพิมพ์เพื่อนบ้าน แต่พวกเขาพบกันตรงกลางPดังนั้นฉันจึงต้องพิมพ์สิ่งนั้นในตอนแรกด้วย จากนั้นก็มีปัญหาบางอย่างกับตัวละครที่ใช้ใน regexps ... จากนั้นฉันเปลี่ยนชื่อตัวแปรอย่างถูกและทำทุกอย่างอีกครั้ง จากนั้นฉันก็พบว่าตัวละครบางตัวที่ฉันสามารถแทนที่ในโปรแกรมของฉันและทำสิ่งทั้งหมดอีกครั้ง และในที่สุด .. ฉันก็ปรับสตริงด้วยตัวละครที่ต้องการเล็กน้อยโดยการทดสอบ

ฉันคิดว่าฉันทำ :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

แน่นอนว่ามันเป็นไปไม่ได้ที่จะเอาชนะ Octave solution ใน MATLAB เพราะมันไม่ได้มีการ"'เริ่มต้น' ในช่วง ASCII randpermแต่ผมตัดสินใจที่จะได้รับบิตสร้างสรรค์และคิดไปสู่การละเมิด ฉันยอมรับว่ามันค่อนข้างแฮ็คและบางคนอาจคิดว่ามันเป็นการโกง แต่ฉันคิดว่ามันเป็นสิ่งที่ดี ก่อนโปรแกรมและผลลัพธ์:

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

ouput:

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 เพิ่มจำนวนเมล็ดโดยไม่ต้องมีความยาวของเมล็ดอีกต่อไป หากใครรู้สึกอยากทำโปรแกรมเพื่อคำนวณตัวเลขตัว n ทั้งหมดที่ Matlab สามารถนำเสนอได้;;)


ฉันคิดว่านี่เป็นทางออกที่ยอดเยี่ยม อย่างไรก็ตาม [''32: 2: 126 33: 2: 125] (ด้วยเครื่องหมายคำพูดเดี่ยว) ถูกต้องและสั้นกว่าที่ 728 คะแนน :-)
Jørgen

@ Jørgenฉันรู้ แต่ฉันต้องการลองวิธีอื่น;) ฉันคิดว่ามันน่าจะให้ผลลัพธ์ที่น่าสนใจมากกว่านี้ถ้าrandpermไม่มีชื่อฟังก์ชันยาว ๆ
Sanchises

4

Haskell, 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);}}

ไม่ได้ดีที่สุดเลย แต่จริง ๆ แล้วทำการแมปตัวอักษรใหม่ (แทนที่จะพิมพ์ออกมาเป็นชุดของตัวดัดแปลง)

Ungolfed:

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

BBC 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

ปรากฎว่าการพิมพ์ค่า ASCII ในขั้นตอน42 58ให้คะแนนต่ำสุดด้วยวิธีนี้:

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 - ฉันไม่รู้ว่าคุณสามารถเขียนลูปแบบนั้นได้
ossifrage คลื่นไส้

หากคุณแทนที่ช่องว่างด้วย linefeeds 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...เป็นความจริง
กริช

@Undefined ฟังก์ชั่นว้าวฉันไม่คิดยังไง! คุณเพิ่งโกน 56 คะแนนจากคะแนนที่ดีที่สุดของฉันนำไปที่ 2144 ตอนนี้: D ยังคงพยายามทำให้มันต่ำกว่า 2,000 แม้ว่า ...
Mwr247

การปรับปรุงง่าย: ใช้บรรทัดใหม่แทนเซมิโคลอนเพื่อแยกคำสั่ง การขึ้นบรรทัดใหม่นับเป็น 1
กรกฎาคม

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
คุณจะได้รับ 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

หมายเหตุ:

  • เอาต์พุตเริ่มต้นด้วย white space ( 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.