j - 不同掷骰子的 K N 面骰子的数量


我需要计算掷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",这在J中K ! <: K + N。这让我想到四种不同的默认表示:

  • d =: ([ ! [: <: +) .简单的火车,没有括号,尽管我需要使用大写字母。
  • d =: ([ (! <:) +) .没有盖子,但用括号括住内钩。
  • d =: (] !&<: +) .只有三个动词火车,但使用撰写。它使用(<: 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)会更好吗?

我的偏好是:

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

并在二元组中添加一个一元选项

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

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

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

相关内容

  • 没有找到相关文章

最新更新