Vom Benutzer bewerteter Code Golf - Diamanten zeichnen [experimentell]

11

Diese Herausforderung wird sich mehr oder weniger wie ein traditionelles verhalten . Der einzige Unterschied besteht darin, dass Benutzer anstelle der Bewertung der Antworten anhand der Anzahl der Zeichen oder Bytes verschiedenen Zeichen in den Kommentaren Gewichte zuweisen und das Programm mit der niedrigsten kumulativen Gewichtung gewinnt.

Herausforderung

Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Zeichenfolge verwendet und eine Rautenform druckt, bei der das erste Zeichen in der Mitte beginnt und nachfolgende Zeichen die Leerzeichen orthogonal zu den zuletzt platzierten Zeichen belegen. Leerzeichen ( ) werden zum Auffüllen verwendet.

Zum Beispiel CATwürde die Eingabe erzeugen

  T  
 TAT 
TACAT
 TAT 
  T  

und ()würde produzieren

 ) 
)()
 ) 

und  dessertswürde produzieren

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

und 9würde produzieren 9.

Einzelheiten

  • Der Code darf nur druckbare ASCII- und Zeilenumbrüche enthalten. (Siehe warum unten.)

  • Die Eingabe / Ausgabe sollte über stdin / stdout erfolgen oder, falls dies nicht möglich ist, ähnliche Alternativen verwenden.

  • Sie können davon ausgehen, dass die Eingabezeichenfolge nur druckbares ASCII (einschließlich Leerzeichen) enthält.

  • Spalten mit führenden Leerzeichen, die keinen Teil des Rautenmusters enthalten, sind in der Ausgabe nicht zulässig. Jede Anzahl und Kombination von Leerzeichen ist zulässig.

  • Optional kann die Ausgabe einen nachgestellten Zeilenumbruch enthalten.

  • Sie können Ihre Antwort so oft bearbeiten, wie Sie möchten.

Wertung

Der gesamte Code darf nur mit Zeilenumbrüchen und den 95 druckbaren ASCII-Zeichen geschrieben werden:

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

(Tabs sind leider nicht zulässig, da Stack Exchange sie als Leerzeichen in Codeblöcken rendert.)

Jedem dieser 96 Zeichen ist ein Gewichtungswert zugeordnet. Standardmäßig sind alle Gewichte 97.

Die Punktzahl eines Programms ist die Summe der Gewichtswerte für jedes seiner Zeichen. Wenn zum Beispiel das Programm wäre print(4)und das Gewicht für 470 wäre, aber für alles andere unverändert, wäre die Punktzahl 749 = 97+97+97+97+97+97+70+97.

Sobald sich die Aktivität in dieser Frage auf fast nichts beruhigt hat, gewinnt die Einreichung mit der niedrigsten Punktzahl. Im vermutlich unwahrscheinlichen Fall eines Unentschieden gehen die Siege an die Antwort mit der höchsten Stimme.

Gewichte ändern

Jeder Benutzer, unabhängig davon, ob er geantwortet hat oder nicht, kann die Gewichtung eines der 96 Zeichen auf einen eindeutigen Wert von 1 bis 96 ändern. Fügen Sie dazu einen Kommentar zu dieser Frage des Formulars hinzu #### W -> C ####, wobei W eine Ganzzahl von ist 1 bis 96 und C ist das Zeichen (wie selbst, keine Anführungszeichen, keine Backticks). Verwenden Sie \nanstelle von C Zeilenumbrüche und \sLeerzeichen, da Stack Exchange 3 Leerzeichen hintereinander komprimiert. Das print(4)obige Beispiel hätte den Kommentar gehabt #### 70 -> 4 ####.

Jeder Benutzer darf nur EINEN Kommentar wie diesen abgeben, und dieser ist nur gültig, wenn sowohl das Zeichen als auch der Gewichtswert nicht in einem zuvor gemachten Kommentar verwendet wurden. Somit kann es schließlich 96 #### W -> C ####Kommentare geben, alle von verschiedenen Benutzern, alle mit unterschiedlichen Gewichten, die verschiedenen Zeichen zugewiesen sind.

