Skip to content

Commit 9c614ab

Browse files
committed
Improve year 2022 day5
1 parent 3eb4bc8 commit 9c614ab

File tree

1 file changed

+19
-14
lines changed
  • year2022/src/main/java/dev/linl33/adventofcode/year2022

1 file changed

+19
-14
lines changed

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

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.linl33.adventofcode.year2022;
22

3+
import dev.linl33.adventofcode.jmh.JmhSolutionBenchmark;
34
import dev.linl33.adventofcode.lib.util.AdventUtil;
45
import org.jetbrains.annotations.NotNull;
56

@@ -8,9 +9,10 @@
89
import java.util.List;
910
import java.util.stream.Stream;
1011

11-
public class Day5 extends AdventSolution2022<String, String> {
12+
public class Day5 extends AdventSolution2022<String, String> implements JmhSolutionBenchmark<String, String> {
1213
public static void main(String[] args) {
13-
new Day5().runAndPrintAll();
14+
// new Day5().runAndPrintAll();
15+
new Day5().benchmark();
1416
}
1517

1618
@Override
@@ -31,7 +33,7 @@ private static String simulateCrane(@NotNull BufferedReader reader, int maxChunk
3133

3234
var stackCount = countStacks(initState);
3335
var stacks = parseStacks(initState);
34-
var tmpStack = new byte[Math.min(stacks.length - stackCount, maxChunkSize)];
36+
var tmpStack = new byte[stacks.length - stackCount];
3537

3638
for (String instruction : instructions) {
3739
var offset = instruction.length() % 2;
@@ -43,21 +45,24 @@ private static String simulateCrane(@NotNull BufferedReader reader, int maxChunk
4345
var right = left ^ from ^ to;
4446

4547
var chunkSize = Math.min(maxChunkSize, cratesToMove);
46-
var moveDir = Integer.signum(from - to) * chunkSize;
48+
var moveDir = Integer.signum(from - to) * cratesToMove;
4749
var copyLengthOffset = Math.min(0, moveDir);
4850

49-
for (int i = 0; i < cratesToMove; i += chunkSize) {
50-
var srcPointer = stacks[from];
51-
var dstPointer = stacks[to];
52-
System.arraycopy(stacks, srcPointer - chunkSize + 1, tmpStack, 0, chunkSize);
51+
var srcPointer = stacks[from];
52+
var dstPointer = stacks[to];
53+
System.arraycopy(stacks, srcPointer - cratesToMove + 1, tmpStack, 0, cratesToMove);
5354

54-
var leftPointer = stacks[left];
55-
System.arraycopy(stacks, leftPointer + 1, stacks, leftPointer + 1 + moveDir, Math.abs(srcPointer - dstPointer) - chunkSize - copyLengthOffset);
56-
System.arraycopy(tmpStack, 0, stacks, dstPointer + 1 + copyLengthOffset, chunkSize);
55+
var leftPointer = stacks[left];
56+
System.arraycopy(stacks, leftPointer + 1, stacks, leftPointer + 1 + moveDir, Math.abs(srcPointer - dstPointer) - cratesToMove - copyLengthOffset);
5757

58-
for (int j = left; j < right; j++) {
59-
stacks[j] += moveDir;
60-
}
58+
for (int i = 0; i < cratesToMove; i += chunkSize) {
59+
// TODO: does it work with chunkSize not 1 or cratesToMove?
60+
var chunkOffset = (cratesToMove / chunkSize - i / chunkSize - 1) * chunkSize;
61+
System.arraycopy(tmpStack, i, stacks, dstPointer + 1 + copyLengthOffset + chunkOffset, chunkSize);
62+
}
63+
64+
for (int j = left; j < right; j++) {
65+
stacks[j] += moveDir;
6166
}
6267
}
6368

0 commit comments

Comments
 (0)