| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- final class Robot {
-
- private GridPosition gridPosition;
-
- private Orientation orientation;
-
- Robot(final GridPosition initialGridPosition, final Orientation initialOrientation) {
- this.gridPosition = initialGridPosition;
- this.orientation = initialOrientation;
- }
-
- GridPosition getGridPosition() {
- return gridPosition;
- }
-
- Orientation getOrientation() {
- return orientation;
- }
-
- Robot advance() {
- switch (orientation) {
- case NORTH:
- gridPosition = new GridPosition(gridPosition.x, gridPosition.y + 1);
- break;
- case EAST:
- gridPosition = new GridPosition(gridPosition.x + 1, gridPosition.y);
- break;
- case SOUTH:
- gridPosition = new GridPosition(gridPosition.x, gridPosition.y - 1);
- break;
- case WEST:
- gridPosition = new GridPosition(gridPosition.x - 1, gridPosition.y);
- break;
- }
-
- return this;
- }
-
- Robot simulate(final String instructions) {
- for (final char instruction : instructions.toCharArray()) {
- switch (instruction) {
- case 'A':
- advance();
- break;
- case 'R':
- turnRight();
- break;
- case 'L':
- turnLeft();
- break;
- default:
- throw new IllegalArgumentException(String.format("Invalid instruction: '%s'", instruction));
- }
- }
-
- return this;
- }
-
- Robot turnLeft() {
- final int newOrientationOrdinal = Math.floorMod(orientation.ordinal() - 1, Orientation.values().length);
- orientation = Orientation.values()[newOrientationOrdinal];
- return this;
- }
-
- Robot turnRight() {
- final int newOrientationOrdinal = Math.floorMod(orientation.ordinal() + 1, Orientation.values().length);
- orientation = Orientation.values()[newOrientationOrdinal];
- return this;
- }
-
- }
|