@@ -13,9 +13,8 @@ public Answer Solve(IEnumerable<string> lines)
13
13
var line = lines . FirstOrDefault ( ) ?? string . Empty ;
14
14
var stones = line . Split ( ' ' ) . Select ( long . Parse ) ;
15
15
16
- var finalStones = BlinkTimes ( stones , 25 ) ;
17
-
18
- part1 += finalStones . Count ;
16
+ part1 += stones . Sum ( s => GetBlinkedCount ( s , 25 ) ) ;
17
+ part2 += stones . Sum ( s => GetBlinkedCount ( s , 75 ) ) ;
19
18
20
19
return new Answer ( )
21
20
{
@@ -24,21 +23,21 @@ public Answer Solve(IEnumerable<string> lines)
24
23
} ;
25
24
}
26
25
27
- public ICollection < long > BlinkTimes ( IEnumerable < long > stones , int blinkTimes )
28
- {
29
- return stones
30
- . SelectMany ( s => BlinkStone ( s , blinkTimes ) )
31
- . ToArray ( ) ;
32
- }
26
+ private readonly Dictionary < ( long , int ) , long > _resultCountByStoneBlinksLeft = [ ] ;
33
27
34
- private IEnumerable < long > BlinkStone ( long stone , int blinkTimes )
28
+ private long GetBlinkedCount ( long stone , int blinkTimes )
35
29
{
36
30
if ( blinkTimes == 0 )
37
31
{
38
- return [ stone ] ;
32
+ return 1 ;
39
33
}
40
34
41
35
blinkTimes -- ;
36
+
37
+ if ( _resultCountByStoneBlinksLeft . TryGetValue ( ( stone , blinkTimes ) , out var cachedCount ) )
38
+ {
39
+ return cachedCount ;
40
+ }
42
41
43
42
var stones = new List < long > ( ) ;
44
43
@@ -61,6 +60,10 @@ private IEnumerable<long> BlinkStone(long stone, int blinkTimes)
61
60
stones . Add ( stone * 2024 ) ;
62
61
}
63
62
64
- return stones . SelectMany ( s => BlinkStone ( s , blinkTimes ) ) ;
63
+ var count = stones . Sum ( s => GetBlinkedCount ( s , blinkTimes ) ) ;
64
+
65
+ _resultCountByStoneBlinksLeft . TryAdd ( ( stone , blinkTimes ) , count ) ;
66
+
67
+ return count ;
65
68
}
66
69
}
0 commit comments