use aoc_runner_derive::{aoc, aoc_generator}; pub struct Forest { slice: Vec>, } impl Forest { fn get(&self, x: usize, y: usize) -> Option { self.slice .get(y) .map(|line| line.get(x % line.len())) .flatten() .cloned() } } #[aoc_generator(day3)] pub fn input_generator(input: &str) -> Forest { let slice = input .lines() .map(|l| l.chars().map(|c| c == '#').collect()) .collect(); Forest { slice } } #[aoc(day3, part1)] pub fn solve_part1(input: &Forest) -> usize { let mut sum: usize = 0; let dx = 3; let dy = 1; let mut pos = (0, 0); while let Some(tree) = input.get(pos.0, pos.1) { if tree { sum += 1; } pos.0 += dx; pos.1 += dy; } sum } #[aoc(day3, part2)] pub fn solve_part2(input: &Forest) -> usize { let mut prod: usize = 1; for (dx, dy) in &[(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)] { let mut sum: usize = 0; let mut pos = (0, 0); while let Some(tree) = input.get(pos.0, pos.1) { if tree { sum += 1; } pos.0 += dx; pos.1 += dy; } prod *= sum; } prod }