feat: solve day 5

This commit is contained in:
Joshua Smallwood 2025-12-06 13:38:33 -06:00
parent 98d927cd72
commit a13fd2afe7
4 changed files with 115 additions and 0 deletions

11
data/examples/05-1.txt Normal file
View file

@ -0,0 +1,11 @@
3-5
10-14
16-20
12-18
1
5
8
11
17
32

6
data/examples/05-2.txt Normal file
View file

@ -0,0 +1,6 @@
1-10
2-9
3-8
4-7
5-6

6
data/examples/05-3.txt Normal file
View file

@ -0,0 +1,6 @@
5-6
4-7
1-10
3-8
2-9

92
src/bin/05.rs Normal file
View file

@ -0,0 +1,92 @@
use itertools::Itertools;
advent_of_code::solution!(5);
pub fn part_one(input: &str) -> Option<usize> {
let mut input_iter = input.splitn(2, "\n\n");
let ranges = input_iter.next().unwrap().split("\n").map(|range| {
let mut range_iter = range.split("-");
let start = range_iter.next().unwrap().parse::<u128>().unwrap_or(0);
let end = range_iter.next().unwrap().parse::<u128>().unwrap_or(0);
start..end + 1
});
Some(
input_iter
.next()
.unwrap()
.split("\n")
.filter(|id| !id.is_empty())
.map(|id| id.parse::<u128>().unwrap())
.filter(|id| {
let mut found = false;
for range in ranges.clone() {
if range.contains(id) {
found = true;
break;
}
}
found
})
.count(),
)
}
pub fn part_two(input: &str) -> Option<i128> {
let mut input_iter = input.splitn(2, "\n\n");
let ranges = input_iter
.next()
.unwrap()
.split("\n")
.map(|range| {
let mut range_iter = range.split("-");
let start = range_iter.next().unwrap().parse::<i128>().unwrap_or(0);
let end = range_iter.next().unwrap().parse::<i128>().unwrap_or(0);
(start, end)
})
.sorted_by_key(|(start, _)| *start)
.collect::<Vec<(i128, i128)>>();
let mut merged_ranges: Vec<(i128, i128)> = vec![];
for range in ranges {
if let Some(last) = merged_ranges.last_mut() {
if range.0 <= last.1 + 1 {
last.1 = std::cmp::max(last.1, range.1);
continue;
}
}
merged_ranges.push(range);
}
merged_ranges
.iter()
.map(|(start, end)| end - start + 1)
.sum1()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
let result = part_one(&advent_of_code::template::read_file_part(
"examples", DAY, 1,
));
assert_eq!(result, Some(3));
}
#[test]
fn test_part_two() {
let mut result = part_two(&advent_of_code::template::read_file_part(
"examples", DAY, 1,
));
assert_eq!(result, Some(14));
result = part_two(&advent_of_code::template::read_file_part(
"examples", DAY, 2,
));
assert_eq!(result, Some(10));
result = part_two(&advent_of_code::template::read_file_part(
"examples", DAY, 3,
));
assert_eq!(result, Some(10));
}
}