From bff0e7601be73fbf772016846432b1317e3fdfc6 Mon Sep 17 00:00:00 2001 From: kageru Date: Mon, 11 Dec 2023 09:46:35 +0100 Subject: [PATCH] add 2023/11 --- 2023/inputs/day11 | 140 ++++++++++++++++++++++++++++++++++++++++++ 2023/src/bin/day11.rs | 71 +++++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 2023/inputs/day11 create mode 100644 2023/src/bin/day11.rs diff --git a/2023/inputs/day11 b/2023/inputs/day11 new file mode 100644 index 0000000..6ba87be --- /dev/null +++ b/2023/inputs/day11 @@ -0,0 +1,140 @@ +.......................................#..........................................................#......................................#.. +.....................#................................#..................................................................................... +....#.....#...................#...............#....................#.....................#.....................#....................#....... +............................................................................................................................................ +.................#......................................................#......#..............#....................#........................ +......................................#..................................................................................................... +.......................................................#...................................................#..............#................. +.............................................................#..........................#................................................... +............#..............................#.................................#.................................................#............ +#.................................#.............#................#....................................................................#..... +....................................................................................#................#...................................... +....#..........#............#...........................................#..................#..................#...................#......... +......................................#...................#.................................................................#.............#. +........#....................................#.......#...................................................................................... +........................................................................................#..........#........................................ +..#................................................................#........................................................................ +..............................#...............................................#.....................................#............#.......... +...................#........................................................................................................................ +...........#......................#........#................................................................................................ +...............................................................#.................#.........................#................................ +......................................................#.....................................#............................................... +........#............................................................................#................................#.........#........... +................#...........#............................................................................................................... +.....................#........................#........................#.....................................#............................#. +....#........................................................#................#.............................................#............... +............................................................................................................................................ +.....................................................................................................#.............#...................#.... +..........................#...........#.........................................................................................#........... +#......................................................#.........................................#............#........#.................... +.........#.....................................#....................................#....................................................... +.................................#..................................#......................................................#........#....... +.........................................................................................................#.................................. +......#.............#....................................................#.................................................................. +..........................#........................................................................................#........................ +.#.......................................#...................#...............#........................#..................#.................. +..................................#..............#...........................................................#.................#............ +.........#.........................................................#........................#............................................... +....................................................................................#....................................................... +.....#........#............................#...............................#.........................................#...................... +......................................................................#..................................#.................................. +............................#..................#........#..............................................................................#.... +.......................#.............#...................................................................................................... +#..........#...................................................#.......................#........................#......#.................... +....................................................#.............................................#......................................... +.................................................................................................................................#.......... +..................................#....................................................................#.................................... +........#.......................................#............#.....#........#............................................................... +............................................................................................................................................ +............................................................................................................................................ +..........................#.............................................................#.........................#......................... +..#............................#..........#..................................................................................#.............. +..................#...................................................#.............#.......................#.............................#. +............#.................................#........#.....#.............................................................................. +............................................................................................................................................ +.......................................................................................#..............#.................#...........#....... +....................#.....#....................................................#............#.................#............................. +....#............................................................................................#..............................#..........# +............................................................................................................................................ +...............................#......................#...............................................................#..................... +.................................................#...............#..................#.........#.............................#............... +........#......#.....................#................................................................................................#..... +.............................................#.................................#............................................................ +.#......................#..............................................................#................#................................... +............#.....#.....................................................................................................#................... +..................................#.....................................................................................................#... +............................................................................................................................................ +......#...............................................................#........................#..............................#............. +.....................#...........................#....................................#..............................#...................... +............................................................................#............................................................... +............#................#........#.......................#.....................................#....................................... +............................................................................................#.................#...........#................. +...................#................................................................................................................#....... +...................................#...................#..........#............#............................................................ +#.........................................#.....#..................................................................#........................ +............................................................................................................#....................#.......... +..........#..........................................................#.................................#...................................# +............................................................................................................................................ +......#.................#.......................................................#...............#.........................#................. +.............................#................#...................#.............................................#........................... +.............#.......................................#......................#.......#................................#...................... +........................................#................................................#...........................................#...... +...................................#........................................................................................................ +.................#...........................................#..............................................................#............... +.........#................#.......................................................................................#......................... +.....................#...................................................................................................................... +.#..............................................................#............#..........#.....#.........#................................... +......#.................................#.............................#..................................................................... +................................................................................................................................#........... +......................................................#............................................#....................#..............#.... +.........................#...................#.............................................................................................. +...............................................................#............#..........#.................#.................................. +..................................#......................................................................................................... +...............#..........................................................................................................#......#.......... +............................................................................................................................................ +......#........................................#..................................#................#..................................#..... +.#..........................#.........#.............................................................................#....................... +.......................................................#......................#.......#..................................................... +.............................................................#.................................................................#............ +...............#......................................................................................#.......#...........................#. +.....#....................................................................#...................#............................................. +..........................#................#.....#................#......................................................................... +..................................................................................#.................................#......#...........#.... +.................#.......................................................................................................................... +..................................#......................................................................................................... +...........#.........................................#.................#...............#.................................................... +................................................................#..............................#..........#....................#............ +...............#.............#............................#..................#.............................................................. +..#............................................#...........................................................................#................ +......................#..................................................................................................................... +.......................................#.................................#..........................................................#....... +...................................................................#........................................................................ +....#.............#................................................................#..................................#......#.............. +.............................................................#.............................................................................. +.........#................#.....................#.....................#.....#.....................#.......#................................. +...................................................................................................................................#........ +...........................................#...............................................#................................................ +.....................................................#..........#....................#...........................#............#.........#... +.#.............#......#..................................................................................................................... +.............................#............................................#..............................#.................................. +.......................................#............................................................................#....................... +..................#......................................#............#.............................#....................................... +.........#................#.....................................................#..............#.............#....................#.......#. +..#..............................................................#.........................................................#................ +...................................#..........#.............................#.........................................................#..... +......#..............................................................................................................#...................... +..............#............................................................................................................................. +......................................................#........#.................#.......................................#.................. +......................#.......#.................#......................................#.......#...............#............................ +..#..............#.......................#.................................................................................................. +.......................................................................#...................#.............#.................................. +.........#..........................................................................#.................................#..................... +......................................#..................#.......................................#....................................#..... +.........................#............................................................................#.......#.............#............... +....................#.........................................#............................................................................. +...............#............................................................................................................................ +......................................................................#...........#........#...................................#............ +.................................#..........#............................................................................................... +......#..........................................#............................#....................................#........................ +...............................................................#...........................................#.............................#.. +..#.........#..........#.................#..........................................................#....................................... diff --git a/2023/src/bin/day11.rs b/2023/src/bin/day11.rs new file mode 100644 index 0000000..49e84ad --- /dev/null +++ b/2023/src/bin/day11.rs @@ -0,0 +1,71 @@ +#![feature(test)] +extern crate test; +use aoc2023::{boilerplate, common::*}; +use itertools::Itertools; + +const DAY: usize = 11; +type I = usize; +type Parsed = (Vec, Vec, Vec<(I, I)>); + +fn parse_input(raw: &str) -> Parsed { + let galaxies = raw + .lines() + .enumerate() + .flat_map(|(x, l)| l.bytes().enumerate().filter_map(move |(y, b)| (b == b'#').then_some((x, y)))) + .collect_vec(); + let &xmax = galaxies.iter().map(|(x, _)| x).max().unwrap(); + let &ymax = galaxies.iter().map(|(_, y)| y).max().unwrap(); + let mut xs = vec![true; xmax + 1]; + let mut ys = vec![true; ymax + 1]; + for &(x, y) in galaxies.iter() { + xs[x] = false; + ys[y] = false; + } + ( + xs.into_iter().enumerate().filter_map(|(x, b)| b.then_some(x)).collect(), + ys.into_iter().enumerate().filter_map(|(y, b)| b.then_some(y)).collect(), + galaxies, + ) +} + +fn distance(x1: &I, x2: &I, empty: &[I]) -> I { + let smaller_x = x1.min(x2); + let bigger_x = x1.max(x2); + empty.iter().filter(|x| (smaller_x..=bigger_x).contains(x)).count() * FACTOR + bigger_x - smaller_x +} + +fn solve((empty_x, empty_y, galaxies): &Parsed) -> usize { + galaxies + .iter() + .tuple_combinations() + .map(|((x1, y1), (x2, y2))| distance::(x1, x2, empty_x) + distance::(y1, y2, empty_y)) + .sum() +} + +fn part1(parsed: &Parsed) -> usize { + solve::<1>(parsed) +} + +fn part2(parsed: &Parsed) -> usize { + solve::<999_999>(parsed) +} + +boilerplate! { + TEST_INPUT == "\ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#.....", + tests: { + part1: { TEST_INPUT => 374 }, + }, + bench1 == 9623138, + bench2 == 726820169514, + bench_parse: |(a, b, c): &Parsed| (a.len(), b.len(), c.len()) => (9, 11, 432), +}