Nhắc lại ASCII


36

Thử thách

Viết chương trình sắp xếp lại các ký tự ASCII!

Nó sẽ xuất ra một chuỗi chứa tất cả các ký tự ASCII có thể in chính xác một lần. Ký tự đầu tiên của chuỗi này được gán giá trị 1, ký tự thứ hai là giá trị 2, v.v.

Nếu hai ký tự thường nằm cạnh nhau (chênh lệch giữa các mã ký tự của chúng là 1), chúng có thể không xuất hiện cạnh nhau trong đầu ra.

Chấm điểm

Điểm của bạn sẽ là tổng của các giá trị cho tất cả các ký tự trong mã nguồn của bạn, như được quyết định bởi đầu ra của chương trình.

Vui lòng xem phần Xác minh để tính điểm của bạn.

Điểm số thấp nhất chiến thắng!

Quy tắc

  • "ASCII có thể in" được định nghĩa là mã ký tự 32 - 126, bao gồm.

  • Bạn có thể viết một chương trình đầy đủ hoặc một chức năng.

  • Mã của bạn chỉ có thể chứa các ký tự ASCII có thể in và các dòng mới.

  • Chương trình của bạn có thể không có bất kỳ đầu vào.

  • Dòng mới sẽ luôn có giá trị 1. Đầu ra của chương trình của bạn không được bao gồm dòng mới.

xác minh

Sử dụng đoạn mã ngăn xếp này để xác minh rằng đầu ra mã của bạn là hợp lệ và để tính điểm của mã của bạn!


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>

Bảng xếp hạng

Nhờ bài đăng này cho mã bảng xếp hạng!


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
Yêu các đoạn xác nhận.
mınxomaτ

2
Bạn có thể giải thích ngắn gọn về cách tính điểm, vì vậy chúng tôi biết cách tối ưu hóa câu trả lời của chúng tôi?
Gây tử vong vào

@Firthize Về cơ bản, ý tưởng là viết một chương trình có đầu ra gán giá trị thấp cho các ký tự mà nó sử dụng, bằng cách đặt chúng vào đầu chuỗi xuất ra. "Giá trị" của mỗi ký tự ASCII được xác định bởi chỉ số dựa trên 1 trong đầu ra mã của bạn. Thay vì đếm từng ký tự trong nguồn của bạn là 1, như golf-code, mỗi ký tự trong nguồn của bạn được tính là giá trị của nó, như được mô tả ở trên.
jrich

4
Đây có vẻ là thời điểm tốt để sử dụng Khoảng trắng trong cuộc thi lập trình ...
C0deH4cker

3
@ C0deH4cker Thật không may, điều đó sẽ yêu cầu các tab, không thể in các ký tự ASCII hoặc dòng mới, vì vậy sẽ không hợp lệ.
jrich

Câu trả lời:


21

CJam, 356 186 168 131 126 111 99 96 94

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Đầu ra

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

Ý kiến

Sử dụng một biến thể của một kỹ thuật phổ biến trong các câu lệnh của CJam, chúng tôi sắp xếp các ký tự ASCII có thể in bằng cách chúng xuất hiện trong mã nguồn và các ký tự không xuất hiện - với hai ngoại lệ - theo các bit chẵn lẻ của điểm mã của chúng.

Với cách bố trí nguồn thích hợp, chúng tôi cũng quản lý để sắp xếp các ký tự mã nguồn - với một ngoại lệ - theo tần số của chúng.

Phải đặc biệt chú ý rằng hai ký tự liền kề không xuất hiện lần lượt từng ký tự trong mã nguồn, vì điều này sẽ làm mất hiệu lực câu trả lời.

"             "_~  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.

Sẽ không ngạc nhiên khi thấy CJam giành được điều này, Pyth không có các câu lệnh đơn giản cũng như các ký tự ASCII được tích hợp sẵn.
orlp

1
CJam cũng không tích hợp sẵn các ký tự ASCII. Tôi đang sử dụng một phạm vi đơn nguyên, sau đó loại bỏ các ký tự điều khiển.
Dennis

14

Brainfuck, 1692 826 765

(Vẫn) Không tối ưu hóa, tôi biết. Tôi đang làm việc với nó (để lại ý kiến).

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

Đầu ra:

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

Tôi đã sử dụng tràn trên các ô 8 bit ở một mức độ nào đó, nhưng tôi đoán bạn vẫn có thể tối ưu hóa nó. Mặc dù điều đó sẽ làm giảm việc sử dụng ký tự giá rẻ :).


2
Tôi đã nhận được 576 với một chương trình rất ngây thơ. Hãy thoải mái trộn và phù hợp với ý tưởng của tôi. +1.
Cấp sông St

12

Bình thường, 173 170

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

Đầu ra

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

Hardcoding một chuỗi giống như quine. Thuận tiện," nhân vật rất gần khi bắt đầu chuỗi được tạo. In các ký tự chẵn sau đó sau "quine".

Rất cám ơn Dennis vì đã tiết kiệm được 3 điểm và làm cho mã trở nên ngon miệng!

Hãy thử nó ở đây


Là một lưu ý phụ, tôi không nghĩ Pyth rnên trả về danh sách các chuỗi khi được sử dụng trong chế độ này.
FryAmTheEggman

1
Sử dụng \~cho phạm vi nhân vật giúp cải thiện điểm số của bạn thêm 3 điểm. (Nó cũng cho phép bạn biến mã của mình thành một bảng màu.)
Dennis

@Dennis Cảm ơn! Phải mất quá nhiều thời gian tôi mới nhận ra mình chỉ có thể viết phần ~"quine" thay vì cần thêm nó vào phạm vi nào đó ...: d
FryAmTheEggman

10

Java, 3518 3189 2692

Một vòng lặp đơn giản in các ký tự chẵn, sau đó tỷ lệ cược. Tôi đã thử một vài điều để tối ưu hóa các ASCII trước đó, nhưng hầu hết cuối cùng làm cho nó dài hơn về tổng thể, và kết thúc với số điểm cao hơn.

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

Đầu ra là:

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

Chỉnh sửa: Hiểu sai về điểm số lúc đầu. Sau khi lật nó thành số lẻ trước, sau đó , nó sẽ ghi điểm tốt hơn rất nhiều.


10

Octave, 630

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

Đầu ra:

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

Hai phạm vi ngầm chuyển thành chuỗi. Không chắc chắn nếu trở về vì Ans có thể chấp nhận được hay không, cũng đưa ra cảnh báo về chuyển đổi ngầm. Đã thử một số vectơ phạm vi khác, nhưng không thể tìm thấy bất cứ điều gì hiệu quả hơn.


Trả lại một câu trả lời là chấp nhận được, công việc tốt đẹp!
jrich

8

C, 42 byte, điểm 1539

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

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

