Продолжение этой проблемы
Учитывая набор смешанных кубиков, выведите распределение частоты броска всех их и суммируя бросанные числа на каждом кристалле.
Например, рассмотрим 1d12 + 1d8
(бросание 1 12-сторонней матрицы и 1 8-сторонней матрицы). Максимальный и минимальный броски равны 20
и 2
, соответственно, аналогичны броскам 2d10
(2 10-гранных кубиков). Тем не менее, 1d12 + 1d8
приводит к более плоскому распределению, чем 2d10
: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
против [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
правила
- Частоты должны быть перечислены в порядке возрастания суммы, которой соответствует частота.
- Разметка частот соответствующими суммами разрешена, но не обязательна (поскольку суммы могут быть выведены из требуемого порядка).
- Вам не нужно обрабатывать входные данные, если выходные данные превышают представимый диапазон целых чисел для вашего языка.
- Ведущие или конечные нули не допускаются. На выходе должны появляться только положительные частоты.
- Вы можете принимать входные данные в любом приемлемом формате (список костей (
[6, 8, 8]
), список пар костей ([[1, 6], [2, 8]]
) и т. Д.). - Частоты должны быть нормализованы так, чтобы GCD частот был 1 (например,
[1, 2, 3, 2, 1]
вместо[2, 4, 6, 4, 2]
). - У всех кубиков будет по крайней мере одно лицо (таков
d1
минимум). - Это код-гольф , поэтому выигрывает самый короткий код (в байтах). Стандартные лазейки запрещены, как обычно.
Тестовые случаи
Эти тестовые примеры приведены как input: output
, где входные данные представлены в виде списка пар, [a, b]
представляющих a
b
кубики со стороны (так [3, 8]
относится 3d8
и [[1, 12], [1, 8]]
относится 1d12 + 1d8
).
[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]
Ответы:
Желе ,
147 байт-3 байта благодаря г-ну Xcoder (использование неявного диапазона, чтобы избежать лидерства
R
; замена сокращения на двоичный декартовый продукт и выравниваниеp/F€
, с помощью декартового продукта, встроенного для этой целиŒp
.)Монадическая ссылка, принимающая список граней игральных костей и возвращающая нормализованное распределение возрастающих сумм.
Попробуйте онлайн!
Как?
Проходит список «размеров» игральных костей (неявно) превращает их в список лиц, затем получает декартово произведение этих списков (все возможные броски набора игральных костей), затем суммирует эти броски, получает группы равных индексы (по возрастанию значения) и принимает длину каждой группы.
Примечание: есть только один способ бросить минимум (бросая по одному на каждый кубик), и мы не учитываем дважды броски, поэтому нет необходимости выполнять нормализацию GCD.
источник
÷g/$
(разве всегда есть только один способ получить минимум или максимум?)ŒpS€µLƙ
MATL , 8 байт
Входные данные представляют собой массив (возможно, повторяющихся) размеров матрицы.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Шелуха , 7 байт
Вход представляет собой список игральных костей. Попробуйте онлайн!
объяснение
источник
Haskell , 54 байта
Попробуйте онлайн!
Haskell , 63 байта
Попробуйте онлайн!
Haskell , 68 байт
Попробуйте онлайн!
источник
Октава ,
88 69 5856 байтКак упомянуто в ответе Хаскелла, здесь используется тот факт, что распределение, например, 3-сторонней и 5-сторонней кости является дискретной сверткой двух векторов
[1,1,1]
и[1,1,1,1,1]
. Спасибо @LuisMendo за умную игру в гольф на 11 байт!Попробуйте онлайн!
Это представление использует рекурсивный подход. Но если бы вы использовали цикл, он был бы немного длиннее:
источник
Haskell ,
80 7864 байтаЭто решение оказалось почти таким же, как у @ Sherlock9 в предыдущем испытании, возможно, с более естественным подходом. У @xnor есть еще более короткое решение для Haskell !
Объяснение:
Попробуйте онлайн!
Предыдущее решение:
Это использует дискретную функцию свертки @AndersKaseorg . Наблюдение здесь состоит в том, что распределение, например, 3-сторонней и 5-сторонней кости является дискретной сверткой двух векторов
[1,1,1]
и[1,1,1,1,1]
.Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 26 байтов
Попробуйте онлайн!
Модификация моего ответа на предыдущий вызов . Это просто генерирует все возможные результаты, суммирует их и подсчитывает результаты.
Ради интереса мы могли бы написать это как
Tally@*Total@*Thread@*Tuples@*Range
, но это дольше.Wolfram Language (Mathematica) , 41 байт
Попробуйте онлайн!
Это основанный на свертках подход (здесь мы берем свертки через произведение производящих функций -
1+x+x^2+...+x^(N-1)
это производящая функция для броска dN - и затем берем список коэффициентов). Я включил это, потому что первое решение не практично для больших входов.источник
Mathematica, 44 байта
Вывод частот, помеченных соответствующими суммами
Попробуйте онлайн!
-5 байтов от Мартина Эндера
спасибо Мише Лаврову за то, что он дал мне знать, что «помечено» действительно
источник
Pyth , 12 байт
Попробуй это здесь!
Как?
источник
Желе , 14 байт
Попробуйте онлайн!
Ввод представляет собой список значений матрицы. Я мог сыграть в гольф, украдя
ĠL€
у другого ответа Желе, но затем я мог бы сыграть в гольф в первой половине и закончить тем же, так что я просто оставлю все как естьисточник
Python 2 ,
120119 байтПопробуйте онлайн!
Спасибо за Мего / Джонатон Аллан за 1 байт.
источник
05AB1E , 11 байт
Попробуйте онлайн!
Как это работает
Сохранено 1 байт благодаря Emigna !
источник
O
вместо€˜
R , 51 байт
Попробуйте онлайн!
Принимает список игральных костей и возвращает названный вектор частот; названия (значения сумм костей) печатаются над частотами.
R , 59 байт
Попробуйте онлайн!
Reduce
Подход , а не итеративной выше.R , 62 байта
Попробуйте онлайн!
Сверточный подход. Это даст несколько предупреждений, что он использует только первый элемент
D
выражения для выражения,1:D
но не влияет на вывод. Если бы нам не пришлось принимать всюRe
часть решения, это было бы 58 байтов.источник
APL (Дьялог Классик) ,
1210 байт-2 благодаря @ Adám
Попробуйте онлайн!
вход
⎕
представляет собой список из N кубиков⍳⍵
является N-мерным массивом вложенных векторов - все возможные броски+/↑,
выравнивает массивы и суммирует броски⊢∘≢⌸
подсчитывает, сколько каждой уникальной суммы, перечисленной в порядке их первого появления, что, к счастью, совпадает с их возрастающим порядкомисточник
⊢∘≢⌸+/↑,⍳⎕
Рубин , 72 байта
Попробуйте онлайн!
Принимает список игральных костей в качестве входных данных. Без сомнения, это может быть в гольфе, но не так уж плохо.
источник
Пари / ГП , 37 байт
Попробуйте онлайн!
источник
Чистый ,
15414213610710085 + 13 = 98 байтВход представляет собой список игральных костей.
Ответ в форме лямбды.
+13 байт из
import StdEnv
, который импортирует модуль, необходимый для этой работы.Попробуйте онлайн!
источник
JavaScript (ES6), 83 байта
Принимает ввод каждого кубика как отдельный параметр.
источник
JavaScript (ES6),
7674 байтаПринимает ввод в виде списка игральных костей.
Контрольные примеры
Для обработки двух последних тестовых случаев потребуется включить TCO или увеличить предельный размер стека по умолчанию для механизма JS.
Показать фрагмент кода
Отформатировано и прокомментировано
NB. Это закомментированная версия моего первоначального представления, в котором использовалась Redu (). Это на 2 байта длиннее, но легче для чтения.
источник
Clojure, 96 байт
Первый вход - это список количества кубиков, а второй - список количества сторон на каждом кубике.
источник
Perl 5 , 94 байта
Попробуйте онлайн!
Формат ввода представляет собой список игральных костей, разделенных символами новой строки. Таким образом, 1d10 + 2d8 будет вводить как:
источник
SageMath, 46 байт
Попробуйте онлайн
Это адаптация моего решения к другому вызову . Он принимает любое количество кубиков в качестве параметров (например,
f(4,4,6,6,6)
для2d4+3d6
) и возвращает список.Python 2 + NumPy , 62 байта
Попробуйте онлайн!
Как и раньше, я включил это решение в приведенное выше, поскольку они по сути эквивалентны. Обратите внимание, что эта функция возвращает массив NumPy, а не список Python, поэтому выходные данные выглядят немного иначе, если вы
print
это сделаете .numpy.ones(x)
это «правильный» способ сделать массив для использования с NumPy, и, таким образом, его можно использовать вместо него[x*[1]]
, но, к сожалению, он намного длиннее.источник