@@ -30,8 +30,35 @@ const init = (data) => {
30
30
// 500 generations takes about 30s, so running 50B generations isn't possible. It's
31
31
// clear looking at the log there's a "Game of Life"-style glider.
32
32
// See output/500-generations.txt and output/500-generations.png
33
+ // This probably is reflected in a pattern in the checksum.
34
+ let prevCheckSum = 0
35
+ let prevDelta = 0
36
+ const stableThreshold = 5 // The number of sequentially identical deltas necessary to determine stabilization
37
+ const stableDeltas = Array ( stableThreshold ) . fill ( 0 )
38
+ let stableGeneration = 0
39
+ let stableCheckSum = 0
40
+ for ( let gen = 0 ; gen <= generations2 ; gen ++ ) {
41
+ const checkSum = plantTracker . getCheckSum ( gen )
42
+ const delta = checkSum - prevCheckSum
43
+ console . log ( `Generation ${ gen } checksum: ${ plantTracker . getCheckSum ( gen ) } which is Δ of ${ delta } )` )
33
44
34
- const answer2 = ''
45
+ // When delta matches previous generation, we may have reached stabilization
46
+ if ( delta === prevDelta ) {
47
+ stableDeltas . shift ( )
48
+ stableDeltas . push ( delta )
49
+ // Reached true stable point when there are N deltas in a row that are the same.
50
+ if ( stableDeltas . filter ( ( Δ ) => Δ === delta ) . length === stableDeltas . length ) {
51
+ stableCheckSum = checkSum
52
+ stableGeneration = gen
53
+ break
54
+ }
55
+ }
56
+ prevCheckSum = checkSum
57
+ prevDelta = delta
58
+ }
59
+ console . log ( `At generation ${ stableGeneration } the Δ is ${ stableDeltas [ 0 ] } and the checksum is ${ stableCheckSum } .` )
60
+ // Calculate the checksum for 50B generations (minus the generation we're already at)
61
+ const answer2 = ( stableDeltas [ 0 ] * ( 50000000000 - stableGeneration - 1 ) ) + stableCheckSum
35
62
36
63
console . log ( `-- Part 1 --` )
37
64
console . log ( `Answer: ${ answer } ` )
0 commit comments