Advent of Code solutions
1use advent_core::{day_stuff, ex_for_day, Day};
2use utils::range::BetterRange;
3
4pub struct Day5;
5
6impl Day for Day5 {
7 day_stuff!(5, "3", "14", (Vec<BetterRange<usize>>, Vec<usize>));
8
9 fn part_1((ranges, ids): Self::Input) -> Option<String> {
10 let ans = ids
11 .into_iter()
12 .filter(|id| ranges.iter().any(|range| range.contains(id)))
13 .count();
14
15 Some(ans.to_string())
16 }
17
18 fn part_2((mut ranges, _): Self::Input) -> Option<String> {
19 ranges.sort();
20
21 let mut new_ranges = Vec::with_capacity(ranges.len());
22
23 for range in ranges {
24 let mut merged = false;
25
26 for new_range in new_ranges.iter_mut() {
27 if let Some(merged_range) = range.merge(new_range) {
28 merged = true;
29 *new_range = merged_range;
30 break;
31 }
32 }
33
34 if !merged {
35 new_ranges.push(range);
36 }
37 }
38
39 let ans = new_ranges
40 .into_iter()
41 .map(|range| range.end - range.start)
42 .sum::<usize>();
43
44 Some(ans.to_string())
45 }
46
47 fn parse_input(input: &str) -> Self::Input {
48 let (ranges, ids) = input.split_once("\n\n").unwrap();
49
50 (
51 ranges
52 .lines()
53 .map(|l| {
54 let (lower, upper) = l.split_once('-').unwrap();
55 BetterRange::new(lower.parse().unwrap(), upper.parse::<usize>().unwrap() + 1)
56 })
57 .collect(),
58 ids.lines().map(|l| l.parse().unwrap()).collect(),
59 )
60 }
61}