Day 8
This commit is contained in:
parent
4f68af7424
commit
560fe542e6
2
.gitignore
vendored
2
.gitignore
vendored
@ -229,3 +229,5 @@ _Pvt_Extensions
|
|||||||
*.o
|
*.o
|
||||||
*.hi
|
*.hi
|
||||||
*.out
|
*.out
|
||||||
|
|
||||||
|
.vscode/
|
1
aoc-8/inputs.txt
Normal file
1
aoc-8/inputs.txt
Normal file
File diff suppressed because one or more lines are too long
63
aoc-8/main.py
Normal file
63
aoc-8/main.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# node struct
|
||||||
|
class Node:
|
||||||
|
def __init__(self, num_children, num_metadata):
|
||||||
|
self.num_children = num_children
|
||||||
|
self.num_metadata = num_metadata
|
||||||
|
self.metadata = []
|
||||||
|
self.children = []
|
||||||
|
|
||||||
|
def full_children(self):
|
||||||
|
return len(self.children) == self.num_children
|
||||||
|
|
||||||
|
def full_metadata(self):
|
||||||
|
return len(self.metadata) == self.num_metadata
|
||||||
|
|
||||||
|
def total_metadata(self):
|
||||||
|
return sum(self.metadata) + sum([ c.total_metadata() for c in self.children ])
|
||||||
|
|
||||||
|
def value(self):
|
||||||
|
if self.num_children == 0:
|
||||||
|
return sum(self.metadata)
|
||||||
|
else:
|
||||||
|
val = 0
|
||||||
|
for index in self.metadata:
|
||||||
|
if index <= len(self.children):
|
||||||
|
val += self.children[index - 1].value()
|
||||||
|
|
||||||
|
return val
|
||||||
|
|
||||||
|
# build tree, list of ints -> root Node
|
||||||
|
def build_tree(inputs):
|
||||||
|
root = None
|
||||||
|
node_stack = list()
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
while root == None:
|
||||||
|
top_node = node_stack[-1] if node_stack else None
|
||||||
|
|
||||||
|
if top_node == None or not top_node.full_children():
|
||||||
|
num_children = inputs[i]
|
||||||
|
num_metadata = inputs[i + 1]
|
||||||
|
|
||||||
|
node_stack.append(Node(num_children, num_metadata))
|
||||||
|
|
||||||
|
i += 2
|
||||||
|
|
||||||
|
else:
|
||||||
|
for j in range(top_node.num_metadata):
|
||||||
|
top_node.metadata.append(inputs[i])
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
node = node_stack.pop()
|
||||||
|
|
||||||
|
if node_stack:
|
||||||
|
node_stack[-1].children.append(node)
|
||||||
|
else:
|
||||||
|
root = node
|
||||||
|
|
||||||
|
return root
|
||||||
|
|
||||||
|
root = build_tree(list(map(lambda x: int(x), open("inputs.txt").read().split(' '))))
|
||||||
|
print(f"[Part 1] Total metadata sum: { root.total_metadata() }")
|
||||||
|
print(f"[Part 2] Root node value: { root.value() } ")
|
Loading…
Reference in New Issue
Block a user