2022 rust day 6 alternate solution
This commit is contained in:
parent
e3d13ec896
commit
bb456142d4
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue