39 lines
866 B
Rust
39 lines
866 B
Rust
#![feature(test)]
|
|
|
|
use aoc::iter_ext::IterExt;
|
|
use itertools::Itertools;
|
|
|
|
type Input = Vec<(i32, i32)>;
|
|
|
|
fn setup(input: &str) -> Input {
|
|
input
|
|
.lines()
|
|
.map(|line| {
|
|
line.split_whitespace()
|
|
.map(|x| x.parse().unwrap())
|
|
.collect_tuple()
|
|
.unwrap()
|
|
})
|
|
.collect()
|
|
}
|
|
|
|
fn part1(input: &Input) -> u32 {
|
|
let (mut left, mut right): (Vec<_>, Vec<_>) = input.iter().copied().unzip();
|
|
left.sort_unstable();
|
|
right.sort_unstable();
|
|
|
|
left.into_iter()
|
|
.zip(right)
|
|
.map(|(l, r)| l.abs_diff(r))
|
|
.sum()
|
|
}
|
|
|
|
fn part2(input: &Input) -> i32 {
|
|
let right_counts = input.iter().map(|&(_, r)| r).counts_fx();
|
|
input
|
|
.iter()
|
|
.map(|&(l, _)| l * *right_counts.get(&l).unwrap_or(&0) as i32)
|
|
.sum()
|
|
}
|
|
|
|
aoc::main!(2024, 1, ex: 1);
|