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