64 lines
1.3 KiB
Rust
64 lines
1.3 KiB
Rust
mod model;
|
|
mod parsing;
|
|
|
|
use aoc_runner_derive::{aoc, aoc_generator};
|
|
use itertools::Itertools;
|
|
pub use model::HeightMap;
|
|
pub use parsing::parse_map;
|
|
use yap::IntoTokens;
|
|
|
|
#[aoc_generator(day9)]
|
|
pub fn parse_input(input: &str) -> HeightMap {
|
|
parse_map(&mut input.into_tokens())
|
|
}
|
|
|
|
#[aoc(day9, part1)]
|
|
pub fn part1(input: &HeightMap) -> usize {
|
|
input
|
|
.get_low_points()
|
|
.iter()
|
|
.map(|point| input.get_risk_level(*point))
|
|
.flatten()
|
|
.sum()
|
|
}
|
|
|
|
#[aoc(day9, part2)]
|
|
pub fn part2(input: &HeightMap) -> usize {
|
|
input
|
|
.get_basin_sizes()
|
|
.iter()
|
|
.sorted()
|
|
.rev()
|
|
.take(3)
|
|
.product()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test {
|
|
const EXAMPLE_INPUT: &str = "2199943210
|
|
3987894921
|
|
9856789892
|
|
8767896789
|
|
9899965678";
|
|
const RESULT_PART_1: usize = 15;
|
|
const RESULT_PART_2: usize = 1134;
|
|
|
|
#[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);
|
|
//unimplemented!();
|
|
}
|
|
}
|