66 lines
1.4 KiB
Rust
66 lines
1.4 KiB
Rust
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);
|
|
}
|
|
}
|