3
3
import java .io .BufferedReader ;
4
4
import java .io .Reader ;
5
5
import java .util .Arrays ;
6
+ import java .util .Collections ;
6
7
import java .util .List ;
7
8
import java .util .regex .Matcher ;
8
9
import java .util .regex .Pattern ;
@@ -20,52 +21,77 @@ public static Result part2(Reader r) {
20
21
}
21
22
22
23
private static Result solve (Reader r , int part ) {
23
- var chars = "abcdefgh" .toCharArray ();
24
+ var chars = ( part == 1 ? "abcdefgh" : "fbgdceah" ) .toCharArray ();
24
25
var instructions = new BufferedReader (r )
25
26
.lines ()
26
- .collect (Collectors .toUnmodifiableList ());
27
- apply (chars , instructions );
27
+ .collect (Collectors .toList ());
28
+ apply (chars , instructions , part == 2 );
28
29
return Result .ok (new String (chars ));
29
30
}
30
31
31
- private static void apply (char [] chars , List <String > instructions ) {
32
+ private static void apply (char [] chars , List <String > instructions , boolean reverse ) {
32
33
var swapPositionRE = Pattern .compile ("swap position (\\ d+) with position (\\ d+)" );
33
34
var swapLetterRE = Pattern .compile ("swap letter (\\ w) with letter (\\ w)" );
34
35
var rotateStepsRE = Pattern .compile ("rotate (left|right) (\\ d+) steps?" );
35
36
var rotateLetterRE = Pattern .compile ("rotate based on position of letter (\\ w)" );
36
37
var reverseRE = Pattern .compile ("reverse positions (\\ d+) through (\\ d+)" );
37
38
var moveRE = Pattern .compile ("move position (\\ d+) to position (\\ d+)" );
39
+ if (reverse ) {
40
+ Collections .reverse (instructions );
41
+ }
38
42
for (var instruction : instructions ) {
39
43
Matcher matcher ;
40
44
matcher = swapPositionRE .matcher (instruction );
41
45
if (matcher .matches ()) {
42
46
var x = Integer .parseInt (matcher .group (1 ));
43
47
var y = Integer .parseInt (matcher .group (2 ));
44
- swap (chars , x , y );
48
+ if (reverse ) {
49
+ swap (chars , y , x );
50
+ } else {
51
+ swap (chars , x , y );
52
+ }
45
53
continue ;
46
54
}
47
55
matcher = swapLetterRE .matcher (instruction );
48
56
if (matcher .matches ()) {
49
57
var x = find (chars , matcher .group (1 ).charAt (0 ));
50
58
var y = find (chars , matcher .group (2 ).charAt (0 ));
51
- swap (chars , x , y );
59
+ if (reverse ) {
60
+ swap (chars , y , x );
61
+ } else {
62
+ swap (chars , x , y );
63
+ }
52
64
continue ;
53
65
}
54
66
matcher = rotateStepsRE .matcher (instruction );
55
67
if (matcher .matches ()) {
56
68
var right = matcher .group (1 ).equals ("right" );
57
69
var steps = Integer .parseInt (matcher .group (2 ));
70
+ if (reverse ) {
71
+ right = !right ;
72
+ }
58
73
rotate (chars , right , steps );
59
74
continue ;
60
75
}
61
76
matcher = rotateLetterRE .matcher (instruction );
62
77
if (matcher .matches ()) {
63
78
var index = find (chars , matcher .group (1 ).charAt (0 ));
64
- var steps = 1 + index ;
65
- if (index >= 4 ) {
66
- steps ++;
79
+ int steps ;
80
+ if (reverse ) {
81
+ if (index == 0 ) {
82
+ steps = 1 ;
83
+ } else if (index % 2 == 1 ) {
84
+ steps = index / 2 + 1 ;
85
+ } else {
86
+ steps = 5 + index / 2 ;
87
+ }
88
+ } else {
89
+ steps = 1 + index ;
90
+ if (index >= 4 ) {
91
+ steps ++;
92
+ }
67
93
}
68
- rotate (chars , true , steps );
94
+ rotate (chars , ! reverse , steps );
69
95
continue ;
70
96
}
71
97
matcher = reverseRE .matcher (instruction );
@@ -79,7 +105,11 @@ private static void apply(char[] chars, List<String> instructions) {
79
105
if (matcher .matches ()) {
80
106
var x = Integer .parseInt (matcher .group (1 ));
81
107
var y = Integer .parseInt (matcher .group (2 ));
82
- move (chars , x , y );
108
+ if (reverse ) {
109
+ move (chars , y , x );
110
+ } else {
111
+ move (chars , x , y );
112
+ }
83
113
continue ;
84
114
}
85
115
throw new IllegalArgumentException (String .format ("invalid instruction: %s" , instruction ));
0 commit comments