Golf Skor Pengguna - Menggambar Berlian [eksperimental]

11

Tantangan ini akan berperilaku kurang lebih seperti 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 CATakan menghasilkan

  T  
 TAT 
TACAT
 TAT 
  T  

dan ()akan menghasilkan

 ) 
)()
 ) 

dan  dessertsakan menghasilkan

        s        
       sts       
      strts      
     strerts     
    streserts    
   stressserts   
  stressesserts  
 stressedesserts 
stressed desserts
 stressedesserts 
  stressesserts  
   stressserts   
    streserts    
     strerts     
      strts      
       sts       
        s        

dan 9akan 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 4adalah 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 \nsebagai pengganti C untuk baris baru dan \suntuk 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 tabuntuk 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):&nbsp;<span id='comments'></span></div><div class='analytics'>Invalid answers (illegal characters or no code block):&nbsp;<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

Hobi Calvin
sumber
#### 1 -> * ####
Martin Ender
Komentar dapat diedit selama 5 menit, sehingga memungkinkannya untuk diedit dapat menyebabkan kekacauan total dengan aturan non-pengulangan.
Peter Taylor
@PeterTaylor Tapi bagaimana saya bisa menghentikan suntingan komentar? Selain itu sama sekali mengabaikan yang diedit. 5 menit berjalan cukup cepat.
Hobi Calvin
1
Saya tidak suka sistem penilaian ini sama sekali (lihat obrolan), tetapi jika Anda akan menggunakannya maka mengabaikan komentar yang diedit jelas merupakan hal yang tepat untuk dilakukan.
Peter Taylor
#### 2 ->: ####
Logic Knight

Jawaban:

4

CJam, 144 150 byte

"x*3:*3:3*::33:3:::333*::333*3::***3::**::33:3::3*:::::*3:3:3:**33*333333::33*:*333:*3*3**:**3:**:3*3:33*3:3*:333**:3**33:*3:::*:3*::3"'3/'b*3b127b:c~

Sudah mencoba beberapa penyandian ...

Diperbarui karena bobot btelah berubah.

Pengkodean lain yang hanya lebih baik secara teori (140 byte):

":***(*3:**3*I**:3*****:*3*******: ::::*:***II@3*******: :**I:**:***:*3***3*I3I:3***33:::*I**3I***3***:3:*I*3I"{"*:I3( **@"#1a*~0}%2b126b:c~
jimmy23013
sumber
5

Python 2, 120 byte

T=raw_input()
L=len(T)
r=[b[::-1]+b[1:]for b in [T[-b:]+' '*(L-b)for b in range(1,L+1)]]
for b in r[:-1]+r[::-1]:print b

Sunting: Menurunkan biaya dengan beberapa karakter yang lebih murah.

Ksatria Logika
sumber
2

CJam, 31 byte

lW%_,:I(S*\+I*I/2%{_W%1>+z}2*N*

Hanya adaptasi dari jawaban saya untuk Mencetak berlian ini untuk saat ini. Saya mungkin men-tweak ketika bobot telah berubah.

Uji di sini.

Martin Ender
sumber
1

J, 45 karakter

(({~((]*]<#@[)>:@(+/~)@:|@i:@(2-#)))@(' '&,))

Solusi gondrong, akan golf dengan beberapa karakter murah ...

Cobalah online. (Tambahkan string input dengan tanda kutip tunggal.)

randomra
sumber
1

PHP (131 karakter)

function f($s){for($i=-($l=strlen($s));$i<$l;$I=abs(++$i)){$t=substr($s,$I);echo str_repeat(' ',$I).strrev($t).substr($t,1)."\n";}}

http://3v4l.org/9Vvkm

Akan mengoptimalkan setelah bobot lebih jelas.

Stephen
sumber
Kode Anda dapat ditulis ulang menjadi ini: 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.
Ismael Miguel
0

Java, 318 byte

class N{public static void main(String[]a){char[]s=new java.util.Scanner(System.in).nextLine().toCharArray();int l=s.length,m=l-1,$=0,b;String t="";for(;$<l;$++,t+='\n')for(b=0;b<l+$;b++)t+=b+$<m?' ':s[b>m?m-b+$:b+$-m];for($=l-2;$>-1;$--,t+='\n')for(b=0;b<l+$;b++)t+=b+$<m?' ':s[b>m?m-b+$:b+$-m];System.out.print(t);}}
Ypnypn
sumber