Código de puntaje de usuario Golf: dibujo de diamantes [experimental]

11

Este desafío se comportará más o menos como un tradicional . La única diferencia es que, en lugar de puntuar las respuestas por su número de caracteres o bytes, los usuarios asignarán pesos a diferentes caracteres en los comentarios y el programa con el menor peso acumulado ganará.

Desafío

Su tarea es escribir un programa que tome una cadena e imprima una forma de diamante donde el primer carácter comienza en el centro y los caracteres posteriores ocupan los espacios vacíos ortogonales al conjunto de caracteres que se colocaron en último lugar. Los espacios ( ) se utilizarán para el relleno.

Por ejemplo, ingresar CATproduciría

  T  
 TAT 
TACAT
 TAT 
  T  

y ()produciría

 ) 
)()
 ) 

y  dessertsproduciría

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

y 9produciría 9.

Detalles

  • El código solo puede contener ASCII imprimible y líneas nuevas. (Vea por qué a continuación).

  • La entrada / salida debe ser a través de stdin / stdout o, si no es posible, use alternativas similares.

  • Puede suponer que la cadena de entrada solo contiene ASCII imprimible (incluido el espacio).

  • Las columnas de espacios iniciales que no contienen ninguna parte del patrón de diamante no están permitidas en la salida. Se permite cualquier cantidad y combinación de espacios finales.

  • Opcionalmente, puede haber una nueva línea final en la salida.

  • Puede editar su respuesta tanto como desee.

Puntuación

Todo el código debe escribirse utilizando solo nuevas líneas y los 95 caracteres ASCII imprimibles:

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

(Lamentablemente, las pestañas no están permitidas porque Stack Exchange las representa como espacios en bloques de código).

Cada uno de estos 96 caracteres tiene un valor de peso asociado. Por defecto, todos los pesos son 97.

La puntuación de un programa es la suma de los valores de peso para cada uno de sus caracteres. Por ejemplo, si el programa fuera print(4)y el peso 4fuera 70, pero sin cambios para todo lo demás, el puntaje sería 749 = 97+97+97+97+97+97+70+97.

Una vez que la actividad en esta pregunta se estabiliza en casi nada, gana la presentación con la puntuación más baja. En el caso presumiblemente improbable de empate, las victorias van a la respuesta más votada.

Cambio de pesos

Cada usuario, ya sea que haya respondido o no, puede cambiar el peso de uno de los 96 caracteres a un valor único de 1 a 96. Para hacer esto, agregue un comentario a esta pregunta del formulario #### W -> C ####, donde W es un número entero de 1 a 96 y C es el carácter (como sí mismo, sin comillas, sin comillas). Úselo \nen lugar de C para líneas nuevas y \spara espacio, ya que Stack Exchange comprime 3 espacios seguidos. El print(4)ejemplo anterior habría tenido el comentario #### 70 -> 4 ####.

Cada usuario solo puede hacer UN comentario como este, y solo será válido si tanto el carácter como el valor de peso no se han utilizado en un comentario hecho anteriormente. Por lo tanto, eventualmente, puede haber 96 #### W -> C ####comentarios, todos de diferentes usuarios, todos con diferentes pesos asignados a diferentes caracteres.

Los usuarios pueden eliminar sus propios comentarios si lo desean, restableciendo el peso de sus personajes a 97 hasta que ellos u otra persona realicen comentarios nuevamente. También pueden editarlos. Los comentarios que no sigan las reglas sobre usuarios / pesos / caracteres distintos deben eliminarse o marcarse como "no constructivos". Los comentarios generales sobre las reglas y otras cosas están bien, pero deben mantenerse al mínimo.

Este fragmento de pila es la tabla de clasificación oficial para esta pregunta. Calcula automáticamente los puntajes de todas las presentaciones al recopilar los pesos de los comentarios cada vez que se ejecuta. No maneja lazos. También puede usarlo para verificar el puntaje que tendría un programa.

Probablemente lo necesite right-click -> Open link in new tabpara los enlaces.

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>

Para que esta tabla de clasificación funcione, los comentarios deben estar en el formato exacto descrito anteriormente y el código de su programa debe estar en el primer bloque de código de varias líneas en su respuesta (las que <pre><code>...</code></pre>están). No utilice el resaltado de sintaxis o su código no se leerá correctamente. El fragmento puede demorar uno o dos minutos antes de actualizarse.

No he probado el fragmento a fondo, pero lo estaré vigilando a medida que este concurso comience. Si nota algún error, por favor dígame. Aquí hay una versión no minificada:

Tenga en cuenta que este sistema de puntuación es completamente nuevo y experimental. Esperemos que a Stack Exchange no le importe que implique toneladas de comentarios. :PAG

Desafío relacionado: imprimir este diamante

Pasatiempos de Calvin
fuente
#### 1 -> * ####
Martin Ender
Los comentarios se pueden editar durante 5 minutos, por lo que permitir que se editen podría causar un havok completo con las reglas de no repetición.
Peter Taylor
@PeterTaylor Pero, ¿cómo puedo detener las ediciones de comentarios? Además de ignorar totalmente los que están editados. 5 minutos pasan bastante rápido.
Hobbies de Calvin
1
No me gusta en absoluto este sistema de puntuación (ver chat), pero si vas a usarlo, ignorar los comentarios editados es definitivamente lo correcto.
Peter Taylor
#### 2 ->: ####
Logic Knight

Respuestas:

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~

Intenté un poco de codificación ...

Actualizado porque el peso de bha cambiado.

Otra codificación que solo es mejor en teoría (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
fuente
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

Editar: Costo reducido con algunos personajes más baratos.

Caballero Lógico
fuente
1

J, 45 caracteres

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

Solución larga, jugará golf con algunos caracteres baratos ...

Pruébalo en línea. (Añadir cadena de entrada con comillas simples).

randomra
fuente
1

PHP (131 caracteres)

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

Se optimizará una vez que las ponderaciones sean más claras.

Stephen
fuente
Su código puede reescribirse en esto: lo 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 podría no funcionar. ¡Pero es 6 bytes más corto! Probablemente puedas tomar algo de aquí.
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
fuente