2022 rust day 6 alternate solution

This commit is contained in:
Maciej Jur 2022-12-06 16:38:12 +01:00
parent e3d13ec896
commit bb456142d4

View file

@ -12,14 +12,14 @@ pub fn run() -> () {
fn solve1(data: &[char]) -> usize { fn solve1(data: &[char]) -> usize {
marker_for(data, 4) marker_bitwise(data, 4)
} }
fn solve2(data: &[char]) -> usize { fn solve2(data: &[char]) -> usize {
marker_for(data, 14) marker_bitwise(data, 14)
} }
fn marker_for(data: &[char], window_len: usize) -> usize { fn marker_iter(data: &[char], window_len: usize) -> usize {
data.windows(window_len) data.windows(window_len)
.enumerate() .enumerate()
.filter_map(|(idx, window)| window.iter() .filter_map(|(idx, window)| window.iter()
@ -30,6 +30,23 @@ fn marker_for(data: &[char], window_len: usize) -> usize {
.next().unwrap() .next().unwrap()
} }
fn marker_bitwise(data: &[char], window_len: usize) -> usize {
static OFFSET: u8 = 'a' as u8;
let mut acc: u32 = 0;
let mut idx: usize = 0;
for &char in data {
acc ^= 1 << char as u8 - OFFSET;
if idx >= window_len {
acc ^= 1 << data[idx - window_len] as u8 - OFFSET;
if acc.count_ones() == window_len as u32 {
return idx + 1;
}
}
idx += 1;
}
return usize::MAX;
}
fn parse_data(data: Vec<String>) -> Vec<char> { fn parse_data(data: Vec<String>) -> Vec<char> {
data.into_iter() data.into_iter()