würde ich das Problem als Anerkennung der Bewegungsbefehle sehen, von denen jeder einen optionalen Faktor hat (wie viele Stufen) und eine obligatorische Richtung. Wenn der Faktor weggelassen wird, bedeutet dies tatsächlich den Wert 1
.
So können diese als Muster in regulären Ausdruck dargestellt werden:
String regex = "(?<factor>\\d*)"
+ "(?<dir>[LURDX])";
Sobald dies geschehen ist, müssen wir nur noch die Richtung zum entsprechenden Änderung dy
in Koordinaten (dx
, zur Karte), und wenden Sie dann die Änderungen an (multipliziert mit dem Wert des Faktors), während wir die Verschiebeanweisungen in einer while-Schleife der Regex-Übereinstimmung verarbeiten.
Beachten Sie, dass X
ein Sonderfall ist, der immer gehandhabt werden kann durch die letzte Position als lastX
und lastY
erinnern.
Das folgende ist meine Implementierung:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Walk {
enum Move {
L (-1, 0)
, U (0, 1)
, R (1, 0)
, D (0, -1)
, X (0, 0)
;
private int dx;
private int dy;
private Move(int dx, int dy) {
this.dx = dx;
this.dy = dy;
}
public int getDx() {
return dx;
}
public int getDy() {
return dy;
}
}
public static void main(String[] args) {
String input = "3L5UR2DDX2LR";
String regex = "(?<factor>\\d*)"
+ "(?<dir>[LURDX])";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int x = 0;
int y = 0;
int lastX = 0;
int lastY = 0;
while (m.find()) {
String factorString = m.group("factor");
int factor;
if (factorString.length()==0) {
factor=1;
} else {
factor=Integer.parseInt(factorString);
}
String dirString = m.group("dir");
Move move = Move.valueOf(dirString);
System.out.format("(%d,%d) last was (%d, %d) %d %s -> "
, x, y
, lastX, lastY
, factor, move.name());
if (move==Move.X) {
x = lastX;
y = lastY;
} else {
lastX = x;
lastY = y;
x += factor * move.getDx();
y += factor * move.getDy();
}
System.out.format("(%d,%d)%n", x, y);
}
System.out.format("finally arrive at (%d,%d)%n", x, y);
}
}
Die Ausgabe dieses Programms ist dies:
(0,0) last was (0, 0) 3 L -> (-3,0)
(-3,0) last was (0, 0) 5 U -> (-3,5)
(-3,5) last was (-3, 0) 1 R -> (-2,5)
(-2,5) last was (-3, 5) 2 D -> (-2,3)
(-2,3) last was (-2, 5) 1 D -> (-2,2)
(-2,2) last was (-2, 3) 1 X -> (-2,3)
(-2,3) last was (-2, 3) 2 L -> (-4,3)
(-4,3) last was (-2, 3) 1 R -> (-3,3)
finally arrive at (-3,3)