Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Probably Dice by novelworm
def probability(dice_number, sides, target):
res = all(dice_number, sides, target) / (sides ** dice_number)
return round(res, 4)
memo = {}
def all(N, n, t):
if t > N * n or t < N:
return 0
elif (N, n, t) in memo:
return memo[(N, n, t)]
elif N == 1 or t == N or t == N * n:
memo[(N, n, t)] = 1
return 1
else:
res = 0
for i in range(1, n+1):
res += all(N-1, n, t-i)
memo[(N, n, t)] = res
return res
if __name__ == '__main__':
#These are only used for self-checking and are not necessary for auto-testing
def almost_equal(checked, correct, significant_digits=4):
precision = 0.1 ** significant_digits
return correct - precision < checked < correct + precision
assert(almost_equal(probability(2, 6, 3), 0.0556)), "Basic example"
assert(almost_equal(probability(2, 6, 4), 0.0833)), "More points"
assert(almost_equal(probability(2, 6, 7), 0.1667)), "Maximum for two 6-sided dice"
assert(almost_equal(probability(2, 3, 5), 0.2222)), "Small dice"
assert(almost_equal(probability(2, 3, 7), 0.0000)), "Never!"
assert(almost_equal(probability(3, 6, 7), 0.0694)), "Three dice"
assert(almost_equal(probability(10, 10, 50), 0.0375)), "Many dice, many sides"
Feb. 18, 2020