|
6 | 6 |
|
7 | 7 | public class Day3 extends AdventSolution2022<Integer, Integer> {
|
8 | 8 | public static final int ALPHA_WIDTH = 'a' - 'A';
|
| 9 | + public static final int COMPARTMENTS = 2; |
| 10 | + public static final int GROUP_SIZE = 3; |
9 | 11 |
|
10 | 12 | public static void main(String[] args) {
|
11 | 13 | new Day3().runAndPrintAll();
|
12 | 14 | }
|
13 | 15 |
|
14 | 16 | @Override
|
15 | 17 | public Integer part1(@NotNull BufferedReader reader) {
|
16 |
| - var masks = new long[2]; |
17 |
| - |
18 |
| - return reader |
| 18 | + var rucksackCompartments = reader |
19 | 19 | .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)); |
32 | 25 | }
|
33 |
| - |
34 |
| - return calcPriority(masks[0] & masks[1]); |
35 | 26 | })
|
36 |
| - .sum(); |
| 27 | + .mapToLong(Day3::stringToMask) |
| 28 | + .toArray(); |
| 29 | + |
| 30 | + return reduceAndSumMasks(rucksackCompartments, COMPARTMENTS); |
37 | 31 | }
|
38 | 32 |
|
39 | 33 | @Override
|
40 | 34 | public Integer part2(@NotNull BufferedReader reader) {
|
41 |
| - var inputInts = reader |
| 35 | + var rucksacks = reader |
42 | 36 | .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) |
49 | 38 | .toArray();
|
50 | 39 |
|
| 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) { |
51 | 52 | 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); |
54 | 60 | }
|
55 | 61 |
|
56 | 62 | return sum;
|
|
0 commit comments