aoc2024/src/days/d1.rs

50 lines
1.0 KiB
Rust
Raw Normal View History

2024-12-01 17:37:15 +00:00
use crate::prelude::*;
pub type I = (B<Rev<u32>>, B<Rev<u32>>);
2024-12-01 17:37:15 +00:00
pub type O = u32;
fn _parse (data: &str) -> I {
let (mut l, mut r) = (B::new(), B::new());
2024-12-01 17:37:15 +00:00
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));
2024-12-01 17:37:15 +00:00
});
(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))
2024-12-01 17:37:15 +00:00
}
fn _gold ((left, right): I) -> O {
let right = right.into_iter().map(|e| e.0).counts();
2024-12-01 17:37:15 +00:00
left.into_iter().fold(0, |acc, cur| acc + cur.0 * *right.get(&cur.0).unwrap_or(&0) as u32)
2024-12-01 17:37:15 +00:00
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn silver () {
let data = _parse(inc!(1));
2024-12-01 17:37:15 +00:00
let ans = _silver(data);
assert_eq!(ans, 2196996)
}
#[test]
fn gold () {
let data = _parse(inc!(1));
2024-12-01 17:37:15 +00:00
let ans = _gold(data);
assert_eq!(ans, 23655822)
}
}