From 5126304fd018eace3af07896f60991b57ef9f1a0 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Tue, 12 Dec 2023 19:21:48 +0100 Subject: [PATCH] day11 part 1 --- 2023/day11/Cargo.toml | 15 ++++ 2023/day11/benches/benches.rs | 3 + 2023/day11/input.txt | 140 ++++++++++++++++++++++++++++++++++ 2023/day11/input_small.txt | 10 +++ 2023/day11/src/lib.rs | 131 +++++++++++++++++++++++++++++++ 2023/day11/src/main.rs | 3 + Cargo.lock | 9 +++ helper/src/ext.rs | 7 ++ 8 files changed, 318 insertions(+) create mode 100644 2023/day11/Cargo.toml create mode 100644 2023/day11/benches/benches.rs create mode 100644 2023/day11/input.txt create mode 100644 2023/day11/input_small.txt create mode 100644 2023/day11/src/lib.rs create mode 100644 2023/day11/src/main.rs diff --git a/2023/day11/Cargo.toml b/2023/day11/Cargo.toml new file mode 100644 index 0000000..6f26205 --- /dev/null +++ b/2023/day11/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "day11" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom.workspace = true +helper.workspace = true +divan.workspace = true + +[[bench]] +name = "benches" +harness = false diff --git a/2023/day11/benches/benches.rs b/2023/day11/benches/benches.rs new file mode 100644 index 0000000..387f7f4 --- /dev/null +++ b/2023/day11/benches/benches.rs @@ -0,0 +1,3 @@ +fn main() { + day11::bench(); +} diff --git a/2023/day11/input.txt b/2023/day11/input.txt new file mode 100644 index 0000000..1043d12 --- /dev/null +++ b/2023/day11/input.txt @@ -0,0 +1,140 @@ +...........................#.......#.....................#................#.......................................#.............#........... +..................................................#...........................................#.......................................#..... +........#....................................#....................................#.......................#................................. +........................................................................................................................#................... +#...................#.......................................#............................................................................... +...............#.......................................................................#...........#...........#............#............... +........................................................#...........................................................................#....... +..............................................#.....................#...................................#................................... +.............................#......#.....................................#................................................................. +.......................#...........................#............................................#.................#......................... +.....#.....................................................................................................................................# +...........#......#...............................................#..............................................................#.......... +.......................................................................................#...................#................................ +..............................#........................#....................................................................#............... +.................................................#..........#......................................#........................................ +........#................................#...................................................#..........#.....#......#...................... +.........................#.........................................................................................................#........ +............#.................................................................#.........#................................................... +....................#....................................................................................................................... +............................................#.............#................................................................................. +..............................#.....#...........................................................#........................................#.. +#.........#........................................#............#................................................................#.......... +.........................................................................................................#.................................. +..................#.....................................#..............................#.............................#.......#.............. +...........................#..............................................#................................................................. +...........................................................................................#......#......................................... +.......................#.......#..................#..........#....................................................................#......#.. +.....#.............................................................#............................................#........................... +....................................#............................................#......................................#................... +.....................................................................................................................................#...... +..............#.............................#.......#....................................#.................................................. +.........#......................................................#.................................................#...........#............. +............................................................................................................................................ +.#.....................................................................#..........#....................#.................................... +..................................#....................................................................................................#.... +...........#.........#............................#......#........................................#......................................... +................................................................................................................................#........... +..............................................................................................#............................................. +......................................#..............#.......................................................#...........#.................. +....#............#.........................................#................................................................................ +............#..............#.............................................................#.................................................. +...............................................#...................................................#..........................#............# +..................................#......................................................................................................... +........................................................................#...........#...............................#.....#................. +#.........#..............#.................................................................................................................. +.......................................................................................................................................#.... +................#..........................................#................#................#.................#..................#......... +...................................................................#........................................................................ +................................................#....................................................#...................................... +.....................................................#..........................................#........................................... +..........................#................................................................................................................. +.....#.....#.....................................................................#.......#..............................#................... +.....................#........................#...............................................................#................#............ +................................#........#............................................................#..................................... +.................................................................................................#................#......................... +..................................................................#.................................................................#....... +............................................................................................................................................ +................................................#.....#.................#................#....................................#............. +......................#.....................................................................................#........#..................#... +..........#........................#................................................#....................................................... +....#.............#...................................................................................#...........................#......... +.........................................#..................................................#.....................#......................... +............................................................................................................................................ +..........................#..................#..........................#.................................................#................. +.......................................................................................#......................#............................. +................................#......#.....................#................................#......................#..................#... +............................................................................................................................................ +........#.........#.................................................................#.......................................#......#........ +..........................................#........#........................................................................................ +............................................................................................................................................ +...............................................................................................#.......................#.................... +............................#............................................................................#.................................# +............................................................................................................................................ +......#...........#...................................#........#........#................................................................... +....................................................................................#.........................................#............. +.......................................#.........#......................................................................#................... +............................................................................................................................................ +..............................#..................................................................................#.......................... +.......................#......................................................#................#............................................ +........#..........................................................#..................#................#...........................#........ +.............#.....#................#....................................................................................................... +.........................................#...............................#.....................................#............................ +.#...........................................................#...................#..................#....................................... +...........................#.................#............................................................................#................. +.......................................................#..................................................#.........#.....................#. +......................................................................................#........#............................................ +......#.........#.................#............................#................................................................#........... +..........................................................................#................................................................. +...........#.........#.........................................................................................#............................ +...........................................#..............#.................................................................#............... +.....................................................#.............#...................................................................#.... +....#.........#.................#................................................................................................#.......... +.......................#.......................................................#..................#........#............#................... +......................................#..................................#...................#.............................................. +.......#.....................................#......................................................................#....................... +..#..........................#...........................#..........................#....................................................... +...........#.............................................................................#......................#......................#.... +...............................................................#.........................................#..................#............... +.................#......................#........#...............................#.......................................................... +......................#.......................................................................#......#..............................#....... +............................#......#......................#................................................................................. +...........................................#.............................#..........................................#.....#................. +...........#......................................................................................#.....................................#... +.......................................................#..........#....................................#.......#.................#.......... +...............................#........................................................#................................................... +..#.....#.............................#................................#.................................................................... +..................................................#...........................#.............................#............................... +.............................................................................................#.....#........................................ +...............#........................................#.............................................................#..................... +#....................#...........#.......................................................................................................... +............................#..............#..............................#.......................................................#......... +.....................................................................................#...................................................... +.................#...........................................................................................#.............................. +.........#..............#............................................................................................#...................#.. +....................................#................#..............................................#....................................... +...............................#.........#.................#...................#.........................#..................#............... +#.............................................#........................................#.................................................... +......................................................................#..........................................#.......................... +.............#...............................................................................#........#...............................#..... +...#............................................................#............................................#..........#..................# +...................................................#........................................................................................ +..........................................#..............................#..................................................#............... +.............................................................#....................#.....................................................#... +.....................#..............#..................#................................................#................................... +.......#.......................#........................................................#.......#..............#.................#.......... +..........................................................................................................................#................. +...#.......................................#....................#...................#....................................................... +..................#......................................................................................................................... +...........................#...........#...................................................................#......#......................... +................................#.............#....................#........................................................................ +.........................................................................................#.......#.......................................... +.......#.....................................................#................................................................#...........#. +..................................................#.......................#................................................................. +.............#...................................................................................................#...................#...... +............................#.........#................#.............................#................#..................................... +......................#.......................................................................#...........................#................. +............................................................................................................................................ +.............................................................................................................#.......#............#......... +.......#...........#.....#.....#.............................#.............................................................................. +.............#...............................#..........#..........................................#......................................#. diff --git a/2023/day11/input_small.txt b/2023/day11/input_small.txt new file mode 100644 index 0000000..986aad4 --- /dev/null +++ b/2023/day11/input_small.txt @@ -0,0 +1,10 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#..... diff --git a/2023/day11/src/lib.rs b/2023/day11/src/lib.rs new file mode 100644 index 0000000..21fd903 --- /dev/null +++ b/2023/day11/src/lib.rs @@ -0,0 +1,131 @@ +use std::fmt::Debug; + +use helper::{Day, IteratorExt, Variants}; + +pub fn main() { + helper::main::(include_str!("../input.txt")); +} + +struct Day11; + +helper::define_variants! { + day => crate::Day11; + part1 { + basic => crate::part1; + } + part2 { + basic => crate::part2; + } +} + +impl Day for Day11 { + fn part1() -> Variants { + part1_variants!(construct_variants) + } + + fn part2() -> Variants { + part2_variants!(construct_variants) + } +} + +struct Universe { + rows: Vec>, +} + +impl Debug for Universe { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f)?; + for row in &self.rows { + for &col in row { + write!(f, "{}", if col { '#' } else { '.' })?; + } + writeln!(f)?; + } + Ok(()) + } +} + +fn parse(input: &str) -> Universe { + Universe { + rows: input + .lines() + .map(|line| line.chars().map(|c| c == '#').collect_vec()) + .collect_vec(), + } +} + +fn expand(universe: Universe) -> Universe { + let mut rows = universe + .rows + .into_iter() + .flat_map(|row| { + if row.iter().all(|b| !b) { + vec![row.clone(), row] + } else { + vec![row] + } + }) + .collect_vec(); + + let mut col = 0; + while col < rows[0].len() { + if rows.iter().all(|row| !row[col]) { + rows.iter_mut().for_each(|row| row.insert(col, false)); + col += 1; + } + col += 1; + } + + Universe { rows } +} + +fn part1(input: &str) -> u64 { + let universe = parse(input); + let universe = expand(universe); + + let galaxies = universe + .rows + .iter() + .enumerate() + .flat_map(|(i, row)| { + row.iter() + .copied() + .enumerate() + .filter(|&(_, b)| b) + .map(move |(j, _)| (i, j)) + }) + .collect_vec(); + + let mut sum = 0; + + for i in 0..galaxies.len() { + for j in (i + 1)..galaxies.len() { + let lhs = galaxies[i]; + let rhs = galaxies[j]; + + let distance_x = ((lhs.1 as i64) - (rhs.1 as i64)).abs(); + let distance_y = ((lhs.0 as i64) - (rhs.0 as i64)).abs(); + + sum += distance_x + distance_y; + } + } + + sum as u64 +} + +fn part2(_input: &str) -> u64 { + 0 +} + +helper::tests! { + day11 Day11; + part1 { + small => 374; + default => 0; + } + part2 { + small => 0; + default => 0; + } +} +helper::benchmarks! {} diff --git a/2023/day11/src/main.rs b/2023/day11/src/main.rs new file mode 100644 index 0000000..88b8e52 --- /dev/null +++ b/2023/day11/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + day11::main(); +} diff --git a/Cargo.lock b/Cargo.lock index 458da8f..633c6b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -215,6 +215,15 @@ dependencies = [ "nom", ] +[[package]] +name = "day11" +version = "0.1.0" +dependencies = [ + "divan", + "helper", + "nom", +] + [[package]] name = "divan" version = "0.1.4" diff --git a/helper/src/ext.rs b/helper/src/ext.rs index eda514e..8513fae 100644 --- a/helper/src/ext.rs +++ b/helper/src/ext.rs @@ -57,6 +57,13 @@ pub trait IteratorExt: Iterator { Ok(array) } + + fn collect_vec(self) -> Vec + where + Self: Sized, + { + self.collect() + } } impl IteratorExt for I {}