Dada una entrada n
donde 3 <= n <= 25
, realice los siguientes pasos, comenzando con un n
dado de un solo lado (caras en el rango [1, n]
, inclusive):
- Imprima el resultado de tirar los
n
dados del lado actual en juego, en la forma kdn: X
(donde X
está el resultado y k
es el número de dados en juego).
- Si
X
es mayor o igual que n/2
el número de dados en juego, agrega un dado. De lo contrario, retire un dado.
- Si el número de dados en juego es igual a
0
o n
, pare. De lo contrario, vaya al paso 1.
Ejecuciones de ejemplo (tenga en cuenta que el resultado entre paréntesis es para explicación y no es obligatorio):
6 lados:
1d6: 4 (avg: 3.0, add)
2d6: 6 (avg: 6.0, add)
3d6: 9 (avg: 9.0, add)
4d6: 16 (avg: 12.0, add)
5d6: 13 (avg: 15.0, remove)
4d6: 9 (avg: 12.0, remove)
3d6: 5 (avg: 9.0, remove)
2d6: 7 (avg: 6.0, add)
3d6: 11 (avg: 9.0, add)
4d6: 14 (avg: 12.0, add)
5d6: 17 (avg: 15.0, add)
9 lados:
1d9: 7 (avg: 4.5, add)
2d9: 14 (avg: 9.0, add)
3d9: 18 (avg: 13.5, add)
4d9: 18 (avg: 18.0, add)
5d9: 28 (avg: 22.5, add)
6d9: 26 (avg: 27.0, remove)
5d9: 28 (avg: 22.5, add)
6d9: 34 (avg: 27.0, add)
7d9: 33 (avg: 31.5, add)
8d9: 30 (avg: 36.0, remove)
7d9: 29 (avg: 31.5, remove)
6d9: 35 (avg: 27.0, add)
7d9: 32 (avg: 31.5, add)
8d9: 42 (avg: 36.0, add)
Reglas
- Las salidas deben estar exactamente en el formato
kdn: X
, con nuevas líneas que separen cada rollo
- En realidad, debes simular lanzar múltiples dados; simplemente
[1, n]
no está permitido devolver un número entero aleatorio en el rango (inclusive) multiplicado por el número de dados actualmente en juego, ya que eso no simula con precisión el lanzamiento de múltiples dados.
- Las lagunas estándar están prohibidas
- Este es el código de golf , por lo que gana la respuesta más corta en bytes
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera la tabla de clasificación a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 65904; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Respuestas:
Pyth, 37 bytes
Pruébalo en línea.
fuente
Mathematica,
958980 caracteresSin golf
fuente
Echo
desafortunadamente no puede tomar una secuencia de entradas como loPrint
hace.PHP,
164121112113109 bytesVersión final, lo prometo. Mejorado usando la sugerencia de Titus:
EDITAR: se agregó un byte adicional para formatear. Olvidé que hay un IF allí que, gracias a soltar el texto "agregar / sub", podría haber sido un operador ternario:
La salida ahora se ve así:
EDITAR: ¡Gracias a @Manatwork, me salvó mucho! Versión nueva y mejorada:
Entrada anterior:
Tira los troqueles separados, genera esto:
Y se llama así:
d(6, 1);
¿Es obligatorio mostrar el sufijo
Add
ySub
? Esto no está claro en su pregunta.fuente
function d($x,$y=1){for($i=$y;$i--;)$r+=rand(1,$x);echo$y."d$x, $r↵";$r/$y>$x/2?$y++:$y--;if($y<$x&&$y)d($x,$y);}
$y-=$r/$y>$x/2?:-1
Pitón 3, 125
Guardado 3 bytes gracias a DSM.
Bastante simple, tira un montón de dados y verifica el promedio. Nada demasiado lujoso aquí todavía.
Necesita ser llamado con un int. Entonces,
x(6)
producirá algo como esto:.
fuente
JavaScript (ES6), 97
102106112bytesGracias @ user81655 y @Jupotter por salvarme unos pocos bytes.
Manifestación
Esto solo funciona en navegadores compatibles con ES6 (en este momento incluye Firefox y Edge, posiblemente con Chrome y Opera con funciones experimentales de JavaScript habilitadas):
fuente
while
a unfor
bucle, redondear hacia abajo en|0
lugar de~~()
y mover algunas declaraciones para que pueda eliminar los corchetes para guardar algunos bytes. También se le permite convertirlo en una función anónima (nof=
). 103 bytes:n=>{for(k=1;k&&k!=n;k+=x<k*n/2?-1:1)for(x=i=0;i++<=k;console.log(k+`d${n}: `+x))x+=1+Math.random()*n|0}
console.log
el otrofor
bucle (me costó 1 char más que el suyo). Todavía lo bajé a 106k&&k!=n
condición por la comparaciónk%n!=0
k%n
funciona aún mejor;)CJam, 45 bytes
Pruébalo en línea.
Implementa la especificación de forma bastante literal (incluida la fórmula matemáticamente incorrecta de "balance medio"). Como se esperaba, portar el programa GolfScript original a continuación a CJam ahorró un montón de bytes debido a nombres de comando integrados más cortos ( y
mr
, en lugar de , y ).o
g
rand
puts
do
GolfScript, 51 bytes
Aquí está mi entrada original de GolfScript. Entre los trucos de golf más notables se incluyen el uso del número
1
como una variable convenientemente preinicializada para almacenar el número actual de dados que se lanzarán. (En su lugarX
, utiliza la versión de CJam , que CJam se inicializa con el valor 1.)PD. Al ver el título, originalmente quería responder esto en AnyDice . Pero resulta ser una elección horrible para este desafío, y no creo que sea técnicamente posible usarlo para implementar esta especificación como se indica.
El problema es que AnyDice es un lenguaje específico de dominio para escribir programas deterministas para calcular estadísticas de lanzamiento de dados. Al inspeccionar los posibles resultados de un rollo y hacer rollos condicionales basados en ellos es posible a través de la repetición, no hay manera de generar cualquier aleatoriedad real. Entonces, si bien podría simular esta secuencia de tiradas de dados en AnyDice, todo lo que puede obtener como resultado son estadísticas sobre cosas como, por ejemplo, el número de tiradas hasta que finalice el proceso, o la distribución de resultados en un paso dado.
Dicho todo esto, aquí está lo más cerca que pude llegar a AnyDice :
Este no es un código particularmente golfizado, ya que parecía un ejercicio inútil. Los trucos estándar de golf en el lenguaje de llaves, como acortar los nombres de las funciones y eliminar espacios en blanco innecesarios, deberían agotar la mayor parte del potencial de golf de todos modos.
El truco clave utilizado aquí es que, cuando llama a una función que espera un número (como se indica
:n
en la definición de la función) en AnyDice, y le pasa un dado (es decir, una distribución de probabilidad), AnyDice evalúa automáticamente la función para todos los posibles valores del dado, y combina los resultados en un nuevo dado.Aquí hay una captura de pantalla de la salida (en formato de gráfico de barras) para los primeros tres rollos:
(Nota que el "0" columna en cada gráfico indica la probabilidad de que la iteración se detuvo, debido al número de dados que golpean ya sea 0 o N, antes de que el rollo actual. Esto pasa a ser una manera conveniente de representar la condición de parada, ya por supuesto, rodar 0dN siempre produce 0.)
fuente
R, 103 bytes
Una implementación bastante sencilla. Los dados se hacen por rollos
sum(sample(n,i))
.Prueba de funcionamiento
fuente
CoffeeScript,
10699 bytesSin golf
fuente
Julia, 77 bytes
La mayor parte de esto debería explicarse por sí mismo: se está utilizando una nueva línea real en la
print
cadena en lugar de usarlaprintln
para guardar un byte.rand(1:n,N)
produceN
enteros aleatorios entre 1 yn
.fuente
Ruby,
939082 caracteresEjecución de muestra:
fuente
QBIC , 83 bytes (no competitivos)
Explicación:
fuente
PHP, 104 bytes
Corre con
php -r '<code>' <N>
Descompostura
fuente