#!/bin/env ruby require 'pry' def convert (seats) seats.map! do |row| row.map! do |seat| case seat when 0 then 'L' when 1 then '#' when nil then '.' end end row.reduce(:+) end end def fill_seats (seats) output = Array.new(seats.length, Array.new(seats[0].length, nil)) output.map!.with_index do |row, i| row.map.with_index do |seat, j| next if seats[i][j] == nil i == 0 ? row_min = 0 : row_min = i - 1 i == seats.length - 1 ? row_max = -1 : row_max = i + 1 j == 0 ? col_min = 0 : col_min = j - 1 j == seats[0].length - 1 ? col_max = -1 : col_max = j + 1 row_range = (row_min..row_max) col_range = (col_min..col_max) adjecents = seats[row_range].map {|line| line[col_range]}.flatten.compact.sum - seats[i][j] combo = {:occupied? => seats[i][j], :adjecents => adjecents} case when combo[:occupied?] == 0 && combo[:adjecents] == 0 then 1 when combo[:occupied?] == 0 && combo[:adjecents] != 0 then 0 when combo[:occupied?] == 1 && combo[:adjecents] < 4 then 1 when combo[:occupied?] == 1 && combo[:adjecents] >= 4 then 0 end end end return output end seats = File.readlines('./input').map(&:strip) .map! {|line| line.split('') } .map! {|line| line.map { |char| char == 'L' ? 0 : nil }} steps = [] steps[0] = seats until steps[-1] == steps[-2] do steps.push(fill_seats(steps[-1])) end p steps[-1].map(&:compact).flatten.sum