From 2ce82421c218ce45560746fdc0bf1e43c9925ded Mon Sep 17 00:00:00 2001 From: timeshifter Date: Thu, 2 Jul 2026 21:59:24 +0200 Subject: [PATCH] add day 20 part 2 --- day20/src/main.rs | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/day20/src/main.rs b/day20/src/main.rs index 9d76a26..7ad0b7c 100644 --- a/day20/src/main.rs +++ b/day20/src/main.rs @@ -17,33 +17,34 @@ fn main() { }) .collect(); - // dbg!(&ranges); - let result = consolidate_all_ranges(&ranges); - dbg!(result); + let mut result = consolidate_all_ranges(&ranges); + + result.sort_by_key(|r| *r.start()); + + println!("{}", result[0].end() + 1); + println!("{}", result.len() - 1); } fn consolidate_all_ranges(ranges: &[RangeInclusive]) -> Vec> { let mut work = ranges.to_vec(); - let mut to_remove = (0, 0); + let mut found; + let mut to_remove; + loop { - let mut found = None; - 'middle: loop { - if work.len() == 1 { - break; - } - for i in 0..work.len() - 1 { - for j in i + 1..work.len() { - if let Some(range) = merge_two_ranges(&[ranges[i].clone(), ranges[j].clone()]) { - found = Some(range); - to_remove = (i, j); - break 'middle; - } + found = None; + to_remove = (0, 0); + + 'inner: for i in 0..work.len() - 1 { + for j in i + 1..work.len() { + if let Some(range) = merge_two_ranges(&[work[i].clone(), work[j].clone()]) { + found = Some(range); + to_remove = (i, j); + break 'inner; } } } if let Some(range) = found { - dbg!(&range); work.remove(to_remove.1); work.remove(to_remove.0); work.push(range); @@ -59,7 +60,7 @@ fn merge_two_ranges(ranges: &[RangeInclusive]) -> Option]) -> Option, b: &RangeInclusive) -> bool { + *a.start() == b.end() + 1 || *b.start() == a.end() + 1 +} + fn ranges_overlap(a: &RangeInclusive, b: &RangeInclusive) -> bool { (a.start() < b.start() && a.end() > b.start()) || (b.start() < a.start() && b.end() > a.start())