产生的不同可能掷骰子的数量,每个掷骰子都有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,最终版本将是选择,即使它看起来确实有点复杂。