Rust
#[test]
fn test_y2025_day5_part2() {
let input = std::fs::read_to_string("input/2025/day_5.txt").unwrap();
let (fresh, _) = input.split_once("\n\n").unwrap();
let mut fresh = fresh
.lines()
.map(|l| {
let (p1, p2) = l.split_once("-").unwrap();
(p1.parse::<usize>().unwrap(), p2.parse::<usize>().unwrap())
})
.collect::<Vec<(usize, usize)>>();
fresh.sort_by_key(|a| a.0);
let mut non_overlapping = vec![*fresh.first().unwrap()];
for range in fresh[1..].iter() {
let last = *non_overlapping.last().unwrap();
if range.0 > last.1 {
// println!("Non overlapping: {range:?} -> {last:?}");
non_overlapping.push((range.0, range.1));
continue;
}
if range.0 <= last.1 && range.1 > last.1 {
// println!("Overlapping: {range:?} -> {last:?}");
let new_last = (last.0, range.1);
non_overlapping.pop();
non_overlapping.push(new_last);
continue;
}
// println!("{range:?} is entirely within {last:?}");
}
let mut count = 0;
for r in &non_overlapping {
count += r.1 - r.0 + 1;
}
assert_eq!(count, 352556672963116);
println!("{}", count);
}
Took me way longer than it should have to work out pt2, got tripped up by a < instead of <=.