forked from TheAlgorithms/Python
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsol1.py
More file actions
Latest commit
75 lines (54 loc) · 2.22 KB
/
Copy pathsol1.py
File metadata and controls
75 lines (54 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
"""
Project Euler Problem 205: https://projecteuler.net/problem=205
Peter has nine four-sided (pyramidal) dice, each with faces numbered 1, 2, 3, 4.
Colin has six six-sided (cubic) dice, each with faces numbered 1, 2, 3, 4, 5, 6.
Peter and Colin roll their dice and compare totals: the highest total wins.
The result is a draw if the totals are equal.
What is the probability that Pyramidal Peter beats Cubic Colin?
Give your answer rounded to seven decimal places in the form 0.abcdefg
"""
fromitertoolsimportproduct
deftotal_frequency_distribution(sides_number: int, dice_number: int) ->list[int]:
"""
Returns frequency distribution of total
>>> total_frequency_distribution(sides_number=6, dice_number=1)
[0, 1, 1, 1, 1, 1, 1]
>>> total_frequency_distribution(sides_number=4, dice_number=2)
[0, 0, 1, 2, 3, 4, 3, 2, 1]
"""
max_face_number=sides_number
max_total=max_face_number*dice_number
totals_frequencies= [0] * (max_total+1)
min_face_number=1
faces_numbers=range(min_face_number, max_face_number+1)
fordice_numbersinproduct(faces_numbers, repeat=dice_number):
total=sum(dice_numbers)
totals_frequencies[total] +=1
returntotals_frequencies
defsolution() ->float:
"""
Returns probability that Pyramidal Peter beats Cubic Colin
rounded to seven decimal places in the form 0.abcdefg
>>> solution()
0.5731441
"""
peter_totals_frequencies=total_frequency_distribution(
sides_number=4, dice_number=9
)
colin_totals_frequencies=total_frequency_distribution(
sides_number=6, dice_number=6
)
peter_wins_count=0
min_peter_total=9
max_peter_total=4*9
min_colin_total=6
forpeter_totalinrange(min_peter_total, max_peter_total+1):
peter_wins_count+=peter_totals_frequencies[peter_total] *sum(
colin_totals_frequencies[min_colin_total:peter_total]
)
total_games_number= (4**9) * (6**6)
peter_win_probability=peter_wins_count/total_games_number
rounded_peter_win_probability=round(peter_win_probability, ndigits=7)
returnrounded_peter_win_probability
if__name__=="__main__":
print(f"{solution() =}")