Solve problem 106 in Python first 50% difficulty
This commit is contained in:
44
python/e106.py
Normal file
44
python/e106.py
Normal file
@@ -0,0 +1,44 @@
|
||||
def repeat(n, xs):
|
||||
return [xs for _ in range(n)]
|
||||
|
||||
|
||||
def sequence(xss, acc):
|
||||
if not xss:
|
||||
return acc
|
||||
return sequence(xss[1:], [a + [x] for x in xss[0] for a in acc])
|
||||
|
||||
|
||||
def is_balanced(xs):
|
||||
""" Check if subsets are balanced. That means for every lower number there
|
||||
is a higher number that balances it out. """
|
||||
ones_balanced, twos_balanced = True, True
|
||||
ones, twos = 0, 0
|
||||
for x in xs:
|
||||
if x == 1:
|
||||
ones += 1
|
||||
twos -= 1
|
||||
elif x == 2:
|
||||
ones -= 1
|
||||
twos += 1
|
||||
if ones < 0:
|
||||
ones_balanced = False
|
||||
if twos < 0:
|
||||
twos_balanced = False
|
||||
return ones_balanced or twos_balanced
|
||||
|
||||
|
||||
def euler_106():
|
||||
n = 12
|
||||
# Generate all possible subsets where both subsets have the same number of
|
||||
# elements and at least two elements per subset.
|
||||
xs = repeat(n, [0, 1, 2])
|
||||
xs = [x for x in sequence(xs, [[]])
|
||||
if x.count(1) > 1
|
||||
if x.count(1) == x.count(2)]
|
||||
return len([1 for x in xs if not is_balanced(x)]) // 2
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
solution = euler_106()
|
||||
print("e106.py: " + str(solution))
|
||||
assert(solution == 21384)
|
||||
Reference in New Issue
Block a user