summaryrefslogtreecommitdiffstats
path: root/src/bin/2021/day7.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/2021/day7.rs')
-rw-r--r--src/bin/2021/day7.rs42
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
+ );
+}