aoc2020/day_11/second.rb
2020-12-11 15:15:17 +01:00

62 lines
1.0 KiB
Ruby

# frozen_string_literal: true
input = File.readlines('./input').map(&:strip).map(&:chars)
$dirs = [
[-1, -1],
[-1, 0],
[-1, 1],
[0, -1],
[0, 1],
[1, -1],
[1, 0],
[1, 1]
]
def round(map)
output = []
map.each_index do |row|
output << []
map[row].each_index do |col|
tmp = $dirs.map do |x, y|
x_index = row + x
y_index = col + y
char = loop do
break nil if x_index.negative? || y_index.negative? || x_index >= map.size || y_index >= map[row].size
char = map[x_index]&.[](y_index)
x_index += x
y_index += y
next if char == '.'
break char
end
char
end
occupied = tmp.compact.count('#')
output[row][col] = case [map[row][col], occupied]
in ['L', 0]
'#'
in ['#', 5..]
'L'
else
map[row][col]
end
end
end
output
end
last_hash = 0
out = input
until out.hash == last_hash
last_hash = out.hash
out = round out
end
puts out.map{_1.count('#')}.inject(:+)