aoc2020/day_11/first.rb

51 lines
799 B
Ruby

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
next nil if x_index < 0 || y_index < 0
map[row+x]&.[](col+y)
end
occupied = tmp.compact.count('#')
output[row][col] = case [map[row][col], occupied]
in ['L', 0]
'#'
in ['#', 4..]
'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(:+)