tło
Jednym ze źródeł ennui w stołowych grach RPG jest rzut na wiele kości. Rzucenie zaklęcia Dezintegracji może być natychmiastowe, ale rzucanie i łączenie 40 kości na pewno nie jest!
Szereg sugestii dotyczących rozwiązania tego problemu omówiono na stronie rpg.stackexchange.com . Jednak niektóre z nich, takie jak używanie programu na kółkach lub uśrednianie kości, zabierają graczom trochę zabawy i kontroli. Inne, takie jak rzucanie 4 kostkami i pomnożenie sumy przez 10, sprawiają, że wyniki są znacznie bardziej wahliwe (podczas gdy uśrednianie kości działa w przeciwnym kierunku).
To pytanie dotyczy metody zmniejszania liczby rzutów kostką bez zmiany ani średniego wyniku (średnia), ani jego zmienności (wariancji).
Notacja i matematyka
W tym pytaniu użyjemy następującej notacji do przedstawienia rzutów kostką:
- n d K (np 40d6) oznacza sumę n rolek k-kostka.
- n d k * c (np. 4d6 * 10) opisuje pomnożenie wyniku przez stałą c.
- Możemy również dodawać rolki (np. 4d6 * 10 + 40d6) i stałe (np. 4d6 + 10).
W przypadku pojedynczego rzutu kostką możemy pokazać, że:
- Średnia : E [1d k ] = (k + 1) / 2
- Wariancja : Var (1d k ) = (k-1) (k + 1) / 12
Korzystając z podstawowych właściwości średniej i wariancji, możemy ponadto wnioskować, że:
- Oznacza : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn . [1d l ] + c
- Wariancja var ( m d k * + n d l * b + c ] = . ² m .Var (1d k ) + b ². N .Var (1d L )
Zadanie
Biorąc pod uwagę trzy liczby całkowite n , k i r , Twój program powinien wypisać sposób zbliżony n d k w co najwyżej r rolkach, z następującymi ograniczeniami:
- Rozwiązanie powinno mieć taką samą średnią i wariancję jak n d k .
- Rozwiązanie powinno zawierać największą możliwą liczbę rolek mniejszą lub równą r , ponieważ większa liczba rolek zapewnia płynniejszy rozkład.
- Powinieneś ograniczyć swoje rozwiązania tylko do używania k- stronnych kości, chyba że celujesz w Bonus (patrz poniżej).
- Jeśli nie ma rozwiązania (ponieważ r jest za małe), program powinien wypisać ciąg „JESTEM SEKSOWNYM BUTEM BOGA WOJNY!”.
- Parametry są przekazywane jako pojedynczy ciąg rozdzielany spacjami.
- Możesz założyć, że 1 ≤ n ≤ 100, 1 ≤ r ≤ n i że k jest jednym z 4, 6, 8, 10, 12 i 20 (standardowe kostki używane w blatach).
- Dane wyjściowe powinny mieć format opisany w Notacji (np. 4d6 * 10 + 5), z opcjonalnymi spacjami wokół + s, ale nigdzie indziej. Mnożniki jednostek są również opcjonalne: ważne są zarówno 4d6 * 1, jak i 4d6.
Możesz napisać program lub funkcję, przyjmując dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji. Wyniki należy wydrukować do STDOUT (lub najbliższej alternatywy) lub zwrócić jako ciąg.
Przykłady
>> "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!
Punktacja
Najkrótszy kod wygrywa. Obowiązują standardowe zasady.
Premia
-33% (zaokrąglone w dół przed odejmowaniem), jeśli twój program zwraca również rozwiązania zawierające prawidłowe kości inne niż k (gdzie prawidłowe wartości, jak wspomniano powyżej, to 4, 6, 8, 10, 12 i 20). Jeśli zdecydujesz się to zrobić, powinieneś zawsze zwracać takie rozwiązania, gdy jest to właściwe, i obsługiwać rozwiązania wykorzystujące wiele rodzajów matryc. Przykład:
>> "7 4 3"
3d6+7
źródło
Odpowiedzi:
GolfScript (
163 143133 bajty)Demo online
Kiedy nie miesza się typów kości, problem sprowadza się do wyrażenia
n
jako sumy nie większej niżr
kwadraty ik
jest nieistotny, z wyjątkiem obliczania stałej na końcu. Większość tej odpowiedzi jest księgowość obowiązek wyrazić wynik w wybranym formacie: faktyczne wyliczenie jest^\?,{^base}%{0\{.*+}/^=},
znaleźć mnożnikówa
,b
itp .; i^@{-}/@)*.2/
obliczyć stałą.Sekcja
źródło
Pyton,
487461452–33% = 303 bajtówPonieważ nikt inny tego nie zrobił, oto rozwiązanie, które obsługuje różne rodzaje kości. Podobnie jak inne rozwiązanie, generuje szereg możliwych rozwiązań i filtruje je. Wykorzystuje fakt, że (k + 1) (k-1) = k ^ 2-1 i dwie pół-luki w specyfikacji (ups!): Brak zakazu drukowania zbędnej formy 0d k * a (co oszczędza wszystkie 5 bajtów!) i brak ograniczenia czasu działania (działa dość wolno dość szybko, choć działają wszystkie podane przykłady).
Dla ładniejszego wyjścia dodaj
if x[0]
po"%sd%s*%s"%x for x in s
:źródło