mod model; mod parsing; use aoc_runner_derive::{aoc, aoc_generator}; pub use model::{Probe, TargetArea}; pub use parsing::parse_target_area; use yap::IntoTokens; #[aoc_generator(day17)] pub fn parse_input(input: &str) -> TargetArea { parse_target_area(&mut input.into_tokens()).unwrap() } #[aoc(day17, part1)] pub fn part1(input: &TargetArea) -> usize { let y = input.get_highest_possible_y_velocity().unwrap(); let mut ret_val = 0; for i in 1..=y { ret_val += i } ret_val as usize } #[aoc(day17, part2)] pub fn part2(input: &TargetArea) -> usize { input.get_all_possible_velocities().len() } #[cfg(test)] mod test { const EXAMPLE_INPUT: &str = "target area: x=20..30, y=-10..-5"; const RESULT_PART_1: usize = 45; const RESULT_PART_2: usize = 112; #[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() { super::parse_input(EXAMPLE_INPUT); } }