add day 20 part 1 and a half WIP

This commit is contained in:
timeshifter
2026-07-02 21:30:58 +02:00
parent 0ab662e20d
commit 15d7a5ad46
5 changed files with 1171 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
use std::ops::RangeInclusive;
#[cfg(debug_assertions)]
const INPUT: &str = "example.txt";
#[cfg(not(debug_assertions))]
const INPUT: &str = "input.txt";
fn main() {
let ranges: Vec<_> = std::fs::read_to_string(INPUT)
.unwrap()
.lines()
.map(|l| {
let mut parts = l.split('-');
let low = parts.next().unwrap();
let high = parts.next().unwrap();
RangeInclusive::new(low.parse::<usize>().unwrap(), high.parse().unwrap())
})
.collect();
// dbg!(&ranges);
let result = consolidate_all_ranges(&ranges);
dbg!(result);
}
fn consolidate_all_ranges(ranges: &[RangeInclusive<usize>]) -> Vec<RangeInclusive<usize>> {
let mut work = ranges.to_vec();
let mut to_remove = (0, 0);
loop {
let mut found = None;
'middle: loop {
if work.len() == 1 {
break;
}
for i in 0..work.len() - 1 {
for j in i + 1..work.len() {
if let Some(range) = merge_two_ranges(&[ranges[i].clone(), ranges[j].clone()]) {
found = Some(range);
to_remove = (i, j);
break 'middle;
}
}
}
}
if let Some(range) = found {
dbg!(&range);
work.remove(to_remove.1);
work.remove(to_remove.0);
work.push(range);
} else {
break;
}
}
work
}
fn merge_two_ranges(ranges: &[RangeInclusive<usize>]) -> Option<RangeInclusive<usize>> {
let a = &ranges[0];
let b = &ranges[1];
if ranges_overlap(a, b) {
let start = if a.start() < b.start() {
a.start()
} else {
b.start()
};
let end = if a.end() > b.end() { a.end() } else { b.end() };
Some(*start..=*end)
} else {
None
}
}
fn ranges_overlap(a: &RangeInclusive<usize>, b: &RangeInclusive<usize>) -> bool {
(a.start() < b.start() && a.end() > b.start())
|| (b.start() < a.start() && b.end() > a.start())
|| (a.start() < b.start() && a.end() > b.end())
|| (b.start() < a.start() && b.end() > a.end())
}