#!/usr/bin/env ruby require_relative '../common' class Day02 < Day def part1 input.each_with_object(Position.new) { |cmd, position| position.process cmd }.result end def part2 input.each_with_object(Position.new(use_aim: true)) { |cmd, position| position.process cmd }.result end class Position def initialize(use_aim: false) @use_aim = use_aim @horizontal_position = 0 @depth = 0 @aim = 0 end def process command direction, value = command.match(/\A(forward|down|up) ([0-9]+)\z/).captures send direction, value.to_i end def result @horizontal_position * @depth end private def forward value @horizontal_position += value @depth += @aim * value if @use_aim end def down value if @use_aim @aim += value else @depth += value end end def up value if @use_aim @aim -= value else @depth -= value end end end end Day02.run