Memetakan kembali ASCII


36

Tantangan

Tulis program yang menata ulang karakter ASCII!

Seharusnya menghasilkan string tunggal yang berisi semua karakter ASCII yang dapat dicetak tepat sekali. Karakter pertama dari string ini diberi nilai 1, karakter kedua nilai 2, dan seterusnya.

Jika dua karakter biasanya bersebelahan (perbedaan antara kode karakter mereka adalah 1), mereka mungkin tidak muncul bersebelahan dalam output.

Mencetak gol

Skor Anda akan menjadi jumlah nilai untuk semua karakter dalam kode sumber Anda, seperti yang ditentukan oleh output program Anda.

Silakan lihat bagian Verifikasi untuk menghitung skor Anda.

Menang skor terendah!

Aturan

  • "Printable ASCII" didefinisikan sebagai kode karakter rata-rata 32 - 126, inklusif.

  • Anda dapat menulis program atau fungsi lengkap.

  • Kode Anda hanya dapat berisi karakter dan baris ASCII yang dapat dicetak.

  • Program Anda mungkin tidak menerima input apa pun.

  • Baris baru akan selalu memiliki nilai 1. Output program Anda tidak harus menyertakan baris baru.

Verifikasi

Gunakan cuplikan tumpukan ini untuk memverifikasi bahwa output kode Anda valid, dan untuk menghitung skor kode Anda!


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>

Papan peringkat

Berkat posting ini untuk kode leaderboard!


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
Mencintai cuplikan validasi.
mınxomaτ

2
Bisakah Anda menjelaskan secara singkat bagaimana skor dihitung, jadi kami tahu cara mengoptimalkan jawaban kami?
Fatalkan

@Fatalize Pada dasarnya, idenya adalah untuk menulis sebuah program yang outputnya memberikan nilai rendah ke karakter yang digunakannya, dengan meletakkannya di awal string yang dihasilkan. "Nilai" dari setiap karakter ASCII ditentukan oleh indeks berbasis 1 dalam output kode Anda. Alih-alih menghitung setiap karakter di sumber Anda sebagai 1, seperti golf kode, setiap karakter di sumber Anda dihitung sebagai nilainya, seperti dijelaskan di atas.
jrich

4
Ini sepertinya waktu yang tepat untuk menggunakan Whitespace dalam kontes pemrograman ...
C0deH4cker

3
@ C0deH4cker Sayangnya itu memerlukan tab, yang tidak dapat dicetak karakter ASCII atau baris baru, sehingga tidak valid.
jrich

Jawaban:


21

CJam, 356 186 168 131 126 111 99 96 94

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

Cobalah online di juru bahasa CJam .

Keluaran

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

Ide

Menggunakan variasi teknik yang umum dalam quine CJam, kami mengurutkan karakter ASCII yang dapat dicetak dengan apakah mereka muncul dalam kode sumber, dan yang tidak muncul - dengan dua pengecualian - dengan bit paritas poin kode mereka.

Dengan tata letak sumber yang tepat, kami juga berhasil mengurutkan karakter kode sumber - dengan satu pengecualian - berdasarkan frekuensinya.

Harus diperhatikan bahwa dua karakter yang berdekatan tidak muncul satu demi satu untuk pertama kalinya dalam kode sumber, karena ini akan membatalkan jawaban.

Kode

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

Tidak akan terkejut melihat CJam memenangkan ini, Pyth tidak memiliki quines sederhana atau karakter ASCII dalam built-in.
orlp

1
CJam juga tidak memiliki built-in untuk karakter ASCII. Saya menggunakan rentang unary, lalu membuang karakter kontrol.
Dennis

14

Brainfuck, 1692 826 765

(Tetap) Tidak dioptimalkan, saya tahu. Saya sedang mengerjakannya (tinggalkan komentar di komentar).

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

Keluaran:

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

Saya sudah menggunakan overflow pada sel 8bit sampai batas tertentu, tapi saya kira Anda masih bisa mengoptimalkannya. Meskipun itu akan mengurangi penggunaan karakter murah :).


