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