AoC_2020/src/day03.rs

58 lines
1.2 KiB
Rust

use aoc_runner_derive::{aoc, aoc_generator};
pub struct Forest {
slice: Vec<Vec<bool>>,
}
impl Forest {
fn get(&self, x: usize, y: usize) -> Option<bool> {
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
}