diff --git a/day02/day02.rb b/day02/day02.rb index 4f59834..24aa7ad 100644 --- a/day02/day02.rb +++ b/day02/day02.rb @@ -2,14 +2,10 @@ class Day02 def solve(lines) - p1 = lines.map do |line| - game_id, subsets = line.scan(/Game (\d+): (.+)/).flatten - next 0 if impossible?(subsets) - - game_id.to_i - end.sum + p1 = part1(lines) + p2 = part2(lines) - [p1, -2] + [p1, p2] end private @@ -20,6 +16,15 @@ def solve(lines) 'blue' => 14 }.freeze + def part1(lines) + lines.map do |line| + game_id, subsets = line.scan(/Game (\d+): (.+)/).flatten + next 0 if impossible?(subsets) + + game_id.to_i + end.sum + end + def impossible?(subsets) subsets.split(';').each do |subset| subset.scan(/(\d+) (red|green|blue)/).each do |(count, cube)| @@ -29,4 +34,24 @@ def impossible?(subsets) false end + + def part2(lines) + lines.map do |line| + _game_id, subsets = line.scan(/Game (\d+): (.+)/).flatten + + power(subsets) + end.sum + end + + def power(subsets) + max_seen = { 'red' => 0, 'green' => 0, 'blue' => 0 } + + subsets.split(';').each do |subset| + subset.scan(/(\d+) (red|green|blue)/).each do |(count, cube)| + max_seen[cube] = [count.to_i, max_seen[cube]].max + end + end + + max_seen.values.reduce(:*) + end end diff --git a/spec/day02/day02_spec.rb b/spec/day02/day02_spec.rb index 2964eb5..74c7cb0 100644 --- a/spec/day02/day02_spec.rb +++ b/spec/day02/day02_spec.rb @@ -28,7 +28,7 @@ it 'returns the right result' do _p1, p2 = solve - expect(p2).to eq(-2) + expect(p2).to eq(2286) end end end