Фон
Одним із джерел приємностей у настільних рольових іграх є робота з рулонами, в яких задіяно багато кісток. Заклинання заклинання про дезінтеграцію може бути миттєвим, але згортання та додавання 40 кубиків точно не є!
Ряд пропозицій щодо вирішення цього питання обговорюється на rpg.stackexchange.com . Однак деякі з них, наприклад, користуючись роликовою програмою або усереднюючи кістки, відбирають у гравців частину задоволення та почуття контролю. Інші, такі як розкачування 4-х кубиків та множення загальної кількості на 10, роблять результати набагато хиткішими (тоді як усереднення кісток діє у зворотному напрямку).
Це питання стосується способу зменшення кількості рулонів кісток, не змінюючи ні середнього результату (середнього), ні його розмахування (дисперсії).
Позначення та математика
У цьому запиті ми будемо використовувати наступні позначення для представлення рулонів з кістки:
- n d k (наприклад, 40d6) відноситься до суми n рулонів k-однобічного штампу.
- n d k * c (наприклад, 4d6 * 10) описує множення результату на постійну c.
- Можна також додати рулони (наприклад, 4d6 * 10 + 40d6) та константи (наприклад, 4d6 + 10).
Для одного ролика матриці ми можемо показати, що:
- Середнє значення : E [1d k ] = (k + 1) / 2
- Варіант : Var (1d k ) = (k-1) (k + 1) / 12
Використовуючи основні властивості середнього та відхилення, ми можемо також зробити висновок про те, що:
- Середнє значення : E [ m d k * a + n d l * b + c ] = am .E [1d k ] + bn . [1d l ] + c
- Різниця : вар ( м д до * + п д л * Ь + с ] = . ² м .var (1d до ) + б ². П .var (1d л )
Завдання
Враховуючи три цілих числа n , k і r , ваша програма повинна вивести спосіб наближення n d k у максимум r- рулонах із наступними обмеженнями:
- Розв’язок повинен мати те саме середнє значення та дисперсію, що й n d k .
- Розчин повинен містити якомога більшу кількість рулонів, меншу або рівну r , оскільки більше рулонів забезпечує більш плавне розподіл.
- Ви повинні обмежувати свої рішення лише використанням k- однобічних кубиків, якщо ви не прагнете отримати бонус (див. Нижче).
- Якщо рішення немає (оскільки r занадто мало), програма повинна вивести рядок "Я - ШЕКСИЙ БЕЗПЕЧНИЙ БОГ ВІЙНИ!".
- Параметри передаються у вигляді єдиного рядка, розділеного пробілом.
- Ви можете припустити, що 1 ≤ n ≤ 100, 1 ≤ r ≤ n і що k - один із 4, 6, 8, 10, 12 і 20 (стандартні кістки, які використовуються на стільницях).
- Вихід повинен бути у форматі, описаному в нотації (наприклад, 4d6 * 10 + 5), з необов’язковими пробілами навколо + s, але ніде більше. Одиничні множники також необов’язкові: і 4d6 * 1, і 4d6 є дійсними.
Ви можете написати програму або функцію, взявши вхід через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції. Результати слід надрукувати в STDOUT (або найближчу альтернативу) або повернути у вигляді рядка.
Приклади
>> "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!
Оцінка балів
Найкоротший код виграє. Діють стандартні правила.
Бонус
-33% (округлюється до віднімання), якщо ваша програма також повертає рішення, які включають дійсні кістки, крім k (де дійсні значення, як згадувалося вище, 4, 6, 8, 10, 12 і 20). Якщо ви вирішили це зробити, то завжди слід повертати такі рішення, коли це доречно, і обробляти рішення, які використовують кілька типів штампу. Приклад:
>> "7 4 3"
3d6+7