2
Saya mendapat 576 dengan program yang sangat naif. Jangan ragu untuk mencampur dan mencocokkan ide saya. +1.
Level River St

12

Pyth, 173 170

Kode

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

Keluaran

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

Hardcoding string seperti quine. Mudahnya, "karakter sangat dekat dengan permulaan string yang dihasilkan. Mencetak bahkan karakter aneh setelah "quine".

Terima kasih banyak untuk Dennis karena telah menghemat 3 poin, dan membuat kodenya palindome!

Coba di sini


Sebagai catatan tambahan, saya tidak berpikir Pyth rharus mengembalikan daftar string ketika digunakan dalam mode ini.
FryAmTheEggman

1
Menggunakan \~untuk rentang karakter meningkatkan skor Anda sebesar 3 poin. (Ini juga memungkinkan Anda untuk membuat kode Anda menjadi palindrome.)
Dennis

@Dennis Terima kasih! Butuh waktu terlalu lama bagi saya untuk menyadari bahwa saya bisa menulis ~ke bagian "quine" alih-alih perlu menambahkannya ke rentang entah bagaimana ...: d
FryAmTheEggman

10

Jawa, 3518 3189 2692

Lingkaran sederhana yang mencetak karakter genap, lalu peluang. Saya mencoba beberapa hal untuk mengoptimalkan ASCII sebelumnya, tetapi kebanyakan akhirnya membuatnya lebih lama secara keseluruhan, dan berakhir dengan skor yang lebih tinggi.

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

Output adalah:

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

Sunting: Menyalahpahami skor pada awalnya. Setelah membalikkannya menjadi aneh terlebih dahulu, bahkan kemudian , skornya jauh lebih baik.


10

Oktaf, 628

Kode

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

Keluaran:

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

Dua rentang secara implisit dikonversi menjadi string. Tidak yakin apakah kembali sebagai Ans dapat diterima, juga memberikan peringatan tentang konversi implisit. Mencoba beberapa vektor jangkauan lain, tetapi tidak dapat menemukan sesuatu yang lebih efisien.


Mengembalikan jawaban adalah pekerjaan yang dapat diterima dan menyenangkan!
jrich

8

C, 42 byte, skor 1539

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

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

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

Dalam kedua kasus, idiinisialisasi ke jumlah string pada commandline (karena tidak ada argumen yang diberikan, ini adalah 1.)

Versi pertama melakukan hal-hal dengan cara yang jelas, bertambah 2, mengambil modulo 95 dan sebelum mencetak semua peluang maka semua rata.

Versi kedua mengambil keuntungan dari fakta bahwa putchar mengembalikan karakter yang dicetak. Karena 32 adalah coprime ke 95, kita dapat menggilir karakter. Karena C mengandung banyak karakter huruf kecil, saya berharap ini, selain lebih pendek, akan memiliki skor lebih rendah tetapi sayangnya ini tidak terjadi.


i;main(){for(;i<3990;i+=42)putchar(i%95+32);}skor 1472, saya pikir
ossifrage melengking

@squeamishossifrage terlihat dengan baik, memang! Berapa lama untuk menemukan yang itu? Saya bosan C, jawaban brainfuck saya jauh lebih baik.
Level River St

Hanya berkutat dengan skrip Perl yang saya gunakan untuk menghasilkan jawaban ini :-)
squeamish ossifrage

Anda dapat menurunkan skor menggunakan anama variabel daripada idalam kedua kasus.
409_Konflik

8

Befunge-93, 801 797 724 699 627 612

Kode:

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

Keluaran:

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

Anda dapat mencobanya di sini jika mau.

Ia bekerja dengan mengeluarkan 32-126 GENAP, dan kemudian 33-125 peluang. Jika ada yang menginginkan penjelasan, saya bersedia.

Saya bermain golf sampai saya mendapatkannya lebih baik daripada ***, yang saya anggap paling rendah. Sejauh strategi bermain golf, saya membuat karakter ascii dan kemudian mencoba mengganti karakter yang mahal dengan yang lebih murah (seperti 1 dengan 2). Saya tahu karena gsangat mahal, lebih baik untuk menghitung setiap iterasi. Saya juga melilit bagian atas karena ^lebih murah daripada v.

