68 lines
1.5 KiB
Rust
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);
|
|
}
|
|
}
|