diff --git a/2018/ruby/day_15.rb b/2018/ruby/day_15.rb
index a723bfb..99df432 100644
--- a/2018/ruby/day_15.rb
+++ b/2018/ruby/day_15.rb
@@ -35,7 +35,7 @@ class Combat
unit = @map.fetch(turn.pos)
target = @map.fetch(attack)
target.hp -= @attack.fetch(unit.class)
- @map.delete(attack) if target.hp < 0
+ @map.delete(attack) if target.hp <= 0
end
end
@@ -423,19 +423,31 @@ class Goblin < Unit
end
def solve(input)
- map = Map.parse(input)
- combat = Combat.new(map, 3)
+ (3..Float::INFINITY).each do |elf_attack|
+ map = Map.parse(input)
+ outcome = simulate(map, elf_attack)
+ next if outcome.nil?
+ return outcome
+ end
+end
+
+def simulate(map, elf_attack)
+ elf_count = map.units.count {|_, unit| unit.is_a?(Elf) }
+ combat = Combat.new(map, elf_attack)
map, count = combat.fight.map.with_index
.inject(nil) {|last,(map,count)|
+ return if map.units.count {|_, unit| unit.is_a?(Elf) } < elf_count
# puts map, map.units.values.map(&:to_s).inspect
[map, count]
- }
- outcome = map.units.values.map(&:hp).sum * count
+ }
+ return if map.units.count {|_, unit| unit.is_a?(Elf) } < elf_count
+ map.units.values.map(&:hp).sum * count
end
class TestSolve < Minitest::Test
def test_solve
- assert_equal 27730, solve(<<~INPUT)
+ # assert_equal 27730, solve(<<~INPUT)
+ assert_equal 4988, solve(<<~INPUT)
#######
#.G...#
#...EG#
@@ -445,17 +457,18 @@ class TestSolve < Minitest::Test
#######
INPUT
- assert_equal 36334, solve(<<~INPUT)
- #######
- #G..#E#
- #E#E.E#
- #G.##.#
- #...#E#
- #...E.#
- #######
- INPUT
-
- assert_equal 39514, solve(<<~INPUT)
+ # assert_equal 36334, solve(<<~INPUT)
+ ########
+ ##G..#E#
+ ##E#E.E#
+ ##G.##.#
+ ##...#E#
+ ##...E.#
+ ########
+ #INPUT
+
+ # assert_equal 39514, solve(<<~INPUT)
+ assert_equal 31284, solve(<<~INPUT)
#######
#E..EG#
#.#G.E#
@@ -465,7 +478,8 @@ class TestSolve < Minitest::Test
#######
INPUT
- assert_equal 27755, solve(<<~INPUT)
+ # assert_equal 27755, solve(<<~INPUT)
+ assert_equal 3478, solve(<<~INPUT)
#######
#E.G#.#
#.#G..#
@@ -475,7 +489,8 @@ class TestSolve < Minitest::Test
#######
INPUT
- assert_equal 28944, solve(<<~INPUT)
+ # assert_equal 28944, solve(<<~INPUT)
+ assert_equal 6474, solve(<<~INPUT)
#######
#.E...#
#.#..G#
@@ -485,7 +500,8 @@ class TestSolve < Minitest::Test
#######
INPUT
- assert_equal 18740, solve(<<~INPUT)
+ # assert_equal 18740, solve(<<~INPUT)
+ assert_equal 1140, solve(<<~INPUT)
#########
#G......#
#.E.#...#