Skip to content

Commit 1ff2e7d

Browse files
committed
AoC 2024 Day 10 - rust
1 parent 8c0588b commit 1ff2e7d

File tree

4 files changed

+114
-1
lines changed

4 files changed

+114
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
| ---| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
1111
| python3 | [](src/main/python/AoC2024_01.py) | [](src/main/python/AoC2024_02.py) | [](src/main/python/AoC2024_03.py) | [](src/main/python/AoC2024_04.py) | [](src/main/python/AoC2024_05.py) | [](src/main/python/AoC2024_06.py) | [](src/main/python/AoC2024_07.py) | [](src/main/python/AoC2024_08.py) | [](src/main/python/AoC2024_09.py) | [](src/main/python/AoC2024_10.py) | [](src/main/python/AoC2024_11.py) | [](src/main/python/AoC2024_12.py) | [](src/main/python/AoC2024_13.py) | [](src/main/python/AoC2024_14.py) | | | | | | | | | | | |
1212
| java | [](src/main/java/AoC2024_01.java) | [](src/main/java/AoC2024_02.java) | [](src/main/java/AoC2024_03.java) | [](src/main/java/AoC2024_04.java) | [](src/main/java/AoC2024_05.java) | [](src/main/java/AoC2024_06.java) | [](src/main/java/AoC2024_07.java) | [](src/main/java/AoC2024_08.java) | | [](src/main/java/AoC2024_10.java) | [](src/main/java/AoC2024_11.java) | [](src/main/java/AoC2024_12.java) | | [](src/main/java/AoC2024_14.java) | | | | | | | | | | | |
13-
| rust | [](src/main/rust/AoC2024_01/src/main.rs) | [](src/main/rust/AoC2024_02/src/main.rs) | [](src/main/rust/AoC2024_03/src/main.rs) | [](src/main/rust/AoC2024_04/src/main.rs) | [](src/main/rust/AoC2024_05/src/main.rs) | [](src/main/rust/AoC2024_06/src/main.rs) | [](src/main/rust/AoC2024_07/src/main.rs) | [](src/main/rust/AoC2024_08/src/main.rs) | | | | | [](src/main/rust/AoC2024_13/src/main.rs) | [](src/main/rust/AoC2024_14/src/main.rs) | | | | | | | | | | | |
13+
| rust | [](src/main/rust/AoC2024_01/src/main.rs) | [](src/main/rust/AoC2024_02/src/main.rs) | [](src/main/rust/AoC2024_03/src/main.rs) | [](src/main/rust/AoC2024_04/src/main.rs) | [](src/main/rust/AoC2024_05/src/main.rs) | [](src/main/rust/AoC2024_06/src/main.rs) | [](src/main/rust/AoC2024_07/src/main.rs) | [](src/main/rust/AoC2024_08/src/main.rs) | | [](src/main/rust/AoC2024_10/src/main.rs) | | | [](src/main/rust/AoC2024_13/src/main.rs) | [](src/main/rust/AoC2024_14/src/main.rs) | | | | | | | | | | | |
1414
<!-- @END:ImplementationsTable:2024@ -->
1515

1616
## 2023
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "AoC2024_10"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
aoc = { path = "../aoc" }
8+
itertools = "0.11"
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#![allow(non_snake_case)]
2+
3+
use aoc::grid::{Cell, Grid, IntGrid};
4+
use aoc::Puzzle;
5+
use itertools::Itertools;
6+
7+
struct AoC2024_10;
8+
9+
impl AoC2024_10 {
10+
fn get_trails(&self, grid: &IntGrid) -> Vec<Vec<Cell>> {
11+
fn dfs(grid: &IntGrid, trails: &mut Vec<Vec<Cell>>, trail: Vec<Cell>) {
12+
if trail.len() == 10 {
13+
trails.push(trail);
14+
return;
15+
}
16+
let nxt = grid.get(trail.last().unwrap()) + 1;
17+
for n in grid.capital_neighbours(trail.last().unwrap()) {
18+
if grid.get(&n) == nxt {
19+
let mut new_trail = trail.to_vec();
20+
new_trail.push(n);
21+
dfs(grid, trails, new_trail);
22+
}
23+
}
24+
}
25+
26+
let mut trails = vec![];
27+
for s in grid.cells().filter(|cell| grid.get(cell) == 0) {
28+
dfs(grid, &mut trails, vec![s]);
29+
}
30+
trails
31+
}
32+
}
33+
34+
impl aoc::Puzzle for AoC2024_10 {
35+
type Input = IntGrid;
36+
type Output1 = usize;
37+
type Output2 = usize;
38+
39+
aoc::puzzle_year_day!(2024, 10);
40+
41+
fn parse_input(&self, lines: Vec<String>) -> Self::Input {
42+
IntGrid::from(&lines.iter().map(AsRef::as_ref).collect::<Vec<_>>())
43+
}
44+
45+
fn part_1(&self, grid: &Self::Input) -> Self::Output1 {
46+
let trails = self.get_trails(grid);
47+
trails
48+
.iter()
49+
.map(|trail| trail[0])
50+
.unique()
51+
.map(|zero| {
52+
trails
53+
.iter()
54+
.filter(|trail| trail[0] == zero)
55+
.map(|trail| trail[9])
56+
.unique()
57+
.count()
58+
})
59+
.sum()
60+
}
61+
62+
fn part_2(&self, grid: &Self::Input) -> Self::Output2 {
63+
self.get_trails(grid).len()
64+
}
65+
66+
fn samples(&self) {
67+
aoc::puzzle_samples! {
68+
self, part_1, TEST, 36,
69+
self, part_2, TEST, 81
70+
};
71+
}
72+
}
73+
74+
fn main() {
75+
AoC2024_10 {}.run(std::env::args());
76+
}
77+
78+
const TEST: &str = "\
79+
89010123
80+
78121874
81+
87430965
82+
96549874
83+
45678903
84+
32019012
85+
01329801
86+
10456732
87+
";
88+
89+
#[cfg(test)]
90+
mod tests {
91+
use super::*;
92+
93+
#[test]
94+
pub fn samples() {
95+
AoC2024_10 {}.samples();
96+
}
97+
}

src/main/rust/Cargo.lock

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)