Fondo
Una fuente de tedio en los juegos de rol de mesa es lidiar con tiradas que involucran muchos dados. Lanzar un hechizo de desintegración puede ser instantáneo, ¡pero lanzar y sumar 40 dados ciertamente no lo es!
Se discuten varias sugerencias para manejar esto en rpg.stackexchange.com . Sin embargo, algunos de ellos, como usar un programa de lanzamiento o promediar dados, les quitan algo de diversión y sentido de control a los jugadores. Otros, como lanzar 4 dados y multiplicar el total por 10, hacen que los resultados sean mucho más oscilantes (mientras que el promedio de los dados actúa en la dirección opuesta).
Esta pregunta se refiere a un método para reducir el número de tiradas de dados sin cambiar el resultado promedio (media) o su oscilación (varianza).
Notación y matemática
En esta pregunta, usaremos la siguiente notación para representar tiradas de dados:
- n d k (p. ej., 40d6) se refiere a la suma de n tiradas de un dado de k lados.
- n d k * c (por ejemplo, 4d6 * 10) describe la multiplicación del resultado por una constante c.
- También podemos agregar rollos (por ejemplo, 4d6 * 10 + 40d6) y constantes (por ejemplo, 4d6 + 10).
Para un solo dado, podemos mostrar que:
- Media : E [1d k ] = (k + 1) / 2
- Varianza : Var (1d k ) = (k-1) (k + 1) / 12
Usando las propiedades básicas de media y varianza, podemos inferir además que:
- Media : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn . [1d l ] + c
- Varianza : Var ( m d k * a + n d l * b + c ] = a ². M .Var (1d k ) + b ². N .Var (1d l )
Tarea
Dados tres enteros n , k y r , su programa debería generar una forma de aproximar n d k en la mayoría de los rollos r , con las siguientes restricciones:
- La solución debe tener la misma media y varianza que n d k .
- La solución debe contener el mayor número posible de rollos menor o igual a r , ya que más rollos producen una distribución más suave.
- Debes restringir tus soluciones a solo usar dados k -sided, a menos que estés apuntando a la Bonificación (ver más abajo).
- Si no hay solución (ya que r es demasiado pequeño), el programa debería generar la cadena "¡SOY UN DIOS DE GUERRA SEXY SHOELESS!".
- Los parámetros se pasan como una sola cadena separada por espacios.
- Puede suponer que 1 ≤ n ≤ 100, 1 ≤ r ≤ ny que k es uno de 4, 6, 8, 10, 12 y 20 (los dados estándar utilizados en las mesas).
- La salida debe estar en el formato descrito en Notación (por ejemplo, 4d6 * 10 + 5), con espacios opcionales alrededor de + s pero en ningún otro lugar. Los multiplicadores de unidades también son opcionales: tanto 4d6 * 1 como 4d6 son válidos.
Puede escribir un programa o función, tomando datos a través de STDIN (o la alternativa más cercana), argumento de línea de comandos o argumento de función. Los resultados deben imprimirse en STDOUT (o la alternativa más cercana) o devolverse como una cadena.
Ejemplos
>> "10 6 10"
10d6
>> "10 6 4"
2d6*2+2d6+14
>> "10 6 3"
1d6*3+1d6+21
>> "10 6 2"
1d6*3+1d6+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!
Tanteo
El código más corto gana. Aplican reglas estándar.
Prima
-33% (redondeado hacia abajo antes de la resta) si su programa también devuelve soluciones que incluyen dados válidos distintos de k (donde los valores válidos, como se mencionó anteriormente, son 4, 6, 8, 10, 12 y 20). Si elige hacerlo, siempre debe devolver dichas soluciones cuando sea apropiado y manejar soluciones que usan múltiples tipos de troqueles. Ejemplo:
>> "7 4 3"
3d6+7
fuente
Respuestas:
GolfScript (
163 143133 bytes)Demostración en línea
Cuando no se mezclan tipos de dados, el problema se reduce a expresarse
n
como una suma de no más quer
cuadrados, yk
es irrelevante, excepto para el cálculo de la constante al final. La mayor parte de esta respuesta es la contabilidad requerida para expresar el resultado en el formato deseado: el cálculo real es^\?,{^base}%{0\{.*+}/^=},
encontrar los factores de multiplicacióna
,b
etc .; y^@{-}/@)*.2/
para calcular la constante.Disección
fuente
Pitón,
487461452 - 33% = 303 bytesComo nadie más lo ha hecho, aquí hay una solución que maneja diferentes tipos de dados. Al igual que la otra solución, genera una gama de posibles soluciones y las filtra. Utiliza el hecho de que (k + 1) (k-1) = k ^ 2-1 y dos semi-lagunas en la especificación (¡Uy!): La falta de prohibición de imprimir la forma redundante 0d k * a (lo que ahorra todos de 5 bytes!), y la falta de restricción de tiempo de ejecución (se ralentiza bastante rápido, aunque ejecuta todos los ejemplos dados).
Para una salida más bonita, agregue
if x[0]
después de"%sd%s*%s"%x for x in s
:fuente