adventofcode

https://adventofcode.com/
Log | Files | Refs

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])