From 54dad514be481ba4c4c5bf9c5c2ee9cb0b26c4ba Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Fri, 9 Jan 2026 01:03:43 +0100 Subject: [PATCH] Implement 2025 - Day 5 - Part 2 --- 2025/05.rs | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/2025/05.rs b/2025/05.rs index 35342f0..e97ab5a 100644 --- a/2025/05.rs +++ b/2025/05.rs @@ -11,27 +11,36 @@ fn main() { start..=end }).collect(); - println!("Ranges: {:?}", ranges); - ranges.sort_by_key(|v| *v.start()); - println!("Ranges: {:?}", ranges); + loop { + let result: Option<(usize, usize)> = ranges.iter().enumerate().find_map(|(idx, r)| { + ranges.iter().enumerate().filter(|(o_idx, _)| idx != *o_idx).find_map(|(o_idx, other)| { + r.contains(other.start()).then_some((idx, o_idx)) + }) + }); - let ids: Vec<_> = CONTENT.lines().map(|l| l.trim()).skip_while(|l| !l.is_empty()).skip(1).map(|v| v.parse::().unwrap()).collect(); - println!("IDs: {:?}", ids); + let (idx, o_idx) = match result { + Some(r) => r, + None => break, + }; + let first = ranges[idx].clone(); + let second = ranges[o_idx].clone(); - let fresh = ids.iter().filter(|id| { - for r in ranges.iter() { - if r.start() > id { - return false; - } + let new_range_start: usize = *first.start().min(second.start()); + let new_range_end: usize = *first.end().max(second.end()); - if r.contains(id) { - return true; - } - } + let new_range = new_range_start..=new_range_end; - false - }).count(); - println!("Fresh: {:?}", fresh); + println!("Merge\n{:?} +\n{:?} =\n{:?}", first, second, new_range); + ranges[idx] = new_range; + ranges.remove(o_idx); + } + + ranges.sort_by_key(|v| (*v.start(), *v.end())); + + println!("Ranges: \n{:#?}", ranges); + + let result: usize = ranges.iter().map(|r| r.clone().count()).sum(); + println!("Result: {:?}", result); }