Code de golf marqué par l'utilisateur - Dessin de diamants [expérimental]

11

Ce défi se comportera plus ou moins comme un 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 CATproduirait

  T  
 TAT 
TACAT
 TAT 
  T  

et ()produirait

 ) 
)()
 ) 

et  dessertsproduirait

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

et 9produirait 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 \spour 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 tabpour 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):&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>

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

Loisirs de Calvin
la source
#### 1 -> * ####
Martin Ender
Les commentaires peuvent être modifiés pendant 5 minutes, donc leur permettre de modifier pourrait provoquer un havok complet avec les règles de non-répétition.
Peter Taylor
@PeterTaylor Mais comment puis-je éventuellement arrêter les modifications de commentaires? En plus d'ignorer totalement ceux qui sont modifiés. 5 minutes vont assez vite.
Calvin's Hobbies
1
Je n'aime pas du tout ce système de notation (voir le chat), mais si vous allez l'utiliser, ignorer les commentaires qui sont modifiés est certainement la bonne chose à faire.
Peter Taylor
#### 2 ->: ####
Logic Knight

Réponses:

4

CJam, 144 150 octets

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

J'ai essayé un peu d'encodage ...

Mis à jour car le poids de ba changé.

Un autre encodage qui n'est que mieux en théorie (140 octets):

":***(*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
la source
5

Python 2, 120 octets

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

Edit: coût réduit avec certains personnages moins chers.

Logic Knight
la source
2

CJam, 31 octets

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

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.

Martin Ender
la source
1

J, 45 caractères

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

Solution longue, jouera avec des caractères bon marché ...

Essayez-le en ligne. (Ajoutez une chaîne d'entrée avec des guillemets simples.)

randomra
la source
1

PHP (131 caractères)

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

Optimisera une fois les pondérations plus claires.

Stephen
la source
Votre code peut être réécrit en ceci: ce 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.
Ismael Miguel
0

Java, 318 octets

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
la source