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) } }