Пользователь набрал код Golf - Drawing Diamonds [экспериментальная]


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>те, что указаны). Не используйте подсветку синтаксиса, иначе ваш код не будет прочитан правильно. Фрагмент может занять минуту или две, прежде чем он обновится.

Я не проверил фрагмент полностью, но буду следить за ним, так как этот конкурс начинается. Если вы заметили какие-либо ошибки, пожалуйста, сообщите мне. Вот не минимизированная версия:

Имейте в виду, что эта система начисления баллов является абсолютно новой и экспериментальной. Надеемся, что Stack Exchange не будет возражать, что в нем содержится множество комментариев. :П

Связанная задача: Распечатать этот бриллиант


#### 1 -> * ####
Мартин Эндер

Комментарии можно редактировать в течение 5 минут, поэтому их редактирование может привести к полному нарушению правил неповторения.
Питер Тейлор

@PeterTaylor Но как я могу остановить редактирование комментариев? Кроме того, полностью игнорируя те, которые редактируются. 5 минут идет довольно быстро.
Увлечения Кэлвина

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

Ответы:


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

J, 45 символов

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

Длинное решение, будет играть в гольф с некоторыми дешевыми символами ...

Попробуйте онлайн. (Добавьте входную строку с одинарными кавычками.)


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.