From 9cdb1c0dcfb6abf24bda6876ca7e767a2ace8902 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Wed, 13 Dec 2023 21:22:12 +0100 Subject: [PATCH] Added day 11 --- resources/input11.txt | 140 ++++++++++++++++++++++++++++++++++++++++++ src/days/day11.rs | 97 +++++++++++++++++++++++++++++ src/days/mod.rs | 3 +- src/main.rs | 1 + 4 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 resources/input11.txt create mode 100644 src/days/day11.rs diff --git a/resources/input11.txt b/resources/input11.txt new file mode 100644 index 0000000..e4949ac --- /dev/null +++ b/resources/input11.txt @@ -0,0 +1,140 @@ +......................................#.....................................#......#.......#.....................#.................#........ +............................................................................................................................................ +.............................................#............................................................................................#. +..........................#..................................#........#............................#........................................ +...#...........................#.................#............................................#...............................#............. +....................#.................................#..................................................#.........#........................ +......................................#...............................................................................................#..... +...................................................................................#.............#.......................................... +.......................#.........................................#......................#..................................#.....#.......... +...............#................#...................#.........................#.................................#........................... +.......#..............................................................#..................................................................... +........................................#...................#.............................................#................................. +...........................#.....................#..................................................#..................#.................... +.................#........................................................................#.......................#......................... +............#..................................................#...............................#........................................#... +.#................................#.........................................................................#............................... +.....................................................#...............#....................................................#................. +..........................#...................#....................................#.................#.........................#............ +........#..............................#............................................................................#....................... +........................................................#................#.................................................................. +...................#.............#...............................#.........................................#................................ +........................#...........................#.........................#......#.....................................................# +..#........#.................#....................................................................................................#......... +.............................................#.............#.........................................#............#......................... +...............#......................................................#......................#..........................................#... +............................................................................................................................................ +..................................................................................#........................................#................ +..........................#........#......#..............#.....#................................................................#........... +.........................................................................................#.....#..............#............................. +....................#..........#.....................#................................................................................#..... +.#....................................................................#........#...........................................................# +..........#..............................................................................................................#.................. +............................................................#......................................#........................................ +...............#..........#................................................................................#................................ +........................................................#..................................#.....................................#.......... +......................#................#...............................................................................................#.... +........#.......................................#.........................................................................#................. +.........................................................................#........#..................................#...................... +#..................................#......#............................................................#...........................#........ +............................................................................................................................................ +......#.................................................#..............................#.................................................... +.........................#....................................................#..............................................#..........#... +.................................#.............................................................................#............................ +.................#..................................#................#...........................#.......................................... +..............................................................#......................#......#............................................... +.............#..........................#.................................................................................................#. +...............................#........................#................................................................................... +....................................#.................................................................#..............#...................... +.......#....................................................................#.................#................................#............ +..........................#.................#.....#.................#....................................................#.............#.... +............................................................................................................................................ +............#.............................................................................................#......#................#......... +...#..........................#..........................#......................................#........................................... +............................................................................................................................................ +........#.............#...................................................#................................................................. +...........................................#....................#.................#...........................#......#.........#............ +............................................................................................................................................ +............#....................#.............................................................#......#..................................... +.....................................................................#..................#................................................... +.....................#..............................#........#...............#........................................................#..... +....................................#...................................................................................#................... +..................................................................................................................#......................... +.....#.......#...............#..................................................................#..............................#............ +.............................................#.........#.................................................................................... +..................................................................#.......#................................#................................ +.........................#.................................................................#.......#.................#...................... +#...............................................#.........................................................................#.......#......... +...........................................#.................#................#...........................................................#. +......................#...............#............................................#........................................................ +...............#..............#....................#....................................#.........................#......................... +..#..........................................................................................................#.............................. +..........#...................................................................................#........#.................................... +...........................#.......#.........#.........#..................#................................................................. +................................................................#......................................................#.................... +............................................................................................................................................ +...............................................................................................................................#............ +........#...............................#............#...................................................#........#....................#.... +....................#....................................................................................................................... +............#...................................#....................................#................................#.....#............... +.............................#....................................#...............................#......................................... +...#....................................................#..................#...........................#.................................... +.......................#..............#..................................................#...............................#........#......... +..............#.................#............................................................................#.............................. +........#..........................................#......................................................................................#. +..........................#............................................#.....#.......................................#...................... +...................................#.....................#........#...............#.........#............................................... +...........................................................................................................................#................ +.........................................#.............................................................#...........................#........ +......#.........................#...........................#............#.....#............................................................ +...............#.....#.................................#.......................................................................#............ +..................................................................................................#..............#........................#. +...................................#.......#................................................................................................ +..............................................................#......................#..................#.........................#......... +..............................#.................#.........................................#................................................. +..#......................................................................................................................................... +..................#..................................................#......#......................#........................#............... +...........#...........................................................................................................#..............#..... +.....................................#...................................................................................................... +........................................................#.........................................................#......................... +..........................#....................................#............................................................................ +............................................................................................#...............#............................#.. +#..............................................#...................................#..................#..................................... +.........#.............#..................#.....................................................................#........................... +.............................................................................................................................#.............. +.....................................#...........................#............#..................#.....................................#.... +.................#..........#............................#..............................................................#........#.......... +.........................................................................#...................#.............................................. +.................................#...........................................................................#.....#........................ +........................................#..........................#........................................................................ +...#.....#.................................................#......................................#......#..........................#.....#. +....................................#.............................................#......................................................... +....................#.......#................#..............................#............................................................... +.....................................................................#....................#....................#............................ +.................................................#................................................................................#......... +...........#...........#...................................................................................................................# +................#.......................#.........................#...................................................#..................... +...#.......................#...............................#.........................................#.........................#............ +....................................................................................#....................................................... +.............................................................................................#...........................................#.. +..............#...............................#................................................................#..........#................. +.......................................................#.............#.....#................................................................ +............................#...................................................................#........................................... +.....#..............................#...........................................................................................#..........# +..................................................#...............#................#........................................................ +..........#..........#.......................................................................................#.........#.............#...... +........................................................#....................................................................#.............. +.............................#...................................................................................#.......................#.. +.#.........................................#...................#...........#..........................#..................................... +....................................................................#......................#................................................ +...........#......................................................................#.................................#....................... +.....#.................................................................................#.......................................#............ +...............................#.....#..................................................................#................................... +....................#.........................#......................................................................................#...... +..................................................................................................#...........#........#.................... +...............#.........................................#............#..................................................................... +..................................#......#....................................#............................................................. +...........................#........................#.....................................#..............#...............................#.. +....#..............#..............................................................................................#......................... +.............#...................................................................................#.......................................... +...................................................................................#..................#..................#............#..... \ No newline at end of file diff --git a/src/days/day11.rs b/src/days/day11.rs new file mode 100644 index 0000000..22a5293 --- /dev/null +++ b/src/days/day11.rs @@ -0,0 +1,97 @@ +use std::{path::Path, str::FromStr, collections::HashSet, ops::Div, cmp::{min, max}}; + +use itertools::Itertools; +use num::Integer; + +use crate::{error::AdventError, input::read_into}; + +struct Chart { + stride: usize, + space: Vec, + empty_rows: HashSet, + empty_columns: HashSet +} + +impl FromStr for Chart { + type Err = AdventError; + + fn from_str(s: &str) -> Result { + let stride = s.lines().next().ok_or(AdventError("No first line".into()))?.len(); + Ok(Chart { + stride, + space: s.chars().filter(|c| !c.is_ascii_whitespace()).collect_vec(), + empty_rows: HashSet::::new(), + empty_columns: HashSet::::new(), + }) + } +} + +impl Chart { + fn detect_doubles(&mut self) { + for x in 0..self.stride { + if self.space.iter().skip(x).step_by(self.stride).all(|c| *c == '.') { + self.empty_columns.insert(x); + } + } + for y in 0..self.space.len().div(self.stride) { + if self.space.iter().skip(y*self.stride).take(self.stride).all(|c| *c == '.') { + self.empty_rows.insert(y); + } + } + } + + fn find_galaxys(&self) -> Vec<(usize, usize)> { + let mut vec = vec![]; + for (i, c) in self.space.iter().enumerate() { + if *c == '#' { + let x = i.div_mod_floor(&self.stride); + vec.push((x.1, x.0)); + } + } + vec + } + + fn distance(&self, c1: &(usize, usize), c2: &(usize, usize), extra_distance: u64) -> u64 { + let mut steps = 0; + for x in (min(c1.0, c2.0)..=max(c1.0, c2.0)).into_iter().skip(1) { + steps += 1; + if self.empty_columns.contains(&x) { + steps += extra_distance; + } + } + for y in (min(c1.1, c2.1)..=max(c1.1, c2.1)).into_iter().skip(1) { + steps += 1; + if (self.empty_rows).contains(&y) { + steps += extra_distance; + } + } + steps + } +} + +pub fn one() -> Result { + let mut chart = read_into::(Path::new("resources/input11.txt"))?; + chart.detect_doubles(); + let galaxy_coords = chart.find_galaxys(); + let mut sum: u64 = 0; + for (i, c1) in galaxy_coords.iter().enumerate() { + for c2 in galaxy_coords.iter().skip(i+1) { + sum += chart.distance(c1, c2, 2-1); + } + } + Ok(sum as u64) +} + + +pub fn two() -> Result { + let mut chart = read_into::(Path::new("resources/input11.txt"))?; + chart.detect_doubles(); + let galaxy_coords = chart.find_galaxys(); + let mut sum: u64 = 0; + for (i, c1) in galaxy_coords.iter().enumerate() { + for c2 in galaxy_coords.iter().skip(i+1) { + sum += chart.distance(c1, c2, 1000000-1); + } + } + Ok(sum as u64) +} \ No newline at end of file diff --git a/src/days/mod.rs b/src/days/mod.rs index be32ac1..1bb6575 100644 --- a/src/days/mod.rs +++ b/src/days/mod.rs @@ -7,4 +7,5 @@ pub mod day6; pub mod day7; pub mod day8; pub mod day9; -pub mod day10; \ No newline at end of file +pub mod day10; +pub mod day11; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 6fec525..1c5e130 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,7 @@ fn main() -> Result<(), AdventError> { (day8::one as fn() -> Result, day8::two as fn() -> Result), (day9::one as fn() -> Result, day9::two as fn() -> Result), (day10::one as fn() -> Result, day10::two as fn() -> Result), + (day11::one as fn() -> Result, day11::two as fn() -> Result), ]; if env::args().len() == 1 {