[TASK] Solved Day 11

This commit is contained in:
2023-12-15 14:23:02 +01:00
parent efa51586d5
commit 779df41294
5 changed files with 237 additions and 4 deletions

140
input/day11.txt Normal file
View File

@@ -0,0 +1,140 @@
............#..................#..........................................................#..........................#......................
.................................................................#...............#..............#...............#......................#....
...................................#.....................#..................#............................#...................#..............
#.....................#.....................#...............................................................................................
........................................................................................#............#......................................
.....#..............................................#.......................................................................................
.......................................#................................#..........#...........#......................................#.....
..................#...........#.............................................................................................................
.............................................#............#.................................................................................
.#............................................................................#..................................#..........................
............#......................#....................................................................#...................#.............#.
.......#............#....................#........#...................................#......................#..............................
...................................................................#................................#.......................................
..............................#.................................................................................................#...........
..#...........................................................................................#.......................#.....................
..............................................................................#.............................................................
.......................................#.........#............#...........................#................#..............................#.
........................................................#.............#.....................................................................
.....#..........................#....................................................................#....................#.................
....................#.......................#...................................#...............#...............#......................#....
...............#..................................................................................................................#.........
..#......................................................................#...................................................#..............
.................................................#............#.........................................#.............#.....................
....................................#.......................................................................................................
...........#..........................................................................#.....................................................
.................#..........................................................................................................................
.............................................#............................#....................................................#............
.........................#.......#..........................#...............................................................................
.......#............#....................................................................................................#..........#.......
...................................................................#................#...........................#...........................
..............#....................................#..........................#..............#..............................................
..#....................#....................................................................................#........#......................
.........................................................................#......................................................#...........
......................................#.........#...........................................................................................
..........#.................................................................................................................................
.....................#......................#...............#.................................................#.............................
...............................#...................................................#....................................#.................#.
.............................................................................................#..............................................
...................................................................#........................................................................
................#..........#.....................#..................................................................................#.......
...................................#............................................#..................#........................................
.....#.....................................................................#...............................#.....#..........................
............#.........................................................................................................#.....................
.....................#.............................#.......................................................................#................
..............................................................#...............................#..........................................#..
.....................................#.......#.................................................................#............................
...............#...................................................................#.....#..............................#...................
...#.....................#.........................................#......#...........................#.....................................
.........#......................................................................................#.............................#.............
..........................................................#.................................................................................
..................................#.......#...........................................#......................#......................#.......
.............................................................................#..............................................................
.....#...........................................#..................................................#....................#..................
............................................................................................................................................
............................................................................................................................................
.................#...................#........................#......#..................................#...................................
..........................#.........................#.....................................#......#.........................#................
..............................................#...........................#.....................................#...........................
#.....................#.................#............................................................................................#......
...............................#..........................#.....................................................................#...........
..........#.........................#.............................#...........#....................................#........................
.....................................................#......................................................................................
.............................................................................................#..............................................
............................................................................................................................................
...............#...........#..........#.....#..................#.......................#......................#.......#..............#......
........#...........#.............................#.....#...................................................................................
............................................................................................................................................
.#................................#.............................................#................................................#..........
............................................................................................................................................
..........................................................................#...............................................................#.
..............................#...............#......................................#........#.............#.........#.....................
...#................................................#.......................................................................................
............................................................................................................................................
.......................#...............#...........................................................#..........................#.............
.................................................#...........#......................................................#.......................
...........#............................................................................#...................................................
.....#..................................................#.....................................#.............#..............................#
..................#..........#..............................................#..........................#..............................#.....
....................................................#.......................................................................................
..#............................................................................................................#................#...........
.............................................................#........#..........#.....#....................................................
...........#..........#............#.......#...............................................................................#................
............................................................................................................................................
......................................................#..............................................#......................................
.........................#.....#...............................................#................................#................#..........
...#.......................................................................................................#...........................#....
........#...........................#....................................#...............#..................................................
..........................................#.......................#.........................................................................
............................................................#.............................................................#.................
...........................#...................................................................#.....................#......................
...............#.................#............#.............................................................................................
...#......#..........................................#..................................#...............#...................................
.................................................................#......................................................................#...
.......................#..................#...............#..................#..............................................................
.................................................#...................................#.............#............................#...........
................#...........................................................................................................................
...................................#.........................................................#........................#.............#.......
.............................................................#..........................#......................#............#..............#
...#..................#.............................#..........................#............................................................
........#......................................#............................................................................................
..............#............#...........#............................................................#.......................................
....................................................................#.......................#...............................................
.#....................................................................................#........................................#.......#....
...........#...................#............................................................................................................
.........................#..........#.......#.........#..................#..................................#...............................
................................................................#....................................................#......................
...#.............................................................................................#.....#....................................
.................................................#....................#.....................................................................
.......................#.........#..................................................#.......#...................#........#..................
........................................................................................................................................#...
...........#................................................#..............................................#................................
.....................................#..........................................................#...........................................
....#.......................................#....................................................................................#..........
...................#..............................................#.........#..........#.............#......................................
............................................................................................................................................
............................................................................................................................................
.............#.......................................#...............#......................#......................#...............#........
...............................................#............................................................................................
....#.................................#.......................................................................................#.............
............................#.................................................#......#.....................................................#
...................#..............#.......#...............#.....................................................#.........#.................
..................................................................#.....................................#...................................
...................................................#..............................#......#.......#..............................#...........
.......................................#.....................#..............#......................................#........................
.................#..........................................................................................................................
..............................................#.......#.................#.................................#.................................
.........#...............#.............................................................#.................................#.............#....
..#..............................#..................................#.......................................................................
...............................................................#...........#.......................................................#........
............................................................................................................................#...............
................#...........#............#.........#........................................................................................
........#.............#........................................................................................#...........................#
..........................................................#...............................#..............#...........................#......
...............................#................................................................#...........................................
..................#.............................................#.........#..........................................#......................
.....#................................................#.........................................................................#...........
............................................#.....................................#.........#...............................................
.......................................................................................................................................#....
#..........#.............#......#.................................#...................................#.....................................
.....................................#.........#.........................#.....#............................................................

