Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2018-12-08 - Memory Maneuver

(original .ipynb)
test_input = "2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2"
#            A----------------------------------
#                 B----------- C-----------
#                                  D-----

real_input = open("puzzle_input/day8.txt").read()
class Node(object):
    def __init__(self, raw_input):
        num_children = raw_input.pop(0)
        num_metadata = raw_input.pop(0)
    
        self.children = []
        for i in range(num_children):
            self.parse_child(raw_input)

        self.metadata = []
        for i in range(num_metadata):
            self.parse_metadata(raw_input)
        
    def parse_child(self, raw_input):
        self.children.append(Node(raw_input))
        
    def parse_metadata(self, raw_input):
        self.metadata.append(raw_input.pop(0))
        
    def sum_metadata(self):
        return sum(self.metadata) + sum([ child.sum_metadata() for child in self.children])
    
    def calculate_value(self):
        if not self.children:
            return sum(self.metadata)
        
        else:
            relevant_indices = [ i - 1 for i in self.metadata if 0 < i and i <= len(self.children)]
            return sum([ self.children[i].calculate_value() for i in relevant_indices ])
    
def parse(raw_input_string):
    raw_input_list = [ int(str) for str in raw_input_string.split(" ") ]
    return Node(raw_input_list)

# Part 1
root = parse(real_input)
print("part one:", root.sum_metadata())

# Part 2
print("part two:", root.calculate_value())
part one: 42196
part two: 33649