44 lines
956 B
Rust
44 lines
956 B
Rust
use aoc_runner_derive::aoc;
|
|
use itertools::Itertools;
|
|
|
|
#[aoc(day6, part1, tuple_windows)]
|
|
fn part1_tuple_windows(input: &str) -> usize {
|
|
input
|
|
.char_indices()
|
|
.tuple_windows()
|
|
.find_map(|((_, a), (_, b), (_, c), (i, d))| {
|
|
if [a, b, c, d].iter().duplicates().count() == 0 {
|
|
Some(i + d.len_utf8())
|
|
} else {
|
|
None
|
|
}
|
|
})
|
|
.unwrap()
|
|
}
|
|
|
|
#[aoc(day6, part1, indexing)]
|
|
fn part1_indexing(input: &str) -> usize {
|
|
const N: usize = 4;
|
|
|
|
for i in N..=input.len() {
|
|
let s = &input[i - N..i];
|
|
if s.chars().duplicates().count() == 0 {
|
|
return i;
|
|
}
|
|
}
|
|
usize::MAX
|
|
}
|
|
|
|
#[aoc(day6, part2)]
|
|
fn part2(input: &str) -> usize {
|
|
const N: usize = 14;
|
|
|
|
for i in N..=input.len() {
|
|
let s = &input[i - N..i];
|
|
if s.chars().duplicates().count() == 0 {
|
|
return i;
|
|
}
|
|
}
|
|
usize::MAX
|
|
}
|