Compare commits

...

2 Commits

Author SHA1 Message Date
Mathis e520118ac2 2023-11: Implement part two 2023-12-22 14:40:07 +01:00
Mathis 5616c7212c 2023-11: Implement first part 2023-12-22 13:24:51 +01:00
5 changed files with 278 additions and 12 deletions

140
input/2023/day_11/input.txt Normal file
View File

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

View File

@ -0,0 +1,15 @@
pub struct Galaxy {
pub i: usize,
pub j: usize,
}
pub fn all_false(vector: &Vec<bool>) -> bool {
vector.iter().all(|x| *x == false)
}
#[allow(dead_code)]
pub fn print_matrix(matrix: &Vec<Vec<bool>>) {
for row in matrix {
row.iter().for_each(|x| print!("{}", if *x { '#' } else { '.' }));
println!();}
}

View File

@ -1,6 +1,6 @@
pub mod part_one;
//pub mod part_two;
//pub mod common;
pub mod part_two;
pub mod common;
use crate::utils::solution::Solution;
use crate::utils::input_reader;
@ -11,7 +11,7 @@ pub struct DaySolution ;
impl Solution for DaySolution {
fn input_path(&self) -> &'static str {
"input/2023/day_11/input_test.txt"
"input/2023/day_11/input.txt"
}
fn part_one(&self) -> String {
@ -19,7 +19,7 @@ impl Solution for DaySolution {
}
fn part_two(&self) -> String {
//input_reader::read_input_file(self.input_path, part_two::part_two)
String::from("Not implemented")
input_reader::read_input_file(self.input_path(), part_two::part_two)
//String::from("Not implemented")
}
}

View File

@ -1,23 +1,35 @@
use super::common::{all_false, Galaxy};
pub fn part_one(input_lines: Vec<String>) -> String {
let vert_dim = input_lines.len();
let horz_dim = input_lines[0].len();
let mut matrix = vec![vec![false; horz_dim]; vert_dim];
let mut galaxies: Vec<Galaxy> = Vec::new();
for (y, line) in input_lines.iter().enumerate() {
for (x, c) in line.chars().enumerate() {
matrix[x][y] = c == '#';
matrix[y][x] = c == '#';
}
}
println!("Pre-expand dims: {:?}, {:?}", matrix.len(), matrix[0].len());
expand_rows(&mut matrix);
expand_cols(&mut matrix);
println!("Post-expand dims: {:?}, {:?}", matrix.len(), matrix[0].len());
for x in 0..matrix.len() {
for y in 0..matrix[x].len() {
if matrix[x][y] {
galaxies.push(Galaxy { i: x, j: y });
}
}
}
let mut total_distance = 0;
for i in 0..(galaxies.len() - 1) {
total_distance += distances_from_galaxy(i, &galaxies);
}
String::from("Not implemented")
total_distance.to_string()
}
fn expand_rows(matrix: &mut Vec<Vec<bool>>) {
@ -46,6 +58,28 @@ fn expand_cols(matrix: &mut Vec<Vec<bool>>) {
}
}
fn all_false(vector: &Vec<bool>) -> bool {
vector.iter().all(|x| *x == false)
fn distances_from_galaxy(id : usize, galaxies: &Vec<Galaxy>) -> usize {
let mut distance: usize = 0;
for i in (id + 1)..galaxies.len() {
distance += euclidian_distance(galaxies[id].i, galaxies[id].j, galaxies[i].i, galaxies[i].j);
}
distance
}
fn euclidian_distance(x1: usize, y1: usize, x2: usize, y2: usize) -> usize {
let x;
if x1 > x2 {
x = x1 - x2;
} else {
x = x2 - x1;
}
let y;
if y1 > y2 {
y = y1 - y2;
} else {
y = y2 - y1;
}
x + y
}

View File

@ -0,0 +1,77 @@
use std::{collections::HashSet, usize};
use super::common::{all_false, Galaxy};
pub fn part_two(input_lines: Vec<String>) -> String {
let vert_dim = input_lines.len();
let horz_dim = input_lines[0].len();
let mut matrix = vec![vec![false; horz_dim]; vert_dim];
let mut galaxies: Vec<Galaxy> = Vec::new();
for (y, line) in input_lines.iter().enumerate() {
for (x, c) in line.chars().enumerate() {
matrix[y][x] = c == '#';
}
}
let mut empty_rows_idx: HashSet<usize> = HashSet::new();
for i in 0..matrix.len() {
if all_false(&matrix[i]) {
empty_rows_idx.insert(i);
}
}
let mut emppty_cols_idx: HashSet<usize> = HashSet::new();
for i in 0..matrix[0].len() {
if all_false(&matrix.iter().map(|row| row[i]).collect::<Vec<bool>>()) {
emppty_cols_idx.insert(i);
}
}
for x in 0..matrix.len() {
for y in 0..matrix[x].len() {
if matrix[x][y] {
galaxies.push(Galaxy { i: x, j: y });
}
}
}
let mut total_distance = 0;
for i in 0..(galaxies.len() - 1) {
total_distance += distances_from_galaxy(i, &galaxies, &empty_rows_idx, &emppty_cols_idx);
}
total_distance.to_string()
}
fn distances_from_galaxy(id : usize, galaxies: &Vec<Galaxy>, empty_rows_idx: &HashSet<usize>, emppty_cols_idx: &HashSet<usize>) -> usize {
let mut distance: usize = 0;
for i in (id + 1)..galaxies.len() {
distance += expanded_euclidian_distance(galaxies[id].i, galaxies[id].j, galaxies[i].i, galaxies[i].j, empty_rows_idx, emppty_cols_idx);
}
distance
}
fn expanded_euclidian_distance(x1: usize, y1: usize, x2: usize, y2: usize, empty_rows_idx: &HashSet<usize>, emppty_cols_idx: &HashSet<usize>) -> usize {
expand_distance(x1, x2, empty_rows_idx) + expand_distance(y1, y2, emppty_cols_idx)
}
fn expand_distance(a: usize, b: usize, empty_ids: &HashSet<usize>) -> usize {
if a > b {
return expand_distance(b, a, empty_ids);
}
let mut res = 0;
for i in a..b {
if empty_ids.contains(&i) {
res += 1000000;
} else {
res += 1;
}
}
res
}