Hintergrund
Eine Quelle der Langeweile in Tabletop-Rollenspielen ist das Würfeln mit vielen Würfeln. Das Wirken eines Zerfallszaubers mag augenblicklich sein, aber das Würfeln und Addieren von 40 Würfeln ist es mit Sicherheit nicht!
Unter rpg.stackexchange.com werden eine Reihe von Vorschlägen zur Behandlung dieses Problems erörtert . Einige von ihnen, wie das Verwenden eines Rollprogramms oder das Mitteln von Würfeln, nehmen den Spielern jedoch etwas Spaß und Gefühl der Kontrolle. Andere, wie das Werfen von 4 Würfeln und das Multiplizieren der Gesamtsumme mit 10, führen zu weitaus schwungvolleren Ergebnissen (während das Mitteln von Würfeln in die entgegengesetzte Richtung erfolgt).
Diese Frage bezieht sich auf eine Methode zur Verringerung der Anzahl der Würfelwürfe, ohne dass das Durchschnittsergebnis (Mittelwert) oder dessen Schwankung (Varianz) geändert werden.
Notation und Mathematik
In dieser Frage verwenden wir die folgende Notation, um Würfelwürfe darzustellen:
- n d k (z. B. 40d6) bezieht sich auf die Summe von n Walzen eines k-seitigen Würfels.
- n d k * c (z. B. 4d6 * 10) beschreibt das Multiplizieren des Ergebnisses mit einer Konstanten c.
- Wir können auch Rollen (zB 4d6 * 10 + 40d6) und Konstanten (zB 4d6 + 10) hinzufügen.
Für einen einzelnen Würfelwurf können wir zeigen, dass:
- Mittelwert : E [1d k ] = (k + 1) / 2
- Varianz : Var (1d k ) = (k - 1) (k + 1) / 12
Anhand der grundlegenden Eigenschaften von Mittelwert und Varianz können wir ferner schließen, dass:
- Mittelwert : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn [1d. L ] + c
- Variance : Var ( m d k * a + n d l * b + c ] = a . ² m .var (1d k ) + b ². N .var (1d l )
Aufgabe
Bei drei Ganzzahlen n , k und r sollte Ihr Programm eine Methode ausgeben, mit der Sie n d k in höchstens r Rollen approximieren können , mit den folgenden Einschränkungen:
- Die Lösung sollte den gleichen Mittelwert und die gleiche Varianz wie n d k haben .
- Die Lösung sollte die größtmögliche Anzahl von Rollen enthalten, die kleiner oder gleich r ist , da mehr Rollen eine gleichmäßigere Verteilung ergeben.
- Sie sollten Ihre Lösungen darauf beschränken, nur k- seitige Würfel zu verwenden, es sei denn, Sie streben den Bonus an (siehe unten).
- Wenn es keine Lösung gibt (da r zu klein ist), sollte das Programm den String "I AM A SEXY SHOELESS GOD OF WAR!" Ausgeben.
- Die Parameter werden als einzelne, durch Leerzeichen getrennte Zeichenfolge übergeben.
- Sie können annehmen, dass 1 ≤ n ≤ 100, 1 ≤ r ≤ n und k einer von 4, 6, 8, 10, 12 und 20 ist (die Standardwürfel, die in Tischplatten verwendet werden).
- Die Ausgabe sollte das in Notation beschriebene Format haben (z. B. 4d6 * 10 + 5), mit optionalen Leerzeichen um + s, aber nirgendwo anders. Einheitenmultiplikatoren sind ebenfalls optional: Sowohl 4d6 * 1 als auch 4d6 sind gültig.
Sie können ein Programm oder eine Funktion schreiben und Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen. Die Ergebnisse sollten an STDOUT (oder die nächstgelegene Alternative) ausgegeben oder als Zeichenfolge zurückgegeben werden.
Beispiele
>> "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!
Wertung
Kürzester Code gewinnt. Es gelten Standardregeln.
Bonus
-33% (vor Subtraktion abgerundet), wenn Ihr Programm auch Lösungen zurückgibt, die andere gültige Würfel als k enthalten (wobei die gültigen Werte, wie oben erwähnt, 4, 6, 8, 10, 12 und 20 sind). Wenn Sie sich dazu entschließen, sollten Sie solche Lösungen bei Bedarf immer zurückgeben und Lösungen behandeln, die mehrere Arten von Stempeln verwenden. Beispiel:
>> "7 4 3"
3d6+7
quelle
Antworten:
GolfScript (
163 143133 Bytes)Online-Demo
Wenn keine Würfeltypen gemischt werden, reduziert sich das Problem auf die
n
Summe von nicht mehr alsr
Quadraten undk
ist außer für die Berechnung der Konstante am Ende irrelevant. Der Großteil dieser Antwort ist die Buchführung erforderlich , um das Ergebnis im gewünschten Format zum Ausdruck bringen: die eigentliche Berechnung ist^\?,{^base}%{0\{.*+}/^=},
die Multiplikationsfaktoren zu findena
,b
usw .; und^@{-}/@)*.2/
um die Konstante zu berechnen.Präparation
quelle
Python,
487461452 - 33% = 303 BytesDa dies bisher noch niemand getan hat, gibt es hier eine Lösung, die verschiedene Arten von Würfeln handhabt. Wie die andere Lösung generiert es eine Reihe möglicher Lösungen und filtert sie herunter. Es verwendet die Tatsache, dass (k + 1) (k-1) = k ^ 2-1 und zwei halbe Lücken in der Spezifikation (oops!): Das fehlende Verbot des Druckens des redundanten Formulars 0d k * a (das spart alle 5 Bytes!) und die fehlende Laufzeitbeschränkung (es wird ziemlich schnell langsam, obwohl alle angegebenen Beispiele ausgeführt werden).
Für schönere Ausgabe Add
if x[0]
nach"%sd%s*%s"%x for x in s
:quelle