Skip to content

Commit 64c7797

Browse files
committed
Improve year 2022 day3
1 parent 8603523 commit 64c7797

File tree

1 file changed

+33
-27
lines changed
  • year2022/src/main/java/dev/linl33/adventofcode/year2022

1 file changed

+33
-27
lines changed

year2022/src/main/java/dev/linl33/adventofcode/year2022/Day3.java

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,57 @@
66

77
public class Day3 extends AdventSolution2022<Integer, Integer> {
88
public static final int ALPHA_WIDTH = 'a' - 'A';
9+
public static final int COMPARTMENTS = 2;
10+
public static final int GROUP_SIZE = 3;
911

1012
public static void main(String[] args) {
1113
new Day3().runAndPrintAll();
1214
}
1315

1416
@Override
1517
public Integer part1(@NotNull BufferedReader reader) {
16-
var masks = new long[2];
17-
18-
return reader
18+
var rucksackCompartments = reader
1919
.lines()
20-
.mapToInt(line -> {
21-
masks[0] = 0L;
22-
masks[1] = 0L;
23-
24-
var rucksackSize = line.length();
25-
var compartmentSize = rucksackSize / 2;
26-
for (int mask = 0; mask < 2; mask++) {
27-
var from = compartmentSize * mask;
28-
for (int i = from; i < from + compartmentSize; i++) {
29-
var item = line.charAt(i) - 'a';
30-
masks[mask] |= 1L << item;
31-
}
20+
.<String>mapMulti((line, buffer) -> {
21+
var compartmentSize = line.length() / COMPARTMENTS;
22+
for (int i = 0; i < COMPARTMENTS; i++) {
23+
var compartmentStart = i * compartmentSize;
24+
buffer.accept(line.substring(compartmentStart, compartmentStart + compartmentSize));
3225
}
33-
34-
return calcPriority(masks[0] & masks[1]);
3526
})
36-
.sum();
27+
.mapToLong(Day3::stringToMask)
28+
.toArray();
29+
30+
return reduceAndSumMasks(rucksackCompartments, COMPARTMENTS);
3731
}
3832

3933
@Override
4034
public Integer part2(@NotNull BufferedReader reader) {
41-
var inputInts = reader
35+
var rucksacks = reader
4236
.lines()
43-
.mapToLong(line -> line
44-
.chars()
45-
.mapToLong(c -> 1L << (c - 'a'))
46-
.reduce((acc, next) -> acc | next)
47-
.orElseThrow()
48-
)
37+
.mapToLong(Day3::stringToMask)
4938
.toArray();
5039

40+
return reduceAndSumMasks(rucksacks, GROUP_SIZE);
41+
}
42+
43+
private static long stringToMask(String line) {
44+
return line
45+
.chars()
46+
.mapToLong(c -> 1L << (c - 'a'))
47+
.reduce((acc, next) -> acc | next)
48+
.orElseThrow();
49+
}
50+
51+
private static int reduceAndSumMasks(long[] masks, int chunkSize) {
5152
var sum = 0;
52-
for (int i = 0; i < inputInts.length; i += 3) {
53-
sum += calcPriority(inputInts[i] & inputInts[i + 1] & inputInts[i + 2]);
53+
for (int i = 0; i < masks.length; i += chunkSize) {
54+
var reducedMask = masks[i];
55+
for (int j = 1; j < chunkSize; j++) {
56+
reducedMask &= masks[i + j];
57+
}
58+
59+
sum += calcPriority(reducedMask);
5460
}
5561

5662
return sum;

0 commit comments

Comments
 (0)