108 lines
2.2 KiB
Rust
108 lines
2.2 KiB
Rust
#![feature(test)]
|
|
use anyhow::Result;
|
|
use aoc::Solver;
|
|
|
|
// -- Runners --
|
|
fn main() -> Result<()> {
|
|
Day::solve()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn part1_test1() -> Result<()> {
|
|
Day::test(aoc::Part::ONE, "test-1", 7)
|
|
}
|
|
#[test]
|
|
fn part1_test2() -> Result<()> {
|
|
Day::test(aoc::Part::ONE, "test-2", 5)
|
|
}
|
|
#[test]
|
|
fn part1_test3() -> Result<()> {
|
|
Day::test(aoc::Part::ONE, "test-3", 6)
|
|
}
|
|
#[test]
|
|
fn part1_test4() -> Result<()> {
|
|
Day::test(aoc::Part::ONE, "test-4", 10)
|
|
}
|
|
#[test]
|
|
fn part1_test5() -> Result<()> {
|
|
Day::test(aoc::Part::ONE, "test-5", 11)
|
|
}
|
|
|
|
#[test]
|
|
fn part2_test1() -> Result<()> {
|
|
Day::test(aoc::Part::TWO, "test-1", 19)
|
|
}
|
|
#[test]
|
|
fn part2_test2() -> Result<()> {
|
|
Day::test(aoc::Part::TWO, "test-2", 23)
|
|
}
|
|
#[test]
|
|
fn part2_test3() -> Result<()> {
|
|
Day::test(aoc::Part::TWO, "test-3", 23)
|
|
}
|
|
#[test]
|
|
fn part2_test4() -> Result<()> {
|
|
Day::test(aoc::Part::TWO, "test-4", 29)
|
|
}
|
|
#[test]
|
|
fn part2_test5() -> Result<()> {
|
|
Day::test(aoc::Part::TWO, "test-5", 26)
|
|
}
|
|
|
|
// Benchmarks
|
|
extern crate test;
|
|
#[bench]
|
|
#[ignore]
|
|
fn part1_bench(b: &mut test::Bencher) {
|
|
Day::benchmark(aoc::Part::ONE, b)
|
|
}
|
|
#[bench]
|
|
#[ignore]
|
|
fn part2_bench(b: &mut test::Bencher) {
|
|
Day::benchmark(aoc::Part::TWO, b)
|
|
}
|
|
}
|
|
|
|
// -- Helpers --
|
|
fn is_start_marker((index, window): (usize, &[u8])) -> Option<usize> {
|
|
for i in 0..window.len() {
|
|
for j in i+1..window.len() {
|
|
if window[i] == window[j] {
|
|
return None;
|
|
}
|
|
}
|
|
}
|
|
|
|
return Some(index + window.len());
|
|
}
|
|
|
|
fn solution(input: &str, length: usize) -> usize {
|
|
input
|
|
.as_bytes()
|
|
.windows(length)
|
|
.enumerate()
|
|
.find_map(is_start_marker)
|
|
.expect("Invalid input")
|
|
}
|
|
|
|
// -- Solution --
|
|
pub struct Day;
|
|
impl aoc::Solver for Day {
|
|
type Output = usize;
|
|
fn day() -> u8 {
|
|
6
|
|
}
|
|
|
|
fn part1(input: &str) -> Self::Output {
|
|
solution(input, 4)
|
|
}
|
|
|
|
fn part2(input: &str) -> Self::Output {
|
|
solution(input, 14)
|
|
}
|
|
}
|