Use new type for day 5 ranges

This is cleaner and faster, with inherent methods and mutability.
This commit is contained in:
George Thomas 2026-01-07 14:29:47 +00:00
parent 88c138baf0
commit 70b56f4501

View File

@ -36,11 +36,12 @@ pub const PUZZLE: Puzzle<(Vec<Range>, Vec<usize>), 2> = Puzzle {
}, },
|(ranges, _)| { |(ranges, _)| {
let mut sorted_ranges = ranges.clone(); let mut sorted_ranges = ranges.clone();
sorted_ranges.sort_by(|a, b| b.lower.cmp(&a.lower)); sorted_ranges.sort_by_key(|r| r.lower);
let merged: Vec<Range> = sorted_ranges let mut merged = Ranges::new();
.into_iter() for r in sorted_ranges {
.rfold(Vec::new(), |acc, new| add_interval(new, acc)); merged.add(r);
merged.iter().map(|r| r.length()).sum::<usize>().to_string() }
merged.total_length().to_string()
}, },
], ],
}; };
@ -65,18 +66,24 @@ impl Range {
} }
} }
fn add_interval(new: Range, mut ranges: Vec<Range>) -> Vec<Range> { struct Ranges(Vec<Range>);
if ranges.is_empty() { impl Ranges {
vec![new] fn new() -> Self {
Ranges(Vec::new())
}
fn add(&mut self, new: Range) {
if self.0.is_empty() {
self.0.push(new);
} else { } else {
let first = &ranges[0]; let first = &self.0[0];
if first.contains(new.lower) { if first.contains(new.lower) {
ranges[0] = first.extend(new.upper); self.0[0] = first.extend(new.upper);
ranges
} else { } else {
let mut result = vec![new]; self.0.insert(0, new);
result.append(&mut ranges);
result
} }
} }
} }
fn total_length(&self) -> usize {
self.0.iter().map(|r| r.length()).sum()
}
}