Code for the Advent of Code event
aoc
advent-of-code
1#!/usr/bin/env ruby
2# frozen_string_literal: true
3
4require 'matrix'
5
6class Vector
7 def x = self[0]
8 def y = self[1]
9end
10
11grid = {}
12
13ARGF.readlines.map(&:strip).each_with_index do |line, row|
14 line.chars.map(&:to_i).each_with_index do |char, col|
15 grid[Vector[col, row]] = char
16 end
17end
18
19def adj(pos)
20 [
21 Vector[pos.x - 1, pos.y - 1], Vector[pos.x, pos.y - 1], Vector[pos.x + 1, pos.y - 1],
22 Vector[pos.x - 1, pos.y], Vector[pos.x + 1, pos.y],
23 Vector[pos.x - 1, pos.y + 1], Vector[pos.x, pos.y + 1], Vector[pos.x + 1, pos.y + 1]
24 ]
25end
26
27flashed = Set.new
28flash_count = 0
29
30(1..).each do |n|
31 grid.each_key { |p| grid[p] += 1 }
32 flash_poses = grid.select { |_, v| v > 9 }.map(&:first)
33 flashed.merge flash_poses
34 process = flash_poses.flat_map { |p| adj(p).select { grid.key?(_1) && !flashed.include?(_1) } }
35 while process.any?
36 pos = process.pop
37 grid[pos] += 1
38 next unless grid[pos] > 9
39 process.delete pos
40 new_adj = adj(pos).select { |p| grid.key?(p) && !flashed.include?(p) }
41 process.push *new_adj
42 flashed.add pos
43 end
44 flashed.each { |p| grid[p] = 0 }
45 flash_count += flashed.size
46 flashed.clear
47 puts flash_count if n == 100
48 break puts n if grid.values.all?(&:zero?)
49end