C, 39 byte, điểm 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;[{<\|=]}>^~?_ @`

Trong cả hai trường hợp, i được khởi tạo cho số chuỗi trên dòng lệnh (vì không có đối số nào được đưa ra, đây là 1.)

Phiên bản đầu tiên thực hiện mọi thứ theo cách rõ ràng, tăng thêm 2, lấy modulo 95 và sau đó in tất cả các tỷ lệ cược sau đó tất cả các evens.

Phiên bản thứ hai lợi dụng thực tế là putchar trả về ký tự được in. Vì 32 là tương đương với 95, chúng ta có thể chuyển qua các ký tự. Vì C chứa rất nhiều ký tự chữ thường, tôi hy vọng rằng điều này, ngoài việc ngắn hơn, sẽ có điểm thấp hơn nhưng thật không may, đây không phải là trường hợp.


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}điểm số 1472, tôi nghĩ
ossifrage squeamish

@squeamishossifrage cũng phát hiện ra, nó thực sự! Mất bao lâu để tìm thấy cái đó? Tôi đã chán C, câu trả lời của tôi tốt hơn nhiều.
Cấp sông St

Chỉ cần xử lý xung quanh với tập lệnh Perl mà tôi đã sử dụng để tạo câu trả lời này :-)
squossish ossifrage

bạn có thể hạ thấp điểm số của mình bằng cách sử dụng alàm tên biến thay vì itrong cả hai trường hợp.
409_Conflict

8

Befunge-93, 801 797 724 699 627 612

Mã số:

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

Đầu ra:

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

Bạn có thể thử nó ở đây nếu bạn muốn.

Nó hoạt động bằng cách xuất ra 32-126 evens, và sau đó tỷ lệ cược 33-125. Nếu bất cứ ai muốn một lời giải thích, tôi sẽ sẵn sàng.

Tôi đánh gôn cho đến khi tôi nhận được nó tốt hơn so với brainf ***, thứ mà tôi cho là thấp nhất tôi có thể đi. Theo như chiến lược chơi gôn, tôi đã tạo ra các ký tự ascii và sau đó cố gắng thay thế các ký tự đắt tiền bằng các ký tự rẻ hơn (như 1 bằng 2). Tôi phát hiện ra vì gnó rất đắt tiền, tốt hơn là tính toán 126 mỗi lần lặp. Tôi cũng quấn quanh đầu vì ^rẻ hơn v.

801 -> 797 : Thay đổi gần đây đã loại bỏ các không gian bổ sung là di tích sử dụng g.

797 -> 724 : Tôi đã thay đổi tính toán 126 mỗi lần chỉ đọc dấu ngã bằng cách sử dụng "~". điều này cũng cho phép cắt bỏ khoảng trắng (Và tôi lại đánh một trong những câu trả lời BF)

724 -> 699 : Tương tự như thay đổi cuối cùng, "" là một cách cực kỳ rẻ (4 điểm) để có được 32

699 -> 627 : Vì tôi chỉ đi qua hàng thứ 2 một lần, tôi chỉ thay đổi nó thành cài đặt 33 thay vì duy trì giá trị khác trên ngăn xếp và thêm một giá trị.

627 -> 612 : Đã chuyển càng nhiều càng tốt sang chuỗi đầu vào. Tôi khá chắc chắn rằng thiết kế sẽ cần phải thay đổi mạnh mẽ để chơi golf hơn nữa.

Đây có lẽ là lần lặp lại cuối cùng, trừ khi một trong những ngôn ngữ không chơi gôn có giải pháp thấp hơn.



7

Brainfuck, điểm 576 667

Nghĩ về điều đó, 576 dường như là sự thật: Tôi đã ước tính một chút và tính ra điểm số của mình là khoảng 95 * 6 + 45 * 2 = 660. Lần đầu tiên tôi phải chạy sai trình xác nhận. Điểm chính xác gần với ước tính của tôi. Nó vẫn không phải là một điểm số tồi.

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

Giữ cho nó đơn giản.

Về cơ bản chỉ cần đi lên và xuống bộ ASCII, in các ký tự. Ba ký tự được sử dụng trong chương trình được in trước. Xoay tròn ở hai đầu là một chút khó khăn.

-+.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}'

Đầu ra:

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

Đây là một giải pháp khá ngớ ngẩn (và tôi không chắc srand không nên là một lỗ hổng tiêu chuẩn đặc biệt vì nó làm giảm đáng kể tính di động). Xáo trộn (hầu hết) các byte trong mã nguồn riêng của nó và xáo trộn phần còn lại, sau đó hủy bỏ và nối các mảng. Sử dụng một hạt giống ngẫu nhiên được chọn để đầu ra là hợp pháp (thực tế đó là một chữ số duy nhất là may mắn thuần túy).


1
Giải pháp thú vị! Tôi sẽ phân loại điều này là hợp pháp vì nó sẽ luôn tạo ra cùng một đầu ra (nếu tôi hiểu đúng) được đưa ra cùng một hạt giống. Ngoài ra, có nhiều cách tiếp cận khác nhau luôn thú vị hơn.
jrich

5

CBM CƠ BẢN V2, 2553

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

đầu ra (được chuyển đổi trong ASCII bằng tập lệnh python trên pc):

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

5

chim ưng, 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)}

Đầu ra

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

Sử dụng

Sao chép và dán các mục sau vào bảng điều khiển của bạn
(mawk sẽ không hoạt động, vì nó quá nghiêm ngặt hơn với 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/nullcuối báo hiệu kết thúc đầu vào, vì vậy khối END sẽ được thực thi.

Về cơ bản tôi đan xen các nhân vật đến từ phía dưới và đến từ phía trên. Sau đó, tôi đã phân tích, những ký tự nào được sử dụng nhiều nhất trong chương trình và in chúng trước, theo thứ tự tần số. Sau đó, tôi phải đảm bảo rằng không có ký tự nào được in nhiều hơn một lần. Việc dệt theo các hướng ngược lại làm cho nhiều khả năng một nhân vật đã được sử dụng sẽ không dẫn đến việc in hàng xóm. Nhưng họ đã gặp nhau ở giữa P, vì vậy tôi cũng phải in nó ngay từ đầu. Sau đó, có một số vấn đề với các ký tự được sử dụng trong regexps ... Sau đó, tôi đổi tên các biến một cách rẻ tiền và làm lại toàn bộ. Sau đó, tôi tìm thấy một số nhân vật tôi có thể thay thế trong chương trình của mình và làm lại toàn bộ. Và như vậy .. Cuối cùng tôi đã điều chỉnh chuỗi với các ký tự ưa thích một chút bằng cách thử nghiệm.

Tôi nghĩ tôi đã xong :D

Trong quá trình tôi không bao giờ thực hiện chương trình từ dòng lệnh, nhưng đã xây dựng một chuỗi tôi đã thực hiện từ bên trong một tập lệnh, nó sẽ phân tích đầu ra cho chính xác và cho tôi điểm và nội dung. Điểm số đầu ra đã giúp rất nhiều. Tất nhiên tôi đã kiểm tra lại ở đây (bạn không bao giờ biết) nhưng nó đã cho tôi kết quả tương tự.

Có chương trình như thế này

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

Tất nhiên, hoàn toàn không thể đánh bại giải pháp Octave trong MATLAB, vì nó không có ""sớm" trong phạm vi ASCII. Tuy nhiên, tôi quyết định có một chút sáng tạo và tìm cách lạm dụng randperm. Tôi thừa nhận rằng đó là một chút hack và một số người có thể coi đó là gian lận, nhưng tôi đoán đó là một liên lạc tốt đẹp. Đầu tiên, chương trình và đầu ra:

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

Để tính toán một hạt giống thích hợp, tôi đã sử dụng chương trình sau, tôi đã chạy cho đến khi seed = 4648029 (nghĩa là cho đến khi các món ăn được hoàn thành)

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

Có lẽ một cách để cải thiện chương trình là thử cả hạt giống điểm nổi, ví dụ, 2,3e4 tăng số lượng hạt mà không có chiều dài hạt dài hơn. Nếu bất cứ ai cảm thấy muốn tạo một chương trình để tính tất cả các số n ký tự được biểu thị bằng Matlab ....;)


Tôi nghĩ rằng đây là một giải pháp tuyệt vời. Tuy nhiên, [''32: 2: 126 33: 2: 125] (có dấu ngoặc đơn) là hợp lệ và ngắn hơn ở 728 điểm :-)
Jørgen

@ Jørgen Tôi biết, nhưng tôi muốn thử một cách tiếp cận khác;). Tôi đoán nó sẽ mang lại kết quả thú vị hơn nếu randpermkhông phải là một tên hàm dài như vậy.
Sanchise

4

Haskell, 1660 1376

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

Xác định hàm atrả về chuỗi:

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

Không thực sự tối ưu chút nào, nhưng nó thực sự làm lại các ký tự (thay vì chỉ in ra một bộ ký tự sửa đổi).

Ung dung:

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

Đầu ra

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

Nó ra lệnh cho các ký tự sử dụng phương thức tương tự như câu trả lời của Geobits và thực hiện một số thứ tương tự như câu trả lời này để thay đổi ký tự.


3

BBC BASIC, 2554

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

Đầu ra

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

3

Pháo đài 90, 1523 1519 1171

Đây là một vòng lặp đầu ra lồng nhau, tương tự như các câu trả lời khác. Không quá tự tin rằng có thể cải thiện nhiều ...

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

Đầu ra:

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

Chỉnh sửa: Quên rằng Fortran 90 là cần thiết cho mã này, 77 yêu cầu mã để bắt đầu trong cột thứ 7. Mặt khác, ngôn ngữ không phân biệt chữ hoa chữ thường, cho phép cải thiện dễ dàng. Các bộ đếm vòng lặp là JLbởi vì đây là hai chữ cái đầu tiên trong chuỗi đầu ra được ngầm định là số nguyên của Fortran.


3

Perl, 1089 922

Hóa ra, việc in các giá trị ASCII theo các bước của 42 58 cho điểm thấp nhất với phương pháp này:

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

Đầu ra:

 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đã đạt được số điểm là 925 và 42 rất có thể không còn tối ưu nữa.
Dennis

Cảm ơn @Dennis - Tôi không biết bạn có thể viết các vòng theo cách đó.
squossish ossifrage

Nếu bạn thay thế khoảng trắng bằng nguồn cấp dữ liệu, print chr$_*63%95+32for 31..125đạt được số điểm 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)

Đầu ra

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

v+một phần (v,i)=>v+i*3%95+32cần thiết? Dường như với tôi rằng nó chỉ đơn giản là thêm vào 0mỗi lần kể từ khi mảng chứa đầy 0s ....
jrich

@Und xác định chức năng Có vẻ như không. Không tập trung quá nhiều vào việc tối ưu hóa, vì tôi đang nghiên cứu một phương pháp thay thế kết thúc bằng mọi cách ngắn hơn. Cảm ơn! =)
Mwr247

for(w=95;w-->0;)có thể for(w=95;w--;), bởi vì 0là giả và 1, 2, 3...là sự thật.
jrich

@Und xác định chức năng Wow, làm thế nào tôi không nghĩ về điều đó! Bạn vừa mới loại bỏ 56 điểm tốt nhất của tôi, mang đến 2144 ngay bây giờ: D Vẫn đang cố gắng để có được nó dưới 2000 mặc dù ...
Mwr247

Cải thiện dễ dàng: sử dụng dòng mới thay vì dấu chấm phẩy để phân tách các câu lệnh. Dòng mới được tính là 1.
jrich

3

Python 2, 72 byte (3188) 116 byte (1383) (1306) (1303)

cảm ơn @FryAmTheEggman vì thủ thuật tham gia;)

cảm ơn @nim (Tôi đã đọc sai văn bản ?: P)

cảm ơn @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])

đầu ra:

 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
Tôi nghĩ rằng bạn có thể thay thế một số trong số các ;dòng mới, được tính là 1
nimi

1
Bạn có thể nhận được 3 điểm bằng cách bắt đầu bằng n='nr i(a…thay vìn=' nri(a…
409_Conflict

3

PHP 1217 1081

Mật mã:

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

Do các biến không được khởi tạo, nên nó cần loại bỏ các thông báo khi chạy (PHP phàn nàn nhưng vẫn tiếp tục thực thi và sử dụng một giá trị mặc định phù hợp trong ngữ cảnh; 0trong trường hợp này):

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

Đầu ra của nó:

 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

Nhận xét:

  • đầu ra bắt đầu bằng khoảng trắng ( chr(32));
  • mã in khoảng trắng sau đó mỗi ký tự thứ 52, bao quanh phạm vi;
  • số ma thuật 52đã được "phát hiện" bằng cách tìm kiếm toàn bộ phạm vi (1..94) của các độ lệch có thể có; 1 tạo ra danh sách các ký tự có thể in theo thứ tự tăng dần của mã ASCII của chúng, 94 tạo ra danh sách theo thứ tự ngược lại, cả hai đều xấu; bội số của 5 và 19 (ước số của 95) tạo ra các chu kỳ ngắn và không bao gồm toàn bộ phạm vi giá trị (cũng xấu);
  • 52dường như là ma thuật; nó là phần bù tốt nhất cho mã này; nhưng nó cũng là tốt nhất cho một số biến thể của mã (tạo ra điểm số lớn hơn một chút); các biến thể tôi đã cố gắng: sử dụng while()thay vì for(), sử dụng $f++, $f--hoặc --$fthay vì ++$f, trao đổi các toán hạng xung quanh <+các nhà khai thác; siết chặt sửa đổi $Tthành 32+$T;
  • tên của các biến ( $T$f ) là các chữ cái đầu tiên từ đầu ra;
  • Tôi đã cố gắng để khởi tạo $Tvới 4hoặc 11nhưng điểm số tồi tệ hơn; bắt đầu bằng 4làm cho $ký tự đầu tiên trong đầu ra; nó là ký tự được sử dụng nhiều nhất trong mã nguồn PHP; 11đưa ra +phía trước; $+là các ký tự được sử dụng nhiều nhất trong mã này.

Mã, kiểm tra, thay đổi gia tăng mà tôi đã thử cho đến khi tôi đạt được giải pháp này và tập lệnh đã kiểm tra tất cả các giá trị bước có thể (nhà cung cấp có thẩm quyền 52là bước tốt nhất) có thể được tìm thấy trên github .


2

Fourier, 1236

Về cơ bản là một chuyển đổi chương trình BBCB của tôi

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

Đầu ra

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

0

AWK , 49 byte, Điểm: 1755

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

Hãy thử trực tuyến!

Đơn giản chỉ cần in mọi ký tự khác sau đó bắt đầu điền vào chỗ trống. Ký tự đầu tiên được in là một f. Tôi đã cố in theo thứ tự ngược lại, nhưng điều đó làm tăng đáng kể điểm số. Các mẫu khác có thể bằng cách thay đổi hệ số nhân và tiêu chí vòng lặp.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.