dicejtacit-programmingoeis

Number of different rolls of K N-sided dice


I needed to calculate the number of different possible rolls that could arise from rolling K dice, each with N-sides. My definition of roll is that something like {1, 1, 2, 3, 4} is equivalent to {1, 4, 3, 1, 2} (order doesn't matter), but not to {1, 1, 3, 3, 3} (they're not the same set of results). For example: Yahtzee is a game involving rolls of 5 6-sided dice—at least initially, before rerolls—and the number of different rolls is thus 252. The case when N = K leads to OEIS sequence A001700.

If I'm not horribly mistaken, this is given by "(N-1+K) choose (N-1)", or equivalently, "(N+K-1) choose K", which is K ! <: K + N in J. This leads me to four different tacit representations:

Which of these is the most "J-ish" solution?

Also, the monadic case for all of these is meaningless: 1 0 0 0 0 ... for the first three and 0 1 1 1 ... for the fourth. A more logical monad for this verb would be the reflexive, as given by d~, so would it be better to define this verb as (d~ : d)?


Solution

  • My preference would be:

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

    and to add a monadic option to the dyadic

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

    I would add the comment including sample arguments and an expected purpose to save me time were I to stumble across it later.

    Of course, the final version would be the choice if 0 d 0 were to return 0, even if it does look a little more complicated.