puzzle7.py (1654B)
1 from sets import Set 2 3 class Node: 4 def __init__(self, name, weight, children): 5 self.name = name 6 self.weight = weight 7 self.children = children 8 9 with open('files/puzzle7.txt') as f: 10 programs = f.readlines() 11 12 my_dict = {} 13 14 for program in programs: 15 tokens = program.split(" ") 16 node = Node(None, None, None) 17 18 if len(tokens) > 2: 19 children = [tokens[i + 3][:len(tokens[i + 3]) - 1] for i in range(len(tokens) - 3)] 20 node = Node(tokens[0], int(tokens[1][1 : len(tokens[1]) - 1]), children) 21 else: 22 node = Node(tokens[0], int(tokens[1][1 : len(tokens[1]) - 2]), None) 23 24 my_dict[node.name] = node 25 26 for node in my_dict.values(): 27 if node.children != None: 28 for i in range(len(node.children)): 29 node.children[i] = my_dict[node.children[i]] 30 31 candidate = "" 32 highest_node_count = 0 33 34 def traverse(node): 35 return 1 if node.children == None else 1 + sum([traverse(node.children[i]) for i in range(len(node.children))]) 36 37 for node in my_dict.values(): 38 node_count = traverse(node) 39 if node_count > highest_node_count: 40 highest_node_count = node_count 41 candidate = node.name 42 43 print candidate 44 45 def traverse_totals(node): 46 if node.children == None: 47 return node.weight 48 49 weights = [traverse_totals(node.children[i]) for i in range(len(node.children))] 50 if len(Set(weights)) != 1: 51 for idx, weight in enumerate(weights): 52 if weights.count(weight) == 1: 53 s = list(Set(weights)) 54 print node.children[idx].weight + s[0] - s[1] 55 return node.weight + sum(weights) 56 57 traverse_totals(my_dict[candidate])