|
| 1 | +#!/usr/bin/ruby |
| 2 | +require 'matrix' |
| 3 | +require 'test/unit' |
| 4 | +require 'pry' |
| 5 | + |
| 6 | +class Day17 |
| 7 | + attr_accessor :cells |
| 8 | + |
| 9 | + def initialize(grid, d) |
| 10 | + @d = d |
| 11 | + @cells = {} |
| 12 | + grid.split("\n").each.with_index { |line, y| |
| 13 | + line.split(//).each.with_index.select{ |c, _| c == '#'}.each { |_, x| |
| 14 | + self.add_cell(([0] * @d).zip([x, y]).map(&:compact).map(&:sum)) |
| 15 | + } |
| 16 | + } |
| 17 | + end |
| 18 | + |
| 19 | + def step |
| 20 | + @cells = cells_to_evaluate.each_with_object({}) do |c, cells| |
| 21 | + cells[c] = true if activated?(c) |
| 22 | + end |
| 23 | + end |
| 24 | + |
| 25 | + def activated?(c) |
| 26 | + (@cells[c] && (2..3).include?(closed_active(c))) || |
| 27 | + (!@cells[c] && closed_active(c) == 3) |
| 28 | + end |
| 29 | + |
| 30 | + def cells_to_evaluate |
| 31 | + @cells.map { |c, _| closed_cells(c) + [c] }.flatten(1).uniq |
| 32 | + end |
| 33 | + |
| 34 | + def add_cell(c) |
| 35 | + @cells[c] = true |
| 36 | + end |
| 37 | + |
| 38 | + def closed_cells(c) |
| 39 | + [1, 0, -1].repeated_permutation(@d).reject { |c| c == [0] * @d }.map{ |ac| |
| 40 | + c.zip(ac).map(&:sum) |
| 41 | + } |
| 42 | + end |
| 43 | + |
| 44 | + def closed_active(c) |
| 45 | + closed_cells(c).count { |c| @cells[c] } |
| 46 | + end |
| 47 | +end |
| 48 | + |
| 49 | +#start 20:40 |
| 50 | +#end 22:10 |
| 51 | +class Day17Test < Test::Unit::TestCase |
| 52 | + def test_star_1 |
| 53 | + solver = Day17.new(File.read('data_test.txt'), 3) |
| 54 | + 6.times { |_| solver.step } |
| 55 | + assert_equal 112, solver.cells.count |
| 56 | + end |
| 57 | + |
| 58 | + def test_star_1_final |
| 59 | + solver = Day17.new(File.read('data.txt'), 3) |
| 60 | + 6.times { |_| solver.step } |
| 61 | + assert_equal 230, solver.cells.count |
| 62 | + end |
| 63 | + |
| 64 | + def test_star_2 |
| 65 | + solver = Day17.new(File.read('data_test.txt'), 4) |
| 66 | + 6.times { |_| solver.step } |
| 67 | + assert_equal 848, solver.cells.count |
| 68 | + end |
| 69 | + |
| 70 | + def test_star_2_final |
| 71 | + solver = Day17.new(File.read('data.txt'), 4) |
| 72 | + 6.times { |_| solver.step } |
| 73 | + assert_equal 1600, solver.cells.count |
| 74 | + end |
| 75 | +end |
0 commit comments