#!/usr/bin/env ruby input = $stdin.readlines.map(&:strip) is = input[0].split(" ")[2] rs = input[2..-1] class Plants def initialize(initial_state, rules) @state = Hash.new(false) parse_state_string(initial_state) @rules = [] parse_rules_lines(rules) end def step(t = 1) t.times do newstate = Hash.new(false) min = @state.keys.min max = @state.keys.max ((min-5)..(max+5)).each do |i| res = false @rules.each do |r| ires = true (-2..2).each do |o| if @state[i + o] != r[o + 2] then ires = false end end if ires then res = true end end if res then newstate[i] = true end end @state = newstate end end def sum @state.select { |_, s| s }.keys.sum end private def parse_state_string(state) state.chars.each_with_index do |s, i| @state[i] = s == "#" end end def parse_rules_lines(rules) rules.each do |rule| c, r = rule.split(" => ") if r == "#" then @rules << c.chars.map { |p| p == "#" } end end end end m = Plants.new(is, rs) m.step(20) puts m.sum