day 11
This commit is contained in:
parent
cb2d876e94
commit
06e67f551b
3 changed files with 315 additions and 2 deletions
140
aoc_puzzle_cache/day_11
Normal file
140
aoc_puzzle_cache/day_11
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
...#...................#.......................#.......................................................#....................................
|
||||||
|
........................................................#...................................................................................
|
||||||
|
...............................#..........#..........................#.....#......................#.........................................
|
||||||
|
......#.................................................................................#.............................#..............#......
|
||||||
|
...........................................................................................................................................#
|
||||||
|
.................#........#.........................#...........#................#....................#......#..............................
|
||||||
|
........................................#................#....................................#..............................#..............
|
||||||
|
......................#.....................................................................................................................
|
||||||
|
..#.........#.......................#..............................#...............................................................#........
|
||||||
|
.............................................................#..................................................#...........................
|
||||||
|
...................#...........#...................#....................#...............................................#...................
|
||||||
|
...........................................#...................................#.....................#......#...............................
|
||||||
|
....#.........................................................................................................................#.............
|
||||||
|
........................................................................................#..........................#........................
|
||||||
|
...........#........................#..........................#............#...............................................................
|
||||||
|
.#...........................#..............................................................................................................
|
||||||
|
...............#..........................#................#.......................#.......................#................................
|
||||||
|
.....................#...........................................................................................#..........................
|
||||||
|
.........#.......................................#..................#..........#............#..........#..................#.................
|
||||||
|
.......................................................................................................................................#....
|
||||||
|
....................................#........................#..........................#...................................................
|
||||||
|
.....#.....................................#................................................................................................
|
||||||
|
...............#......................................#......................................................#....................#.........
|
||||||
|
....................#................................................................#.......#...............................#..............
|
||||||
|
...........#................................................................................................................................
|
||||||
|
.........................#......................#...........................................................................................
|
||||||
|
...#..............................#....................................#...........................#........................................
|
||||||
|
..................................................................#..................................................................#......
|
||||||
|
..........................................#..........#......................#............................................#..................
|
||||||
|
...............#......................................................................#..........................#........................#.
|
||||||
|
.....................#......................................................................................................................
|
||||||
|
..................................................#.............#.................................#.........................................
|
||||||
|
#..........................#.........................................................................................#......................
|
||||||
|
.....................................#......#................................#..............#...............#..................#............
|
||||||
|
........#............................................................................................#................................#.....
|
||||||
|
................................................................................................................#...........................
|
||||||
|
...............................#.......................#..................#................................................#................
|
||||||
|
..................................................................................................#...................#....................#
|
||||||
|
............................................................................................................................................
|
||||||
|
................#..........#....................#..................#..........................................#.............................
|
||||||
|
........#.................................#........................................#.....#.....................................#............
|
||||||
|
.......................#............................................................................................#.......................
|
||||||
|
.........................................................................................................................#.........#........
|
||||||
|
........................................................................................................#...................................
|
||||||
|
....#.......#...............#........................................#......................................................................
|
||||||
|
...........................................#.....#.............................................................#..............#.........#...
|
||||||
|
............................................................................................................................................
|
||||||
|
.....................#................#..................#....................#..............#..............................................
|
||||||
|
......#.....................................................................................................................................
|
||||||
|
...............#......................................................................................#.........................#...........
|
||||||
|
........................#...........................#..........#......................................................#.....................
|
||||||
|
.........................................#...........................#.................#......................#.............................
|
||||||
|
............................................................................................................................................
|
||||||
|
............................#.............................#.................................#..............................#...........#....
|
||||||
|
.#...........#......................#.........#...........................#.................................................................
|
||||||
|
............................................................................................................................................
|
||||||
|
.................#..................................................................#...........#.........#......................#..........
|
||||||
|
............................................................................................................................................
|
||||||
|
............................................................................................................................................
|
||||||
|
.........#...................#.................................#.............#..............................................................
|
||||||
|
...............#....................................................#...............................................#.....#.................
|
||||||
|
..........................................#..............................................#...........#.......#..............................
|
||||||
|
..#..................................................................................................................................#......
|
||||||
|
..........................................................................#.........#.......................................................
|
||||||
|
....................................#.........................#.........................................................#...................
|
||||||
|
...............................#................................................................#...........................................
|
||||||
|
...........#.............................................#............................................#............#........................
|
||||||
|
...........................................................................................................................#............#...
|
||||||
|
................#...........................#......................#..........#.......#.....................................................
|
||||||
|
#......................................................................................................................#............#.......
|
||||||
|
........................................................................#..................................#................................
|
||||||
|
..............................................................#...........................#.....#.........................................#.
|
||||||
|
......#.......#.....#.............#.........................................................................................................
|
||||||
|
.............................#.........#..................#.................................................................................
|
||||||
|
..........#.........................................................................................................#.......................
|
||||||
|
......................................................#................................................#...................#................
|
||||||
|
....#....................#.........................................#.........................................#..............................
|
||||||
|
....................................#.........#...............#...............#..............#...................................#..........
|
||||||
|
............................................................................................................................................
|
||||||
|
.............................#..................................................................................#.......#...................
|
||||||
|
........................................#................#...............#..................................................................
|
||||||
|
............................................................................................................................................
|
||||||
|
.............................................................#.........................#................#...................................
|
||||||
|
..........#......#............................#..................................#...............#..............................#.........#.
|
||||||
|
..................................#.................................................................................#.......................
|
||||||
|
....................................................#.......................#...............#.................#.......................#.....
|
||||||
|
.#...........#........................#..............................................#......................................................
|
||||||
|
................................................................#.......#..............................#....................................
|
||||||
|
..................................................................................................#...........................#.............
|
||||||
|
............................................................#............................................................#..............#...
|
||||||
|
......#.....................#......................................#...........#............................................................
|
||||||
|
.....................................................#.............................................................#.............#..........
|
||||||
|
.......................#.............#.....................................................................................................#
|
||||||
|
...........#.................................#............................#...........................#.....................................
|
||||||
|
.#...............................#....................................................................................#.....................
|
||||||
|
...................#...................................#..........................................#..............#..........................
|
||||||
|
.........................#.......................................#.............#............................................................
|
||||||
|
..........................................#.......#.....................#................#..................................#...............
|
||||||
|
...#.......................................................................................................#............................#...
|
||||||
|
............#.............................................#..................................#...................................#..........
|
||||||
|
............................#..........#.............................................................#.............#........................
|
||||||
|
......................#.....................................................................................................................
|
||||||
|
.............................................................................................................#..............................
|
||||||
|
....#........................................#.....................................#.......................................#................
|
||||||
|
.....................................................#..............#...................................................................#...
|
||||||
|
#....................................#....................#.......................................................................#.........
|
||||||
|
................................................................................................#...........................................
|
||||||
|
...........#.........#....................#...............................#.............#................................#..................
|
||||||
|
............................................................................................................................................
|
||||||
|
......#..........................#...........................#...........................................#...........#......................
|
||||||
|
.#.............#.........#.........................................#...........#.....#..................................................#...
|
||||||
|
.....................................#...................#.....................................................................#............
|
||||||
|
...........................................................................................#................................................
|
||||||
|
...................#................................................................................#..............#........................
|
||||||
|
...........................................#......#........................................................................................#
|
||||||
|
..#........................#..................................#.........................#...................................................
|
||||||
|
........#.............................#...............................................................................#.....................
|
||||||
|
...............................#........................#...............#..............................#....................................
|
||||||
|
.................................................................#..........................................#...............................
|
||||||
|
....................................................#........................#........#....................................#.........#......
|
||||||
|
....#.........#....................................................................................#.......................................#
|
||||||
|
......................#.....#.............................................................#.................................................
|
||||||
|
#......................................#......#....................................#...............................#.............#..........
|
||||||
|
.......................................................#..................................................#.................................
|
||||||
|
.........................................................................#......................#...........................................
|
||||||
|
...............................................................................#............................................#...............
|
||||||
|
....#........#................#...............................#.......................................................................#.....
|
||||||
|
.......................#.................................................................#..................#...............................
|
||||||
|
.....................................#.............#........................................................................................
|
||||||
|
...................................................................................................#......................................#.
|
||||||
|
..#.........................................................................................................................................
|
||||||
|
........#.................................#.............#...........#................#......................................................
|
||||||
|
...............................................................................................#............................#...............
|
||||||
|
.................#....................#.........................#..................................................................#........
|
||||||
|
....#.............................................#........................................................#........#.......................
|
||||||
|
.........................#.............................................#............................#.......................................
|
||||||
|
......................................................#.................................#................................................#..
|
||||||
|
.............................#...............#.................................#............................................................
|
||||||
|
.........#....................................................................................#........................#........#...........
|
||||||
|
..................#...........................................#.................................................#...........................
|
173
src/bin/day11.rs
Normal file
173
src/bin/day11.rs
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
use aoc23::prelude::*;
|
||||||
|
use derive_builder::Builder;
|
||||||
|
use itertools::Itertools;
|
||||||
|
use rayon::prelude::*;
|
||||||
|
use std::{str::FromStr, time::Instant};
|
||||||
|
|
||||||
|
static DAY: u8 = 11;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
|
struct Vec2D {
|
||||||
|
x: usize,
|
||||||
|
y: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<(usize, usize)> for Vec2D {
|
||||||
|
fn from(value: (usize, usize)) -> Self {
|
||||||
|
Self {
|
||||||
|
x: value.0,
|
||||||
|
y: value.1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
struct Space {
|
||||||
|
galaxies: Vec<Vec2D>,
|
||||||
|
x_max: usize,
|
||||||
|
y_max: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Space {
|
||||||
|
fn new(s: &str) -> Result<Self> {
|
||||||
|
let mut x_max = 0;
|
||||||
|
let mut y_max = 0;
|
||||||
|
let mut galaxies = vec![];
|
||||||
|
for (y, row) in s.trim().lines().enumerate() {
|
||||||
|
for (x, col) in row.chars().enumerate() {
|
||||||
|
if col == '#' {
|
||||||
|
galaxies.push((x, y).into());
|
||||||
|
}
|
||||||
|
x_max = x;
|
||||||
|
}
|
||||||
|
y_max = y;
|
||||||
|
}
|
||||||
|
Ok(Space {
|
||||||
|
galaxies,
|
||||||
|
x_max,
|
||||||
|
y_max,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn expand(&mut self, by: usize) {
|
||||||
|
for y in (0..=self.y_max).rev() {
|
||||||
|
if self.galaxies.iter().filter(|g| g.y == y).count() == 0 {
|
||||||
|
self.galaxies
|
||||||
|
.iter_mut()
|
||||||
|
.filter(|g| g.y > y)
|
||||||
|
.for_each(|g| g.y += by);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for x in (0..=self.x_max).rev() {
|
||||||
|
if self.galaxies.iter().filter(|g| g.x == x).count() == 0 {
|
||||||
|
self.galaxies
|
||||||
|
.iter_mut()
|
||||||
|
.filter(|g| g.x > x)
|
||||||
|
.for_each(|g| g.x += by);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn galaxy_pairs(&self) -> Vec<(&Vec2D, &Vec2D)> {
|
||||||
|
let mut galaxy_pairs = vec![];
|
||||||
|
for i in 0..self.galaxies.len() {
|
||||||
|
for i2 in i + 1..self.galaxies.len() {
|
||||||
|
galaxy_pairs.push((&self.galaxies[i], &self.galaxies[i2]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
galaxy_pairs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: String) -> Result<usize> {
|
||||||
|
// parse
|
||||||
|
let start = Instant::now();
|
||||||
|
let mut space = Space::new(&input)?;
|
||||||
|
let parsed_time = start.elapsed();
|
||||||
|
let step_start = Instant::now();
|
||||||
|
space.expand(1);
|
||||||
|
let expansion_time = step_start.elapsed();
|
||||||
|
|
||||||
|
// algo
|
||||||
|
let step_start = Instant::now();
|
||||||
|
let mut answer = 0;
|
||||||
|
for pair in space.galaxy_pairs() {
|
||||||
|
let distance = pair.0.y.abs_diff(pair.1.y) + pair.0.x.abs_diff(pair.1.x);
|
||||||
|
answer += distance;
|
||||||
|
}
|
||||||
|
let algo_time = step_start.elapsed();
|
||||||
|
|
||||||
|
// output
|
||||||
|
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
|
||||||
|
println!("\tparse: {parsed_time:?}");
|
||||||
|
println!("\texpansion: {expansion_time:?}");
|
||||||
|
println!("\talgo: {algo_time:?}");
|
||||||
|
Ok(answer)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: String) -> Result<usize> {
|
||||||
|
// parse
|
||||||
|
let start = Instant::now();
|
||||||
|
let mut space = Space::new(&input)?;
|
||||||
|
let parsed_time = start.elapsed();
|
||||||
|
let step_start = Instant::now();
|
||||||
|
space.expand(1000000 - 1);
|
||||||
|
let expansion_time = step_start.elapsed();
|
||||||
|
|
||||||
|
// algo
|
||||||
|
let step_start = Instant::now();
|
||||||
|
let mut answer = 0;
|
||||||
|
for pair in space.galaxy_pairs() {
|
||||||
|
let distance = pair.0.y.abs_diff(pair.1.y) + pair.0.x.abs_diff(pair.1.x);
|
||||||
|
answer += distance;
|
||||||
|
}
|
||||||
|
let algo_time = step_start.elapsed();
|
||||||
|
|
||||||
|
// output
|
||||||
|
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
|
||||||
|
println!("\tparse: {parsed_time:?}");
|
||||||
|
println!("\texpansion: {expansion_time:?}");
|
||||||
|
println!("\talgo: {algo_time:?}");
|
||||||
|
Ok(answer)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<()> {
|
||||||
|
println!("Day {DAY}");
|
||||||
|
println!("=====");
|
||||||
|
let input = utils::aoc::get_puzzle_input(DAY).await?;
|
||||||
|
part1(input.clone())?;
|
||||||
|
part2(input.clone())?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
static DATA: &'static str = "...#......
|
||||||
|
.......#..
|
||||||
|
#.........
|
||||||
|
..........
|
||||||
|
......#...
|
||||||
|
.#........
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
.......#..
|
||||||
|
#...#.....
|
||||||
|
";
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_part_1() -> Result<()> {
|
||||||
|
assert_eq!(part1(DATA.to_owned())?, 374);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
// Must set the space.expand(1000000 - 1); to (100 - 1) instead for this test
|
||||||
|
#[ignore]
|
||||||
|
fn test_part_2() -> Result<()> {
|
||||||
|
assert_eq!(part2(DATA.to_owned())?, 8410);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,12 +6,12 @@ use std::{str::FromStr, time::Instant};
|
||||||
|
|
||||||
static DAY: u8 = TODO;
|
static DAY: u8 = TODO;
|
||||||
|
|
||||||
#[derive(Debug, Builder, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
struct Todo {}
|
struct Todo {}
|
||||||
|
|
||||||
impl Todo {
|
impl Todo {
|
||||||
fn new(s: &str) -> Result<Self> {
|
fn new(s: &str) -> Result<Self> {
|
||||||
Ok(TodoBuilder::default().build()?)
|
Ok(Todo {})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue