main.rs (2483B)
1 #[derive(Debug, Clone)] 2 struct Board { 3 board: std::collections::HashMap<(usize, usize), u32>, 4 } 5 6 impl Board { 7 fn new(input: &Vec<Vec<u32>>) -> Self { 8 let mut board = std::collections::HashMap::<(usize, usize), u32>::new(); 9 for x in 0..input.len() { 10 for y in 0..input[0].len() { 11 board.insert((x, y), input[x][y]); 12 } 13 } 14 Board { board } 15 } 16 17 fn step_forward(&mut self) -> i32 { 18 for v in self.board.values_mut() { 19 *v += 1; 20 } 21 let mut tot_flash_count = 0; 22 loop { 23 let mut flash_count = 0; 24 let mut flashed = Vec::<(usize, usize)>::new(); 25 for (k, v) in self.board.iter_mut() { 26 if *v > 9 { 27 flash_count += 1; 28 *v = 0; 29 flashed.push(*k); 30 } 31 } 32 for (x, y) in flashed { 33 for dx in -1..=1 { 34 for dy in -1..=1 { 35 if let Some(v) = self 36 .board 37 .get_mut(&((x as i32 + dx) as usize, (y as i32 + dy) as usize)) 38 { 39 if *v != 0 { 40 *v += 1; 41 } 42 } 43 } 44 } 45 } 46 tot_flash_count += flash_count; 47 if flash_count == 0 { 48 break; 49 } 50 } 51 tot_flash_count 52 } 53 } 54 55 fn main() { 56 let input = std::fs::read_to_string("input.txt") 57 .unwrap() 58 .trim() 59 .split('\n') 60 .map(|s| { 61 s.chars() 62 .map(|c| c.to_digit(10).unwrap()) 63 .collect::<Vec<u32>>() 64 }) 65 .collect::<Vec<_>>(); 66 let board = Board::new(&input); 67 // 1613 68 println!("Part 1: {}", part_1(&board)); 69 // 510 70 println!("Part 2: {}", part_2(&board)); 71 } 72 73 fn part_1(board: &Board) -> i32 { 74 let mut board = board.clone(); 75 let mut total_flashed = 0; 76 for _ in 0..100 { 77 let flashed = board.step_forward(); 78 total_flashed += flashed; 79 } 80 total_flashed 81 } 82 83 fn part_2(board: &Board) -> i32 { 84 let mut board = board.clone(); 85 let mut step = 0; 86 loop { 87 let flashed = board.step_forward(); 88 step += 1; 89 if flashed as usize == board.board.len() { 90 return step; 91 } 92 } 93 }