Code for the Advent of Code event
aoc advent-of-code
at rust 49 lines 1.2 kB view raw
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