From 1f82341f811460b5b5a991d4ebafd3938d507f05 Mon Sep 17 00:00:00 2001 From: YK Date: Sun, 1 Dec 2024 20:37:15 +0300 Subject: [PATCH] solution: day 1 --- src/days.rs | 1 + src/days/d1.rs | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 src/days/d1.rs diff --git a/src/days.rs b/src/days.rs index 849a861..e88513f 100644 --- a/src/days.rs +++ b/src/days.rs @@ -1,3 +1,4 @@ +pub mod d1; // pub mod d2; // pub mod d3; // pub mod d4; diff --git a/src/days/d1.rs b/src/days/d1.rs new file mode 100644 index 0000000..ee084fe --- /dev/null +++ b/src/days/d1.rs @@ -0,0 +1,57 @@ +use crate::prelude::*; + +pub type I = (Vec, Vec); +pub type O = u32; + +fn _parse (data: &str) -> I { + let (mut l, mut r) = (vec![], vec![]); + data.lines().for_each(|line| { + let mut iter = line.split_whitespace(); + + let left = p!(n!(iter)); + let right = p!(n!(iter)); + l.push(left); + r.push(right); + }); + + (l, r) +} + +fn _silver ((mut left, mut right): I) -> O { + left.sort(); + right.sort(); + + left.into_iter().zip(right.into_iter()).fold(0, |acc, (l, r)| acc + l.abs_diff(r)) +} + +fn _gold ((left, right): I) -> O { + let right = right.into_iter().counts(); + + left.into_iter().fold(0, |acc, cur| acc + cur * *right.get(&cur).unwrap_or(&0) as u32) +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> I { + let data = inc!(1); + _parse(data) + } + + #[test] + fn silver () { + let data = read(); + let ans = _silver(data); + + assert_eq!(ans, 2196996) + } + + #[test] + fn gold () { + let data = read(); + let ans = _gold(data); + + assert_eq!(ans, 23655822) + } +}