Tantangan ini akan berperilaku kurang lebih seperti golf kode tradisional . Satu-satunya perbedaan adalah bahwa alih-alih mencetak jawaban berdasarkan jumlah karakter atau byte mereka, pengguna akan menetapkan bobot untuk karakter yang berbeda dalam komentar dan program dengan bobot kumulatif terendah akan menang.
Tantangan
Tugas Anda adalah menulis program yang mengambil string dan mencetak bentuk berlian di mana karakter pertama dimulai di tengah dan karakter selanjutnya menempati ruang kosong ortogonal ke set karakter yang ditempatkan terakhir. Spaces ( ) akan digunakan untuk pengisi.
Misalnya memasukkan CAT
akan menghasilkan
T
TAT
TACAT
TAT
T
dan ()
akan menghasilkan
)
)()
)
dan desserts
akan menghasilkan
s
sts
strts
strerts
streserts
stressserts
stressesserts
stressedesserts
stressed desserts
stressedesserts
stressesserts
stressserts
streserts
strerts
strts
sts
s
dan 9
akan menghasilkan 9
.
Detail
Kode hanya dapat berisi ASCII dan baris baru yang dapat dicetak . (Lihat mengapa di bawah.)
Input / output harus melalui stdin / stdout, atau, jika tidak memungkinkan, gunakan alternatif serupa.
Anda dapat mengasumsikan string input hanya berisi ASCII yang dapat dicetak (termasuk spasi).
Kolom ruang terdepan yang tidak mengandung bagian dari pola intan tidak diizinkan dalam output. Jumlah dan kombinasi spasi spasi tambahan diperbolehkan.
Secara opsional mungkin ada garis akhir yang tertinggal di output.
Anda dapat mengedit jawaban Anda sebanyak yang Anda inginkan.
Mencetak gol
Semua kode harus ditulis hanya menggunakan baris baru dan 95 karakter ASCII yang dapat dicetak:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(Sayangnya tab tidak diizinkan karena Stack Exchange menjadikannya sebagai spasi di blok kode.)
Masing-masing dari 96 karakter ini memiliki nilai bobot yang terkait dengannya. Secara default, semua bobot adalah 97.
Skor suatu program adalah jumlah dari nilai bobot untuk masing-masing karakternya. Misalnya, jika programnya print(4)
dan bobotnya 4
adalah 70, tetapi tidak berubah untuk yang lain, skornya akan menjadi 749 = 97+97+97+97+97+97+70+97
.
Setelah aktivitas dalam pertanyaan ini hampir tidak ada, pengajuan skor terendah akan menang. Dalam kasus yang tidak mungkin terjadi, kemenangan akan menuju ke jawaban dengan suara tertinggi.
Mengubah Bobot
Setiap pengguna, apakah mereka menjawab atau tidak, dapat mengubah bobot salah satu dari 96 karakter menjadi nilai unik dari 1 menjadi 96. Untuk melakukan ini, tambahkan komentar ke pertanyaan ini dari formulir #### W -> C ####
, di mana W adalah bilangan bulat dari 1 hingga 96 dan C adalah karakter (seperti itu sendiri, tidak ada tanda kutip, tidak ada backticks). Gunakan \n
sebagai pengganti C untuk baris baru dan \s
untuk ruang karena Stack Exchange memampatkan 3 spasi berturut-turut. The print(4)
contoh di atas akan memiliki komentar #### 70 -> 4 ####
.
Setiap pengguna hanya dapat membuat SATU komentar seperti ini, dan itu hanya akan valid jika karakter dan nilai bobot belum digunakan dalam komentar yang dibuat sebelumnya. Jadi pada akhirnya, mungkin ada 96 #### W -> C ####
komentar, semuanya dari pengguna yang berbeda, semua dengan bobot yang berbeda ditugaskan untuk karakter yang berbeda.
Pengguna dapat menghapus komentar mereka sendiri jika mereka mau, mengatur ulang bobot karakter mereka kembali ke 97 sampai mereka atau orang lain berkomentar lagi. Mereka juga dapat mengeditnya. Komentar yang tidak mengikuti aturan tentang pengguna / bobot / karakter yang berbeda harus dihapus atau ditandai sebagai "tidak konstruktif". Komentar umum tentang peraturan dan hal-hal lain baik-baik saja tetapi harus dijaga agar tetap minimum.
Cuplikan tumpukan ini adalah leaderboard resmi untuk pertanyaan ini. Secara otomatis menghitung skor untuk semua kiriman dengan mengumpulkan bobot dari komentar setiap kali dijalankan. Itu tidak menangani ikatan. Anda juga dapat menggunakannya untuk memeriksa skor suatu program.
Anda mungkin perlu melakukannya right-click -> Open link in new tab
untuk tautannya.
function compute(){var e=computeScore($("#code").val());$("#score").val(e==-1?"Invalid characters":e)}function computeScore(e){var t=0;for(var n=0;n<e.length;n++){if(weights.hasOwnProperty(e[n])){t+=weights[e[n]]}else{return-1}}return t}function htmlDecode(e){var t=document.createElement("div");t.innerHTML=e;return t.childNodes.length===0?"":t.childNodes[0].nodeValue}function addLeaderboard(){validAnswers.sort(function(e,t){return e.score>t.score});var e=1;var t="";for(var n=0;n<validAnswers.length;n++){var r=validAnswers[n];t+="<tr><td>"+e+"</td><td><a href='"+r.link+"'>"+r.owner.display_name+"</a></td><td>"+r.score+"</td><td>"+r.length+"</td></tr>";if(n+1<validAnswers.length&&validAnswers[n+1].score>r.score){e++}}$("#leaderboard").append(t)}function addAnalytics(){var e="";for(var t in weights){if(weights.hasOwnProperty(t)&&weights[t]!=defaultWeight){e+=(t=="\n"?"\\n":t)+"="+weights[t]+" "}}$("#weights").val(e);var n="";for(var t in usedChars){if(usedChars.hasOwnProperty(t)&&usedChars[t]==false){n+=t=="\n"?"\\n":t}}$("#unusedc").val(n);var r="";for(var t in usedWeights){if(usedWeights.hasOwnProperty(t)&&usedWeights[t]==false){r+=t+" "}}$("#unusedw").val(r);var i="";if(invalidComments.length>0){for(var s=0;s<invalidComments.length;s++){var o=invalidComments[s];i+="<a href='#"+o.link+"'>"+o.owner.display_name+"</a> "}}else{i="none"}$("#comments").html(i);var u="";if(invalidAnswers.length>0){for(var s=0;s<invalidAnswers.length;s++){var a=invalidAnswers[s];u+="<a href='#"+a.link+"'>"+a.owner.display_name+"</a> "}}else{u="none"}$("#answers").html(u)}function checkAnswers(e){for(var t=0;t<e.items.length;t++){var n=e.items[t];var r=answerPattern.exec(n.body);if(r){var i=htmlDecode(r[1]);var s=computeScore(i);if(s==-1){invalidAnswers.push(n)}else{n.length=i.length;n.score=s;validAnswers.push(n)}}else{invalidAnswers.push(n)}}addLeaderboard();addAnalytics()}function checkComments(e){for(var t=0;t<e.items.length;t++){var n=e.items[t];var r=commentPattern.exec(htmlDecode(n.body));if(r){var i=n.owner.user_id;var s=parseInt(r[1]);var o=r[2]=="\\n"?"\n":r[2]=="\\s"?" ":r[2];if(userIDs.hasOwnProperty(i)||!usedWeights.hasOwnProperty(s)||usedWeights[s]||!usedChars.hasOwnProperty(o)||usedChars[o]){invalidComments.push(n)}else{userIDs[i]=true;usedWeights[s]=true;usedChars[o]=true;weights[o]=s}}}$.get(answersURL,checkAnswers)}function refresh(){$.get(commentsURL,checkComments)}questionID=45040;commentsURL="https://api.stackexchange.com/2.2/questions/"+questionID+"/comments?order=asc&sort=creation&site=codegolf&filter=!t)IWLXOkOvAuPe8m2xJrXOknWcw(ZqZ";answersURL="https://api.stackexchange.com/2.2/questions/"+questionID+"/answers?order=desc&sort=activity&site=codegolf&filter=!.FjsvG2LuND(frE*)WTvqQev1.lyu";commentPattern=/^#### (\d+) -> (\\(?:n|s)|[ -~]) ####$/;answerPattern=/<pre><code>((?:\n|.)*?)\n<\/code><\/pre>/;chars="\n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";validAnswers=[];invalidAnswers=[];invalidComments=[];userIDs={};usedWeights={};usedChars={};weights={};defaultWeight=chars.length+1;for(var i=0;i<chars.length;i++){usedChars[chars[i]]=false;usedWeights[i+1]=false;weights[chars[i]]=defaultWeight}refresh()
*{font-family:Helvetica,Arial,sans-serif}table{border:3px solid green;border-collapse:collapse}button{font-size:100%}th{background-color:green;color:#fff;padding:6pt}td{border:1px solid green;padding:6pt}.large{font-size:140%}.title{font-weight:700;margin:6pt 0}textarea{font-family:"Courier New";white-space:nowrap;overflow:auto}input[readonly]{background-color:#dcdcdc}.analytics{font-size:90%;padding:4pt 0 0}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div class='large title'>Leaderboard</div><table id='leaderboard'> <tr> <th>Place</th> <th>Submitter</th> <th>Score</th> <th>Program Length</th> </tr></table><br><div class='title'>Compute Score</div><textarea id='code' rows='5' cols='40' placeholder='paste code here...'></textarea><br><button type='button' onclick='compute()'>Compute</button> Score: <input type='text' id='score' readonly><br><br><div class='title'>Analytics</div><div class='analytics'>Assigned weights: <input type='text' id='weights' readonly></div><div class='analytics'>Unused characters: <input type='text' id='unusedc' readonly> (all weight 97)</div><div class='analytics'>Unused weights: <input type='text' id='unusedw' readonly></div><div class='analytics'>Invalid comments (duplicate user/char/weight): <span id='comments'></span></div><div class='analytics'>Invalid answers (illegal characters or no code block): <span id='answers'><span></div><br><button type='button' onclick='refresh'>Refresh</button>
Agar papan peringkat ini berfungsi, komentar harus dalam format persis seperti yang dijelaskan di atas dan kode program Anda harus berada di blok kode multi-baris pertama dalam jawaban Anda ( <pre><code>...</code></pre>
yang). Jangan gunakan penyorotan sintaks atau kode Anda tidak akan dibaca dengan benar. Cuplikan dapat memakan waktu satu atau dua menit sebelum diperbarui.
Saya belum menguji snippet secara menyeluruh, tetapi saya akan mengawasinya saat kontes ini berlangsung. Jika Anda melihat ada bug tolong beritahu saya. Ini adalah versi yang tidak diperkecil:
Ingatlah bahwa sistem penilaian ini benar-benar baru dan eksperimental. Semoga Stack Exchange tidak keberatan bahwa itu melibatkan banyak komentar. : P
Tantangan terkait: Cetak berlian ini
sumber
Jawaban:
CJam,
144150 byteSudah mencoba beberapa penyandian ...
Diperbarui karena bobot
b
telah berubah.Pengkodean lain yang hanya lebih baik secara teori (140 byte):
sumber
Python 2, 120 byte
Sunting: Menurunkan biaya dengan beberapa karakter yang lebih murah.
sumber
Pyth , 21 byte
Cobalah secara online: Pyth Compiler / Executor
sumber
CJam, 31 byte
Hanya adaptasi dari jawaban saya untuk Mencetak berlian ini untuk saat ini. Saya mungkin men-tweak ketika bobot telah berubah.
Uji di sini.
sumber
J, 45 karakter
Solusi gondrong, akan golf dengan beberapa karakter murah ...
Cobalah online. (Tambahkan string input dengan tanda kutip tunggal.)
sumber
PHP (131 karakter)
http://3v4l.org/9Vvkm
Akan mengoptimalkan setelah bobot lebih jelas.
sumber
function f($s){for($i=-($l=strlen($s));$i<$l;)echo str_repeat(' ',$I=abs(++$i)),strrev($t=substr($s,$I)),substr($t,1),"\n";}
yang mungkin tidak berfungsi. Tapi ini lebih pendek 6 byte! Mungkin Anda dapat mengambil sesuatu dari sini.Java, 318 byte
sumber