diff --git a/ykoiso/src/B034_Robot.java b/ykoiso/src/B034_Robot.java new file mode 100644 index 0000000000000000000000000000000000000000..b48623c9308e7fcd10e02ed0d8e3efd193d88e25 --- /dev/null +++ b/ykoiso/src/B034_Robot.java @@ -0,0 +1,206 @@ +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +public class B034_Robot { + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + // 各定数読み込み + // 初期座標 + final int X = scan.nextInt(); + final int Y = scan.nextInt(); + // 移動量 + final int W = scan.nextInt(); + final int D = scan.nextInt(); + final int S = scan.nextInt(); + final int A = scan.nextInt(); + // 命令数 + final int N = scan.nextInt(); + // ロボットの生成 + Robot robot = new Robot(X, Y, W, A, S, D); + String order, direction; + // 命令の実行 + for (int i = 0; i < N; i++) { + order = scan.next(); + direction = scan.next(); + robot.executeOrder(order, direction); + } + // 現在の座標の出力 + robot.showCoodinate(); + + scan.close(); + } + + static class Robot { + private int x, y, W, A, S, D; + // ロボットの向いている方向 + // 角度で表すdeg表記 + private Direction direction = Direction.F; + + public enum Direction { + F(0), R(1), B(2), L(3); + + private Integer deg; + private static Map map = new HashMap<>(); + static { + for (Direction d : Direction.values()) { + map.put(d.getDeg(), d); + } + } + + Direction(final Integer deg) { + this.deg = deg; + } + + public Integer getDeg() { + return deg; + } + + public Direction turn(final Direction direction) { + return map.get((this.getDeg() + direction.getDeg()) % Direction.values().length); + } + } + + + + // コンストラクタ + Robot(int x, int y, int W, int A, int S, int D) { + // 座標 + this.x = x; + this.y = y; + // 移動量 + this.W = W; + this.A = A; + this.S = S; + this.D = D; + } + + // 方向取得 + // テスト用 + public int getDeg() { + return direction.getDeg(); + } + + // 座標取得 + // テスト用 + public int getX() { + return x; + } + + public int getY() { + return y; + } + + // 座標表示 + public void showCoodinate() { + System.out.println(x + " " + y); + } + + // 命令実行関数 + public void executeOrder(final String order, final String direction) { + if (order.equals("m")) { + // 移動命令判定 + // 移動関数は絶対座標系 + // ここで相対から絶対に変更 + switch (this.direction) { + case F: + moveFront(direction); + break; + case R: + moveRight(direction); + break; + case B: + moveBack(direction); + break; + case L: + moveLeft(direction); + break; + } + } else { + changeDirection(direction); + System.out.println(this.direction); + } + } + + // 方向変更関数 + public void changeDirection(final String direction) { + this.direction = this.direction.turn(Direction.valueOf(direction)); + } + + // 前方移動関数 + // 絶対座標系 + public void moveFront(final String direction) { + switch (direction) { + case "F": + y += W; + break; + case "R": + x += D; + break; + case "B": + y -= S; + break; + case "L": + x -= A; + break; + } + } + + // 右方向移動関数 + // 絶対座標系 + public void moveRight(final String direction) { + switch (direction) { + case "F": + x += W; + break; + case "R": + y -= D; + break; + case "B": + x -= S; + break; + case "L": + y += A; + break; + } + } + + // 後方移動関数 + // 絶対座標系 + public void moveBack(final String direction) { + switch (direction) { + case "F": + y -= W; + break; + case "R": + x -= D; + break; + case "B": + y += S; + break; + case "L": + x += A; + break; + } + } + + // 左方向移動関数 + // 絶対座標系 + public void moveLeft(final String direction) { + switch (direction) { + case "F": + x -= W; + break; + case "R": + y += D; + break; + case "B": + x += S; + break; + case "L": + y -= A; + break; + } + } + } +} diff --git a/ykoiso/test/B034_RobotTest.java b/ykoiso/test/B034_RobotTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6b7cb1158b6c528d91ea30606979e8f9f34e9eaa --- /dev/null +++ b/ykoiso/test/B034_RobotTest.java @@ -0,0 +1,211 @@ +import static org.junit.Assert.assertThat; +import org.hamcrest.core.Is; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import static org.hamcrest.CoreMatchers.*; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class B034_RobotTest { + public static class 方向転換テスト { + B034_Robot.Robot sut; + + @Before + public void setUp() { + sut = new B034_Robot.Robot(0, 0, 1, 1, 1, 1); + } + + @Test + public void 右に方向転換できる() { + sut.executeOrder("t", "R"); + int actual = sut.getDeg(); + assertThat(actual, is(1)); + } + + @Test + public void 後ろに方向転換できる() { + sut.executeOrder("t", "B"); + int actual = sut.getDeg(); + assertThat(actual, is(2)); + } + + @Test + public void 左に方向転換できる() { + sut.executeOrder("t", "L"); + int actual = sut.getDeg(); + assertThat(actual, is(3)); + } + + } + public static class 前向き移動テスト { + B034_Robot.Robot sut; + + @Before + public void setUp() { + sut = new B034_Robot.Robot(0, 0, 1, 4, 3, 2); + } + + @Test + public void 前に1マス移動できる() { + sut.executeOrder("m", "F"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, 1}; + assertThat(actual, is(expected)); + } + + @Test + public void 右に2マス移動できる() { + sut.executeOrder("m", "R"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {2, 0}; + assertThat(actual, is(expected)); + } + + @Test + public void 後ろに3マス移動できる() { + sut.executeOrder("m", "B"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, -3}; + assertThat(actual, is(expected)); + } + + @Test + public void 左に4マス移動できる() { + sut.executeOrder("m", "L"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {-4, 0}; + assertThat(actual, is(expected)); + } + + } + public static class 右向き移動テスト { + B034_Robot.Robot sut; + + @Before + public void setUp() { + sut = new B034_Robot.Robot(0, 0, 1, 4, 3, 2); + sut.changeDirection("R"); + } + + @Test + public void 前に1マス移動できる() { + sut.executeOrder("m", "F"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {1, 0}; + assertThat(actual, is(expected)); + } + + @Test + public void 右に2マス移動できる() { + sut.executeOrder("m", "R"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, -2}; + assertThat(actual, is(expected)); + } + + @Test + public void 後ろに3マス移動できる() { + sut.executeOrder("m", "B"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {-3, 0}; + assertThat(actual, is(expected)); + } + + @Test + public void 左に4マス移動できる() { + sut.executeOrder("m", "L"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, 4}; + assertThat(actual, is(expected)); + } + + } + + + + public static class 後ろ向き移動テスト { + B034_Robot.Robot sut; + + @Before + public void setUp() { + sut = new B034_Robot.Robot(0, 0, 1, 4, 3, 2); + sut.executeOrder("t", "B"); + } + + @Test + public void 前に1マス移動できる() { + sut.executeOrder("m", "F"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, -1}; + assertThat(actual, is(expected)); + } + + @Test + public void 右に2マス移動できる() { + sut.executeOrder("m", "R"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {-2, 0}; + assertThat(actual, is(expected)); + } + + @Test + public void 後ろに3マス移動できる() { + sut.executeOrder("m", "B"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, 3}; + assertThat(actual, is(expected)); + } + + @Test + public void 左に4マス移動できる() { + sut.executeOrder("m", "L"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {4, 0}; + assertThat(actual, is(expected)); + } + + } + public static class 左向き移動テスト { + B034_Robot.Robot sut; + + @Before + public void setUp() { + sut = new B034_Robot.Robot(0, 0, 1, 4, 3, 2); + sut.changeDirection("L"); + } + + @Test + public void 前に1マス移動できる() { + sut.executeOrder("m", "F"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {-1, 0}; + assertThat(actual, is(expected)); + } + + @Test + public void 右に2マス移動できる() { + sut.executeOrder("m", "R"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, 2}; + assertThat(actual, is(expected)); + } + + @Test + public void 後ろに3マス移動できる() { + sut.executeOrder("m", "B"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {3, 0}; + assertThat(actual, is(expected)); + } + + @Test + public void 左に4マス移動できる() { + sut.executeOrder("m", "L"); + int[] actual = {sut.getX(), sut.getY()}; + int[] expected = {0, -4}; + assertThat(actual, is(expected)); + } + + } +}