def stage19(): calculator = calc666.Calc666([".", "1", "2"], binary_inverse=stage19_inverse) factors = helper.get_factors(666) nodes = [calculator.root] for i in range(1, 3): next_level = [] for node in nodes: print(node) factors = helper.get_factors(node.value) for val in factors: calculator.add_nodes_binary(node, val) for n in node.binary_children: next_level.append(n[0]) next_level.append(n[1]) nodes = list(next_level)
def problem_12(): """What is the value of the first triangle number to have over five hundred divisors?""" # Closed form: \sum_i=1^n i = (n * (n + 1)) / 2 for n in xrange(7, 100000): # Don't loop forever. triangle = (n * (n + 1)) / 2 if len(helper.get_factors(triangle)) >= 250: return triangle raise Exception('No solution to problem 12 found!')
def problem_9(): """There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product abc.""" # Using Euclid's formula: # http://en.wikipedia.org/wiki/Pythagorean_triple#Generating_a_triple # 1000 = a + b + c = (m**2 - n**2) + 2mn + (m**2 + n**2) = 2m**2 + 2mn => # 500 = m**2 + mn = m (m + n) for f1, f2 in helper.get_factors(500): m, n = (f1, f2 - f1) if f2 > f1 else (f2, f1 - f2) # Avoid negatives. m, n = (m, n) if m > n else (n, m) # Make sure m > n. a, b, c = (m ** 2 - n ** 2, 2 * m * n, m ** 2 + n ** 2) # Euclid's formula. if a + b + c == 1000: return a * b * c raise error("No solution to problem 9 found!")