Skip to content

Commit f3dbff6

Browse files
committed
day17
1 parent 39d5bc1 commit f3dbff6

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

2020/day17/data.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#.##....
2+
.#.#.##.
3+
###.....
4+
....##.#
5+
#....###
6+
.#.#.#..
7+
.##...##
8+
#..#.###

2020/day17/data_test.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.#.
2+
..#
3+
###

2020/day17/main.rb

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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

Comments
 (0)