diff options
Diffstat (limited to 'src/2021/7/mod.rs')
-rw-r--r-- | src/2021/7/mod.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/2021/7/mod.rs b/src/2021/7/mod.rs new file mode 100644 index 0000000..275173e --- /dev/null +++ b/src/2021/7/mod.rs @@ -0,0 +1,38 @@ +pub fn part1() -> anyhow::Result<i64> { + let crabs: Vec<i64> = data_lines!()? + .next() + .unwrap()? + .split(',') + .map(|s| s.parse()) + .collect::<Result<_, _>>()?; + + Ok((0..=crabs.iter().copied().max().unwrap()) + .map(|start| { + crabs.iter().copied().map(|crab| (crab - start).abs()).sum() + }) + .min() + .unwrap()) +} + +pub fn part2() -> anyhow::Result<i64> { + let crabs: Vec<i64> = data_lines!()? + .next() + .unwrap()? + .split(',') + .map(|s| s.parse()) + .collect::<Result<_, _>>()?; + + Ok((0..=crabs.iter().copied().max().unwrap()) + .map(|start| { + crabs + .iter() + .copied() + .map(|crab| { + let diff = (crab - start).abs(); + diff * (diff + 1) / 2 + }) + .sum() + }) + .min() + .unwrap()) +} |