Ce défi se comportera plus ou moins comme un golf de code traditionnel . La seule différence est qu'au lieu de noter les réponses par leur nombre de caractères ou d'octets, les utilisateurs attribueront des poids à différents caractères dans les commentaires et le programme avec le poids cumulatif le plus bas gagnera.
Défi
Votre tâche consiste à écrire un programme qui prend une chaîne et imprime une forme de losange où le premier caractère commence au centre et les caractères suivants occupent les espaces vides orthogonaux au jeu de caractères qui a été placé en dernier. Des espaces ( ) seront utilisés pour le remplissage.
Par exemple, la saisie CAT
produirait
T
TAT
TACAT
TAT
T
et ()
produirait
)
)()
)
et desserts
produirait
s
sts
strts
strerts
streserts
stressserts
stressesserts
stressedesserts
stressed desserts
stressedesserts
stressesserts
stressserts
streserts
strerts
strts
sts
s
et 9
produirait 9
.
Détails
Le code ne peut contenir que des caractères ASCII et des sauts de ligne imprimables . (Voir pourquoi ci-dessous.)
L'entrée / sortie doit se faire via stdin / stdout ou, si ce n'est pas possible, utiliser des alternatives similaires.
Vous pouvez supposer que la chaîne d'entrée contient uniquement de l'ASCII imprimable (y compris l'espace).
Les colonnes d'espaces de début ne contenant aucune partie du motif losange ne sont pas autorisées dans la sortie. N'importe quelle quantité et combinaison d'espaces de fin d'espaces est autorisée.
Il peut éventuellement y avoir un retour à la ligne de fin dans la sortie.
Vous pouvez modifier votre réponse autant que vous le souhaitez.
Notation
Tout le code doit être écrit en utilisant uniquement des retours à la ligne et les 95 caractères ASCII imprimables:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(Malheureusement, les tabulations ne sont pas autorisées car Stack Exchange les rend sous forme d'espaces dans des blocs de code.)
Chacun de ces 96 caractères a une valeur de poids qui lui est associée. Par défaut, tous les poids sont 97.
Le score d'un programme est la somme des valeurs de poids pour chacun de ses caractères. Par exemple, si le programme était print(4)
et le poids pour 4
était de 70, mais inchangé pour tout le reste, le score serait 749 = 97+97+97+97+97+97+70+97
.
Une fois que l'activité dans cette question se résume à presque rien, la soumission avec le score le plus bas gagne. Dans le cas vraisemblablement peu probable d'égalité, les victoires sont attribuées à la réponse la plus élevée.
Modification des poids
Chaque utilisateur, qu'il ait répondu ou non, peut changer le poids de l'un des 96 caractères en une valeur unique de 1 à 96. Pour ce faire, ajoutez un commentaire à cette question du formulaire #### W -> C ####
, où W est un entier de 1 à 96 et C est le caractère (comme lui-même, pas de guillemets, pas de guillemets). Utilisez \n
à la place de C pour les retours à la ligne et \s
pour l'espace car Stack Exchange comprime 3 espaces d'affilée. L' print(4)
exemple ci-dessus aurait eu le commentaire #### 70 -> 4 ####
.
Chaque utilisateur ne peut faire QU'UN commentaire comme celui-ci, et il ne sera valable que si le caractère et la valeur de poids n'ont pas été utilisés dans un commentaire précédemment fait. Ainsi, éventuellement, il peut y avoir 96 #### W -> C ####
commentaires, tous provenant d'utilisateurs différents, tous avec des poids différents attribués à différents personnages.
Les utilisateurs peuvent supprimer leur propre commentaire s'ils le souhaitent, réinitialisant le poids de leurs personnages à 97 jusqu'à ce qu'ils ou quelqu'un d'autre commente à nouveau. Ils peuvent également les modifier. Les commentaires ne respectant pas les règles concernant les utilisateurs / poids / caractères distincts doivent être supprimés ou marqués comme "non constructifs". Les commentaires généraux sur les règles et autres choses sont corrects mais devraient être réduits au minimum.
Cet extrait de pile est le classement officiel de cette question. Il calcule automatiquement les scores de toutes les soumissions en collectant les poids des commentaires chaque fois qu'il est exécuté. Il ne gère pas les liens. Vous pouvez également l'utiliser pour vérifier le score d'un programme.
Vous devrez probablement le faire right-click -> Open link in new tab
pour les liens.
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>
Pour que ce classement fonctionne, les commentaires doivent être dans le format exact décrit ci-dessus et le code de votre programme doit être dans le premier bloc de code multiligne de votre réponse ( <pre><code>...</code></pre>
ceux). N'utilisez pas la coloration syntaxique ou votre code ne sera pas lu correctement. L'extrait peut prendre une minute ou deux avant sa mise à jour.
Je n'ai pas testé l'extrait à fond, mais je garderai un œil dessus pendant le déroulement de ce concours. Si vous remarquez des bugs, dites-le moi. Voici une version non réduite:
Gardez à l'esprit que ce système de notation est complètement nouveau et expérimental. Avec un peu de chance, Stack Exchange ne verra pas d'inconvénient à impliquer des tonnes de commentaires. : P
Défi connexe: imprimer ce diamant
la source
Réponses:
CJam,
144150 octetsJ'ai essayé un peu d'encodage ...
Mis à jour car le poids de
b
a changé.Un autre encodage qui n'est que mieux en théorie (140 octets):
la source
Python 2, 120 octets
Edit: coût réduit avec certains personnages moins chers.
la source
Pyth , 21 octets
Essayez-le en ligne: Pyth Compiler / Executor
la source
CJam, 31 octets
Juste une adaptation de ma réponse pour imprimer ce diamant pour l'instant. Je pourrais le modifier lorsque les poids ont changé.
Testez-le ici.
la source
J, 45 caractères
Solution longue, jouera avec des caractères bon marché ...
Essayez-le en ligne. (Ajoutez une chaîne d'entrée avec des guillemets simples.)
la source
PHP (131 caractères)
http://3v4l.org/9Vvkm
Optimisera une fois les pondérations plus claires.
la source
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";}
qui pourrait ne pas fonctionner. Mais c'est 6 octets de moins! Vous pourriez probablement prendre quelque chose d'ici.Java, 318 octets
la source