801 -> 797 : Perubahan terbaru menghilangkan ruang ekstra yang merupakan peninggalan dari menggunakan g.

797 -> 724 : Saya mengubah penghitungan 126 setiap kali menjadi hanya membaca menggunakan tilde "~". ini juga memungkinkan untuk memotong spasi putih (Dan saya mengalahkan salah satu jawaban BF lagi)

724 -> 699 : Mirip dengan perubahan terakhir, "" adalah cara yang sangat murah (4 poin) untuk mendapatkan 32

699 -> 627 : Karena saya hanya melewati baris ke-2 sekali, saya hanya mengubahnya ke pengaturan 33 daripada mempertahankan nilai lain pada stack dan menambahkannya.

627 -> 612 : Memindahkan sebanyak yang saya bisa untuk memasukkan input. Saya cukup yakin desain akan perlu berubah secara drastis untuk golf itu lebih jauh.

Ini mungkin iterasi terakhir, kecuali salah satu bahasa non-golf mendapatkan solusi yang lebih rendah.


7

Haskell, 830

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

Mengevaluasi ke string:

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

Terinspirasi oleh jawaban Jørgen dan sangat berbeda dengan jawaban saya .


7

Brainfuck, skor 576 667

Memikirkan hal itu, 576 kelihatannya bagus untuk menjadi kenyataan: Saya melakukan sedikit estimasi dan menghitung skor saya menjadi sekitar 95 * 6 + 45 * 2 = 660. Sesuatu pasti salah saat pertama kali saya menjalankan validator. Skor yang benar lebih dekat dengan perkiraan saya. Itu masih bukan skor yang buruk.

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

Tetap sederhana.

Pada dasarnya hanya berjalan naik turun set ASCII, mencetak karakter. Tiga karakter yang digunakan dalam program ini dicetak terlebih dahulu. Berbalik di kedua ujungnya agak rumit.

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

Keluaran:

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

Ini adalah solusi yang cukup bodoh (dan saya tidak yakin srand seharusnya tidak menjadi celah standar terutama karena secara drastis mengurangi portabilitas). Mengacak (sebagian besar) byte dalam kode sumbernya sendiri dan mengocok sisanya, lalu menguningkan dan menggabungkan array. Menggunakan benih acak yang dipilih sehingga hasilnya legal (fakta bahwa itu adalah satu digit adalah keberuntungan murni).


1
Solusi menarik! Saya akan mengklasifikasikan ini sebagai legal karena akan selalu menghasilkan output yang sama (jika saya mengerti dengan benar) dengan seed yang sama. Juga, memiliki berbagai pendekatan berbeda selalu lebih menarik.
jrich

5

CBM BASIC V2, 2553

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

output (dikonversi dalam ASCII oleh skrip python di pc):

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

Keluaran

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

Pemakaian

