You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

#### 47 lines 996 B Raw Permalink Blame History

 ```require "advent" ``` ```require "benchmark" ``` ``` ``` ```INPUT = input(2020, 17).lines.map(&.chars) ``` ``` ``` ```def solve(input, dim) ``` ``` step = input.clone ``` ``` cubes = Set(Array(Int32)).new ``` ``` new_cubes = Set(Array(Int32)).new ``` ``` input.each_with_index do |row, y| ``` ``` row.each_with_index do |c, x| ``` ``` cubes << [x,y].concat([0] * (dim-2)) if c == '#' ``` ``` end ``` ``` end ``` ``` ``` ``` 8.times do |i| ``` ``` print '.' ``` ``` neighbor_count = Hash(Array(Int32), Int32).new(0) ``` ``` Array.product([[-1,0,1]] * dim).each do |diff| ``` ``` next if diff.all? &.==(0) ``` ``` cubes.each do |c| ``` ``` neighbor_count[c.zip_with(diff) { |a,b| a+b }] += 1 ``` ``` end ``` ``` end ``` ``` ``` ``` new_cubes.clear ``` ``` neighbor_count.each do |n, i| ``` ``` new_cubes << n if i == 3 || (cubes.includes?(n) && i == 2) ``` ``` end ``` ``` new_cubes, cubes = cubes, new_cubes ``` ``` end ``` ``` cubes.size ``` ```end ``` ``` ``` ```def part1(input) ``` ``` solve(input, 3) ``` ```end ``` ``` ``` ```def part2(input) ``` ``` solve(input, 4) ``` ```end ``` ``` ``` ```(3..).each do |i| ``` ``` print "Dim #{i} " ``` ``` bm = Benchmark.measure { puts " #{solve(INPUT, i)}" } ``` ``` puts bm.real * 1000 ``` ```end ``` ``` ```