diff options
Diffstat (limited to 'src/2021/5/mod.rs')
-rw-r--r-- | src/2021/5/mod.rs | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/src/2021/5/mod.rs b/src/2021/5/mod.rs index 229ba20..2e81e34 100644 --- a/src/2021/5/mod.rs +++ b/src/2021/5/mod.rs @@ -72,34 +72,37 @@ impl Map { } } -pub fn part1() -> anyhow::Result<i64> { - let rx = regex::Regex::new("^(\\d+),(\\d+) -> (\\d+),(\\d+)$").unwrap(); - let mut map = Map::default(); - for line in data_lines!()? { - let nums: Vec<usize> = rx - .captures(&line) +pub fn parse( + fh: std::fs::File, +) -> anyhow::Result<impl Iterator<Item = Vec<usize>>> { + let rx = regex::Regex::new("^(\\d+),(\\d+) -> (\\d+),(\\d+)$")?; + Ok(crate::util::parse::lines(fh).map(move |line| { + rx.captures(&line) .unwrap() .iter() .skip(1) .map(|s| s.unwrap().as_str().parse()) - .collect::<Result<_, _>>()?; + .collect::<Result<_, _>>() + .unwrap() + })) +} + +pub fn part1( + coords: impl Iterator<Item = Vec<usize>>, +) -> anyhow::Result<i64> { + let mut map = Map::default(); + for nums in coords { let _ = map.mark_horizontal(nums[0], nums[1], nums[2], nums[3]) || map.mark_vertical(nums[0], nums[1], nums[2], nums[3]); } Ok(map.count_overlapping().try_into()?) } -pub fn part2() -> anyhow::Result<i64> { - let rx = regex::Regex::new("^(\\d+),(\\d+) -> (\\d+),(\\d+)$").unwrap(); +pub fn part2( + coords: impl Iterator<Item = Vec<usize>>, +) -> anyhow::Result<i64> { let mut map = Map::default(); - for line in data_lines!()? { - let nums: Vec<usize> = rx - .captures(&line) - .unwrap() - .iter() - .skip(1) - .map(|s| s.unwrap().as_str().parse()) - .collect::<Result<_, _>>()?; + for nums in coords { let _ = map.mark_horizontal(nums[0], nums[1], nums[2], nums[3]) || map.mark_vertical(nums[0], nums[1], nums[2], nums[3]) || map.mark_diagonal(nums[0], nums[1], nums[2], nums[3]) @@ -110,6 +113,12 @@ pub fn part2() -> anyhow::Result<i64> { #[test] fn test() { - assert_eq!(part1().unwrap(), 6311); - assert_eq!(part2().unwrap(), 19929); + assert_eq!( + part1(parse(crate::util::data(2021, 5).unwrap()).unwrap()).unwrap(), + 6311 + ); + assert_eq!( + part2(parse(crate::util::data(2021, 5).unwrap()).unwrap()).unwrap(), + 19929 + ); } |