【发布时间】:2013-10-09 14:03:29
【问题描述】:
我需要计算掷 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 sequence A001700。
如果我没记错的话,这是由“(N-1+K)选择(N-1)”给出的,或者等效地,“(N+K-1)选择K”,即@987654322 @ in 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) 会更好吗?
【问题讨论】:
标签: dice j tacit-programming oeis