use aoc_runner_derive::{aoc, aoc_generator}; use yap::IntoTokens; mod model; mod parsing; pub use model::{Fish, School, SmartSchool}; pub use parsing::parse_school_of_fish; #[aoc_generator(day6)] pub fn parse_input(input: &str) -> School { parse_school_of_fish(&mut input.into_tokens()) } #[aoc(day6, part1)] pub fn part1(input: &School) -> usize { let mut school = input.clone(); for _ in 0..80 { school.tick() } school.size() } #[aoc(day6, part1, smart_school)] pub fn part1_smart(input: &School) -> usize { let mut school = SmartSchool::from(input); for _ in 0..80 { school.tick() } school.size() } #[aoc(day6, part2)] pub fn part2(input: &School) -> usize { let mut school = SmartSchool::from(input); for _ in 0..256 { school.tick() } school.size() } #[cfg(test)] mod test { const EXAMPLE_INPUT: &str = "3,4,3,1,2"; const RESULT_PART_1: usize = 5934; const RESULT_PART_2: usize = 26_984_457_539; #[test] fn part1_example() { let result = super::part1(&super::parse_input(EXAMPLE_INPUT)); assert_eq!(result, RESULT_PART_1); } #[test] fn part2_example() { let result = super::part2(&super::parse_input(EXAMPLE_INPUT)); assert_eq!(result, RESULT_PART_2); } #[test] fn parse_example() { let example = super::parse_input(EXAMPLE_INPUT); assert!(example.size() == 5); } }