From 6b2c0a4df7d1a4d13c69fdeb6d12814e50e64018 Mon Sep 17 00:00:00 2001 From: Matvey Bazhenov Date: Fri, 6 Feb 2026 01:04:37 +0300 Subject: [PATCH 1/4] task 1 --- .../hse/java/practice/task1/RubiksCube.java | 125 +++++++++++++++++- 1 file changed, 119 insertions(+), 6 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index d986f9f0..3678cf99 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -26,34 +26,147 @@ public RubiksCube() { } } + private void swap(int a, int b) { + Edge tmp = edges[a]; + edges[a] = edges[b]; + edges[b] = tmp; + } + + private void RotateEdge(RotateDirection direction, CubeColor[][] edge) { + if (RotateDirection.CLOCKWISE == direction) { + CubeColor tmp_cell = edge[0][0]; + edge[0][0] = edge[2][0]; + edge[2][0] = edge[2][2]; + edge[2][2] = edge[0][2]; + edge[0][2] = tmp_cell; + + tmp_cell = edge[0][1]; + edge[0][1] = edge[1][0]; + edge[1][0] = edge[2][1]; + edge[2][1] = edge[1][2]; + edge[1][2] = tmp_cell; + } + if (RotateDirection.COUNTERCLOCKWISE == direction) { + CubeColor tmp_cell = edge[0][0]; + edge[0][0] = edge[0][2]; + edge[0][2] = edge[2][2]; + edge[2][2] = edge[2][0]; + edge[2][0] = tmp_cell; + + tmp_cell = edge[0][1]; + edge[0][1] = edge[1][2]; + edge[1][2] = edge[2][1]; + edge[2][1] = edge[1][0]; + edge[1][0] = tmp_cell; + } + } + @Override public void up(RotateDirection direction) { - + swap(EdgePosition.FRONT.ordinal(), EdgePosition.UP.ordinal()); + swap(EdgePosition.UP.ordinal(), EdgePosition.DOWN.ordinal()); + swap(EdgePosition.UP.ordinal(), EdgePosition.BACK.ordinal()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + front(direction); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + swap(EdgePosition.UP.ordinal(), EdgePosition.BACK.ordinal()); + swap(EdgePosition.UP.ordinal(), EdgePosition.DOWN.ordinal()); + swap(EdgePosition.FRONT.ordinal(), EdgePosition.UP.ordinal()); } + @Override public void down(RotateDirection direction) { - + swap(EdgePosition.DOWN.ordinal(), EdgePosition.FRONT.ordinal()); + swap(EdgePosition.DOWN.ordinal(), EdgePosition.UP.ordinal()); + swap(EdgePosition.DOWN.ordinal(), EdgePosition.BACK.ordinal()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + front(direction); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + swap(EdgePosition.DOWN.ordinal(), EdgePosition.BACK.ordinal()); + swap(EdgePosition.DOWN.ordinal(), EdgePosition.UP.ordinal()); + swap(EdgePosition.DOWN.ordinal(), EdgePosition.FRONT.ordinal()); } @Override public void left(RotateDirection direction) { - + swap(EdgePosition.LEFT.ordinal(), EdgePosition.FRONT.ordinal()); + swap(EdgePosition.LEFT.ordinal(), EdgePosition.RIGHT.ordinal()); + swap(EdgePosition.LEFT.ordinal(), EdgePosition.BACK.ordinal()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.UP.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.DOWN.ordinal()].getParts()); + front(direction); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.UP.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.DOWN.ordinal()].getParts()); + swap(EdgePosition.LEFT.ordinal(), EdgePosition.BACK.ordinal()); + swap(EdgePosition.LEFT.ordinal(), EdgePosition.RIGHT.ordinal()); + swap(EdgePosition.LEFT.ordinal(), EdgePosition.FRONT.ordinal()); } @Override public void right(RotateDirection direction) { - + swap(EdgePosition.RIGHT.ordinal(), EdgePosition.FRONT.ordinal()); + swap(EdgePosition.RIGHT.ordinal(), EdgePosition.LEFT.ordinal()); + swap(EdgePosition.RIGHT.ordinal(), EdgePosition.BACK.ordinal()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.UP.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.DOWN.ordinal()].getParts()); + front(direction); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.UP.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.DOWN.ordinal()].getParts()); + swap(EdgePosition.RIGHT.ordinal(), EdgePosition.BACK.ordinal()); + swap(EdgePosition.RIGHT.ordinal(), EdgePosition.LEFT.ordinal()); + swap(EdgePosition.RIGHT.ordinal(), EdgePosition.FRONT.ordinal()); } @Override public void front(RotateDirection direction) { - + CubeColor[][] front = edges[4].getParts(); + CubeColor[][] up = edges[0].getParts(); + CubeColor[][] down = edges[1].getParts(); + CubeColor[][] left = edges[2].getParts(); + CubeColor[][] right = edges[3].getParts(); + RotateEdge(direction, front); + if (direction == RotateDirection.CLOCKWISE) { + CubeColor tmp_cell; + for (int i = 0; i < 3; i++) { + tmp_cell = left[i][2]; + left[i][2] = down[0][i]; + down[0][i] = right[2 - i][0]; + right[2 - i][0] = up[2][2 - i]; + up[2][2 - i] = tmp_cell; + } + + } else if (direction == RotateDirection.COUNTERCLOCKWISE) { + CubeColor tmp_cell; + for (int i = 0; i < 3; i++) { + tmp_cell = down[0][i]; + down[0][i] = left[i][2]; + left[i][2] = up[2][2 - i]; + up[2][2 - i] = right[2 - i][0]; + right[2 - i][0] = tmp_cell; + } + } } @Override public void back(RotateDirection direction) { - + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + swap(EdgePosition.UP.ordinal(), EdgePosition.DOWN.ordinal()); + swap(EdgePosition.BACK.ordinal(), EdgePosition.FRONT.ordinal()); + front(direction); + swap(EdgePosition.BACK.ordinal(), EdgePosition.FRONT.ordinal()); + swap(EdgePosition.UP.ordinal(), EdgePosition.DOWN.ordinal()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.RIGHT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); + RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); } public Edge[] getEdges() { From 95bb4179cc7eeee6d5bcba6678a8b1765799aa7e Mon Sep 17 00:00:00 2001 From: Matvey Bazhenov Date: Sat, 7 Feb 2026 20:08:45 +0300 Subject: [PATCH 2/4] cube: tests --- src/main/java/hse/java/practice/task1/RubiksCube.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 3678cf99..8e703fa1 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -32,6 +32,7 @@ private void swap(int a, int b) { edges[b] = tmp; } + private void RotateEdge(RotateDirection direction, CubeColor[][] edge) { if (RotateDirection.CLOCKWISE == direction) { CubeColor tmp_cell = edge[0][0]; From e8af2156b0a49a6bd041539a502674e5c4dd1d9a Mon Sep 17 00:00:00 2001 From: Matvey Bazhenov Date: Sat, 7 Feb 2026 20:43:08 +0300 Subject: [PATCH 3/4] cube: fix up and down --- .../java/hse/java/practice/task1/RubiksCube.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 8e703fa1..1b31b22f 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -64,7 +64,9 @@ private void RotateEdge(RotateDirection direction, CubeColor[][] edge) { @Override public void up(RotateDirection direction) { - swap(EdgePosition.FRONT.ordinal(), EdgePosition.UP.ordinal()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); + swap(EdgePosition.UP.ordinal(), EdgePosition.FRONT.ordinal()); swap(EdgePosition.UP.ordinal(), EdgePosition.DOWN.ordinal()); swap(EdgePosition.UP.ordinal(), EdgePosition.BACK.ordinal()); RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); @@ -74,12 +76,16 @@ public void up(RotateDirection direction) { RotateEdge(RotateDirection.COUNTERCLOCKWISE, edges[EdgePosition.LEFT.ordinal()].getParts()); swap(EdgePosition.UP.ordinal(), EdgePosition.BACK.ordinal()); swap(EdgePosition.UP.ordinal(), EdgePosition.DOWN.ordinal()); - swap(EdgePosition.FRONT.ordinal(), EdgePosition.UP.ordinal()); + swap(EdgePosition.UP.ordinal(), EdgePosition.FRONT.ordinal()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); } @Override public void down(RotateDirection direction) { + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); swap(EdgePosition.DOWN.ordinal(), EdgePosition.FRONT.ordinal()); swap(EdgePosition.DOWN.ordinal(), EdgePosition.UP.ordinal()); swap(EdgePosition.DOWN.ordinal(), EdgePosition.BACK.ordinal()); @@ -91,6 +97,8 @@ public void down(RotateDirection direction) { swap(EdgePosition.DOWN.ordinal(), EdgePosition.BACK.ordinal()); swap(EdgePosition.DOWN.ordinal(), EdgePosition.UP.ordinal()); swap(EdgePosition.DOWN.ordinal(), EdgePosition.FRONT.ordinal()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); + RotateEdge(RotateDirection.CLOCKWISE, edges[EdgePosition.BACK.ordinal()].getParts()); } @Override @@ -179,3 +187,7 @@ public String toString() { return Arrays.toString(edges); } } + +//[[[GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN]], [[RED, RED, RED], [RED, RED, RED], [RED, RED, RED]], [[BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE]], [[WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE]], [[YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW]], [[ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE]]] +//[[[GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN]], [[RED, RED, RED], [RED, RED, RED], [RED, RED, RED]], [[YELLOW, YELLOW, YELLOW], [BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE]], [[ORANGE, ORANGE, ORANGE], [WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE]], [[WHITE, WHITE, WHITE], [YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW]], [[BLUE, BLUE, BLUE], [ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE]]] +//[[[GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN]], [[RED, RED, RED], [RED, RED, RED], [RED, RED, RED]], [[WHITE, WHITE, WHITE], [BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE]], [[BLUE, BLUE, BLUE], [WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE]], [[ORANGE, ORANGE, ORANGE], [YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW]], [[YELLOW, YELLOW, YELLOW], [ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE]]] From 1d16ed265e6901006082e00785f6b9c37cd3b5a6 Mon Sep 17 00:00:00 2001 From: Matvey Bazhenov Date: Sat, 7 Feb 2026 20:49:08 +0300 Subject: [PATCH 4/4] cube: delete output tests --- src/main/java/hse/java/practice/task1/RubiksCube.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/hse/java/practice/task1/RubiksCube.java b/src/main/java/hse/java/practice/task1/RubiksCube.java index 1b31b22f..b5fb4567 100644 --- a/src/main/java/hse/java/practice/task1/RubiksCube.java +++ b/src/main/java/hse/java/practice/task1/RubiksCube.java @@ -188,6 +188,3 @@ public String toString() { } } -//[[[GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN]], [[RED, RED, RED], [RED, RED, RED], [RED, RED, RED]], [[BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE]], [[WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE]], [[YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW]], [[ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE]]] -//[[[GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN]], [[RED, RED, RED], [RED, RED, RED], [RED, RED, RED]], [[YELLOW, YELLOW, YELLOW], [BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE]], [[ORANGE, ORANGE, ORANGE], [WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE]], [[WHITE, WHITE, WHITE], [YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW]], [[BLUE, BLUE, BLUE], [ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE]]] -//[[[GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN], [GREEN, GREEN, GREEN]], [[RED, RED, RED], [RED, RED, RED], [RED, RED, RED]], [[WHITE, WHITE, WHITE], [BLUE, BLUE, BLUE], [BLUE, BLUE, BLUE]], [[BLUE, BLUE, BLUE], [WHITE, WHITE, WHITE], [WHITE, WHITE, WHITE]], [[ORANGE, ORANGE, ORANGE], [YELLOW, YELLOW, YELLOW], [YELLOW, YELLOW, YELLOW]], [[YELLOW, YELLOW, YELLOW], [ORANGE, ORANGE, ORANGE], [ORANGE, ORANGE, ORANGE]]]