day 5 part 2

This commit is contained in:
2026-01-04 22:51:44 +01:00
parent f723f00016
commit bdaa42f123
3 changed files with 55 additions and 1 deletions

View File

@@ -1 +1,2 @@
pub mod part1; pub mod part1;
pub mod part2;

53
src/day5/part2.rs Normal file
View File

@@ -0,0 +1,53 @@
use std::{fs, ops::RangeInclusive};
#[allow(dead_code)]
pub fn solve() {
let file = fs::read_to_string("src/day5/input.txt").expect("You didn't provide input.txt.");
let mut original_ranges = Vec::<RangeInclusive<usize>>::new();
let mut fresh_products_ranges = Vec::<RangeInclusive<usize>>::new();
// Initialize the ranges
for line in file.lines() {
if line.is_empty() {
break;
}
let mut parts = line.split("-");
let start = parts.next().unwrap().parse::<usize>().unwrap();
let end = parts.next().unwrap().parse::<usize>().unwrap();
original_ranges.push(start..=end);
}
// Sort them by start for easier merge in next step
original_ranges.sort_by_key(|range| *range.start());
// merge overlappers
for range in original_ranges {
if fresh_products_ranges.is_empty() {
fresh_products_ranges.push(range);
continue;
}
let last_idx = fresh_products_ranges.len() - 1;
let last_range = &fresh_products_ranges[last_idx];
if *range.start() <= *last_range.end() + 1 {
let new_end = *last_range.end().max(range.end());
let new_start = *last_range.start();
fresh_products_ranges[last_idx] = new_start..=new_end;
} else {
fresh_products_ranges.push(range);
}
}
let fresh_products_count = {
let mut cnt = 0;
for range in &fresh_products_ranges {
cnt += range.end() - range.start() + 1;
}
cnt
};
println!("Fresh products: {:?}", fresh_products_count);
}

View File

@@ -5,5 +5,5 @@ mod day4;
mod day5; mod day5;
fn main() { fn main() {
day5::solve(); day5::part2::solve();
} }