diff options
Diffstat (limited to 'day08/part2')
-rwxr-xr-x | day08/part2 | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/day08/part2 b/day08/part2 new file mode 100755 index 0000000..94c2415 --- /dev/null +++ b/day08/part2 @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby + +def parse_tree(input, start) + num_children = input[start] + num_metadata = input[start + 1] + + children = [] + next_index = start + 2 + while num_children > 0 do + sum, endindex = parse_tree(input, next_index) + children << sum + next_index = endindex + 1 + num_children -= 1 + end + + value = 0 + if children.empty? + while num_metadata > 0 do + value += input[next_index] + next_index += 1 + num_metadata -= 1 + end + else + while num_metadata > 0 do + i = input[next_index] + value += children[i - 1] if i <= children.length + next_index += 1 + num_metadata -= 1 + end + end + return [ value, next_index - 1 ] +end + +input = gets.chomp.split.map(&:to_i) + +puts parse_tree(input, 0)[0] |