10
input/day11_example.txt Normal file
View File

@@ -0,0 +1,10 @@
...#......
.......#..
#.........
..........
......#...
.#........
.........#
..........
.......#..
#...#.....

71
src/day11.rs Normal file
View File

@@ -0,0 +1,71 @@
use itertools::Itertools;
use crate::day_solver::DaySolver;
use crate::util::{Coord, Grid};
#[cfg(test)]
use crate::util::read_file;
pub struct Day11 {
cosmos: Grid<char>
}
impl Day11 {
pub fn create(input: String) -> Self {
return Day11 {
cosmos: Grid {
width: input.lines().next().unwrap().len(),
data: input.lines().join("").chars().collect(),
default: Some('.')
}
}
}
fn expand_galaxies_and_calculate_distances(&self, expansion: usize) -> usize {
// self.cosmos.print();
let galaxies: Vec<Coord<usize>> = self.cosmos.find_positions(&(|c| c == &'#')).collect();
// println!("{:?}", galaxies);
let expand_cols: Vec<usize> = (0..self.cosmos.width).filter(|x| galaxies.iter().all(|c| c.x != *x)).collect();
let expand_rows: Vec<usize> = (0..self.cosmos.height()).filter(|y| galaxies.iter().all(|c| c.y != *y)).collect();
let expanded_galaxies: Vec<Coord<usize>> = galaxies.iter().map(|g| Coord {
x: g.x + (expand_cols.iter().filter(|x| **x < g.x).count() * (expansion - 1)),
y: g.y + (expand_rows.iter().filter(|y| **y < g.y).count() * (expansion - 1)),
}).collect();
let mut sum = 0;
for i in 0..expanded_galaxies.len() {
for j in (i + 1)..expanded_galaxies.len() {
let d = expanded_galaxies[i].manhattan_dist(&expanded_galaxies[j]);
// println!("Distance between {} at {:?} and {} at {:?} = {}", i, expanded_galaxies[i], j, expanded_galaxies[j], d);
sum += d;
}
}
return sum;
}
}
impl DaySolver for Day11 {
fn solve_part1(&mut self) -> String {
return self.expand_galaxies_and_calculate_distances(2).to_string()
}
fn solve_part2(&mut self) -> String {
return self.expand_galaxies_and_calculate_distances(1000000).to_string()
}
}
#[test]
fn test_part1() {
let mut day = Day11::create(read_file("input/day11_example.txt"));
assert_eq!("374", day.solve_part1());
}
#[test]
fn test_part2() {
let mut day = Day11::create(read_file("input/day11_example.txt"));
assert_eq!(8410, day.expand_galaxies_and_calculate_distances(100));
}

View File

@@ -2,6 +2,7 @@ extern crate core;
use std::time::Instant;
use crate::day10::Day10;
use crate::day11::Day11;
use crate::day1::Day1;
use crate::day2::Day2;
use crate::day3::Day3;
@@ -26,8 +27,9 @@ mod day7;
mod day8;
mod day9;
mod day10;
mod day11;
const MAX_DAY: u8 = 10;
// const MAX_DAY: u8 = 11;
const DEFAULT_BENCHMARK_AMOUNT: u32 = 100;
fn main() {
@@ -108,6 +110,7 @@ fn build_day_solver(day: u8, input: String) -> Option<Box<dyn DaySolver>> {
8 => Some(Box::new(Day8::create(input))),
9 => Some(Box::new(Day9::create(input))),
10 => Some(Box::new(Day10::create(input))),
11 => Some(Box::new(Day11::create(input))),
_ => None
}
}
@@ -187,7 +190,8 @@ fn run_once(single_day: bool, day: u8, silent: bool, bench_results: &mut Vec<Aoc
fn solve_all(silent: bool) -> AocBenchResult {
let mut bench_results = Vec::new();
for day in 1..(MAX_DAY + 1) {
let max_day = (1..).take_while(|d| build_day_solver(*d, "".to_string()).is_some()).last().unwrap();
for day in 1..(max_day + 1) {
bench_results.push(solve(day, silent));
}
return AocBenchResult {

View File

@@ -1,7 +1,7 @@
use std::fs;
use std::fmt::Display;
use itertools::Itertools;
use std::fs;
use itertools::Itertools;
use num::Integer;
pub fn read_file(filename: &str) -> String {
@@ -75,6 +75,14 @@ impl<T: Clone + Sized> Grid<T> {
return x < &self.width && y < &self.height()
}
pub fn find_positions<'a, P>(&'a self, predicate: &'a P) -> impl Iterator<Item = Coord<usize>> + 'a
where P: Fn(&'a T) -> bool + 'a {
return self.data.iter().enumerate()
.filter(|(_,x)| predicate(x).to_owned())
.map(|(i, _)| self.coord(i));
}
pub fn validate(&self) {
debug_assert!(&self.data.len() % self.width == 0)
}