Користувальницький код за гольфом - Малювання алмазів [експериментальний]


11

Цей виклик буде вести себе більш-менш, як традиційний . Єдина відмінність полягає в тому, що замість того, щоб забивати відповіді за їх кількістю символів чи байтів, користувачі призначатимуть ваги різним символам у коментарях і виграє програма з найменшою сукупною вагою.

Виклик

Ваше завдання - написати програму, яка займає рядок і роздруковує форму ромба, де перший символ починається в центрі, а наступні символи займають ортогональні порожні пробіли до набору символів, які були розміщені останніми. Пробіли ( ) будуть використані для оббивки.

Наприклад, введення CATможе дати результат

  T  
 TAT 
TACAT
 TAT 
  T  

і ()вироблять

 ) 
)()
 ) 

і  dessertsвироблять

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

і 9вироблять 9.

Деталі

  • Код може містити лише друковані ASCII та нові рядки. (Дивіться, чому нижче.)

  • Введення / виведення слід здійснювати через stdin / stdout, або, якщо вони неможливі, використовувати подібні альтернативи.

  • Ви можете припустити, що вхідний рядок містить лише друкований ASCII (включаючи пробіл).

  • Стовпці провідних пробілів, що не містять жодної частини алмазного малюнка, не допускаються у висновку. Дозволяється будь-яка кількість та комбінація пробілів пробілів.

  • Необов'язково, може бути новий проміжний рядок у висновку.

  • Ви можете редагувати свою відповідь скільки завгодно.

Оцінка балів

Весь код повинен бути написаний, використовуючи лише нові рядки та 95 друкованих символів ASCII:

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

(На жаль, вкладки заборонені, оскільки Stack Exchange надає їх як пробіли в кодових блоках.)

Кожен з цих 96 символів має пов’язане з ним значення ваги . За замовчуванням всі ваги - 97.

Оцінка програми - це сума вагових значень для кожного її персонажа. Наприклад, якби програма була, print(4)а вага для них 4становила 70, але незмінною для всього іншого, оцінка була б 749 = 97+97+97+97+97+97+70+97.

Після того як активність у цьому питанні майже не зникає, виграє найнижчий показник балів. У імовірно малоймовірному випадку виграш перемог переходить до найвищої відповіді.

Зміна ваг

Кожен користувач, відповів чи ні, може змінити вагу одного з 96 символів на унікальне значення від 1 до 96. Для цього додайте коментар до цього питання форми #### W -> C ####, де W - ціле число 1 - 96 і C - символ (як сам, без лапок, без зворотних посилань). Використовуйте \nзамість C для нових рядків і \sдля місця, оскільки Stack Exchange стискає 3 проміжки поспіль. Наведений print(4)вище приклад мав би коментар #### 70 -> 4 ####.

Кожен користувач може зробити лише ОДИН коментар, як цей, і він буде дійсним лише в тому випадку, якщо і характер, і значення ваги не були використані в раніше зробленому коментарі. Таким чином, в кінцевому підсумку може бути 96 #### W -> C ####коментарів, від різних користувачів, всі з різною вагою, присвоєними різним персонажам.

Користувачі можуть видалити власний коментар, якщо захочуть, скинувши вагу своїх персонажів до 97, поки вони чи хтось ще не дасть коментар. Вони також можуть їх редагувати. Коментарі, які не відповідають правилам щодо окремих користувачів / ваги / символів, повинні бути видалені або позначені як "неконструктивні". Загальні коментарі щодо правил та інших речей є прекрасними, але їх слід мінімізувати.

Цей фрагмент стека є офіційним таблицею лідерів цього питання. Він автоматично обчислює бали за всі подані матеріали, збираючи ваги з коментарів кожного разу, коли він запускається. Він не справляється зі зв’язками. Ви також можете використовувати його для перевірки балів, які матиме програма.

Можливо, вам потрібно буде right-click -> Open link in new tabдля посилань.

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>

Щоб ця таблиця лідерів працювала, коментарі повинні бути у точному форматі, описаному вище, а код вашої програми повинен бути у першому багаторядковому кодовому блоці у вашій відповіді ( <pre><code>...</code></pre>ті). Не використовуйте підсвічування синтаксису, інакше ваш код не буде прочитаний правильно. До оновлення фрагменту може пройти хвилину-дві.

Я не перевірив фрагмент ретельно, але буду стежити за цим, як цей конкурс триває. Якщо ви помітили будь-які помилки, будь ласка, скажіть мені. Ось неміфікована версія:

Майте на увазі, що ця система балів є абсолютно новою та експериментальною. Сподіваємось, Exchange Stack не заперечує, що вона включає багато коментарів. : P

Пов’язаний виклик: надрукуйте цей алмаз


#### 1 -> * ####
Мартін Ендер

Коментарі можна редагувати протягом 5 хвилин, тому дозволити їх редагування може спричинити повний хаос із правилами неповторення.
Пітер Тейлор

@PeterTaylor Але як я можу припинити редагування коментарів? Крім того, повністю ігноруючи ті, що редагуються. 5 хвилин проходить досить швидко.
Захоплення Кальвіна

1
Мені ця система підрахунку балів зовсім не подобається (див. Чат), але якщо ви збираєтесь її використовувати, то ігнорування коментарів, які редагуються, це, безумовно, правильна річ.
Пітер Тейлор

#### 2 ->: ####
Логічний лицар

Відповіді:


4

CJam, 144 150 байт

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

Спробував кодування ...

Оновлено, оскільки вага ваги bзмінилася.

Ще одне кодування, яке є теоретично кращим (140 байт):

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

5

Python 2, 120 байт

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

Правка: знижена вартість з деякими дешевшими символами.





1

PHP (131 символів)

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

Оптимізується, коли зважування стане чіткішим.


Ваш код може бути переписаний на це: 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";}що може не працювати. Але це на 6 байт коротше! Можливо, ви можете взяти щось звідси.
Ісмаїл Мігель

0

Java, 318 байт

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);}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.