|
1 | 1 | use crate::solutions::Solution; |
| 2 | +use itertools::Itertools; |
| 3 | +use std::ops::RangeInclusive; |
2 | 4 |
|
3 | 5 | pub struct Day05; |
4 | 6 |
|
5 | 7 | impl Solution for Day05 { |
6 | | - fn part_one(&self, _input: &str) -> String { |
7 | | - String::from("0") |
| 8 | + fn part_one(&self, input: &str) -> String { |
| 9 | + let (ranges, ids) = self.parse(input); |
| 10 | + |
| 11 | + ids.iter() |
| 12 | + .filter(|id| ranges.iter().any(|range| range.contains(id))) |
| 13 | + .count() |
| 14 | + .to_string() |
8 | 15 | } |
9 | 16 |
|
10 | 17 | fn part_two(&self, _input: &str) -> String { |
11 | 18 | String::from("0") |
12 | 19 | } |
13 | 20 | } |
14 | 21 |
|
| 22 | +impl Day05 { |
| 23 | + fn parse(&self, input: &str) -> (Vec<RangeInclusive<usize>>, Vec<usize>) { |
| 24 | + let (ranges_str, ids_str) = input.split_once("\n\n").unwrap(); |
| 25 | + |
| 26 | + let ranges = ranges_str |
| 27 | + .lines() |
| 28 | + .map(|line| { |
| 29 | + let (start, end) = line.split_once("-").unwrap(); |
| 30 | + |
| 31 | + let start = start.parse::<usize>().unwrap(); |
| 32 | + let end = end.parse::<usize>().unwrap(); |
| 33 | + |
| 34 | + start..=end |
| 35 | + }) |
| 36 | + .collect_vec(); |
| 37 | + |
| 38 | + let ids = ids_str |
| 39 | + .lines() |
| 40 | + .map(|line| line.parse::<usize>().unwrap()) |
| 41 | + .collect_vec(); |
| 42 | + |
| 43 | + (ranges, ids) |
| 44 | + } |
| 45 | +} |
| 46 | + |
15 | 47 | #[cfg(test)] |
16 | 48 | mod tests { |
17 | 49 | use crate::solutions::year2025::day05::Day05; |
18 | 50 | use crate::solutions::Solution; |
19 | 51 |
|
20 | | - const EXAMPLE: &str = r#""#; |
| 52 | + const EXAMPLE: &str = r#"3-5 |
| 53 | +10-14 |
| 54 | +16-20 |
| 55 | +12-18 |
| 56 | +
|
| 57 | +1 |
| 58 | +5 |
| 59 | +8 |
| 60 | +11 |
| 61 | +17 |
| 62 | +32"#; |
21 | 63 |
|
22 | 64 | #[test] |
23 | 65 | fn part_one_example_test() { |
24 | | - assert_eq!("0", Day05.part_one(EXAMPLE)); |
| 66 | + assert_eq!("3", Day05.part_one(EXAMPLE)); |
25 | 67 | } |
26 | 68 | } |
0 commit comments