solution: day 10

This commit is contained in:
Matej Janezic 2024-12-10 06:29:22 +01:00
parent 0000013050
commit 000001408c
Signed by: janezicmatej
GPG Key ID: 4298E230ED37B2C0
2 changed files with 97 additions and 0 deletions

8
data/examples/10.txt Normal file
View File

@ -0,0 +1,8 @@
89010123
78121874
87430965
96549874
45678903
32019012
01329801
10456732

89
src/bin/10.rs Normal file
View File

@ -0,0 +1,89 @@
use hashbrown::HashMap;
use itertools::Itertools;
fn score_trailhead(
acc: &mut HashMap<(usize, usize), usize>,
grid: &[Vec<usize>],
start: (usize, usize),
) {
let (i, j) = start;
let n = grid[i][j];
if n == 9 {
*acc.entry((i, j)).or_default() += 1;
}
let dirs = [(-1, 0), (0, -1), (1, 0), (0, 1)];
for (di, dj) in dirs {
let (ni, nj) = (i.wrapping_add(di as usize), j.wrapping_add(dj as usize));
if let Some(nn) = grid.get(ni).and_then(|row| row.get(nj)) {
if *nn == n + 1 {
score_trailhead(acc, grid, (ni, nj));
}
}
}
}
fn parse_grid(input: &str) -> Vec<Vec<usize>> {
input
.lines()
.map(|x| {
x.chars()
.map(|y| y.to_digit(10).unwrap_or(11) as usize)
.collect_vec()
})
.collect_vec()
}
pub fn part_one(input: &str) -> Option<usize> {
let grid = parse_grid(input);
let mut score = 0;
let mut acc = HashMap::new();
for (i, row) in grid.iter().enumerate() {
for (j, _) in row.iter().copied().enumerate().filter(|x| x.1 == 0) {
acc.clear();
score_trailhead(&mut acc, &grid, (i, j));
score += acc.len();
}
}
score.into()
}
pub fn part_two(input: &str) -> Option<usize> {
let grid = parse_grid(input);
let mut acc = HashMap::new();
for (i, row) in grid.iter().enumerate() {
for (j, _) in row.iter().copied().enumerate().filter(|x| x.1 == 0) {
score_trailhead(&mut acc, &grid, (i, j));
}
}
acc.values().sum::<usize>().into()
}
aoc::solution!(10);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
assert_eq!(
part_one(&aoc::template::read_file("examples", 10)),
Some(36)
);
}
#[test]
fn test_part_two() {
assert_eq!(
part_two(&aoc::template::read_file("examples", 10)),
Some(81)
);
}
}