my solutions to advent of code
aoc advent-of-code

with a try fold

aylac.top b99210bb a909dbe8

verified
Changed files
+8 -8
2025
5
rust
src
+8 -8
2025/5/rust/src/main.rs
···
let mut seen_ranges: HashSet<(u64, u64)> =
HashSet::with_capacity(fresh_ranges.len());
fresh_ranges.iter().for_each(|range| {
-
let range: (u64, u64) = seen_ranges.clone().iter().fold(
+
let range = seen_ranges.clone().iter().try_fold(
*range,
|range: (u64, u64), seen_range: &(u64, u64)| {
// btw im refusing to ever do something better than this idc about your sorting and whatever this is the way shut the fuck up i spent three hours on this i will be using it
···
range.1.cmp(&seen_range.0),
) {
// if there's no touching
-
(Gt, Gt, Gt, Gt) | (Lt, Lt, Lt, Lt) => range,
+
(Gt, Gt, Gt, Gt) | (Lt, Lt, Lt, Lt) => Some(range),
// if it's inside of the other one
(Gt, Lt, _, _)
| (Eq, Lt, _, _)
| (Gt, Eq, _, _)
-
| (Eq, Eq, _, _) => (0_u64, 0_u64),
+
| (Eq, Eq, _, _) => None,
// if the other one is inside it
(Lt, Gt, _, _) | (Eq, Gt, _, _) | (Lt, Eq, _, _) => {
seen_ranges.remove(seen_range);
-
range
+
Some(range)
}
// if it's touching on the left side make them touch
(Lt, Lt, _, _) => {
seen_ranges.remove(seen_range);
-
(range.0, seen_range.1)
+
Some((range.0, seen_range.1))
}
// if it's touching on the right size make them touch
(Gt, Gt, _, _) => {
seen_ranges.remove(seen_range);
-
(seen_range.0, range.1)
+
Some((seen_range.0, range.1))
}
}
},
);
-
if range != (0_u64, 0_u64) {
-
seen_ranges.insert(range);
+
if range.is_some() {
+
seen_ranges.insert(range.unwrap());
}
});
let part_2 = seen_ranges