1
1
package dev .linl33 .adventofcode .year2022 ;
2
2
3
+ import dev .linl33 .adventofcode .jmh .JmhSolutionBenchmark ;
3
4
import dev .linl33 .adventofcode .lib .util .AdventUtil ;
4
5
import org .jetbrains .annotations .NotNull ;
5
6
8
9
import java .util .List ;
9
10
import java .util .stream .Stream ;
10
11
11
- public class Day5 extends AdventSolution2022 <String , String > {
12
+ public class Day5 extends AdventSolution2022 <String , String > implements JmhSolutionBenchmark < String , String > {
12
13
public static void main (String [] args ) {
13
- new Day5 ().runAndPrintAll ();
14
+ // new Day5().runAndPrintAll();
15
+ new Day5 ().benchmark ();
14
16
}
15
17
16
18
@ Override
@@ -31,7 +33,7 @@ private static String simulateCrane(@NotNull BufferedReader reader, int maxChunk
31
33
32
34
var stackCount = countStacks (initState );
33
35
var stacks = parseStacks (initState );
34
- var tmpStack = new byte [Math . min ( stacks .length - stackCount , maxChunkSize ) ];
36
+ var tmpStack = new byte [stacks .length - stackCount ];
35
37
36
38
for (String instruction : instructions ) {
37
39
var offset = instruction .length () % 2 ;
@@ -43,21 +45,24 @@ private static String simulateCrane(@NotNull BufferedReader reader, int maxChunk
43
45
var right = left ^ from ^ to ;
44
46
45
47
var chunkSize = Math .min (maxChunkSize , cratesToMove );
46
- var moveDir = Integer .signum (from - to ) * chunkSize ;
48
+ var moveDir = Integer .signum (from - to ) * cratesToMove ;
47
49
var copyLengthOffset = Math .min (0 , moveDir );
48
50
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 );
53
54
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 );
57
57
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 ;
61
66
}
62
67
}
63
68
0 commit comments