1use utils::prelude::*;
2
3#[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]);