From 8580a33dcd89b103bf2a94a0426b4668d6b7f1de Mon Sep 17 00:00:00 2001 From: Anthony Oteri Date: Mon, 11 Dec 2023 18:52:00 -0500 Subject: [PATCH] Day 11 - Part 1 Signed-off-by: Anthony Oteri --- day-11/Cargo.toml | 28 ++++++++ day-11/benches/benchmark.rs | 15 ++++ day-11/input.txt | 140 ++++++++++++++++++++++++++++++++++++ day-11/src/bin/part1.rs | 21 ++++++ day-11/src/bin/part2.rs | 21 ++++++ day-11/src/error.rs | 9 +++ day-11/src/lib.rs | 4 ++ day-11/src/part1.rs | 113 +++++++++++++++++++++++++++++ day-11/src/part2.rs | 18 +++++ day-11/test-input.txt | 10 +++ 10 files changed, 379 insertions(+) create mode 100644 day-11/Cargo.toml create mode 100644 day-11/benches/benchmark.rs create mode 100644 day-11/input.txt create mode 100644 day-11/src/bin/part1.rs create mode 100644 day-11/src/bin/part2.rs create mode 100644 day-11/src/error.rs create mode 100644 day-11/src/lib.rs create mode 100644 day-11/src/part1.rs create mode 100644 day-11/src/part2.rs create mode 100644 day-11/test-input.txt diff --git a/day-11/Cargo.toml b/day-11/Cargo.toml new file mode 100644 index 0000000..5b26fdf --- /dev/null +++ b/day-11/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "day-11" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +itertools = { workspace = true } +nom = { workspace = true } +tracing = { workspace = true } +tracing-subscriber = { workspace = true } +miette = { workspace = true } +thiserror = { workspace = true } +dhat = { workspace = true } + +[dev-dependencies] +divan = { workspace = true } +env_logger = { workspace = true } +test-log = { workspace = true } + +[[bench]] +name = "day-00" +path = "benches/benchmark.rs" +harness = false + +[features] +dhat-heap = [] diff --git a/day-11/benches/benchmark.rs b/day-11/benches/benchmark.rs new file mode 100644 index 0000000..7f60052 --- /dev/null +++ b/day-11/benches/benchmark.rs @@ -0,0 +1,15 @@ +use day_11::*; + +fn main() { + divan::main(); +} + +#[divan::bench] +fn part1() { + part1::process(divan::black_box("../input.txt")).unwrap(); +} + +#[divan::bench] +fn part2() { + part2::process(divan::black_box("../input.txt")).unwrap(); +} diff --git a/day-11/input.txt b/day-11/input.txt new file mode 100644 index 0000000..64c44c6 --- /dev/null +++ b/day-11/input.txt @@ -0,0 +1,140 @@ +.#...........#.........................................................................#...............#...........#........................ +.......................#.................................................................................................................... +...............................#...........#.................#.............................#.............................................#.. +......#............................................#........................................................................................ +......................................................................#.....#.....................#......................................... +.................#.......#.......................................#................#.....#.....................#............................. +.........................................#.................#................................................................................ +................................#.............................................................#..........#.................................. +#.......................................................................#..............................................#.................#.. +..........#....................................#......................................#............................................#........ +................#....................................#........#............................................................................. +......#........................................................................#............................................................ +......................#..............#..............................................................#..........#.....#...................... +..................................................#.......................#..................................................#..........#... +............................#............................................................................................................... +........#................................................................................................................................... +..................#.......................#................................................................#................................ +.............................................................#........#..................................................................... +..............................#.......#......................................#.............#........................#....................... +.#............................................................................................................#...........................#. +...................................................................................................#....................#................... +....................#......................#.............#.....#..................................................................#......... +.................................................................................................................#.......................... +............................................................................................................................................ +....................................................................#.....................#................................................. +.................................#..............................................#..............#............#.............#................. +...........................#............................................#...........................................#....................... +......................#.........................#........................................................................................... +.......................................#....................................#...................................#........................... +.....#..........#.........................................#...............................................................................#. +#..........#......................#...................................................#.......#.....#....................................... +.........................#.................................................................................................................. +....................#..............................#.............#.........................................#.......#........#............... +...........................................#........................................................................................#....... +...........................................................#....................#........................................................... +..........#....................................................................................................#............................ +...............#................................#..........................#..............................................................#. +..#.................................#.................................................................#.......................#............. +.....................#......#...............#........................#................................................#..................... +..............................................................................................#....................................#........ +................................#.......#................................................................................................... +..........#................................................#...................#.....#..............#..........#..........#................. +.........................#.................................................................................................................. +..................#...............................#...........................................................................#............. +.........................................................................#............................................#..................... +........#.....#..............................................................................#.........#..................................#. +.#...............................#......#............#.............................................................................#........ +....................................................................................#.............#...............#........#................ +...........................#................................................................................................................ +......................#..................................#..............#................................#.............#................#... +...............................................................#..............#............................................................. +..................................#........................................................#........#....................................... +......#.................................#.......#....................#...............................................................#...... +.................#............#..............................................................................#.............................# +............................................................................................................................................ +..#.....................#.............................................................................#..................................... +.......................................................................................#..............................#..................... +...............................................................................#.............#.............................................. +....................#.....................#...............................................................#................................. +..........#........................#............#...................#.............................................#...............#......... +............................#.............................#..........................#...................................................... +...........................................................................................#................................................ +.................................................................#.................................#.........................#........#..... +.................#........................................................#..................................#.............................. +......................................#......................#.............................................................................. +.............#...........#...............................................................................#..........#....................... +.................................#...........#...........................................................................#..............#... +.......#............................................#.....#....................#..............#.....#....................................... +...................#...........................................#................................................#........................... +........................................................................................#................................................... +...#....................#.....#............#.........................................................................................#...... +...............#.............................................................#..................#........#................#................. +.........#.....................................#............................................................................................ +................................................................................................................................#........... +.....................#.............#.........................................................................#.............................. +.....#...............................................................................................................#..............#......# +...........#.......................................#.....#.................#.................#.............................................. +............................................................................................................................................ +.#.......................................#..........................................#................#...................................... +......................#.............#.................#.......................#...........#.............................#................... +...............#.............#................................#......#.......................................................#.............. +............................................................................................................................................ +...#............................................................................................#....................#...................... +..........#.....................#.............................................................................#............................. +...........................#...............................................................................................#...............# +.....................#......................................#.......#......#........#..................#...........................#........ +.....#...............................#............#......................................................................................... +............................................................................................................................................ +.........................................................#........................................................#......................... +#..............................#..........#..............................................................................#................#. +....................#..............................................#.......................#.........#...................................... +............................................................................................................................................ +...........#.......................................#.............................................................................#.......... +...#......................#...............................................#......................#.......................................... +..................#......................................................................................................................... +...........................................................#........#...........#.....#......#........................#.................#... +........#................................................................................................................................... +....................................................................................................#......#................................ +................................#...........#....................#.....#...................................................#........#....... +........................#............#......................................#.............#................................................. +...................#............................................................................................#........................... +#................................................................................................................................#.......... +..............#.............................................#............................................................................... +..............................#...............................................#.................#......................................#.... +....#....................#......................................#...................#...............................#.......#............... +........................................#..........#........................................#................#.............................. +............................................................................................................................................ +............................................................................................................................................ +........................................................................................................................................#... +...........................................................#..................#.................#.................#......................... +.......#........................................................#................................................................#.......... +..........................#......#......#..................................................................................#................ +...............................................#.....#.................#.................................................................... +......................................................................................................#..................................... +................#....................#.....................................................................#........#....................... +..............................................................................................................................#............. +...........................................#.............................................................................................#.. +....#........................#..............................#.............#................#................................................ +......................#..........................................................................................#......#................... +....................................................#................................#.........#............................................ +..........................#.......................................#......................................................................... +.................#........................#.....#........................................................#.................................. +.#.........................................................#............#....................................................#.............. +..........#..................#.....#..................................................................................................#..... +.................................................................................#.......................................................... +.....................................................#....................................#.........#...........#.....#..................... +.............................................#.....................#.......................................#.......................#........ +................................#........................................................................................................... +......#........................................................#..............................#............................................. +............#......................................#.....#............................#........................................#............ +............................................................................#............................................................... +.......................................#...............................#...................#..............................#...........#..... +.......................#..............................#..........................#..............................#........................... +.................................................................#...................................#...................................... +......................................................................................................................#...................#. +.................#.......................................................................................................................... +.........#......................#.....#...........#.......................................................#................................. +...........................................#.................#................#.....................................................#....... +..#...............................................................#......................................................................... +.....................#......#......#.............................................................#............#...........#................. \ No newline at end of file diff --git a/day-11/src/bin/part1.rs b/day-11/src/bin/part1.rs new file mode 100644 index 0000000..6815519 --- /dev/null +++ b/day-11/src/bin/part1.rs @@ -0,0 +1,21 @@ +use day_11::part1::process; +use miette::Context; + +#[cfg(feature = "dhat-heap")] +#[global_allocator] +static ALLOC: dhat::Alloc = dhat::Alloc; + +#[tracing::instrument] +fn main() -> miette::Result<()> { + #[cfg(feature = "dhat-heap")] + let _profiler = dhat::Profiler::new_heap(); + + #[cfg(not(feature = "dhat-heap"))] + tracing_subscriber::fmt::init(); + + let file = include_str!("../../input.txt"); + let result = process(file).context("process part 1")?; + + println!("{}", result); + Ok(()) +} diff --git a/day-11/src/bin/part2.rs b/day-11/src/bin/part2.rs new file mode 100644 index 0000000..41ac4d7 --- /dev/null +++ b/day-11/src/bin/part2.rs @@ -0,0 +1,21 @@ +use day_11::part2::process; +use miette::Context; + +#[cfg(feature = "dhat-heap")] +#[global_allocator] +static ALLOC: dhat::Alloc = dhat::Alloc; + +#[tracing::instrument] +fn main() -> miette::Result<()> { + #[cfg(feature = "dhat-heap")] + let _profiler = dhat::Profiler::new_heap(); + + #[cfg(not(feature = "dhat-heap"))] + tracing_subscriber::fmt::init(); + + let file = include_str!("../../input.txt"); + let result = process(file).context("process part 1")?; + + println!("{}", result); + Ok(()) +} diff --git a/day-11/src/error.rs b/day-11/src/error.rs new file mode 100644 index 0000000..e08a17f --- /dev/null +++ b/day-11/src/error.rs @@ -0,0 +1,9 @@ +use miette::Diagnostic; +use thiserror::Error; + +#[derive(Error, Diagnostic, Debug)] +pub enum AocError { + #[error(transparent)] + #[diagnostic(code(aoc::io_error))] + IoError(#[from] std::io::Error), +} diff --git a/day-11/src/lib.rs b/day-11/src/lib.rs new file mode 100644 index 0000000..681e54b --- /dev/null +++ b/day-11/src/lib.rs @@ -0,0 +1,4 @@ +pub mod error; + +pub mod part1; +pub mod part2; diff --git a/day-11/src/part1.rs b/day-11/src/part1.rs new file mode 100644 index 0000000..5aac9a7 --- /dev/null +++ b/day-11/src/part1.rs @@ -0,0 +1,113 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use itertools::Itertools; + +use crate::error::AocError; + +#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)] +struct Point { + x: usize, + y: usize, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +enum Tile { + Galax, + Empty, +} + +fn parse(input: &str) -> BTreeMap { + let input = input + .lines() + .map(|line| { + line.chars() + .map(|c| match c { + '#' => Tile::Galax, + '.' => Tile::Empty, + _ => panic!("Unknown tile type"), + }) + .collect_vec() + }) + .collect::>>(); + + let mut expanded_rows = Vec::new(); + for line in input.iter() { + if line.iter().all(|t| matches!(t, Tile::Empty)) { + expanded_rows.push(line.clone()); + } + expanded_rows.push(line.clone()); + } + + let mut translated = Vec::new(); + for col_index in 0..expanded_rows[0].len() { + let col = expanded_rows + .iter() + .map(|r| r[col_index].clone()) + .collect::>(); + + if col.iter().all(|t| matches!(t, Tile::Empty)) { + translated.push(col.clone()); + } + translated.push(col.clone()); + } + + translated + .into_iter() + .enumerate() + .flat_map(|(y, line)| { + line.into_iter().enumerate().map(move |(x, tile)| { + // Working off translated map, so re-translate back + let pos = Point { x, y }; + (pos, tile.clone()) + }) + }) + .collect() +} + +#[tracing::instrument] +pub fn process(input: &str) -> miette::Result { + let map = parse(input); + let locations = map + .iter() + .filter_map(|(p, t)| matches!(t, Tile::Galax).then_some(p.clone())) + .collect::>(); + + let pairs: BTreeSet> = locations + .iter() + .cartesian_product(locations.iter()) + .filter(|(p1, p2)| p1 != p2) + .map(|(p1, p2)| BTreeSet::from([p1.clone(), p2.clone()])) + .collect(); + + let pairs: Vec<(Point, Point)> = pairs + .into_iter() + .map(|pair| { + let mut pair = pair.into_iter(); + let p1 = pair.next().unwrap(); + let p2 = pair.next().unwrap(); + (p1, p2) + }) + .collect(); + let distances: Vec = pairs + .iter() + .map(|(p1, p2)| { + let x = (p1.x as i64 - p2.x as i64).abs(); + let y = (p1.y as i64 - p2.y as i64).abs(); + (x + y) as usize + }) + .collect(); + + Ok(distances.iter().map(|&d| d as u64).sum()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test_log::test] + fn test_process() -> miette::Result<()> { + let input = include_str!("../test-input.txt"); + assert_eq!(374, process(input)?); + Ok(()) + } +} diff --git a/day-11/src/part2.rs b/day-11/src/part2.rs new file mode 100644 index 0000000..1ff3976 --- /dev/null +++ b/day-11/src/part2.rs @@ -0,0 +1,18 @@ +use crate::error::AocError; + +#[tracing::instrument] +pub fn process(input: &str) -> miette::Result { + Ok(0) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test_log::test] + fn test_process() -> miette::Result<()> { + let input = include_str!("../test-input.txt"); + assert_eq!(0, process(input)?); + Ok(()) + } +} diff --git a/day-11/test-input.txt b/day-11/test-input.txt new file mode 100644 index 0000000..a0bda53 --- /dev/null +++ b/day-11/test-input.txt @@ -0,0 +1,10 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#..... \ No newline at end of file