add day 20 part 2

This commit is contained in:
timeshifter
2026-07-02 21:59:24 +02:00
parent 15d7a5ad46
commit 2ce82421c2
+23 -18
View File
@@ -17,33 +17,34 @@ fn main() {
}) })
.collect(); .collect();
// dbg!(&ranges); let mut result = consolidate_all_ranges(&ranges);
let result = consolidate_all_ranges(&ranges);
dbg!(result); result.sort_by_key(|r| *r.start());
println!("{}", result[0].end() + 1);
println!("{}", result.len() - 1);
} }
fn consolidate_all_ranges(ranges: &[RangeInclusive<usize>]) -> Vec<RangeInclusive<usize>> { fn consolidate_all_ranges(ranges: &[RangeInclusive<usize>]) -> Vec<RangeInclusive<usize>> {
let mut work = ranges.to_vec(); let mut work = ranges.to_vec();
let mut to_remove = (0, 0); let mut found;
let mut to_remove;
loop { loop {
let mut found = None; found = None;
'middle: loop { to_remove = (0, 0);
if work.len() == 1 {
break; 'inner: for i in 0..work.len() - 1 {
} for j in i + 1..work.len() {
for i in 0..work.len() - 1 { if let Some(range) = merge_two_ranges(&[work[i].clone(), work[j].clone()]) {
for j in i + 1..work.len() { found = Some(range);
if let Some(range) = merge_two_ranges(&[ranges[i].clone(), ranges[j].clone()]) { to_remove = (i, j);
found = Some(range); break 'inner;
to_remove = (i, j);
break 'middle;
}
} }
} }
} }
if let Some(range) = found { if let Some(range) = found {
dbg!(&range);
work.remove(to_remove.1); work.remove(to_remove.1);
work.remove(to_remove.0); work.remove(to_remove.0);
work.push(range); work.push(range);
@@ -59,7 +60,7 @@ fn merge_two_ranges(ranges: &[RangeInclusive<usize>]) -> Option<RangeInclusive<u
let a = &ranges[0]; let a = &ranges[0];
let b = &ranges[1]; let b = &ranges[1];
if ranges_overlap(a, b) { if ranges_overlap(a, b) || ranges_are_adjacent(a, b) {
let start = if a.start() < b.start() { let start = if a.start() < b.start() {
a.start() a.start()
} else { } else {
@@ -72,6 +73,10 @@ fn merge_two_ranges(ranges: &[RangeInclusive<usize>]) -> Option<RangeInclusive<u
} }
} }
fn ranges_are_adjacent(a: &RangeInclusive<usize>, b: &RangeInclusive<usize>) -> bool {
*a.start() == b.end() + 1 || *b.start() == a.end() + 1
}
fn ranges_overlap(a: &RangeInclusive<usize>, b: &RangeInclusive<usize>) -> bool { fn ranges_overlap(a: &RangeInclusive<usize>, b: &RangeInclusive<usize>) -> bool {
(a.start() < b.start() && a.end() > b.start()) (a.start() < b.start() && a.end() > b.start())
|| (b.start() < a.start() && b.end() > a.start()) || (b.start() < a.start() && b.end() > a.start())