year2015/
day08.rs

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