Change problem 121 to look cooler but make it harder to understand

This commit is contained in:
2021-07-03 21:28:47 -04:00
parent 43cffbfbb7
commit 70235c9090

View File

@@ -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__":