Задний план
Один из источников тоски в настольных ролевых играх связан с бросками, включающими много кубиков. Разыгрывание заклинания «Распад» может быть мгновенным, но бросать и складывать вместе 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
источник
Ответы:
GolfScript (
163 143133 байта)Онлайн демо
Если не смешивать типы кубиков, проблема сводится к выражению
n
в виде суммы не болееr
квадратов и неk
имеет значения, за исключением вычисления константы в конце. Основная часть этого ответа является бухучет требуется , чтобы выразить результат в желаемом формате: фактический расчет ,^\?,{^base}%{0\{.*+}/^=},
чтобы найти факторы умноженияa
,b
и т.д .; и^@{-}/@)*.2/
рассчитать постоянную.рассечение
источник
Python,
487461452 - 33% = 303 байтаТак как никто другой не сделал этого, вот решение, которое обрабатывает различные виды костей. Как и другое решение, оно генерирует ряд возможных решений и фильтрует их. Он использует тот факт, что (k + 1) (k-1) = k ^ 2-1 и две полузащиты в спецификации (упс!): Отсутствие запрета на печать избыточной формы 0d k * a (что экономит все 5 байтов!), и отсутствие ограничения времени выполнения (оно замедляется довольно быстро, хотя и запускает все приведенные примеры).
Для более приятного вывода добавить
if x[0]
после"%sd%s*%s"%x for x in s
:источник