Use new type for day 5 ranges
This is cleaner and faster, with inherent methods and mutability.
This commit is contained in:
parent
88c138baf0
commit
70b56f4501
@ -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 {
|
||||||
} else {
|
Ranges(Vec::new())
|
||||||
let first = &ranges[0];
|
|
||||||
if first.contains(new.lower) {
|
|
||||||
ranges[0] = first.extend(new.upper);
|
|
||||||
ranges
|
|
||||||
} else {
|
|
||||||
let mut result = vec![new];
|
|
||||||
result.append(&mut ranges);
|
|
||||||
result
|
|
||||||
}
|
}
|
||||||
|
fn add(&mut self, new: Range) {
|
||||||
|
if self.0.is_empty() {
|
||||||
|
self.0.push(new);
|
||||||
|
} else {
|
||||||
|
let first = &self.0[0];
|
||||||
|
if first.contains(new.lower) {
|
||||||
|
self.0[0] = first.extend(new.upper);
|
||||||
|
} else {
|
||||||
|
self.0.insert(0, new);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn total_length(&self) -> usize {
|
||||||
|
self.0.iter().map(|r| r.length()).sum()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user