1
+ import java .util .Arrays ;
2
+ import java .util .HashMap ;
3
+ import java .util .List ;
4
+ import java .util .Map ;
5
+
6
+ import com .github .pareronia .aoc .solution .Sample ;
7
+ import com .github .pareronia .aoc .solution .Samples ;
8
+ import com .github .pareronia .aoc .solution .SolutionBase ;
9
+
10
+ public final class AoC2024_11 extends SolutionBase <List <Long >, Long , Long > {
11
+
12
+ private AoC2024_11 (final boolean debug ) {
13
+ super (debug );
14
+ }
15
+
16
+ public static AoC2024_11 create () {
17
+ return new AoC2024_11 (false );
18
+ }
19
+
20
+ public static AoC2024_11 createDebug () {
21
+ return new AoC2024_11 (true );
22
+ }
23
+
24
+ @ Override
25
+ protected List <Long > parseInput (final List <String > inputs ) {
26
+ return Arrays .stream (inputs .get (0 ).split (" " ))
27
+ .map (Long ::valueOf )
28
+ .toList ();
29
+ }
30
+
31
+ private long solve (final List <Long > stones , final int blinks ) {
32
+ class Counter {
33
+ record State (long stone , int cnt ) {}
34
+
35
+ static final Map <State , Long > memo = new HashMap <>();
36
+
37
+ static long count (final long s , final int cnt ) {
38
+ final State state = new State (s , cnt );
39
+ if (memo .containsKey (state )) {
40
+ return memo .get (state );
41
+ }
42
+ long ans ;
43
+ if (cnt == 0 ) {
44
+ ans = 1 ;
45
+ } else if (s == 0 ) {
46
+ ans = count (1 , cnt - 1 );
47
+ } else if (String .valueOf (s ).length () % 2 == 0 ) {
48
+ final String ss = String .valueOf (s );
49
+ final int length = ss .length ();
50
+ final long ss1 = Long .parseLong (ss .substring (0 , length / 2 ));
51
+ final long ss2 = Long .parseLong (ss .substring (length / 2 ));
52
+ ans = count (ss1 , cnt - 1 ) + count (ss2 , cnt - 1 );
53
+ } else {
54
+ ans = count (s * 2024 , cnt - 1 );
55
+ }
56
+ memo .put (state , ans );
57
+ return ans ;
58
+ }
59
+ }
60
+
61
+ return stones .stream ().mapToLong (s -> Counter .count (s , blinks )).sum ();
62
+ }
63
+
64
+ @ Override
65
+ public Long solvePart1 (final List <Long > stones ) {
66
+ return solve (stones , 25 );
67
+ }
68
+
69
+ @ Override
70
+ public Long solvePart2 (final List <Long > stones ) {
71
+ return solve (stones , 75 );
72
+ }
73
+
74
+ @ Override
75
+ @ Samples ({
76
+ @ Sample (method = "part1" , input = TEST , expected = "55312" )
77
+ })
78
+ public void samples () {
79
+ }
80
+
81
+ public static void main (final String [] args ) throws Exception {
82
+ AoC2024_11 .create ().run ();
83
+ }
84
+
85
+ private static final String TEST = """
86
+ 125 17
87
+ """ ;
88
+ }
0 commit comments