50 lines
965 B
Crystal
50 lines
965 B
Crystal
require "./common.cr"
|
|
|
|
lines = File.read("day8_input").split("\n")
|
|
lines.pop
|
|
|
|
class Node
|
|
getter children : Array(Node)
|
|
getter metadata : Array(Int32)
|
|
|
|
def initialize(@children : Array(Node), @metadata : Array(Int32))
|
|
end
|
|
|
|
def sum
|
|
return metadata.sum + children.map(&.sum.as Int32).sum
|
|
end
|
|
|
|
def value
|
|
return metadata.sum if children.empty?
|
|
metadata.map do |meta|
|
|
next 0 unless child = children[meta - 1]?
|
|
next child.value
|
|
end.sum
|
|
end
|
|
end
|
|
|
|
def parse(numbers, index = 0)
|
|
child_count = numbers[index]
|
|
index += 1
|
|
meta_count = numbers[index]
|
|
index += 1
|
|
|
|
|
|
children = Array(Node).new
|
|
child_count.times do |count|
|
|
child, index = parse(numbers, index)
|
|
children << child
|
|
end
|
|
|
|
meta = numbers[index...(index + meta_count)]
|
|
index += meta_count
|
|
|
|
node = Node.new children, meta
|
|
return {node, index}
|
|
end
|
|
|
|
numbers = lines[0].split(" ").map &.to_i32
|
|
tree = parse(numbers)
|
|
puts tree[0].sum
|
|
puts tree[0].value
|