diff --git a/2018/ruby/day_08.rb b/2018/ruby/day_08.rb new file mode 100644 index 0000000..7a1faf8 --- /dev/null +++ b/2018/ruby/day_08.rb @@ -0,0 +1,34 @@ +raw = ARGF.read.chomp.split(/\s+/).map(&:to_i) + +class Node + def self.from(raw) + child_count = raw.shift + metadata_count = raw.shift + + children = child_count.times.map { Node.from(raw) } + metadata = metadata_count.times.map { raw.shift } + + Node.new(children, metadata) + end + + def initialize(children, metadata) + @children, @metadata = children, metadata + end + + def checksum + @metadata.sum + @children.map(&:checksum).sum + end + + def value + if @children.empty? + @metadata.sum + else + @metadata.flat_map {|index| + @children.fetch(index-1, []) + }.map(&:value).sum + end + end +end + +root = Node.from(raw) +p root.value