advent/2022/src/day6.rs

58 lines
1.2 KiB
Rust

// 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<usize> {
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}");
}