From a3bb9bbbb34a16d5717c6f87ad12d1a2db5c644c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=A9=20Cassiop=C3=A9e=20Gauthier?= Date: Sat, 11 Dec 2021 10:14:46 -0500 Subject: [PATCH] Day 11 --- Cargo.toml | 4 ++ inputs/day11.txt | 10 +++++ src/day11.rs | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 inputs/day11.txt create mode 100644 src/day11.rs diff --git a/Cargo.toml b/Cargo.toml index 0090bfc..0249f0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,3 +42,7 @@ path = "src/day9.rs" [[bin]] name = "day10" path = "src/day10.rs" + +[[bin]] +name = "day11" +path = "src/day11.rs" diff --git a/inputs/day11.txt b/inputs/day11.txt new file mode 100644 index 0000000..64dcfab --- /dev/null +++ b/inputs/day11.txt @@ -0,0 +1,10 @@ +5665114554 +4882665427 +6185582113 +7762852744 +7255621841 +8842753123 +8225372176 +7212865827 +7758751157 +1828544563 diff --git a/src/day11.rs b/src/day11.rs new file mode 100644 index 0000000..53c9939 --- /dev/null +++ b/src/day11.rs @@ -0,0 +1,114 @@ +use std::collections::HashSet; + +fn square(x: usize, y: usize) -> Vec<(usize, usize)> { + let mut sq = Vec::new(); + if y > 0 { + if x > 0 { + sq.push((x - 1, y - 1)) + } + sq.push((x, y - 1)); + if x < 9 { + sq.push((x + 1, y - 1)) + } + } + if x > 0 { + sq.push((x - 1, y)) + } + if x < 9 { + sq.push((x + 1, y)) + } + if y < 9 { + if x > 0 { + sq.push((x - 1, y + 1)) + } + sq.push((x, y + 1)); + if x < 9 { + sq.push((x + 1, y + 1)) + } + } + sq +} + +fn step(grid: &mut Vec>) -> usize { + let mut flashed = HashSet::new(); + + loop { + let mut new_flashes = false; + for (y, row) in grid.iter().enumerate() { + for (x, octopus) in row.iter().enumerate() { + let adjacent = square(x, y) + .iter() + .filter(|(xx, yy)| flashed.contains(&(*xx, *yy))) + .count() as u32; + if (octopus + adjacent + 1) >= 10 && !flashed.contains(&(x, y)) { + flashed.insert((x, y)); + new_flashes = true; + } + } + } + if !new_flashes { + break; + } + } + + for (y, row) in grid.iter_mut().enumerate() { + for (x, octopus) in row.iter_mut().enumerate() { + *octopus = if flashed.contains(&(x, y)) { + 0 + } else { + *octopus + + square(x, y) + .iter() + .filter(|(xx, yy)| flashed.contains(&(*xx, *yy))) + .count() as u32 + + 1 + }; + } + } + + flashed.len() +} + +fn total_flashes(input: &str) -> usize { + let mut octopuses = input + .lines() + .map(|line| { + line.chars() + .map(|c| char::to_digit(c, 10).unwrap()) + .collect::>() + }) + .collect::>>(); + + (0..100).fold(0, |acc, _| acc + step(&mut octopuses)) +} + +fn first_simultaneous_step(input: &str) -> usize { + let mut octopuses = input + .lines() + .map(|line| { + line.chars() + .map(|c| char::to_digit(c, 10).unwrap()) + .collect::>() + }) + .collect::>>(); + + let mut s = 0; + loop { + s += 1; + if step(&mut octopuses) == 100 { + break; + } + } + s +} + +fn main() { + const INPUT: &str = include_str!("../inputs/day11.txt"); + println!("solution {}", total_flashes(INPUT)); + println!("solution {}", first_simultaneous_step(INPUT)); +} + +#[test] +fn test_square() { + assert_eq!(square(0, 0), vec![(1, 0), (0, 1), (1, 1)]); +}