RosettaCodeData/Task/Dice-game-probabilities/Pluto/dice-game-probabilities.pluto
2026-04-30 12:34:36 -04:00

31 lines
826 B
Text

require "table2"
local function throw_die(nsides, ndice, s, counts)
if ndice == 0 then
counts[s + 1] += 1
return
end
for i = 1, nsides do throw_die(nsides, ndice - 1, s + i, counts) end
end
local function beating_probability(nsides1, ndice1, nsides2, ndice2)
local len1 = (nsides1 + 1) * ndice1
local c1 = table.rep(len1, 0)
throw_die(nsides1, ndice1, 0, c1)
local len2 = (nsides2 + 1) * ndice2
local c2 = table.rep(len2, 0)
throw_die(nsides2, ndice2, 0, c2)
local p12 = (nsides1 ^ ndice1) * (nsides2 ^ ndice2)
local tot = 0
for i = 0, len1 - 1 do
for j = 0, math.min(i, len2) - 1 do
tot += c1[i + 1] * c2[j + 1] / p12
end
end
return tot
end
print(beating_probability(4, 9, 6, 6))
print(beating_probability(10, 5, 7, 6))