Skip to content

Commit df2d5c6

Browse files
day 22 speedup
1 parent 5c50b57 commit df2d5c6

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

src/main/java/com/adventofcode/aoc2024/AoC222024.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@
44
import static com.adventofcode.utils.Utils.itoa;
55

66
import com.adventofcode.Solution;
7-
import com.adventofcode.utils.Pair;
87
import com.adventofcode.utils.Utils;
9-
import java.util.HashMap;
10-
import java.util.List;
8+
import java.util.HashSet;
119
import java.util.Map;
1210
import java.util.Set;
11+
import java.util.concurrent.ConcurrentHashMap;
12+
import java.util.concurrent.atomic.LongAccumulator;
1313
import java.util.stream.Stream;
1414

1515
class AoC222024 implements Solution {
1616

17+
private static final Map<State, Integer> SEQ_TO_BANANAS = new ConcurrentHashMap<>();
18+
private static final LongAccumulator MAX = new LongAccumulator( Long::max, 0 );
1719
private static final int B16777216 = 0b111111111111111111111111;
1820

1921
@Override
@@ -27,27 +29,22 @@ public String solveSecondPart(final Stream<String> input) {
2729
}
2830

2931
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();
3139
if ( first ) {
32-
return itoa( results.mapToLong( Pair::getFirst ).sum() );
40+
return itoa( sum );
3341
} 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() );
4643
}
4744
}
4845

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<>();
5148
long a = getNextNumber( secret );
5249
long b = getNextNumber( a );
5350
long c = getNextNumber( b );
@@ -59,13 +56,16 @@ private Pair<Long, Map<State, Integer>> getResults(final long secret) {
5956
(int) (c % 10 - b % 10),
6057
(int) (d % 10 - c % 10),
6158
(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+
}
6363
a = b;
6464
b = c;
6565
c = d;
6666
d = e;
6767
}
68-
return new Pair<>( d, seqToDigit );
68+
return d;
6969
}
7070

7171
private long getNextNumber(long secret) {

0 commit comments

Comments
 (0)