use std::env::args; use std::fs::File; use std::io::BufRead; use std::io::BufReader; fn step(levels: &mut Vec, rows: usize, cols: usize) -> u32 { for y in 0..rows { for x in 0..cols { levels[y * cols + x] += 1; } } let mut flashes = 0; let mut flashed = true; while flashed { flashed = false; for y in 0..rows { for x in 0..cols { let i = y * cols + x; if levels[i] > 9 { flashed = true; flashes += 1; levels[i] = 0; if x != 0 && y != 0 && levels[i - cols - 1] != 0 { levels[i - cols - 1] += 1; } if y != 0 && levels[i - cols] != 0 { levels[i - cols] += 1; } if x != cols - 1 && y != 0 && levels[i - cols + 1] != 0 { levels[i - cols + 1] += 1; } if x != cols - 1 && levels[i + 1] != 0 { levels[i + 1] += 1; } if x != cols - 1 && y != rows - 1 && levels[i + cols + 1] != 0 { levels[i + cols + 1] += 1; } if y != rows - 1 && levels[i + cols] != 0 { levels[i + cols] += 1; } if x != 0 && y != rows - 1 && levels[i + cols - 1] != 0 { levels[i + cols - 1] += 1; } if x != 0 && levels[i - 1] != 0 { levels[i - 1] += 1; } } } } } return flashes; } fn main() { let path = args().nth(1).unwrap(); let file = File::open(path).unwrap(); let mut rows = 0; let mut cols = 0; let mut levels = vec![]; for line in BufReader::new(file).lines() { let l = line.unwrap(); rows += 1; cols = l.len(); for c in l.chars() { levels.push(c.to_digit(10).unwrap() as u8); } } let mut flashes = 0; for _ in 0..100 { flashes += step(&mut levels, rows, cols); } print!("{}\n", flashes); }