58 lines
1.2 KiB
Rust
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}");
|
|
} |