fundo
Uma fonte de tédio nos RPGs de mesa é lidar com jogadas envolvendo muitos dados. Lançar um feitiço de desintegração pode ser instantâneo, mas rolar e somar 40 dados certamente não é!
Várias sugestões para lidar com isso são discutidas em rpg.stackexchange.com . Alguns deles, no entanto, como o uso de um programa de rolagem ou a média de dados, retiram parte da diversão e senso de controle dos jogadores. Outros, como rolar 4 dados e multiplicar o total por 10, tornam os resultados muito mais instáveis (enquanto a média dos dados age na direção oposta).
Esta questão diz respeito a um método de reduzir o número de jogadas de dados sem alterar o resultado médio (média) ou sua oscilação (variação).
Notação e matemática
Nesta pergunta, usaremos a seguinte notação para representar lançamentos de dados:
- n d k (por exemplo 40d6) refere-se à soma de n rolos de fieira k lados.
- n d k * c (por exemplo, 4d6 * 10) descreve a multiplicação do resultado por uma constante c.
- Também podemos adicionar rolos (por exemplo, 4d6 * 10 + 40d6) e constantes (por exemplo, 4d6 + 10).
Para um único rolo de matriz, podemos mostrar que:
- Média : E [1d k ] = (k + 1) / 2
- Variância : Var (1d k ) = (k-1) (k + 1) / 12
Usando as propriedades básicas de média e variância, podemos ainda inferir que:
- Média : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn . [1d l ] + c
- Variância : Var ( m d k * a + n d l * b + c ] = a ². M. Var (1d k ) + b ². N .Var (1d l )
Tarefa
Dado três números inteiros n , k e r , seu programa deve gerar uma maneira de aproximar n d k no máximo de r rolos, com as seguintes restrições:
- A solução deve ter a mesma média e variação que n d k .
- A solução deve conter o maior número possível de rolos menor ou igual a r , pois mais rolos produz uma distribuição mais suave.
- Você deve restringir suas soluções a usar apenas dados do lado k , a menos que esteja buscando o bônus (veja abaixo).
- Se não houver solução (como r é muito pequeno), o programa deve exibir a sequência "EU SOU UM DEUS DA GUERRA SEM SEXY!".
- Os parâmetros são passados como uma única sequência separada por espaço.
- Você pode assumir que 1 ≤ n ≤ 100, 1 ≤ r ≤ n e que k é um dos 4, 6, 8, 10, 12 e 20 (os dados padrão usados nas mesas).
- A saída deve estar no formato descrito em Notação (por exemplo, 4d6 * 10 + 5), com espaços opcionais em torno de + s, mas em nenhum outro lugar. Os multiplicadores de unidades também são opcionais: 4d6 * 1 e 4d6 são válidos.
Você pode escrever um programa ou função, recebendo informações via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função. Os resultados devem ser impressos em STDOUT (ou alternativa mais próxima) ou retornados como uma sequência.
Exemplos
>> "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!
Pontuação
O menor código vence. Aplicam-se regras padrão.
Bônus
-33% (arredondado antes da subtração) se o seu programa também retornar soluções que incluam dados válidos que não sejam k (onde os valores válidos, como mencionado acima, são 4, 6, 8, 10, 12 e 20). Se você optar por fazê-lo, sempre retorne essas soluções quando apropriado e lide com soluções que usem vários tipos de matriz. Exemplo:
>> "7 4 3"
3d6+7
fonte
Respostas:
GolfScript (
163 143133 bytes)Demonstração online
Quando não se misturam tipos de dados, o problema se reduz a expressar
n
como uma soma de não mais quer
quadrados ek
é irrelevante, exceto pelo cálculo da constante no final. A maior parte desta resposta é a contabilidade necessária para expressar o resultado no formato desejado: o cálculo real é^\?,{^base}%{0\{.*+}/^=},
para encontrar os factores de multiplicaçãoa
,b
etc .; e^@{-}/@)*.2/
para calcular a constante.Dissecação
fonte
Python,
487461452 - 33% = 303 bytesComo ninguém mais o fez, aqui está uma solução que lida com diferentes tipos de dados. Como a outra solução, gera uma variedade de soluções possíveis e as filtra. Ele usa o fato de que (k + 1) (k-1) = k ^ 2-1 e duas semi-brechas na especificação (oops!): A falta de proibição de imprimir a forma redundante 0d k * a (o que economiza todos os 5 bytes!) e a falta de restrição de tempo de execução (fica lento muito rapidamente, embora execute todos os exemplos fornecidos).
Para uma saída mais bonita, adicione
if x[0]
depois"%sd%s*%s"%x for x in s
:fonte