Skip to content

Instantly share code, notes, and snippets.

@CryZe
Last active December 5, 2018 16:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CryZe/0182994a72762e099034b706a8fadca3 to your computer and use it in GitHub Desktop.
Save CryZe/0182994a72762e099034b706a8fadca3 to your computer and use it in GitHub Desktop.
use arrayvec::ArrayVec;
use rayon::prelude::*;
fn collapse(input: impl IntoIterator<Item = u8>, buf: &mut ArrayVec<[u8; 16384]>) {
let mut top_byte = b'\0';
for byte in input {
if top_byte ^ 0x20 == byte {
buf.pop();
top_byte = buf.last().cloned().unwrap_or_default();
} else {
top_byte = byte;
let _ = buf.try_push(byte);
}
}
}
pub fn part1(input: &str) -> usize {
let mut buf = ArrayVec::new();
collapse(input.bytes(), &mut buf);
buf.len()
}
pub fn part2(input: &str) -> usize {
let mut buf = ArrayVec::new();
(b'A'..=b'Z')
.map(|upper| {
buf.clear();
let filtered = input.bytes().filter(|&b| b & !32 != upper);
collapse(filtered, &mut buf);
buf.len()
})
.min()
.unwrap()
}
pub fn part2_rayon(input: &str) -> usize {
(b'A'..b'Z' + 1)
.into_par_iter()
.map(|upper| {
let mut buf = ArrayVec::new();
let filtered = input.bytes().filter(|&b| b & !32 != upper);
collapse(filtered, &mut buf);
buf.len()
})
.min()
.unwrap()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment