Количество разных бросков К N-сторонних кубиков
Мне нужно было рассчитать количество различных возможных бросков, которые могут возникнуть при броске кубиков, каждый из которых имеет N сторон. Мое определение броска таково, что что-то вроде {1, 1, 2, 3, 4} эквивалентно {1, 4, 3, 1, 2} (порядок не имеет значения), но не {1, 1, 3, 3, 3} (это не тот же набор результатов). Например: Yahtzee - игра, включающая броски 5 6-гранных костей - по крайней мере, первоначально, перед повторными бросками - и число различных бросков, таким образом, составляет 252. Случай, когда N = K, приводит к последовательности OEIS A001700.
Если я не ужасно ошибаюсь, это дается "(N-1+K) выбрать (N-1)", или, что эквивалентно, "(N+K-1) выберите К", что K ! <: K + N
в J. Это приводит меня к четырем различным молчаливым представлениям:
d =: ([ ! [: <: +)
, Простой поезд, без скобок, хотя мне нужно использовать шапку.d =: ([ (! <:) +)
, Без шапки, но заключенный в скобки внутренний крючок.d =: (] !&<: +)
, Только три поезда глагола, но с помощью Compose. Он использует(<: N) ! <: K + N
версия.d =: (([ ! +) * ] % +)
, Этот переписывает "C(N+K-1, K)" как "C(N+K, K) * N / (N+K)". Это уродливее, но в случае 0 игральных костей с 0 сторонами это дает 0 вместо 1, что, вероятно, является менее бессмысленным ответом.
Какое из них является наиболее "J-ишем" решением?
Кроме того, монадический случай для всего этого не имеет смысла: 1 0 0 0 0 ...
для первых трех и 0 1 1 1 ...
для четвертого. Более логичной монадой для этого глагола будет рефлексивный, как d~
поэтому было бы лучше определить этот глагол как (d~ : d)
?
1 ответ
Мое предпочтение будет:
d =: ([ (! <:) +)
и добавить монадическую опцию к диадике
d =: d~ : ([ (! <:) +) NB. 4 d 5 ( 4 rolls of 5 sided dice : 70 possible combinations)
Я бы добавил комментарий, включая примеры аргументов и ожидаемую цель, чтобы сэкономить мне время, когда я наткнусь на него позже.
Конечно, окончательная версия будет выбором, если 0 d 0 будет возвращать 0, даже если это выглядит немного сложнее.