Benutzer können ihren eigenen Kommentar löschen, wenn sie möchten, und das Gewicht ihrer Charaktere auf 97 zurücksetzen, bis sie oder eine andere Person erneut Kommentare abgeben. Sie können sie auch bearbeiten. Kommentare, die nicht den Regeln für bestimmte Benutzer / Gewichte / Zeichen entsprechen, sollten gelöscht oder als "nicht konstruktiv" gekennzeichnet werden. Allgemeine Kommentare zu Regeln und anderen Dingen sind in Ordnung, sollten aber auf ein Minimum beschränkt werden.

Dieses Stack-Snippet ist die offizielle Rangliste für diese Frage. Es berechnet automatisch die Punktzahlen für alle Einsendungen, indem bei jeder Ausführung die Gewichte aus den Kommentaren erfasst werden. Es geht nicht um Krawatten. Sie können es auch verwenden, um die Punktzahl eines Programms zu überprüfen.

Sie müssen wahrscheinlich right-click -> Open link in new tabfür die 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):&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>

Damit diese Rangliste funktioniert, müssen die Kommentare genau das oben beschriebene Format haben und der Code Ihres Programms muss sich im ersten mehrzeiligen Codeblock in Ihrer Antwort ( <pre><code>...</code></pre>denjenigen) befinden. Verwenden Sie keine Syntaxhervorhebung, da Ihr Code sonst nicht richtig gelesen wird. Es kann ein oder zwei Minuten dauern, bis das Snippet aktualisiert wird.

Ich habe das Snippet nicht gründlich getestet, aber ich werde es im Auge behalten, wenn dieser Wettbewerb beginnt. Wenn Sie Fehler bemerken, sagen Sie es mir bitte. Hier ist eine nicht minimierte Version:

Denken Sie daran, dass dieses Bewertungssystem völlig neu und experimentell ist. Hoffentlich macht es Stack Exchange nichts aus, dass es Unmengen von Kommentaren enthält. : P.

Verwandte Herausforderung: Drucken Sie diesen Diamanten

Calvins Hobbys
quelle
#### 1 -> * ####
Martin Ender
Kommentare können 5 Minuten lang bearbeitet werden. Wenn Sie sie also bearbeiten, kann dies zu einem völligen Chaos mit den Nichtwiederholungsregeln führen.
Peter Taylor
@PeterTaylor Aber wie kann ich möglicherweise die Bearbeitung von Kommentaren stoppen? Abgesehen davon, dass diejenigen, die bearbeitet werden, völlig ignoriert werden. 5 Minuten vergehen ziemlich schnell.
Calvins Hobbys
1
Ich mag dieses Bewertungssystem überhaupt nicht (siehe Chat), aber wenn Sie es verwenden wollen, ist es definitiv richtig, Kommentare zu ignorieren, die bearbeitet werden.
Peter Taylor
#### 2 ->: ####
Logic Knight

Antworten:

4

CJam, 144 150 Bytes

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

Versuchte einige Codierung ...

Aktualisiert, da sich das Gewicht von bgeändert hat.

Eine andere Codierung, die theoretisch nur besser ist (140 Bytes):

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

Python 2, 120 Bytes

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

Bearbeiten: Geringere Kosten mit einigen günstigeren Charakteren.

Logikritter
quelle
2

CJam, 31 Bytes

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

Nur eine Anpassung meiner Antwort auf Print this Diamond . Ich könnte es optimieren, wenn sich die Gewichte geändert haben.

Testen Sie es hier.

Martin Ender
quelle
1

J, 45 Zeichen

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

Längere Lösung, wird es mit ein paar billigen Zeichen Golf spielen ...

Probieren Sie es online aus. (Fügen Sie die Eingabezeichenfolge mit einfachen Anführungszeichen hinzu.)

randomra
quelle
1

PHP (131 Zeichen)

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

Optimiert, sobald die Gewichtungen klarer sind.

Stephen
quelle
Ihr Code wird möglicherweise wie folgt umgeschrieben: Dies 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";}funktioniert möglicherweise nicht. Aber es ist 6 Bytes kürzer! Wahrscheinlich könnten Sie etwas von hier nehmen.
Ismael Miguel
0

Java, 318 Bytes

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
quelle