2023 - Day 11
This commit is contained in:
parent
058653a3d9
commit
a8035fd0fc
140
2023/input/11/input
Normal file
140
2023/input/11/input
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
.......................................................................................#........................................#..........#
|
||||||
|
..........#.....#.........................#..................................#..............#...............................................
|
||||||
|
.......................#.........................#.....#......#....................................#.......................#................
|
||||||
|
............................................................................................................................................
|
||||||
|
........................................................................#...................................................................
|
||||||
|
.................................#...............................................#.............#...............#.......................#....
|
||||||
|
..#.............................................................#...........................................................................
|
||||||
|
..........................................#.......#........................................................#................................
|
||||||
|
....................................................................#...............................#....................#..................
|
||||||
|
......#......................#..............................................................................................................
|
||||||
|
...........................................................#....................................................................#...........
|
||||||
|
#................#...........................................................#......#.....#.....#....................#......................
|
||||||
|
.......................#.............#...............#..................#...................................................................
|
||||||
|
..........#....................#..............................................................................#............#............#...
|
||||||
|
.............................................#.....................................................................................#........
|
||||||
|
......#............................................................................................................#........................
|
||||||
|
...................................#................................#......................#................................................
|
||||||
|
..#..........#......#.......................................................................................................................
|
||||||
|
.......................................................#.....#..................................#....................................#......
|
||||||
|
.................................................#......................................#.............#.........................#...........
|
||||||
|
.......................................#...................................#...................................#............................
|
||||||
|
....#...............................................................................................................#......#...............#
|
||||||
|
...........#.........................................#.............................#........................................................
|
||||||
|
................................#...........................................................................#...............................
|
||||||
|
.......#.............................#........................#...............................#.........................................#...
|
||||||
|
..............#..........#.................#............#.....................#.............................................................
|
||||||
|
...#..............................................................#.....................................................#...................
|
||||||
|
............................................................................................................................................
|
||||||
|
................................................#................................#............................................#.............
|
||||||
|
..........#.....................................................................................................#...........................
|
||||||
|
......................#.................................................#................................#.........................#........
|
||||||
|
......#..........................#......................................................................................................#...
|
||||||
|
..........................#...............#..........#.....................................#................................................
|
||||||
|
..............................................................................#.................#...........................................
|
||||||
|
....................#................#.......................#.......#....................................................#................#
|
||||||
|
....#.............................................................................#.................................#.......................
|
||||||
|
................#.......................................#.............................................#......#..............................
|
||||||
|
........#...................................................................#...............................................................
|
||||||
|
..........................................#.......#.........................................................................#...............
|
||||||
|
....................................................................#...........................#.....................#.....................
|
||||||
|
.#.................#.....#............#........................#.................................................................#......#...
|
||||||
|
.............................................#........#...................#........#........................................................
|
||||||
|
...............#........................................................................#...................................................
|
||||||
|
....#............................................#......................................................#...........................#.......
|
||||||
|
...........#.........#............#..........................#.................#................................#.........#.................
|
||||||
|
.............................#.............#......................#.........................#...................................#...........
|
||||||
|
#.....................................#.....................................................................................................
|
||||||
|
...................................................................................#..............#....................#..................#.
|
||||||
|
..........................#...........................................#...................................#.................................
|
||||||
|
............................................................................................................................................
|
||||||
|
......................................................#.......................#.......#.....................................................
|
||||||
|
....................................#.......#....................#..........................................................................
|
||||||
|
...#................#.......................................................................#................#.................#............
|
||||||
|
.............................#........................................................................#...................#............#....
|
||||||
|
..........#..............................#.......#.....................#........#...............#...........................................
|
||||||
|
..............................................................#...................................................................#.........
|
||||||
|
...........................................................................................................#.................#..............
|
||||||
|
.................#......#...........#.................#............#..................#............................#........................
|
||||||
|
.....#...............................................................................................#......................................
|
||||||
|
............#..................................................................................................#.......#...............#....
|
||||||
|
................................#.........#.................................#...............................................................
|
||||||
|
................................................#..........#.......................#........................................................
|
||||||
|
.#.................#.............................................................................#..................#.............#.........
|
||||||
|
........................#............#..................................#................#..................................................
|
||||||
|
......#...............................................................................................#......#...........................#..
|
||||||
|
.....................................................................................#..................................#...................
|
||||||
|
..........#..........................................#...........#............................................................#.............
|
||||||
|
.............................................................................................#....................#.........................
|
||||||
|
.......................................................................................................................................#....
|
||||||
|
....#................#.................#........#...........................................................#..............#................
|
||||||
|
............................................................................................................................................
|
||||||
|
............................................................................................................................................
|
||||||
|
..............#.........#............................................................#.................................#....................
|
||||||
|
.............................#................................#....................................#........................................
|
||||||
|
.......................................................#...................................#.................#..............................
|
||||||
|
.....................#..................................................................................................................#...
|
||||||
|
...#.................................#.............#................................................................#........#..............
|
||||||
|
............................................................#...............................................................................
|
||||||
|
.......#....................................................................................................................................
|
||||||
|
.............................#.........................................................................................#..........#.......#.
|
||||||
|
.....................................................#...........................................#..........................................
|
||||||
|
..........................................#...........................#.........#...........................................................
|
||||||
|
..................#...................................................................#......................#..............................
|
||||||
|
.......................#.......................#...................................................................#......#.................
|
||||||
|
#............#..................#...........................................#........................#......................................
|
||||||
|
.....................................#............................#.........................................................................
|
||||||
|
............................................................................................#............#.....#..................#.........
|
||||||
|
..........................................#...................#....................#........................................#...............
|
||||||
|
..................................................#.........................................................................................
|
||||||
|
.....#............#...............................................................................................#....................#....
|
||||||
|
......................................................#.......................................#.............................................
|
||||||
|
..............................#..............#..............................................................................................
|
||||||
|
......................................#................................#.................................#............#........#...........#
|
||||||
|
...#..........#.....#...........................................................#...........................................................
|
||||||
|
.....................................................................................#.....#......#........................#................
|
||||||
|
.......................................................#...........#..............................................................#.........
|
||||||
|
............................................#..............................#.............................................................#..
|
||||||
|
................#..........#.................................................................................#..............................
|
||||||
|
......................................#..............................................................#......................................
|
||||||
|
#.......#...............................................................#.............................................#...............#.....
|
||||||
|
..........................................#....................................................#............................................
|
||||||
|
....#.................#................................................................#....................................................
|
||||||
|
...............#.............#..................................................................................#.........#..............#..
|
||||||
|
....................................#..............................................................#...............................#........
|
||||||
|
............................................................................................................................................
|
||||||
|
......#.............#.............................................#.............#...........................................................
|
||||||
|
...........................#............................................................................#.........#.........................
|
||||||
|
#......................................#....................................................#...........................#..............#....
|
||||||
|
...............................................#.....#......................................................................................
|
||||||
|
.............#.........#......#....................................................................................................#........
|
||||||
|
..............................................................#.....#............#..........................................................
|
||||||
|
.........#...............................................................................................................................#..
|
||||||
|
......................................#.....#...............................#...........#....................#..............................
|
||||||
|
.....................................................................................................#..............#.......................
|
||||||
|
....#.......................#.....#.................................................#.......................................................
|
||||||
|
...........................................................................................................................#.....#..........
|
||||||
|
.................#........................#......................................................................#..........................
|
||||||
|
.#.................................................................#..........#..........#..............#...................................
|
||||||
|
.......................................................#.....#..............................................................................
|
||||||
|
.........#.....................................#...................................................#.........#..............................
|
||||||
|
.................................#...............................................#.....................................#.............#.....#
|
||||||
|
.........................#..................................................................................................................
|
||||||
|
....................#.................................................#.....#...................................#...............#...........
|
||||||
|
...................................................#...........#.............................#..............................................
|
||||||
|
....................................................................................#..................#....................................
|
||||||
|
....#...........#......................#...............#....................................................................................
|
||||||
|
.........#........................................................................................#...................#...................#.
|
||||||
|
......................#......#.............................................................#................................................
|
||||||
|
#..............................................................................#............................................................
|
||||||
|
..............#....................#.........................................................................................#......#.......
|
||||||
|
.................................................#...................#...............................#......................................
|
||||||
|
....................#......#..................................#...........#.......#....................................#....................
|
||||||
|
..........#.....................................................................................................#...........................
|
||||||
|
.....#...................................................#.....................................................................#............
|
||||||
|
........................#.......#......#......#..................#........................................................................#.
|
||||||
|
.............................................................................#.............................#................................
|
||||||
|
..............#........................................................................#....................................................
|
||||||
|
.....................#.............#...................#.........................#..........#...............................................
|
||||||
|
.............................#............#....................#.........#.......................#..................................#.......
|
||||||
|
........................................................................................................#...................................
|
10
2023/input/11/test-1
Normal file
10
2023/input/11/test-1
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
...#......
|
||||||
|
.......#..
|
||||||
|
#.........
|
||||||
|
..........
|
||||||
|
......#...
|
||||||
|
.#........
|
||||||
|
.........#
|
||||||
|
..........
|
||||||
|
.......#..
|
||||||
|
#...#.....
|
168
2023/src/bin/day11.rs
Normal file
168
2023/src/bin/day11.rs
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
#![feature(test)]
|
||||||
|
use anyhow::Result;
|
||||||
|
use aoc::Solver;
|
||||||
|
|
||||||
|
// -- Runners --
|
||||||
|
fn main() -> Result<()> {
|
||||||
|
Day::solve()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_test1() -> Result<()> {
|
||||||
|
Day::test(Day::part1, "test-1", 374)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part1_solution() -> Result<()> {
|
||||||
|
Day::test(Day::part1, "input", 10490062)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: The given example for part2 are only for 10x and 100x, while part2 uses 1000000x
|
||||||
|
// Therefore there are now part2 example test
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn part2_solution() -> Result<()> {
|
||||||
|
Day::test(Day::part2, "input", 382979724122)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Benchmarks
|
||||||
|
extern crate test;
|
||||||
|
#[bench]
|
||||||
|
#[ignore]
|
||||||
|
fn part1_bench(b: &mut test::Bencher) {
|
||||||
|
Day::benchmark(Day::part1, b)
|
||||||
|
}
|
||||||
|
#[bench]
|
||||||
|
#[ignore]
|
||||||
|
fn part2_bench(b: &mut test::Bencher) {
|
||||||
|
Day::benchmark(Day::part2, b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct GridPoint {
|
||||||
|
galaxy: bool,
|
||||||
|
vertical_expansion: bool,
|
||||||
|
horizontal_expansion: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn distance(
|
||||||
|
a: (usize, usize),
|
||||||
|
b: (usize, usize),
|
||||||
|
grid: &[Vec<GridPoint>],
|
||||||
|
expansion: usize,
|
||||||
|
) -> usize {
|
||||||
|
let (range_x, x_end) = if a.0 > b.0 {
|
||||||
|
(b.0..a.0, a.0)
|
||||||
|
} else {
|
||||||
|
(a.0..b.0, b.0)
|
||||||
|
};
|
||||||
|
let (range_y, y_start) = if a.1 > b.1 {
|
||||||
|
(b.1..a.1, b.1)
|
||||||
|
} else {
|
||||||
|
(a.1..b.1, a.1)
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut steps = 0;
|
||||||
|
for x in range_x {
|
||||||
|
if grid[y_start][x].horizontal_expansion {
|
||||||
|
steps += expansion;
|
||||||
|
} else {
|
||||||
|
steps += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for y in range_y {
|
||||||
|
if grid[y][x_end].vertical_expansion {
|
||||||
|
steps += expansion;
|
||||||
|
} else {
|
||||||
|
steps += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
steps
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve(input: &str, expansion: usize) -> usize {
|
||||||
|
let mut galaxies = Vec::<(usize, usize)>::new();
|
||||||
|
let mut grid: Vec<Vec<_>> = input
|
||||||
|
.lines()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(y, line)| {
|
||||||
|
line.chars()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(x, c)| {
|
||||||
|
let has_galaxy = c == '#';
|
||||||
|
|
||||||
|
if has_galaxy {
|
||||||
|
galaxies.push((x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
GridPoint {
|
||||||
|
galaxy: has_galaxy,
|
||||||
|
vertical_expansion: false,
|
||||||
|
horizontal_expansion: false,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// The grid is square
|
||||||
|
let size = grid.len();
|
||||||
|
|
||||||
|
for row in &mut grid {
|
||||||
|
let has_galaxy = row.iter().any(|point| point.galaxy);
|
||||||
|
|
||||||
|
row.iter_mut()
|
||||||
|
.for_each(|point| point.vertical_expansion = !has_galaxy)
|
||||||
|
}
|
||||||
|
|
||||||
|
for x in 0..size {
|
||||||
|
let mut has_galaxy = false;
|
||||||
|
for row in &grid {
|
||||||
|
has_galaxy |= row[x].galaxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
for row in &mut grid {
|
||||||
|
row[x].horizontal_expansion = !has_galaxy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut sum = 0;
|
||||||
|
for a in &galaxies {
|
||||||
|
for b in &galaxies {
|
||||||
|
if a == b {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sum += distance(*a, *b, &grid, expansion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are computing every pair twice, dividing by two is a simpler solution then keep keeping
|
||||||
|
// track of every pair, but it does require more computation
|
||||||
|
sum / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// -- Solution --
|
||||||
|
pub struct Day;
|
||||||
|
impl aoc::Solver for Day {
|
||||||
|
type Output1 = usize;
|
||||||
|
type Output2 = usize;
|
||||||
|
|
||||||
|
fn day() -> u8 {
|
||||||
|
11
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part1(input: &str) -> Self::Output1 {
|
||||||
|
solve(input, 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn part2(input: &str) -> Self::Output2 {
|
||||||
|
solve(input, 1000000)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user