sfondo
Una fonte di ennui nei giochi di ruolo da tavolo riguarda i tiri che coinvolgono molti dadi. Lanciare un incantesimo di disintegrazione può essere istantaneo, ma lanciare e sommare 40 dadi certamente non lo è!
Un certo numero di suggerimenti per gestirlo sono discussi su rpg.stackexchange.com . Alcuni di loro, tuttavia, come usare un programma a rulli o fare una media dei dadi, tolgono un po 'di divertimento e senso di controllo ai giocatori. Altri, come tirare 4 dadi e moltiplicare il totale per 10, rendono i risultati molto più oscillanti (mentre la media dei dadi agisce nella direzione opposta).
Questa domanda riguarda un metodo per ridurre il numero di tiri di dado senza cambiare il risultato medio (media) o la sua oscillazione (varianza).
Notazione e matematica
In questa domanda, useremo la seguente notazione per rappresentare i tiri di dado:
- n d k (ad es. 40d6) si riferisce alla somma di n tiri di un dado a faccia k.
- n d k * c (es. 4d6 * 10) descrive la moltiplicazione del risultato per una costante c.
- Possiamo anche aggiungere rotoli (ad es. 4d6 * 10 + 40d6) e costanti (ad es. 4d6 + 10).
Per un singolo tiro di dado, possiamo dimostrare che:
- Media : E [1d k ] = (k + 1) / 2
- Varianza : Var (1d k ) = (k-1) (k + 1) / 12
Utilizzando le proprietà di base di media e varianza, possiamo inoltre dedurre che:
- 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 )
Compito
Dato tre numeri interi n , k e r , il programma dovrebbe produrre un modo di ravvicinare n d k al massimo in r rotoli, con le seguenti limitazioni:
- La soluzione dovrebbe avere la stessa media e varianza di n d k .
- La soluzione dovrebbe contenere il maggior numero possibile di rotoli inferiore o uguale a r , poiché un numero maggiore di rotoli produce una distribuzione più uniforme.
- Dovresti limitare le tue soluzioni all'uso solo dei dadi a lato k , a meno che tu non stia mirando al Bonus (vedi sotto).
- Se non esiste una soluzione (poiché r è troppo piccola), il programma dovrebbe generare la stringa "I AM A SEXY SHOELESS GOD OF WAR!".
- I parametri vengono passati come una singola stringa separata da spazio.
- Si può presumere che 1 ≤ n ≤ 100, 1 ≤ r ≤ n e che k sia uno di 4, 6, 8, 10, 12 e 20 (i dadi standard usati nei tavoli).
- L'output dovrebbe essere nel formato descritto in Notazione (ad es. 4d6 * 10 + 5), con spazi opzionali intorno a + s ma in nessun altro luogo. Anche i moltiplicatori di unità sono opzionali: sono validi sia 4d6 * 1 che 4d6.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), argomento della riga di comando o argomento della funzione. I risultati devono essere stampati su STDOUT (o alternativa più vicina) o restituiti come stringa.
Esempi
>> "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!
punteggio
Il codice più corto vince. Si applicano le regole standard.
indennità
-33% (arrotondato per difetto prima della sottrazione) se il programma restituisce anche soluzioni che includono dadi validi diversi da k (dove i valori validi, come menzionato sopra, sono 4, 6, 8, 10, 12 e 20). Se scegli di farlo, dovresti sempre restituire tali soluzioni quando appropriato e gestire soluzioni che utilizzano più tipi di matrici. Esempio:
>> "7 4 3"
3d6+7