1
+ import static com .github .pareronia .aoc .Utils .last ;
2
+
3
+ import java .util .ArrayDeque ;
4
+ import java .util .ArrayList ;
5
+ import java .util .Deque ;
6
+ import java .util .List ;
7
+
8
+ import com .github .pareronia .aoc .Grid .Cell ;
9
+ import com .github .pareronia .aoc .IntGrid ;
10
+ import com .github .pareronia .aoc .solution .Sample ;
11
+ import com .github .pareronia .aoc .solution .Samples ;
12
+ import com .github .pareronia .aoc .solution .SolutionBase ;
13
+
14
+ public final class AoC2024_10 extends SolutionBase <IntGrid , Integer , Integer > {
15
+
16
+ private AoC2024_10 (final boolean debug ) {
17
+ super (debug );
18
+ }
19
+
20
+ public static AoC2024_10 create () {
21
+ return new AoC2024_10 (false );
22
+ }
23
+
24
+ public static AoC2024_10 createDebug () {
25
+ return new AoC2024_10 (true );
26
+ }
27
+
28
+ @ Override
29
+ protected IntGrid parseInput (final List <String > inputs ) {
30
+ return IntGrid .from (inputs );
31
+ }
32
+
33
+ private List <List <Cell >> getTrails (final IntGrid grid ) {
34
+ class BFS {
35
+ private final List <List <Cell >> trails = new ArrayList <>();
36
+
37
+ void bfs (final List <Cell > trail ) {
38
+ final Deque <List <Cell >> q = new ArrayDeque <>(List .of (trail ));
39
+ while (!q .isEmpty ()) {
40
+ final List <Cell > curr = q .pop ();
41
+ if (curr .size () == 10 ) {
42
+ trails .add (curr );
43
+ continue ;
44
+ }
45
+ final int next = grid .getValue (last (curr )) + 1 ;
46
+ grid .getCapitalNeighbours (last (curr ))
47
+ .filter (n -> grid .getValue (n ) == next )
48
+ .forEach (n -> {
49
+ final List <Cell > newTrail = new ArrayList <>(curr );
50
+ newTrail .add (n );
51
+ q .add (newTrail );
52
+ });
53
+ }
54
+ }
55
+ }
56
+
57
+ final BFS bfs = new BFS ();
58
+ grid .getAllEqualTo (0 ).forEach (zero -> bfs .bfs (List .of (zero )));
59
+ return bfs .trails ;
60
+ }
61
+
62
+ @ Override
63
+ public Integer solvePart1 (final IntGrid grid ) {
64
+ final List <List <Cell >> trails = getTrails (grid );
65
+ return trails .stream ()
66
+ .map (trail -> trail .get (0 ))
67
+ .distinct ()
68
+ .mapToInt (zero -> (int ) trails .stream ()
69
+ .filter (trail -> trail .get (0 ).equals (zero ))
70
+ .map (trail -> trail .get (9 ))
71
+ .distinct ()
72
+ .count ())
73
+ .sum ();
74
+ }
75
+
76
+ @ Override
77
+ public Integer solvePart2 (final IntGrid grid ) {
78
+ return getTrails (grid ).size ();
79
+ }
80
+
81
+ @ Override
82
+ @ Samples ({
83
+ @ Sample (method = "part1" , input = TEST , expected = "36" ),
84
+ @ Sample (method = "part2" , input = TEST , expected = "81" ),
85
+ })
86
+ public void samples () {
87
+ }
88
+
89
+ public static void main (final String [] args ) throws Exception {
90
+ AoC2024_10 .create ().run ();
91
+ }
92
+
93
+ private static final String TEST = """
94
+ 89010123
95
+ 78121874
96
+ 87430965
97
+ 96549874
98
+ 45678903
99
+ 32019012
100
+ 01329801
101
+ 10456732
102
+ """ ;
103
+ }
0 commit comments