Change problem 121 to look cooler but make it harder to understand
This commit is contained in:
@@ -1,41 +1,25 @@
|
|||||||
from fractions import Fraction
|
from math import factorial
|
||||||
from itertools import combinations
|
from itertools import combinations
|
||||||
|
|
||||||
|
|
||||||
def mul(xs):
|
def product(xs):
|
||||||
r = 1
|
r = 1
|
||||||
for x in xs:
|
for x in xs:
|
||||||
r *= x
|
r *= x
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
|
||||||
def mul_inv(xs):
|
|
||||||
r = 1
|
|
||||||
for x in xs:
|
|
||||||
r *= (1 - x)
|
|
||||||
return r
|
|
||||||
|
|
||||||
|
|
||||||
def sub_odds(n_blue, n_total):
|
def sub_odds(n_blue, n_total):
|
||||||
""" Computes the odds for getting exactly n_blue out of n_total blue discs.
|
odds = [n for n in range(1, n_total + 1)]
|
||||||
"""
|
return sum(map(product, combinations(odds, n_total - n_blue)))
|
||||||
total_odds = 0
|
|
||||||
odds = [Fraction(1, n) for n in range(2, 2 + n_total)]
|
|
||||||
odds_set = set(odds)
|
|
||||||
for odd in combinations(odds, n_blue):
|
|
||||||
odd_inv = tuple(odds_set.difference(set(odd)))
|
|
||||||
total_odds += mul(odd) * mul_inv(odd_inv)
|
|
||||||
return total_odds
|
|
||||||
|
|
||||||
|
|
||||||
def euler_121():
|
def euler_121():
|
||||||
n_turns = 15
|
n_turns = 15
|
||||||
n_to_win = n_turns // 2 + 1
|
n_to_win = n_turns // 2 + 1
|
||||||
odds = 0
|
odds = sum([sub_odds(n_blue, n_turns)
|
||||||
for n_blue in range(n_to_win, n_turns + 1):
|
for n_blue in range(n_to_win, n_turns + 1)])
|
||||||
odds += sub_odds(n_blue, n_turns)
|
return int(factorial(n_turns + 1) / odds)
|
||||||
price = int(1 / odds)
|
|
||||||
return price
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user