use crate::prelude::*; pub type I = (B>, B>); pub type O = u32; fn _parse (data: &str) -> I { let (mut l, mut r) = (B::new(), B::new()); data.lines().for_each(|line| { let mut iter = line.split_whitespace(); let left = p!(n!(iter)); let right = p!(n!(iter)); l.push(Rev(left)); r.push(Rev(right)); }); (l, r) } fn _silver ((left, right): I) -> O { left.into_iter_sorted().zip(right.into_iter_sorted()).fold(0, |acc, (l, r)| acc + l.0.abs_diff(r.0)) } fn _gold ((left, right): I) -> O { let right = right.into_iter().map(|e| e.0).counts(); left.into_iter().fold(0, |acc, cur| acc + cur.0 * *right.get(&cur.0).unwrap_or(&0) as u32) } #[cfg(test)] mod test { use super::*; #[test] fn silver () { let data = _parse(inc!(1)); let ans = _silver(data); assert_eq!(ans, 2196996) } #[test] fn gold () { let data = _parse(inc!(1)); let ans = _gold(data); assert_eq!(ans, 23655822) } }