4
4
import static com .adventofcode .utils .Utils .itoa ;
5
5
6
6
import com .adventofcode .Solution ;
7
- import com .adventofcode .utils .Pair ;
8
7
import com .adventofcode .utils .Utils ;
9
- import java .util .HashMap ;
10
- import java .util .List ;
8
+ import java .util .HashSet ;
11
9
import java .util .Map ;
12
10
import java .util .Set ;
11
+ import java .util .concurrent .ConcurrentHashMap ;
12
+ import java .util .concurrent .atomic .LongAccumulator ;
13
13
import java .util .stream .Stream ;
14
14
15
15
class AoC222024 implements Solution {
16
16
17
+ private static final Map <State , Integer > SEQ_TO_BANANAS = new ConcurrentHashMap <>();
18
+ private static final LongAccumulator MAX = new LongAccumulator ( Long ::max , 0 );
17
19
private static final int B16777216 = 0b111111111111111111111111;
18
20
19
21
@ Override
@@ -27,27 +29,22 @@ public String solveSecondPart(final Stream<String> input) {
27
29
}
28
30
29
31
private String solve (final Stream <String > input , final boolean first ) {
30
- var results = input .map ( Utils ::extractIntegerFromString ).map ( this ::getResults );
32
+ SEQ_TO_BANANAS .clear ();
33
+ MAX .reset ();
34
+ long sum = input
35
+ .parallel ()
36
+ .map ( Utils ::extractIntegerFromString )
37
+ .mapToLong ( secret -> getNumber ( secret , first ) )
38
+ .sum ();
31
39
if ( first ) {
32
- return itoa ( results . mapToLong ( Pair :: getFirst ). sum () );
40
+ return itoa ( sum );
33
41
} else {
34
- List <Map <State , Integer >> seqToDigitList = results .map ( Pair ::getSecond ).toList ();
35
- int max = seqToDigitList .stream ()
36
- .map ( Map ::keySet )
37
- .flatMap ( Set ::stream )
38
- .distinct ()
39
- .parallel () //TODO speedup
40
- .mapToInt ( seq ->
41
- seqToDigitList .stream ()
42
- .mapToInt ( seqToDigit -> seqToDigit .getOrDefault ( seq , 0 ) )
43
- .sum ()
44
- ).max ().getAsInt ();
45
- return itoa ( max );
42
+ return itoa ( MAX .get () );
46
43
}
47
44
}
48
45
49
- private Pair < Long , Map < State , Integer >> getResults (final long secret ) {
50
- Map <State , Integer > seqToDigit = new HashMap <>();
46
+ private long getNumber (final long secret , final boolean first ) {
47
+ Set <State > seen = new HashSet <>();
51
48
long a = getNextNumber ( secret );
52
49
long b = getNextNumber ( a );
53
50
long c = getNextNumber ( b );
@@ -59,13 +56,16 @@ private Pair<Long, Map<State, Integer>> getResults(final long secret) {
59
56
(int ) (c % 10 - b % 10 ),
60
57
(int ) (d % 10 - c % 10 ),
61
58
(int ) (e % 10 - d % 10 ) );
62
- seqToDigit .putIfAbsent ( state , (int ) (e % 10 ) );
59
+ if ( !first && seen .add ( state ) ) {
60
+ long sum = SEQ_TO_BANANAS .merge ( state , (int ) (e % 10 ), Integer ::sum );
61
+ MAX .accumulate ( sum );
62
+ }
63
63
a = b ;
64
64
b = c ;
65
65
c = d ;
66
66
d = e ;
67
67
}
68
- return new Pair <>( d , seqToDigit ) ;
68
+ return d ;
69
69
}
70
70
71
71
private long getNextNumber (long secret ) {
0 commit comments