Este desafío se comportará más o menos como un código de golf 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 CAT
produciría
T
TAT
TACAT
TAT
T
y ()
produciría
)
)()
)
y desserts
produciría
s
sts
strts
strerts
streserts
stressserts
stressesserts
stressedesserts
stressed desserts
stressedesserts
stressesserts
stressserts
streserts
strerts
strts
sts
s
y 9
producirí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 4
fuera 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 \n
en lugar de C para líneas nuevas y \s
para 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 tab
para 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): <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 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
fuente
Respuestas:
CJam,
144150 bytesIntenté un poco de codificación ...
Actualizado porque el peso de
b
ha cambiado.Otra codificación que solo es mejor en teoría (140 bytes):
fuente
Python 2, 120 bytes
Editar: Costo reducido con algunos personajes más baratos.
fuente
Pyth , 21 bytes
Pruébelo en línea: Pyth Compiler / Executor
fuente
CJam, 31 bytes
Solo una adaptación de mi respuesta para imprimir este diamante por ahora. Podría ajustarlo cuando los pesos hayan cambiado.
Pruébalo aquí.
fuente
J, 45 caracteres
Solución larga, jugará golf con algunos caracteres baratos ...
Pruébalo en línea. (Añadir cadena de entrada con comillas simples).
fuente
PHP (131 caracteres)
http://3v4l.org/9Vvkm
Se optimizará una vez que las ponderaciones sean más claras.
fuente
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í.Java, 318 bytes
fuente