Salin dan tempel yang berikut ini ke konsol Anda
(mawk tidak akan berfungsi, karena terlalu ketat dengan 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

Itu < /dev/null di akhir memberi sinyal akhir input, sehingga blok END akan dieksekusi.

Saya pada dasarnya menjalin karakter yang datang dari bawah dan datang dari atas. Kemudian saya menganalisis, karakter mana yang paling banyak digunakan dalam program dan mencetaknya terlebih dahulu, berdasarkan frekuensi. Kemudian saya harus memastikan bahwa tidak ada karakter yang dicetak lebih dari satu kali. Tenun di arah yang berlawanan membuatnya lebih mungkin bahwa karakter yang sudah digunakan tidak akan mengarah ke pencetakan tetangga. Tapi mereka bertemu di tengahP , jadi saya harus mencetaknya juga di awal. Lalu ada beberapa masalah dengan karakter yang digunakan dalam regexps ... Lalu saya mengganti nama variabel dengan murah dan melakukan semuanya lagi. Kemudian saya menemukan beberapa karakter yang bisa saya ganti di program saya, dan melakukan semuanya lagi. Dan seterusnya .. Saya akhirnya men-tweak string dengan karakter yang disukai sedikit dengan menguji.

Saya pikir saya sudah selesai :D

Selama proses itu saya tidak pernah menjalankan program dari baris perintah, tetapi membangun string yang saya jalankan dari dalam skrip, yang akan menganalisis output untuk kebenaran dan memberi saya skor dan barang-barang. Output skor itu sangat membantu. Tentu saja saya periksa kembali di sini (Anda tidak pernah tahu) tetapi itu memberi saya hasil yang sama.

Disana programnya terlihat seperti ini

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

Tentu saja, sangat tidak mungkin untuk mengalahkan solusi Octave di MATLAB, karena tidak memiliki "yang 'awal' dalam rentang ASCII. Namun, saya memutuskan untuk menjadi sedikit kreatif dan berpikir untuk melakukan pelecehan randperm. Saya akui itu agak basi dan ada yang menganggapnya curang, tapi saya rasa itu sentuhan yang bagus. Pertama, program dan output:

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

Untuk menghitung benih yang sesuai, saya menggunakan program berikut ini, yang saya jalankan sampai seed = 4648029 (yaitu, sampai hidangan selesai)

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

Mungkin salah satu cara untuk meningkatkan program ini adalah dengan mencoba benih titik apung juga, misalnya, 2.3e4 menambah jumlah benih tanpa memiliki panjang biji yang lebih panjang. Jika ada yang merasa ingin membuat program untuk menghitung semua angka n-karakter yang diwakili oleh Matlab ....;)


Saya pikir ini adalah solusi yang sangat baik. Namun, ['' 32: 2: 126 33: 2: 125] (dengan tanda kutip tunggal) valid, dan lebih pendek pada 728 poin :-)
Jørgen

@ Jørgen saya tahu, tetapi saya ingin mencoba pendekatan yang berbeda;). Saya kira itu akan menghasilkan hasil yang lebih menarik jika randpermbukan nama fungsi yang panjang.
Sanchises

4

Haskell, 1660 1376

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

Menentukan fungsi ayang mengembalikan string:

 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

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

Tidak benar-benar optimal sama sekali, tetapi itu benar - benar memetakan ulang karakter (bukan hanya mencetak satu set karakter yang dimodifikasi).

Tidak Disatukan:

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

Keluaran

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

Ini memerintahkan chars menggunakan metode yang sama dengan jawaban Geobits , dan melakukan sesuatu yang mirip dengan jawaban ini untuk mengubah chars.


3

BBC BASIC, 2554

Kode

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

Keluaran

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

3

Fortran 90, 1523 1519 1171

Ini adalah loop keluaran bersarang, mirip dengan jawaban lain. Tidak terlalu percaya diri bahwa banyak perbaikan mungkin terjadi ...

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

Keluaran:

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

Sunting: Lupa bahwa Fortran 90 diperlukan untuk kode ini, 77 memerlukan kode untuk memulai di kolom 7. Di sisi lain, bahasanya tidak peka terhadap huruf besar-kecil, sehingga mudah diperbaiki. Counter loop adalah Jdan Lkarena ini adalah dua huruf pertama dalam string output yang secara implisit dinyatakan sebagai bilangan bulat oleh Fortran.


3

Perl, 1089 922

Ternyata mencetak nilai ASCII dalam langkah 42 58 memberikan skor terendah dengan pendekatan ini:

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

Keluaran:

 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..94sudah mencapai skor 925, dan 42 kemungkinan besar tidak lagi optimal.
Dennis

Terima kasih @ Dennis - Saya tidak tahu Anda bisa menulis loop seperti itu.
squeamish ossifrage

Jika Anda mengganti spasi dengan umpan baris, print chr$_*63%95+32for 31..125dapatkan skor 799.
Dennis

3

JavaScript, 3169 2548 2144 2104 2071 1885 1876 1872

Kode

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

Keluaran

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

Apakah v+bagian yang (v,i)=>v+i*3%95+32diperlukan? Sepertinya saya itu hanya menambahkan 0setiap kali karena array diisi dengan 0....
jrich

@UndefinedFunction Sepertinya tidak. Tidak fokus terlalu keras untuk mengoptimalkan, karena saya sedang mengerjakan metode alternatif yang akhirnya lebih pendek. Terima kasih! =)
Mwr247

for(w=95;w-->0;)bisa jadi for(w=95;w--;), karena 0palsu dan 1, 2, 3...benar.
jrich

@UndefinedFungsi Wow, bagaimana saya tidak memikirkan itu! Anda baru saja mencukur 56 poin dari yang terbaik, membawanya ke 2144 sekarang: D Namun masih berusaha untuk mendapatkannya di bawah 2000 ...
Mwr247

Perbaikan mudah: gunakan baris baru alih-alih titik koma untuk memisahkan pernyataan. Baris baru dihitung sebagai 1.
jrich

3

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

terima kasih @FryAmTheEggman untuk trik gabung;)

thanks @nim (Apakah saya salah membaca teks?: P)

terima kasih @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])

keluaran:

 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))dan"".join(a[::2]+a[1::2])
FryAmTheEggman

1
Saya pikir Anda dapat mengganti beberapa ;dengan baris baru, yang dihitung sebagai 1
nimi

1
Anda bisa mendapatkan 3 poin dengan memulai dengan n='nr i(a…bukann=' nri(a…
409_Conflict

3

PHP, 1217 1081

Kode:

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

Karena variabel tidak diinisialisasi, itu perlu untuk menekan pemberitahuan saat menjalankan (PHP mengeluh tetapi melanjutkan eksekusi dan menggunakan nilai default yang sesuai dalam konteks; 0dalam kasus ini):

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

Keluarannya:

 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

Komentar:

  • output dimulai dengan spasi putih (chr(32) );
  • kode mencetak spasi putih kemudian masing-masing karakter ke-52, membungkus rentang;
  • angka ajaib 52"ditemukan" dengan mencari seluruh rentang (1..94) kemungkinan offset; 1 menghasilkan daftar karakter yang dapat dicetak dalam urutan kode ASCII yang naik, 94 menghasilkan daftar dengan urutan terbalik, keduanya buruk; kelipatan 5 dan 19 (pembagi 95) menghasilkan siklus pendek dan tidak mencakup seluruh rentang nilai (juga buruk);
  • 52tampaknya ajaib; ini merupakan offset terbaik untuk kode ini; tetapi juga yang terbaik untuk beberapa variasi kode (yang menghasilkan skor sedikit lebih besar); variasi yang saya coba: gunakan while()alih-alih for(), gunakan $f++, $f--atau --$falih-alih ++$f, tukar operan di sekitar operator <dan +; peras modifikasi $Tmenjadi 32+$T;
  • nama-nama variabel ( $Tdan$f ) adalah huruf pertama dari output;
  • Saya mencoba menginisialisasi $Tdengan 4atau 11tetapi nilainya lebih buruk; dimulai dengan 4membuat $karakter pertama dalam output; itu adalah karakter yang paling banyak digunakan dalam kode sumber PHP; 11membawa +di depan; $dan +merupakan karakter yang paling banyak digunakan dalam kode ini.

Kode, tes, perubahan tambahan yang saya coba sampai saya mencapai solusi ini dan skrip yang menguji semua nilai langkah yang mungkin (penyedia otoritatif 52sebagai langkah terbaik) dapat ditemukan di github .


2

Fourier, 1236

Pada dasarnya konversi program BBCB saya

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

Keluaran

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

0

AWK , 49 byte, Nilai: 1755

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

Cobalah online!

Cukup cetak setiap karakter lain kemudian mulai mengisi bagian yang kosong. Karakter pertama yang dicetak adalah f. Saya mencoba mencetak dengan urutan terbalik, tetapi itu sangat meningkatkan skor. Pola lain dimungkinkan dengan hanya mengubah kriteria pengali dan loop.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.