// const DATA: &'static str = "zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw"; const DATA: &'static str = include_str!("../data/day6.txt"); struct CharCounts { chars: [u8; 26], } impl CharCounts { fn new() -> Self { CharCounts { chars: [0; 26]} } fn idx(c: u8) -> usize { (c as usize) - (b'a' as usize) } fn inc(&mut self, c: u8) { self.chars[Self::idx(c)] += 1; } fn dec(&mut self, c: u8) { self.chars[Self::idx(c)] -= 1; } fn max(&self) -> u8 { // max only returns None if the iterator is empty *self.chars.iter().max().unwrap() } } fn find_marker(data: &[u8], window_size: usize) -> Option { let mut window = CharCounts::new(); for (i, v) in data.iter().enumerate() { window.inc(*v); if i > (window_size - 1) { let dropout = data[i - window_size]; window.dec(dropout); } if i > (window_size - 1) && window.max() == 1 { return Some(i + 1); } } None } fn main() { let bytes = DATA.trim().as_bytes(); let m1 = find_marker(&bytes, 4).unwrap(); println!("Part 1: {m1}"); let m2 = find_marker(&bytes, 14).unwrap(); println!("Part 2: {m2}"); }