【问题标题】:Number of different rolls of K N-sided diceK N面骰子的不同掷数
【发布时间】: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


    【解决方案1】:

    我的偏好是:

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

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

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

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

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

    【讨论】:

    • 我同意你的偏好。如果希望零掷骰或骰子产生零作为结果,我会让 [ (! <:> 这个更宽的叉子的右叉: <i>&amp; i&gt; * ([ (! <:></:></i>
    • 我无法弄清楚如何让评论真正显示代码。原始动词的左边应该是星号和星号-空格-星号。 (当然,这个空间是装饰性的,而不是语义性的。)
    • 哦,你的意思是(*&amp;* * [ (! &lt;:) +)?现在有一个想法。您不能只签署产品,因为我认为用 N 面掷 0 个骰子的 1 种方法具有组合意义。但这个想法将我们引向(*@] * [ (! &lt;:) +),这符合要求。不错!
    • 您在这里提出的代码实际上是我的第一个想法,但我不明白您在不掷骰子和没有边之间做出的区别,所以我概括了。
    • 如果(*@] * [ (! &lt;:) +) 符合要求,那么(* *) @ ([ (! &lt;:) +) 也应该如此。如果零面骰子只能以一种方式抛出,那么( (* *) (! &lt;:) + ) 也可以。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2021-09-09
    • 2018-09-08
    • 2015-06-29
    • 2020-09-25
    相关资源
    最近更新 更多