add day 20 part 1 and a half WIP
This commit is contained in:
Generated
+7
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "day20"
|
||||||
|
version = "0.1.0"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[package]
|
||||||
|
name = "day20"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
5-8
|
||||||
|
0-2
|
||||||
|
4-7
|
||||||
+1075
File diff suppressed because it is too large
Load Diff
@@ -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())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user