From b0914ebb2bb8e8f2daeab9f1def8e0bedfbba918 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sat, 18 Dec 2021 12:51:59 +0200 Subject: [PATCH] feat: solve day 11, part 1 & 2 --- Cargo.lock | 9 +++ Cargo.toml | 1 + input/11.txt | 10 +++ src/day11.rs | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 3 + 5 files changed, 194 insertions(+) create mode 100644 input/11.txt create mode 100644 src/day11.rs diff --git a/Cargo.lock b/Cargo.lock index 27f0474..5cdb22e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,3 +3,12 @@ [[package]] name = "advent-of-code-2021" version = "0.1.0" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" diff --git a/Cargo.toml b/Cargo.toml index ff6b2ee..b3951d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,3 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +arrayvec = "0.7.2" diff --git a/input/11.txt b/input/11.txt new file mode 100644 index 0000000..350dba8 --- /dev/null +++ b/input/11.txt @@ -0,0 +1,10 @@ +3265255276 +1537412665 +7335746422 +6426325658 +3854434364 +8717377486 +4522286326 +6337772845 +8824387665 +6351586484 diff --git a/src/day11.rs b/src/day11.rs new file mode 100644 index 0000000..1a8092b --- /dev/null +++ b/src/day11.rs @@ -0,0 +1,171 @@ +use arrayvec::ArrayVec; + +pub fn parse_input(input: &str) -> [[u32; 10]; 10] { + input.lines() + .map(|s| s.chars() + .map(|s| s.to_digit(10).unwrap()) + .collect::>() + .into_inner() + .unwrap()) + .collect::>() + .into_inner() + .unwrap() +} + +fn display_grid(grid: &[[u32; 10]; 10]) { + for i in 0..grid.len() { + for j in 0..grid[i].len() { + print!("{:X}", grid[i][j]); + } + print!("\n"); + } + print!("\n"); +} + +fn bump_energy(grid: &mut [[u32; 10]; 10]) { + for i in 0..grid.len() { + for j in 0..grid[i].len() { + grid[i][j] += 1; + } + } +} + +fn bump_energy_around(grid: &mut [[u32; 10]; 10], i: usize, j: usize) { + if j > 0 { + grid[i+0][j-1] += 1; + } + if j < 9 { + grid[i+0][j+1] += 1; + } + if i > 0 { + grid[i-1][j+0] += 1; + } + if i < 9 { + grid[i+1][j+0] += 1; + } + + if i > 0 && j > 0 { + grid[i-1][j-1] += 1; + } + if i < 9 && j > 0 { + grid[i+1][j-1] += 1; + } + if i > 0 && j < 9 { + grid[i-1][j+1] += 1; + } + if i < 9 && j < 9 { + grid[i+1][j+1] += 1; + } +} + +fn perform_flashes(grid: &mut [[u32; 10]; 10]) -> u32 { + let mut flashes = 0; + let mut has_flashed: [[bool; 10]; 10] = [[false; 10]; 10]; + let mut anyone_flashed = true; + + while anyone_flashed { + anyone_flashed = false; + + for i in 0..grid.len() { + for j in 0..grid[i].len() { + if grid[i][j] > 9 && !has_flashed[i][j] { + flashes += 1; + has_flashed[i][j] = true; + anyone_flashed = true; + bump_energy_around(grid, i, j); + } + } + } + } + + return flashes; +} + +fn reset_energy(grid: &mut [[u32; 10]; 10]) { + for i in 0..grid.len() { + for j in 0..grid[i].len() { + if grid[i][j] > 9 { + grid[i][j] = 0; + } + } + } +} + +fn do_step(grid: &mut [[u32; 10]; 10]) -> u32 { + bump_energy(grid); + let flashes = perform_flashes(grid); + reset_energy(grid); + return flashes; +} + +fn has_all_zeros(grid: &[[u32; 10]; 10]) -> bool { + for i in 0..grid.len() { + for j in 0..grid[i].len() { + if grid[i][j] != 0 { + return false; + } + } + } + return true; +} + +pub fn part1(grid: &[[u32; 10]; 10]) -> u32 { + let mut flashes = 0; + let mut active_grid = grid.clone(); + for _ in 0..100 { + flashes += do_step(&mut active_grid); + } + return flashes; +} + +pub fn part2(grid: &[[u32; 10]; 10]) -> u32 { + let mut active_grid = grid.clone(); + let mut step = 0; + while !has_all_zeros(&active_grid) { + do_step(&mut active_grid); + step += 1; + } + return step; +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_example() { + let input = [ + [5, 4, 8, 3, 1, 4, 3, 2, 2, 3], + [2, 7, 4, 5, 8, 5, 4, 7, 1, 1], + [5, 2, 6, 4, 5, 5, 6, 1, 7, 3], + [6, 1, 4, 1, 3, 3, 6, 1, 4, 6], + [6, 3, 5, 7, 3, 8, 5, 4, 7, 8], + [4, 1, 6, 7, 5, 2, 4, 6, 4, 5], + [2, 1, 7, 6, 8, 4, 1, 7, 2, 1], + [6, 8, 8, 2, 8, 8, 1, 1, 3, 4], + [4, 8, 4, 6, 8, 4, 8, 5, 5, 4], + [5, 2, 8, 3, 7, 5, 1, 5, 2, 6] + ]; + let result = part1(&input); + assert_eq!(result, 1656); + } + + #[test] + fn part2_example() { + let input = [ + [5, 4, 8, 3, 1, 4, 3, 2, 2, 3], + [2, 7, 4, 5, 8, 5, 4, 7, 1, 1], + [5, 2, 6, 4, 5, 5, 6, 1, 7, 3], + [6, 1, 4, 1, 3, 3, 6, 1, 4, 6], + [6, 3, 5, 7, 3, 8, 5, 4, 7, 8], + [4, 1, 6, 7, 5, 2, 4, 6, 4, 5], + [2, 1, 7, 6, 8, 4, 1, 7, 2, 1], + [6, 8, 8, 2, 8, 8, 1, 1, 3, 4], + [4, 8, 4, 6, 8, 4, 8, 5, 5, 4], + [5, 2, 8, 3, 7, 5, 1, 5, 2, 6] + ]; + let result = part2(&input); + assert_eq!(result, 195); + } +} + diff --git a/src/main.rs b/src/main.rs index ecc7065..4238e8c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ mod day7; mod day8; mod day9; mod day10; +mod day11; use std::{env, process}; use std::fs::File; @@ -44,6 +45,8 @@ fn run(day: i32, part: i32, input_filename: &str) { "9.2" => println!("{}", day9::part2(day9::parse_input(&contents))), "10.1" => println!("{}", day10::part1(&day10::parse_input(&contents))), "10.2" => println!("{}", day10::part2(&day10::parse_input(&contents))), + "11.1" => println!("{}", day11::part1(&day11::parse_input(&contents))), + "11.2" => println!("{}", day11::part2(&day11::parse_input(&contents))), _ => println!("Day {} part {} not found", day, part) } }