3

我需要计算滚动 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)吗?

4

1 回答 1

2

我的偏好是:

d =: ([ (! <:) +)

并为二元添加一个单子选项

d =: d~ : ([ (! <:) +) NB. 4 d 5 ( 4 rolls of 5 sided dice : 70 possible combinations)

我会添加评论,包括示例参数和预期的目的,以节省我的时间,如果我以后偶然发现它。

当然,如果 0 d 0 返回 0,最终版本将是选择,即使它看起来确实有点复杂。

于 2013-10-03T06:55:29.810 回答