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);