From bdaa42f1239ce19ae28dec2115e2424648161c7d Mon Sep 17 00:00:00 2001 From: Oschly Date: Sun, 4 Jan 2026 22:51:44 +0100 Subject: [PATCH] day 5 part 2 --- src/day5/mod.rs | 1 + src/day5/part2.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/day5/part2.rs diff --git a/src/day5/mod.rs b/src/day5/mod.rs index 9002565..faaf542 100644 --- a/src/day5/mod.rs +++ b/src/day5/mod.rs @@ -1 +1,2 @@ pub mod part1; +pub mod part2; diff --git a/src/day5/part2.rs b/src/day5/part2.rs new file mode 100644 index 0000000..0f9cbe8 --- /dev/null +++ b/src/day5/part2.rs @@ -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::>::new(); + let mut fresh_products_ranges = Vec::>::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::().unwrap(); + let end = parts.next().unwrap().parse::().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); +} diff --git a/src/main.rs b/src/main.rs index 61cb819..4d99728 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,5 +5,5 @@ mod day4; mod day5; fn main() { - day5::solve(); + day5::part2::solve(); }