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>
Jawaban:
CJam,
356186168131126111999694Cobalah online di juru bahasa CJam .
Keluaran
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
sumber
Brainfuck,
1692826765(Tetap) Tidak dioptimalkan, saya tahu. Saya sedang mengerjakannya (tinggalkan komentar di komentar).
Keluaran:
Saya sudah menggunakan overflow pada sel 8bit sampai batas tertentu, tapi saya kira Anda masih bisa mengoptimalkannya. Meskipun itu akan mengurangi penggunaan karakter murah :).
sumber
Pyth,
173170Kode
Keluaran
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
sumber
r
harus mengembalikan daftar string ketika digunakan dalam mode ini.\~
untuk rentang karakter meningkatkan skor Anda sebesar 3 poin. (Ini juga memungkinkan Anda untuk membuat kode Anda menjadi palindrome.)~
ke bagian "quine" alih-alih perlu menambahkannya ke rentang entah bagaimana ...: dJawa,
3518 31892692Lingkaran 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.
Output adalah:
Sunting: Menyalahpahami skor pada awalnya. Setelah membalikkannya menjadi aneh terlebih dahulu, bahkan kemudian , skornya jauh lebih baik.
sumber
Oktaf, 628
Kode
Keluaran:
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.
sumber
C, 42 byte, skor 1539
C, 39 byte, skor 1687
Dalam kedua kasus,
i
diinisialisasi 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.
sumber
i;main(){for(;i<3990;i+=42)putchar(i%95+32);}
skor 1472, saya pikira
nama variabel daripadai
dalam kedua kasus.Befunge-93,
801797724699627612Kode:
Keluaran:
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
g
sangat mahal, lebih baik untuk menghitung setiap iterasi. Saya juga melilit bagian atas karena^
lebih murah daripadav
.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.
sumber
Haskell, 830
Mengevaluasi ke string:
Terinspirasi oleh jawaban Jørgen dan sangat berbeda dengan jawaban saya .
sumber
Brainfuck, skor
576667Memikirkan 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.
sumber
Ruby 2.2, 1157
Keluaran:
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).
sumber
CBM BASIC V2, 2553
output (dikonversi dalam ASCII oleh skrip python di pc):
sumber
gawk,
278219881821Keluaran
Pemakaian
Salin dan tempel yang berikut ini ke konsol Anda
(mawk tidak akan berfungsi, karena
terlaluketat dengan printf)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 tengah
P
, 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
sumber
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 pelecehanrandperm
. Saya akui itu agak basi dan ada yang menganggapnya curang, tapi saya rasa itu sentuhan yang bagus. Pertama, program dan output:Ouput:
Untuk menghitung benih yang sesuai, saya menggunakan program berikut ini, yang saya jalankan sampai seed = 4648029 (yaitu, sampai hidangan selesai)
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 ....;)
sumber
randperm
bukan nama fungsi yang panjang.Haskell,
16601376Menentukan fungsi
a
yang mengembalikan string:sumber
Jawa, 15470
Tidak benar-benar optimal sama sekali, tetapi itu benar - benar memetakan ulang karakter (bukan hanya mencetak satu set karakter yang dimodifikasi).
Tidak Disatukan:
Keluaran
Ini memerintahkan chars menggunakan metode yang sama dengan jawaban Geobits , dan melakukan sesuatu yang mirip dengan jawaban ini untuk mengubah chars.
sumber
BBC BASIC, 2554
Kode
Keluaran
sumber
Fortran 90,
152315191171Ini adalah loop keluaran bersarang, mirip dengan jawaban lain. Tidak terlalu percaya diri bahwa banyak perbaikan mungkin terjadi ...
Keluaran:
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
J
danL
karena ini adalah dua huruf pertama dalam string output yang secara implisit dinyatakan sebagai bilangan bulat oleh Fortran.sumber
Perl,
1089922Ternyata mencetak nilai ASCII dalam langkah
4258 memberikan skor terendah dengan pendekatan ini:Keluaran:
sumber
print chr$_*42%95+32for 0..94
sudah mencapai skor 925, dan 42 kemungkinan besar tidak lagi optimal.print chr$_*63%95+32for 31..125
dapatkan skor 799.JavaScript,
31692548214421042071188518761872Kode
Keluaran
sumber
v+
bagian yang(v,i)=>v+i*3%95+32
diperlukan? Sepertinya saya itu hanya menambahkan0
setiap kali karena array diisi dengan0
....for(w=95;w-->0;)
bisa jadifor(w=95;w--;)
, karena0
palsu dan1, 2, 3...
benar.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
keluaran:
sumber
a=map(chr,range(32,172))
dan"".join(a[::2]+a[1::2])
;
dengan baris baru, yang dihitung sebagai 1n='nr i(a…
bukann=' nri(a…
PHP,
12171081Kode:
Karena variabel tidak diinisialisasi, itu perlu untuk menekan pemberitahuan saat menjalankan (PHP mengeluh tetapi melanjutkan eksekusi dan menggunakan nilai default yang sesuai dalam konteks;
0
dalam kasus ini):Keluarannya:
Komentar:
chr(32)
);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);52
tampaknya 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: gunakanwhile()
alih-alihfor()
, gunakan$f++
,$f--
atau--$f
alih-alih++$f
, tukar operan di sekitar operator<
dan+
; peras modifikasi$T
menjadi32+$T
;$T
dan$f
) adalah huruf pertama dari output;$T
dengan4
atau11
tetapi nilainya lebih buruk; dimulai dengan4
membuat$
karakter pertama dalam output; itu adalah karakter yang paling banyak digunakan dalam kode sumber PHP;11
membawa+
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
52
sebagai langkah terbaik) dapat ditemukan di github .sumber
Fourier, 1236
Pada dasarnya konversi program BBCB saya
Keluaran
sumber
AWK , 49 byte, Nilai: 1755
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.sumber
Perl 5 , 1069
Cobalah online!
sumber