From 37bf0f6a60c1d6b3d91300260a66e56a771eca29 Mon Sep 17 00:00:00 2001 From: Russell Champoux Date: Fri, 5 Dec 2025 10:43:46 -0500 Subject: [PATCH] day 05 --- README.md | 3 +- data/examples/05.txt | 11 ++++++ src/bin/05.rs | 87 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 data/examples/05.txt create mode 100644 src/bin/05.rs diff --git a/README.md b/README.md index fb99969..e78a2e2 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,9 @@ Solutions for [Advent of Code](https://adventofcode.com/) in [Rust](https://www. | [Day 2](./src/bin/02.rs) | `225.7ms` | `250.4ms` | | [Day 3](./src/bin/03.rs) | `85.9µs` | `120.1µs` | | [Day 4](./src/bin/04.rs) | `227.4µs` | `1.9ms` | +| [Day 5](./src/bin/05.rs) | `159.6µs` | `21.4µs` | -**Total: 480.16ms** +**Total: 480.34ms** --- diff --git a/data/examples/05.txt b/data/examples/05.txt new file mode 100644 index 0000000..2e9078d --- /dev/null +++ b/data/examples/05.txt @@ -0,0 +1,11 @@ +3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32 diff --git a/src/bin/05.rs b/src/bin/05.rs new file mode 100644 index 0000000..1e2dc5f --- /dev/null +++ b/src/bin/05.rs @@ -0,0 +1,87 @@ +advent_of_code::solution!(5); +use itertools::Itertools; + +pub fn part_one(input: &str) -> Option { + let lists = input.split("\n\n").collect_vec(); + let ranges = lists[0] + .lines() + .map(|line| { + let (start, end) = line.split_once('-').unwrap(); + // println!("Parsed range: {}-{}", start, end); + (start.parse::().unwrap(), end.parse::().unwrap()) + }) + .collect_vec(); + let ids = lists[1].lines().map(|line| line.parse::().unwrap()).collect_vec(); + + // println!("{ranges:?}"); + // println!("{ids:?}"); + let mut fresh_item_count = 0; + + for id in ids { + for (start, end) in &ranges { + if id >= *start && id <= *end { + // println!("ID {id} is in range {start}-{end}"); + fresh_item_count += 1; + break; + } + } + } + + Some(fresh_item_count) +} + +pub fn part_two(input: &str) -> Option { + let lists = input.split("\n\n").collect_vec(); + let mut ranges = lists[0] + .lines() + .map(|line| { + let (start, end) = line.split_once('-').unwrap(); + // println!("Parsed range: {}-{}", start, end); + (start.parse::().unwrap(), end.parse::().unwrap()) + }) + .collect_vec(); + ranges.sort_by(|a, b| if a.0 != b.0 { + a.0.cmp(&b.0) + } else { + a.1.cmp(&b.1) + }); + // println!("{ranges:?}"); + + let mut i = 0; + while i < ranges.len() - 1 { + let (start_a, end_a) = ranges[i]; + let (start_b, end_b) = ranges[i + 1]; + if end_a >= start_b { + let new_end = end_a.max(end_b); + ranges[i] = (start_a, new_end); + ranges.remove(i + 1); + // println!("Merged to: {:?}", ranges[i]); + } + else { + i += 1; + } + } + // println!("{ranges:?}"); + + let total_count = ranges.iter().map(|(start, end)| end - start + 1).sum::(); + // sort and merge ranges + + Some(total_count) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_part_one() { + let result = part_one(&advent_of_code::template::read_file("examples", DAY)); + assert_eq!(result, Some(3)); + } + + #[test] + fn test_part_two() { + let result = part_two(&advent_of_code::template::read_file("examples", DAY)); + assert_eq!(result, Some(14)); + } +}