mirror of
https://github.com/RussellChamp/advent-of-code-2025-rust.git
synced 2026-10-28 00:22:29 +00:00
day 05
This commit is contained in:
1 parent
b4153b0766
commit
37bf0f6a60
3 files changed
+100
-1
No files matched your search
@@ -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**
|
||||
<!--- benchmarking table --->
|
||||
|
||||
---
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
3-5
|
||||
10-14
|
||||
16-20
|
||||
12-18
|
||||
|
||||
1
|
||||
5
|
||||
8
|
||||
11
|
||||
17
|
||||
32
|
||||
@@ -0,0 +1,87 @@
|
||||
advent_of_code::solution!(5);
|
||||
use itertools::Itertools;
|
||||
|
||||
pub fn part_one(input: &str) -> Option<u64> {
|
||||
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::<u64>().unwrap(), end.parse::<u64>().unwrap())
|
||||
})
|
||||
.collect_vec();
|
||||
let ids = lists[1].lines().map(|line| line.parse::<u64>().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<u64> {
|
||||
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::<u64>().unwrap(), end.parse::<u64>().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::<u64>();
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user