我需要计算滚动 K 骰子可能产生的不同可能掷骰的数量,每个骰子都有 N 面。我对 roll 的定义是 {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 ! <: 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-ish”的解决方案?
此外,所有这些的一元案例是没有意义的:1 0 0 0 0 ...
对于前三个和0 1 1 1 ...
第四个。这个动词的一个更合乎逻辑的单子是反身,由 给出d~
,那么将这个动词定义为 会更好(d~ : d)
吗?