add day 20 part 2
This commit is contained in:
+20
-15
@@ -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 i in 0..work.len() - 1 {
|
|
||||||
for j in i + 1..work.len() {
|
for j in i + 1..work.len() {
|
||||||
if let Some(range) = merge_two_ranges(&[ranges[i].clone(), ranges[j].clone()]) {
|
if let Some(range) = merge_two_ranges(&[work[i].clone(), work[j].clone()]) {
|
||||||
found = Some(range);
|
found = Some(range);
|
||||||
to_remove = (i, j);
|
to_remove = (i, j);
|
||||||
break 'middle;
|
break 'inner;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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())
|
||||||
|
|||||||
Reference in New Issue
Block a user