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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy