Esse desafio se comportará mais ou menos como um código-golfe tradicional . A única diferença é que, em vez de marcar as respostas pelo número de caracteres ou bytes, os usuários atribuirão pesos a caracteres diferentes nos comentários e o programa com o menor peso acumulado ganhará.
Desafio
Sua tarefa é escrever um programa que pega uma sequência e imprime uma forma de diamante onde o primeiro caractere começa no centro e os caracteres subsequentes ocupam os espaços vazios ortogonais ao conjunto de caracteres que foram colocados por último. Espaços ( ) serão usados para preenchimento.
Por exemplo, a entrada CAT
produziria
T
TAT
TACAT
TAT
T
e ()
produziria
)
)()
)
e desserts
produziria
s
sts
strts
strerts
streserts
stressserts
stressesserts
stressedesserts
stressed desserts
stressedesserts
stressesserts
stressserts
streserts
strerts
strts
sts
s
e 9
produziria 9
.
Detalhes
O código pode conter apenas ASCII e novas linhas imprimíveis . (Veja o porquê abaixo.)
A entrada / saída deve ser via stdin / stdout ou, se não for possível, usar alternativas semelhantes.
Você pode assumir que a sequência de entrada contém apenas ASCII imprimível (incluindo espaço).
Colunas dos espaços à esquerda que não contêm nenhuma parte do padrão de diamante não são permitidas na saída. Qualquer quantidade e combinação de espaços à direita é permitida.
Opcionalmente, pode haver uma nova linha à direita na saída.
Você pode editar sua resposta quantas vezes quiser.
Pontuação
Todo o código deve ser escrito usando apenas novas linhas e os 95 caracteres ASCII imprimíveis:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(Infelizmente, as guias não são permitidas porque o Stack Exchange as processa como espaços nos blocos de código.)
Cada um desses 96 caracteres possui um valor de peso associado. Por padrão, todos os pesos são 97.
A pontuação de um programa é a soma dos valores de peso para cada um de seus caracteres. Por exemplo, se o programa fosse print(4)
e o peso 4
fosse 70, mas inalterado para todo o resto, a pontuação seria 749 = 97+97+97+97+97+97+70+97
.
Depois que a atividade nesta pergunta se estabiliza em quase nada, o envio de pontuação mais baixa vence. No caso presumivelmente improvável de empate, as vitórias vão para a resposta mais votada.
Alteração de pesos
Todo usuário, tenha respondido ou não, pode alterar o peso de um dos 96 caracteres para um valor exclusivo de 1 a 96. Para fazer isso, adicione um comentário a esta pergunta do formulário #### W -> C ####
, onde W é um número inteiro de 1 a 96 e C é o caractere (como ele próprio, sem aspas, sem reticências). Use \n
no lugar de C para novas linhas e \s
para espaço, pois o Stack Exchange compacta 3 espaços seguidos. O print(4)
exemplo acima teria o comentário #### 70 -> 4 ####
.
Cada usuário pode fazer apenas UM comentário como esse, e isso só será válido se o caractere e o valor do peso não tiverem sido usados em um comentário feito anteriormente. Assim, eventualmente, pode haver 96 #### W -> C ####
comentários, todos de usuários diferentes, todos com pesos diferentes atribuídos a caracteres diferentes.
Os usuários podem excluir seu próprio comentário, se quiserem, redefinindo o peso de seus personagens para 97 até que eles ou outra pessoa comentem novamente. Eles também podem editá-los. Os comentários que não seguem as regras sobre usuários / pesos / caracteres distintos devem ser excluídos ou sinalizados como "não construtivos". Comentários gerais sobre regras e outras coisas estão bem, mas devem ser mantidos no mínimo.
Este snippet de pilha é o placar oficial desta pergunta. Ele calcula automaticamente as pontuações de todos os envios, reunindo os pesos dos comentários toda vez que é executado. Não lida com laços. Você também pode usá-lo para verificar a pontuação que um programa teria.
Você provavelmente precisará right-click -> Open link in new tab
dos links.
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>
Para que este cabeçalho funcione, os comentários devem estar no formato exato descrito acima e o código do seu programa deve estar no primeiro bloco de código de várias linhas da sua resposta ( <pre><code>...</code></pre>
os). Não use o destaque da sintaxe ou seu código não será lido corretamente. O snippet pode demorar um ou dois minutos antes de ser atualizado.
Não testei o snippet completamente, mas vou ficar de olho nele enquanto o concurso começa. Se você notar algum erro, por favor me diga. Aqui está uma versão não minificada:
Lembre-se de que esse sistema de pontuação é completamente novo e experimental. Espero que o Stack Exchange não se importe com o fato de envolver muitos comentários. : P
Desafio relacionado: Imprima este diamante
fonte
Respostas:
CJam,
144150 bytesTentei alguma codificação ...
Atualizado porque o peso de
b
mudou.Outra codificação que só é melhor em teoria (140 bytes):
fonte
Python 2, 120 bytes
Edit: Custo reduzido com alguns caracteres mais baratos.
fonte
Pitão , 21 bytes
Experimente on-line: Compilador / Executor Pyth
fonte
CJam, 31 bytes
Apenas uma adaptação da minha resposta para Imprimir este diamante por enquanto. Eu posso ajustá-lo quando os pesos mudarem.
Teste aqui.
fonte
J, 45 caracteres
Longish solução, vai golf-lo com alguns caracteres baratos ...
Experimente online. (Adicione uma string de entrada com aspas simples.)
fonte
PHP (131 caracteres)
http://3v4l.org/9Vvkm
Otimizará quando as ponderações forem mais claras.
fonte
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";}
que pode não funcionar. Mas é 6 bytes mais curto! Provavelmente você pode pegar algo daqui.Java, 318 bytes
fonte