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