Advent of Code solutions
at main 61 lines 1.7 kB view raw
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}