diff options
Diffstat (limited to 'src/bin/2021/day7.rs')
-rw-r--r-- | src/bin/2021/day7.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/bin/2021/day7.rs b/src/bin/2021/day7.rs new file mode 100644 index 0000000..56eaeb1 --- /dev/null +++ b/src/bin/2021/day7.rs @@ -0,0 +1,42 @@ +use advent_of_code::prelude::*; + +pub fn parse(fh: File) -> Result<Vec<usize>> { + Ok(parse::split(fh, b',').collect()) +} + +pub fn part1(crabs: Vec<usize>) -> Result<usize> { + Ok((0..=crabs.iter().copied().max().unwrap()) + .map(|start| { + crabs.iter().copied().map(|crab| crab.abs_diff(start)).sum() + }) + .min() + .unwrap()) +} + +pub fn part2(crabs: Vec<usize>) -> Result<usize> { + Ok((0..=crabs.iter().copied().max().unwrap()) + .map(|start| { + crabs + .iter() + .copied() + .map(|crab| { + let diff = crab.abs_diff(start); + diff * (diff + 1) / 2 + }) + .sum() + }) + .min() + .unwrap()) +} + +#[test] +fn test() { + assert_eq!( + part1(parse(parse::data(2021, 7).unwrap()).unwrap()).unwrap(), + 333755 + ); + assert_eq!( + part2(parse(parse::data(2021, 7).unwrap()).unwrap()).unwrap(), + 94017638 + ); +} |