1use utils::prelude::*;
2
3#[derive(Clone, Debug)]
5pub struct Day08<'a> {
6 input: &'a str,
7}
8
9impl<'a> Day08<'a> {
10 pub fn new(input: &'a str, _: InputType) -> Result<Self, InputError> {
11 Ok(Self { input })
12 }
13
14 #[must_use]
15 pub fn part1(&self) -> u32 {
16 self.input
17 .bytes()
18 .fold((false, 0), |(escaped, diff), b| match (escaped, b) {
19 (false, b'"') => (false, diff + 1),
20 (false, b'\\') => (true, diff),
21 (true, b'\\') => (false, diff + 1),
22 (true, b'"') => (false, diff + 1),
23 (true, b'x') => (false, diff + 3),
24 _ => (false, diff),
25 })
26 .1
27 }
28
29 #[must_use]
30 pub fn part2(&self) -> u32 {
31 self.input
32 .bytes()
33 .fold((false, 0), |(escaped, diff), b| match (escaped, b) {
34 (false, b'"') => (false, diff + 2),
35 (false, b'\\') => (true, diff + 1),
36 (true, b'\\') => (false, diff + 1),
37 (true, b'"') => (false, diff + 1),
38 _ => (false, diff),
39 })
40 .1
41 }
42}
43
44examples!(Day08<'_> -> (u32, u32) [
45 {file: "day08_example0.txt", part1: 12, part2: 19},
46]);