feat: solve day 5
This commit is contained in:
parent
98d927cd72
commit
a13fd2afe7
4 changed files with 115 additions and 0 deletions
11
data/examples/05-1.txt
Normal file
11
data/examples/05-1.txt
Normal 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
6
data/examples/05-2.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
1-10
|
||||||
|
2-9
|
||||||
|
3-8
|
||||||
|
4-7
|
||||||
|
5-6
|
||||||
|
|
||||||
6
data/examples/05-3.txt
Normal file
6
data/examples/05-3.txt
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
5-6
|
||||||
|
4-7
|
||||||
|
1-10
|
||||||
|
3-8
|
||||||
|
2-9
|
||||||
|
|
||||||
92
src/bin/05.rs
Normal file
92
src/bin/05.rs
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue