diff --git a/lib/days/16.rb b/lib/days/16.rb index 5a0af46..9c023e1 100644 --- a/lib/days/16.rb +++ b/lib/days/16.rb @@ -26,11 +26,31 @@ def pos def part1(input) grid = parse_grid(input) - visited = Set.new - beams = [ - Beam.new(0, 0, :right) - ] + solve(grid, Beam.new(0, 0, :right)) + end + + def part2(input) + grid = parse_grid(input) + + values = [] + + grid.length.times do |x| + values << solve(grid, Beam.new(x, 0, :down)) + values << solve(grid, Beam.new(x, grid.first.length - 1, :up)) + end + + grid.first.length.times do |y| + values << solve(grid, Beam.new(0, y, :right)) + values << solve(grid, Beam.new(grid.length - 1, y, :right)) + end + + values.max + end + + def solve(grid, initial) + visited = Set.new + beams = [initial] loop do new_beams = [] @@ -39,12 +59,11 @@ def part1(input) if beam.x.negative? || beam.x >= grid.length || beam.y.negative? || - beam.y >= grid.first.length + beam.y >= grid.first.length || + visited.include?(beam) next end - next if visited.include?(beam) - visited.add(beam) case grid[beam.x][beam.y] @@ -97,8 +116,4 @@ def part1(input) visited.map(&:pos).uniq.length end - def part2(input) - 'TODO' - end - end diff --git a/test/16_test.rb b/test/16_test.rb index 32db758..11b1886 100644 --- a/test/16_test.rb +++ b/test/16_test.rb @@ -13,6 +13,6 @@ def test_part1 end def test_part2 - assert_equal @day.part2(@data), '' + assert_equal @day.part2(@data), 51 end end