From a13fd2afe7256ad33fbd0aa909936480d0b16ca8 Mon Sep 17 00:00:00 2001 From: Joshua Smallwood <31932412+smallwoj@users.noreply.github.com> Date: Sat, 6 Dec 2025 13:38:33 -0600 Subject: [PATCH] feat: solve day 5 --- data/examples/05-1.txt | 11 +++++ data/examples/05-2.txt | 6 +++ data/examples/05-3.txt | 6 +++ src/bin/05.rs | 92 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 data/examples/05-1.txt create mode 100644 data/examples/05-2.txt create mode 100644 data/examples/05-3.txt create mode 100644 src/bin/05.rs diff --git a/data/examples/05-1.txt b/data/examples/05-1.txt new file mode 100644 index 0000000..2e9078d --- /dev/null +++ b/data/examples/05-1.txt @@ -0,0 +1,11 @@ +3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32 diff --git a/data/examples/05-2.txt b/data/examples/05-2.txt new file mode 100644 index 0000000..dab38b6 --- /dev/null +++ b/data/examples/05-2.txt @@ -0,0 +1,6 @@ +1-10 +2-9 +3-8 +4-7 +5-6 + diff --git a/data/examples/05-3.txt b/data/examples/05-3.txt new file mode 100644 index 0000000..c21cf26 --- /dev/null +++ b/data/examples/05-3.txt @@ -0,0 +1,6 @@ +5-6 +4-7 +1-10 +3-8 +2-9 + diff --git a/src/bin/05.rs b/src/bin/05.rs new file mode 100644 index 0000000..9e717b7 --- /dev/null +++ b/src/bin/05.rs @@ -0,0 +1,92 @@ +use itertools::Itertools; + +advent_of_code::solution!(5); + +pub fn part_one(input: &str) -> Option { + 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::().unwrap_or(0); + let end = range_iter.next().unwrap().parse::().unwrap_or(0); + start..end + 1 + }); + Some( + input_iter + .next() + .unwrap() + .split("\n") + .filter(|id| !id.is_empty()) + .map(|id| id.parse::().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 { + 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::().unwrap_or(0); + let end = range_iter.next().unwrap().parse::().unwrap_or(0); + (start, end) + }) + .sorted_by_key(|(start, _)| *start) + .collect::>(); + 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)); + } +}