2023-11: Implement part two
This commit is contained in:
parent
5616c7212c
commit
e520118ac2
|
@ -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")
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue