2023-11: Implement part two

This commit is contained in:
Mathis 2023-12-22 14:40:07 +01:00
parent 5616c7212c
commit e520118ac2
2 changed files with 80 additions and 3 deletions

View File

@ -1,5 +1,5 @@
pub mod part_one;
//pub mod part_two;
pub mod part_two;
pub mod common;
use crate::utils::solution::Solution;
@ -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

@ -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
}