aoc-rs-2021/src/day_05/mod.rs
Jan Christian Grünhage c57507f579 implement day 5
2021-12-05 11:09:21 +01:00

68 lines
1.5 KiB
Rust

use aoc_runner_derive::{aoc, aoc_generator};
use yap::IntoTokens;
mod model;
mod parsing;
pub use model::{Grid, Line, Point};
pub use parsing::parse_lines;
#[aoc_generator(day5)]
pub fn parse_input(input: &str) -> Vec<Line> {
parse_lines(&mut input.into_tokens())
}
#[aoc(day5, part1)]
pub fn part1(input: &[Line]) -> usize {
solve(input, &|line| line.is_horizontal() || line.is_vertical())
}
#[aoc(day5, part2)]
pub fn part2(input: &[Line]) -> usize {
solve(input, &|line| line.is_horizontal() || line.is_vertical() || line.is_diagonal())
}
pub fn solve(input: &[Line], filter: &impl Fn(&&Line) -> bool) -> usize {
let lines: Vec<Line> = input
.iter()
.filter(filter)
.copied()
.collect();
let grid = Grid::from(&lines[..]);
grid.count()
}
#[cfg(test)]
mod test {
const EXAMPLE_INPUT: &str = "0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2";
const RESULT_PART_1: usize = 5;
const RESULT_PART_2: usize = 12;
#[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.len() == 10);
}
}