/ Rust / 2022 / 06.rs
06.rs
 1  #![feature(test)]
 2  
 3  type Input = Vec<usize>;
 4  
 5  fn setup(input: &str) -> Input {
 6      input.trim().bytes().map(|x| (x - b'a') as _).collect()
 7  }
 8  
 9  #[derive(Default)]
10  struct Counter {
11      counter: [usize; 26],
12      dup: usize,
13  }
14  
15  impl Counter {
16      pub fn inc(&mut self, i: usize) {
17          self.counter[i] += 1;
18          if self.counter[i] == 2 {
19              self.dup += 1;
20          }
21      }
22  
23      pub fn dec(&mut self, i: usize) {
24          self.counter[i] -= 1;
25          if self.counter[i] == 1 {
26              self.dup -= 1;
27          }
28      }
29  
30      pub fn is_distinct(&self) -> bool {
31          self.dup == 0
32      }
33  }
34  
35  fn solve(input: &Input, n: usize) -> usize {
36      let mut counter = Counter::default();
37      (0..n).for_each(|i| counter.inc(input[i]));
38      for i in n..input.len() {
39          if counter.is_distinct() {
40              return i;
41          }
42          counter.inc(input[i]);
43          counter.dec(input[i - n]);
44      }
45      panic!()
46  }
47  
48  fn part1(input: &Input) -> usize {
49      solve(input, 4)
50  }
51  
52  fn part2(input: &Input) -> usize {
53      solve(input, 14)
54  }
55  
56  aoc::main!(2022, 6, ex: 1, 2, 3, 4, 5);