58 lines
1.1 KiB
Rust
58 lines
1.1 KiB
Rust
|
|
use crate::prelude::*;
|
||
|
|
|
||
|
|
pub type I = (Vec<u32>, Vec<u32>);
|
||
|
|
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)
|
||
|
|
}
|
||
|
|
}
|