Add part 2 solution (check out the previous commit for part 1.)
This commit is contained in:
parent
b7518c96a1
commit
6ff1d97c91
29
day15.cr
29
day15.cr
|
@ -213,9 +213,10 @@ end
|
|||
def step(map, units)
|
||||
sort_reading_order(units)
|
||||
index = 0
|
||||
elf_death_count = 0
|
||||
while index < units.size
|
||||
return true if (units.count &.[:type].==(:elf)) == 0
|
||||
return true if (units.count &.[:type].==(:goblin)) == 0
|
||||
return nil if (units.count &.[:type].==(:elf)) == 0
|
||||
return nil if (units.count &.[:type].==(:goblin)) == 0
|
||||
|
||||
unit = units[index]
|
||||
unit = moved_unit(map, units, unit)
|
||||
|
@ -224,6 +225,7 @@ def step(map, units)
|
|||
if attacked_u
|
||||
attacked_index, attacked_unit = attacked_u
|
||||
if attacked_unit[:hp] <= 0
|
||||
elf_death_count += 1 if attacked_unit[:type] == :elf
|
||||
units.delete_at attacked_index
|
||||
index -= 1 if index >= attacked_index
|
||||
else
|
||||
|
@ -233,7 +235,7 @@ def step(map, units)
|
|||
index += 1
|
||||
end
|
||||
|
||||
return false
|
||||
return elf_death_count
|
||||
end
|
||||
|
||||
def check_win(units)
|
||||
|
@ -252,11 +254,21 @@ def winning_score(units, type)
|
|||
units.select(&.[:type].==(type)).sum &.[:hp]
|
||||
end
|
||||
|
||||
simulating_units = units.dup
|
||||
power = 3
|
||||
loop do
|
||||
simulating_units = units.dup.map do |unit|
|
||||
next unit unless unit[:type] == :elf
|
||||
{ x: unit[:x], y: unit[:y], hp: unit[:hp], type: :elf, power: power }
|
||||
end
|
||||
steps = 0
|
||||
died = false
|
||||
# draw(map, simulating_units)
|
||||
until won = check_win(simulating_units)
|
||||
steps += 1 unless step(map, simulating_units)
|
||||
until won = check_win(simulating_units) || died
|
||||
result = step(map, simulating_units)
|
||||
if result
|
||||
steps += 1
|
||||
died = result > 0
|
||||
end
|
||||
# draw(map, simulating_units)
|
||||
sort_reading_order(simulating_units)
|
||||
# simulating_units.each do |unit|
|
||||
|
@ -264,4 +276,7 @@ until won = check_win(simulating_units)
|
|||
# end
|
||||
# puts "-- (end of roun #{steps})"
|
||||
end
|
||||
puts "#{steps} * #{winning_score(simulating_units, won)} = #{steps * winning_score(simulating_units, won)}"
|
||||
puts "(power: #{power}) #{steps} * #{winning_score(simulating_units, won)} = #{steps * winning_score(simulating_units, won)}"
|
||||
break if !died && won != :goblin
|
||||
power += 1
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue
Block a user