advent-of-code/2022/src/bin/day06.rs
2022-12-06 10:34:25 +01:00

54 lines
1.4 KiB
Rust

#![feature(test, array_windows)]
extern crate test;
use std::collections::HashSet;
use aoc2022::{boilerplate, common::*};
const DAY: usize = 6;
fn parse_input(raw: &str) -> &str {
raw
}
// Different implementation because manual comparisons are feasible for groups of 4 and
// significantly faster than sets.
fn part1(parsed: &str) -> usize {
parsed
.as_bytes()
.array_windows()
.zip(4..)
.find_map(|([a, b, c, d], i)| (a != b && a != c && a != d && b != c && b != d && c != d).then_some(i))
.unwrap()
}
fn part2(parsed: &str) -> usize {
parsed
.as_bytes()
.array_windows::<14>()
.zip(14..)
.find_map(|(arr, i)| (arr.iter().collect::<HashSet<_>>().len() == 14).then_some(i))
.unwrap()
}
boilerplate! {
TEST_INPUT == "mjqjpqmgbljsphdztnvjfqwrcgsmlb",
tests: {
part1: {
TEST_INPUT => 7,
"bvwbjplbgvbhsrlpgdmjqwftvncz" => 5,
"nppdvjthqldpwncqszvftbrmjlhg" => 6,
"nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg" => 10,
"zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw" => 11,
},
part2: {
TEST_INPUT => 19,
"nppdvjthqldpwncqszvftbrmjlhg" => 23,
"nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg" => 29,
"zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw" => 26,
},
},
bench1 == 1287,
bench2 == 3716,
bench_parse: str::len => 4096,
}