From c6fc7ded50bef4931dfa2a968775eb9bb91d8f65 Mon Sep 17 00:00:00 2001 From: Dominic Date: Mon, 11 Dec 2023 11:08:43 +0100 Subject: [PATCH] day 11 part 1 --- inputs/day11.txt | 140 +++++++++++++++++++++++++++++++++++++++++++++++ src/bin/day11.rs | 83 ++++++++++++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 inputs/day11.txt create mode 100644 src/bin/day11.rs diff --git a/inputs/day11.txt b/inputs/day11.txt new file mode 100644 index 0000000..639a7a9 --- /dev/null +++ b/inputs/day11.txt @@ -0,0 +1,140 @@ +..............................#.........................#.......................#..............................#.........................#.. +....#.....#...................................#............................................................................................. +.....................................#..................................#................................................................... +...................................................#....................................................................#................... +...............................................................#..................#...............................#......................... +...............#.......................................#...................................#.....#.......#.........................#........ +............................................................................................................................................ +............................................................................#............................................................... +.......#.......................#....................#....................................................................................... +........................#..................#....................................................................#........................... +..#.......................................................#.........#....................#....................................#............. +..............#...........................................................#..........................................................#...... +......................................#...........................................#..........................#.............................. +.....................................................#.........#..........................................................................#. +#.......#....................................#.................................................#............................................ +..............................#.......................................#..............#....................#..........#...................... +....#...................................#................................................................................................... +....................................................................................................#....................................... +.....................#...........#...............................................#..................................................#....... +...............................................#.........#..................................................#..................#............ +..........................................................................#...............#........................#........................ +.................#.......................................................................................................#.................. +......................................................................................#..................#..............................#... +.............#...................................................................................#.......................................... +#...........................#..........#.................................................................................................... +.........#........................................................................#...............................#......................... +.....................#.........................#.....................................................#....................#......#.......... +.....................................................................#...................................................................... +................................#.....................................................................................................#..... +...............#..........................................#.................#................#.............................................. +....................................#...........................#...........................................#............................... +.......#...................#................#.......................................#..............................#......................#. +......................#.................................................#................................................#.................. +....................................................#......................................#............#................................... +.............#........................#..........................................................#.............#............................ +...................#..............................................................#......................................................... +.........................................................#..................#..........#.................................................... +........................#.....................#..............................................#.........................................#.... +.................................................................#.........................................#...................#............ +...................................................#........#.....................................#......................#.................. +.........#....................#.......#................................................................#............#....................... +#.............................................................................#.....................................................#....... +..................#.......#................................................................................................................. +.............#........................................................#........................#................#..........#..............#. +.....................................................#...................................................................................... +.......#...............#.................#......................#................#.......................................................... +...................................#.....................................................#............................#..................... +............................................................................................................................................ +...............................#........................................#.........................#......................................... +.....#.........#...............................#...................#.....................................................................#.. +............................................................................................................................................ +..........#......................................................................#.......................................................... +.........................................#.............................................#......#...................#...................#..... +........................#.....#........................................................................#.................................... +...................................................#.....#...................#.............................................................. +....................................................................#...............#....................................#........#......... +...........................#..............................................................#................................................. +...#........................................#.........#.......................................................#..............#.............. +..........#....................................................#................#........................................................... +..................................#..................................................................................#...............#...... +.................#.......................................................................................................................... +............................................................................................................................................ +............................#.............#................................#.........................#.....................#................ +.........#.........................................#............#.........................#............................................#.... +....#................................................................#.........................#..............#............................. +...................#......................................#................................................................................. +..............................#......#..............................................#..............#................#....................... +.............................................................................#.............................................................. +.......#.........................................................................................................................#.......... +..............#............#....................#...................#............#.......#.................................#................ +................................#......................#................................................#.................................#. +............................................................................................................................................ +.#......................#......................................#...............................................#............................ +........................................................................#............................#...................................... +..................................................#..........................#..........................................#.......#........... +.........................................#..........................................#....................#..............................#... +......#...............#.................................#................................................................................... +....................................#....................................................................................................... +...............................................................#................#........#.........................#..........#............. +..#........#.....#..........#...................#...................................................#....................................... +.......................................#...........................#...........................................#............................ +.............................................................................#.............................................................. +.......................#..................................#............#...............#.......#.....................................#...... +............................................................................................................................................ +............#.....#................................#...........#...................................................#............#........... +...........................................#..............................................#................................................. +..................................#..............................................#.....................#.................................... +..................................................................#......................................................................... +...#..........................#............................................#................................................................ +.......................................................#..........................................#........#........#....................... +.......................................#.................................................................................#......#........... +.................................................#..........#.........#.......................#............................................. +............................................................................................................................................ +....#...........#........................................................................................#.......#...........#.............. +......................#...........#.......#....................#..............#.....#....................................................... +.........#...............................................................................#.................................................. +..................................................#......................................................................................... +...................#......................................#...........................................#...........................#......#.. +.............#..........#.....................#....................#........................................................................ +...............................................................................#.....#.....#.................#......#....................... +...#.........................#...................................................................#........................#................. +............................................................................................................................................ +.......#.........#..........................................#............................................................................... +.................................#..............................................................................................#........... +........................................................................#..............#.......#..................#........................# +.#...................................#......#......#........................................................................................ +............................................................................................................................................ +.............#................#............................................................#..............#................................. +......#.....................................................#.......................#................#...............................#...... +...................#..............................................#.......................................................#................. +....................................#.....................................#................................................................. +........................................................................................................#.......#........................... +....#.....................................#...............#...................#...............#.........................................#... +.....................................................................................#...................................................... +....................................................#...........#......................................................#............#....... +........................#...................................................................................#............................... +............................................................................#.....#.........#......................#........................ +...#.....#.....#.......................#.................................................................................................... +............................................................................................................................................ +......................................................................#..................................................................... +......................................................................................#............#..........................#............. +.....#.............#.........................................................#................#............................................. +..............................#..........#............#.....#...........................................................#.............#..... +........................................................................#................#.................................................. +..................................................................................#......................................................... +......................#.............#....................#........................................................#......................... +.................#................................#.............#.............#............................................................. +............................................................................................................................................ +...#..........................#.............#....................................................#.......#...............#.........#........ +........#...........#.................#..................................................................................................#.. +..............#.................................#.....#..........................................................#.......................... +...........................................................#......#......................................................................... +............................#..................................................#.....................................#...................... +...................................................#.......................................#................................................ +.#................#................#...............................................#...........................................#.....#...... +.............#....................................................................................................#......................... +.........................#...........................................#.....#......................#..........#.............................. +........................................#...................#...........................................#................................... +...#......#............................................................................#.................................................... +...............................................#.......................................................................#.................... diff --git a/src/bin/day11.rs b/src/bin/day11.rs new file mode 100644 index 0000000..4b4da3b --- /dev/null +++ b/src/bin/day11.rs @@ -0,0 +1,83 @@ +#![forbid(elided_lifetimes_in_paths, unsafe_code)] + +use aoc23::read; +use chumsky::prelude::*; +use std::collections::HashSet; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum Cell { + Void, + Galaxy +} + +impl Cell { + fn parser() -> impl Parser> { + choice(( + just('.').map(|_| Self::Void), + just('#').map(|_| Self::Galaxy) + )) + } +} + +fn parser() -> impl Parser>, Error = Simple> { + Cell::parser() + .repeated() + .then_ignore(just("\n")) + .repeated() + .then_ignore(end()) +} + +fn main() -> anyhow::Result<()> { + let universe = read("inputs/day11.txt", parser())?; + + let empty_rows: HashSet = universe + .iter() + .enumerate() + .filter(|(_, row)| row.iter().all(|cell| *cell == Cell::Void)) + .map(|(i, _)| i) + .collect(); + let empty_cols: HashSet = universe + .first() + .unwrap() + .iter() + .enumerate() + .map(|(i, _)| i) + .filter(|i| universe.iter().all(|row| row[*i] == Cell::Void)) + .collect(); + + let galaxies: Vec<(usize, usize)> = universe + .iter() + .enumerate() + .flat_map(|(i, row)| row.iter().enumerate().map(move |(j, cell)| (i, j, *cell))) + .filter(|(_, _, cell)| *cell == Cell::Galaxy) + .map(|(i, j, _)| (i, j)) + .collect(); + + let mut sum = 0_u64; + for (i, g) in galaxies.iter().enumerate() { + for (_j, h) in galaxies.iter().enumerate().skip(i + 1) { + let mut x = [g.0, h.0]; + x.sort_unstable(); + let mut dist = (x[0] .. x[1]) + .map(|row| match empty_rows.contains(&row) { + true => 2, + false => 1 + }) + .sum::(); + + let mut y = [g.1, h.1]; + y.sort_unstable(); + dist += (y[0] .. y[1]) + .map(|col| match empty_cols.contains(&col) { + true => 2, + false => 1 + }) + .sum::(); + // eprintln!(" - Between galaxy {} and galaxy {}: {dist}", i + 1, _j + 1); + sum += dist; + } + } + println!("{sum}"); + + Ok(()) +}