mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
feat: Add solution for Project Euler Problem 121 (#4261)
* Added solution for Project Euler problem 121 * Updated typing for 3.9 * updating DIRECTORY.md Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
This commit is contained in:
parent
8f5f32bc00
commit
89a43c81e5
|
@ -772,6 +772,8 @@
|
|||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_119/sol1.py)
|
||||
* Problem 120
|
||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_120/sol1.py)
|
||||
* Problem 121
|
||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_121/sol1.py)
|
||||
* Problem 123
|
||||
* [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_123/sol1.py)
|
||||
* Problem 125
|
||||
|
|
0
project_euler/problem_121/__init__.py
Normal file
0
project_euler/problem_121/__init__.py
Normal file
64
project_euler/problem_121/sol1.py
Normal file
64
project_euler/problem_121/sol1.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
"""
|
||||
A bag contains one red disc and one blue disc. In a game of chance a player takes a
|
||||
disc at random and its colour is noted. After each turn the disc is returned to the
|
||||
bag, an extra red disc is added, and another disc is taken at random.
|
||||
|
||||
The player pays £1 to play and wins if they have taken more blue discs than red
|
||||
discs at the end of the game.
|
||||
|
||||
If the game is played for four turns, the probability of a player winning is exactly
|
||||
11/120, and so the maximum prize fund the banker should allocate for winning in this
|
||||
game would be £10 before they would expect to incur a loss. Note that any payout will
|
||||
be a whole number of pounds and also includes the original £1 paid to play the game,
|
||||
so in the example given the player actually wins £9.
|
||||
|
||||
Find the maximum prize fund that should be allocated to a single game in which
|
||||
fifteen turns are played.
|
||||
|
||||
|
||||
Solution:
|
||||
For each 15-disc sequence of red and blue for which there are more red than blue,
|
||||
we calculate the probability of that sequence and add it to the total probability
|
||||
of the player winning. The inverse of this probability gives an upper bound for
|
||||
the prize if the banker wants to avoid an expected loss.
|
||||
"""
|
||||
|
||||
from itertools import product
|
||||
|
||||
|
||||
def solution(num_turns: int = 15) -> int:
|
||||
"""
|
||||
Find the maximum prize fund that should be allocated to a single game in which
|
||||
fifteen turns are played.
|
||||
>>> solution(4)
|
||||
10
|
||||
>>> solution(10)
|
||||
225
|
||||
"""
|
||||
total_prob: float = 0.0
|
||||
prob: float
|
||||
num_blue: int
|
||||
num_red: int
|
||||
ind: int
|
||||
col: int
|
||||
series: tuple[int, ...]
|
||||
|
||||
for series in product(range(2), repeat=num_turns):
|
||||
num_blue = series.count(1)
|
||||
num_red = num_turns - num_blue
|
||||
if num_red >= num_blue:
|
||||
continue
|
||||
prob = 1.0
|
||||
for ind, col in enumerate(series, 2):
|
||||
if col == 0:
|
||||
prob *= (ind - 1) / ind
|
||||
else:
|
||||
prob *= 1 / ind
|
||||
|
||||
total_prob += prob
|
||||
|
||||
return int(1 / total_prob)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(f"{solution() = }")
|
Loading…
Reference in New Issue
Block a user