year2024/
day01.rs

1use utils::prelude::*;
2
3/// Comparing two lists of numbers.
4#[derive(Clone, Debug)]
5pub struct Day01 {
6    left: Vec<u32>,
7    right: Vec<u32>,
8}
9
10impl Day01 {
11    pub fn new(input: &str, _: InputType) -> Result<Self, InputError> {
12        let pairs = parser::u32()
13            .then(parser::u32().with_prefix("   "))
14            .parse_lines(input)?;
15
16        let mut left = pairs.iter().map(|x| x.0).collect::<Vec<_>>();
17        left.sort_unstable();
18
19        let mut right = pairs.into_iter().map(|x| x.1).collect::<Vec<_>>();
20        right.sort_unstable();
21
22        Ok(Self { left, right })
23    }
24
25    #[must_use]
26    pub fn part1(&self) -> u32 {
27        self.left
28            .iter()
29            .zip(&self.right)
30            .map(|(&l, &r)| l.abs_diff(r))
31            .sum()
32    }
33
34    #[must_use]
35    pub fn part2(&self) -> u32 {
36        let mut score = 0;
37        let mut i = 0;
38        for &l in &self.left {
39            while i < self.right.len() && self.right[i] < l {
40                i += 1;
41            }
42
43            let mut j = i;
44            while j < self.right.len() && self.right[j] == l {
45                score += l;
46                j += 1;
47            }
48        }
49        score
50    }
51}
52
53examples!(Day01 -> (u32, u32) [
54    {input: "3   4\n4   3\n2   5\n1   3\n3   9\n3   3", part1: 11, part2: 31},
55]);