From c7befe8413d8533169c0027e4365d404fc4dad95 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Wed, 12 Jul 2023 15:25:14 +0900 Subject: [PATCH 1/8] =?UTF-8?q?B134=E5=9B=9E=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 134 +++++++++++++++++++++++++++++++++++ syamauchi/test/B134Test.java | 80 +++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 syamauchi/src/B134.java create mode 100644 syamauchi/test/B134Test.java diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java new file mode 100644 index 0000000..0e966a3 --- /dev/null +++ b/syamauchi/src/B134.java @@ -0,0 +1,134 @@ +package src; + +import java.util.Scanner; + +public class B134 { + + private static int RANGE = 2; + private int fieldHeight; + private int fieldWidth; + + public B134(final int fieldHeight, final int fieldWidth) { + this.fieldHeight = fieldHeight; + this.fieldWidth = fieldWidth; + } + + public static void main(String[] args) { + final Scanner sc = new Scanner(System.in); + final int fieldHeight = sc.nextInt(); + final int fieldWidth = sc.nextInt(); + final int times = sc.nextInt(); + + final B134 seedingSimulation = new B134(fieldHeight, fieldWidth); + int[][] seededField = seedingSimulation.createField(); + for (int i = 0; i < times; i++) { + seededField = seedingSimulation + .seedingField(sc.nextInt(), sc.nextInt(), sc.nextInt(), seededField); + } + System.out.println(seedingSimulation.showField(seededField)); + sc.close(); + } + + // 種まきされる前の畑の作成 + public int[][] createField() { + final int[][] field = new int[this.fieldHeight][this.fieldWidth]; + for (int[] fields : field) { + for (int position : fields) { + position = 0; + + } + } + return field; + } + + // 畑の範囲内であるかどうかの判定 + private boolean isField(final int x, final int y, final int[][] field) { + return field[0].length > y && y >= 0 && field.length > x && x >= 0; + } + + // 畑を表示する + public String showField(final int[][] seedingField) { + StringBuilder FieldText = new StringBuilder(); + for (int i = 0; i < this.fieldHeight; i++) { + for (int j = 0; j < this.fieldWidth; j++) { + if (j == this.fieldWidth - 1) { + FieldText.append(seedingField[i][j]+"\n"); + } else { + FieldText.append(seedingField[i][j] + + " "); + } + } + } + return FieldText.toString(); + } + + // 種まきをするメソッド(もっといい書き方あったら教えてほしいです。) + public int[][] seedingField(final int droneHeight, final int drone_x, + final int drone_y, final int[][] field) { + int[][] seededField = field; + + final int position_x = drone_x - 1; + final int position_y = drone_y - 1; + /* + * 種まきされる場所はドローンの座標を中心として一辺が高さと同じ数になる場所のため ドローンの座標から(ドローンの高さ/2)マス目の座標 + */ + final int range = droneHeight / RANGE; + // ドローンの座標に種まきがされるとき + if (range == 0 && isField(position_y, position_x, seededField)) { + seededField[position_y][position_x]++; + } else { + // 高さが3以上の時 + for (int depth = position_x - range; depth <= position_x + range; depth++) { + seededField = seedingCountSideways(position_y, depth, range, seededField); + } + for (int length = position_y - range; length <= position_y + range; length++) { + + seededField = seedingCountVerticalways(length, position_x, range, seededField); + } + // 四隅は1回余分にカウントされるため1減らす + seededField = decreaseCorner(position_y + range, position_x + range, seededField); + seededField = decreaseCorner(position_y - range, position_x + range, seededField); + seededField = decreaseCorner(position_y + range, position_x - range, seededField); + seededField = decreaseCorner(position_y - range, position_x - range, seededField); + } + + return seededField; + } + + // 横方向の種まき + private int[][] seedingCountSideways(final int py, final int px, final int range, + final int[][] field) { + if (isField(py - range, px, field)) { + field[py - range][px]++; + } + + if (isField(py + range, px, field)) { + field[py + range][px]++; + } + + return field; + } + + // 縦方向の種まき + private int[][] seedingCountVerticalways(final int py, final int px, final int range, + final int[][] field) { + if (isField(py, px - range, field)) { + field[py][px - range]++; + } + + if (isField(py, px + range, field)) { + field[py][px + range]++; + } + return field; + } + + // 角のカウントをへらす + private int[][] decreaseCorner(final int py, final int px, final int[][] field) { + if (isField(py, px, field)) { + field[py][px]--; + } + + return field; + } + +} diff --git a/syamauchi/test/B134Test.java b/syamauchi/test/B134Test.java new file mode 100644 index 0000000..45eb2ad --- /dev/null +++ b/syamauchi/test/B134Test.java @@ -0,0 +1,80 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; +import org.junit.Test; +import src.B134; + +public class B134Test { + + @Test + public void 正しく種まきがされるテスト() { + + final B134 sut = new B134(4, 6); + int[][] actual = sut.createField(); + + actual = sut.seedingField(3, 3, 2, actual); + actual = sut.seedingField(1, 6, 1, actual); + actual = sut.seedingField(5, 6, 4, actual); + + final int[][] expected = { + { + 0, 1, 1, 1, 0, 1 + }, + { + 0, 1, 0, 2, 1, 1 + }, { + 0, 1, 1, 2, 0, 0 + }, { + 0, 0, 0, 1, 0, 0 + } + }; + + assertThat(actual, is(expected)); + } + + // 畑の区画の範囲は1<=height,width<=100 + @Test + public void 畑の区画が最小の時のテスト() { + + final B134 sut = new B134(1, 1); + int[][] actual = sut.createField(); + actual = sut.seedingField(1, 1, 1, actual); + final int[][] expected = { + { + 1 + } + }; + assertThat(actual, is(expected)); + } + + @Test + public void 畑の区画が最大の時のテスト() { + + final B134 sut = new B134(100, 100); + int[][] actual = sut.createField(); + actual = sut.seedingField(1, 1, 1, actual); + int[][] expected = new int[100][100]; + expected[0][0] = 1; + + assertThat(actual, is(expected)); + } + + @Test + public void 種まきあとの畑がshowFieldで正しく表示されるテスト() { + + final B134 sut = new B134(4, 6); + int[][] field = sut.createField(); + + field = sut.seedingField(3, 3, 2, field); + field = sut.seedingField(1, 6, 1, field); + field = sut.seedingField(5, 6, 4, field); + final String actual = sut.showField(field); + final String expected = "0 1 1 1 0 1\n" + + "0 1 0 2 1 1\n" + + "0 1 1 2 0 0\n" + + "0 0 0 1 0 0\n"; + assertThat(actual, is(expected)); + } + +} -- GitLab From 5f629dcd314fcaabbe2cff53b73349aeb48806a1 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Wed, 12 Jul 2023 17:15:45 +0900 Subject: [PATCH 2/8] =?UTF-8?q?B134=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java index 0e966a3..1f73c00 100644 --- a/syamauchi/src/B134.java +++ b/syamauchi/src/B134.java @@ -48,13 +48,16 @@ public class B134 { // 畑を表示する public String showField(final int[][] seedingField) { - StringBuilder FieldText = new StringBuilder(); + final StringBuilder FieldText = new StringBuilder(); for (int i = 0; i < this.fieldHeight; i++) { for (int j = 0; j < this.fieldWidth; j++) { if (j == this.fieldWidth - 1) { - FieldText.append(seedingField[i][j]+"\n"); + FieldText + .append(seedingField[i][j] + + "\n"); } else { - FieldText.append(seedingField[i][j] + FieldText + .append(seedingField[i][j] + " "); } } -- GitLab From 5f450220d62b62680c05e0c93648ae4c066c4cee Mon Sep 17 00:00:00 2001 From: syamauchi Date: Wed, 12 Jul 2023 17:18:02 +0900 Subject: [PATCH 3/8] =?UTF-8?q?B134=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java index 1f73c00..18f0bf9 100644 --- a/syamauchi/src/B134.java +++ b/syamauchi/src/B134.java @@ -66,12 +66,12 @@ public class B134 { } // 種まきをするメソッド(もっといい書き方あったら教えてほしいです。) - public int[][] seedingField(final int droneHeight, final int drone_x, - final int drone_y, final int[][] field) { + public int[][] seedingField(final int droneHeight, final int droneX, + final int droneY, final int[][] field) { int[][] seededField = field; - final int position_x = drone_x - 1; - final int position_y = drone_y - 1; + final int position_x = droneX - 1; + final int position_y = droneY - 1; /* * 種まきされる場所はドローンの座標を中心として一辺が高さと同じ数になる場所のため ドローンの座標から(ドローンの高さ/2)マス目の座標 */ -- GitLab From 834360acce76b0e9770448def0468e1c3eeae1a5 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Wed, 12 Jul 2023 17:20:56 +0900 Subject: [PATCH 4/8] =?UTF-8?q?B134Test=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/test/B134Test.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syamauchi/test/B134Test.java b/syamauchi/test/B134Test.java index 45eb2ad..6d0199f 100644 --- a/syamauchi/test/B134Test.java +++ b/syamauchi/test/B134Test.java @@ -54,7 +54,7 @@ public class B134Test { final B134 sut = new B134(100, 100); int[][] actual = sut.createField(); actual = sut.seedingField(1, 1, 1, actual); - int[][] expected = new int[100][100]; + final int[][] expected = new int[100][100]; expected[0][0] = 1; assertThat(actual, is(expected)); -- GitLab From c5a7953f83c88db8d0e0bf53e202322dde3f1f68 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Wed, 12 Jul 2023 18:00:45 +0900 Subject: [PATCH 5/8] =?UTF-8?q?B134=5FcheckStyle=E9=81=A9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java index 18f0bf9..dac0ec0 100644 --- a/syamauchi/src/B134.java +++ b/syamauchi/src/B134.java @@ -2,6 +2,9 @@ package src; import java.util.Scanner; +/** + * B134種まきシミュレーション ドローンの高さと座標から畑に種をまく場所をカウントして表示する. + */ public class B134 { private static int RANGE = 2; @@ -13,7 +16,10 @@ public class B134 { this.fieldWidth = fieldWidth; } - public static void main(String[] args) { + /** + * 入力を受け取りカウント後の畑を表示. + */ + public static void main(final String[] args) { final Scanner sc = new Scanner(System.in); final int fieldHeight = sc.nextInt(); final int fieldWidth = sc.nextInt(); @@ -29,7 +35,7 @@ public class B134 { sc.close(); } - // 種まきされる前の畑の作成 + /** 種まきされる前の畑の作成. */ public int[][] createField() { final int[][] field = new int[this.fieldHeight][this.fieldWidth]; for (int[] fields : field) { @@ -46,7 +52,12 @@ public class B134 { return field[0].length > y && y >= 0 && field.length > x && x >= 0; } - // 畑を表示する + /** + * 畑を表示する. + + * @param seedingField 種まき後の畑 + * @return String型の種まき後の畑 + */ public String showField(final int[][] seedingField) { final StringBuilder FieldText = new StringBuilder(); for (int i = 0; i < this.fieldHeight; i++) { @@ -65,7 +76,16 @@ public class B134 { return FieldText.toString(); } - // 種まきをするメソッド(もっといい書き方あったら教えてほしいです。) + /** + * 種まきをするメソッド. + + * @param droneHeight ドローンの高さ + * @param droneX ドローンの座標 + * @param droneY ドローンの座標 + * @param field 種まきを行う畑 + * + * @return 種まき後の畑を返す + */ public int[][] seedingField(final int droneHeight, final int droneX, final int droneY, final int[][] field) { int[][] seededField = field; -- GitLab From 552b6715c5f0df1268128c0266d8fd75813439c1 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Thu, 13 Jul 2023 16:25:33 +0900 Subject: [PATCH 6/8] =?UTF-8?q?B134=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 146 ++++++++++++++++++++++------------- syamauchi/test/B134Test.java | 67 ++++++++-------- 2 files changed, 129 insertions(+), 84 deletions(-) diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java index dac0ec0..fccaa72 100644 --- a/syamauchi/src/B134.java +++ b/syamauchi/src/B134.java @@ -1,5 +1,7 @@ package src; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; /** @@ -7,9 +9,10 @@ import java.util.Scanner; */ public class B134 { - private static int RANGE = 2; - private int fieldHeight; - private int fieldWidth; + private static final int RANGE = 2; + private static final int NO_SEED = 0; + private final int fieldHeight; + private final int fieldWidth; public B134(final int fieldHeight, final int fieldWidth) { this.fieldHeight = fieldHeight; @@ -26,49 +29,65 @@ public class B134 { final int times = sc.nextInt(); final B134 seedingSimulation = new B134(fieldHeight, fieldWidth); - int[][] seededField = seedingSimulation.createField(); + List> seededField = seedingSimulation.createField(); for (int i = 0; i < times; i++) { seededField = seedingSimulation .seedingField(sc.nextInt(), sc.nextInt(), sc.nextInt(), seededField); } - System.out.println(seedingSimulation.showField(seededField)); + System.out.println(seedingSimulation.toStringField(seededField)); sc.close(); } /** 種まきされる前の畑の作成. */ - public int[][] createField() { - final int[][] field = new int[this.fieldHeight][this.fieldWidth]; - for (int[] fields : field) { - for (int position : fields) { - position = 0; + public List> createField() { + final List> fields = new ArrayList>(); + for (int i = 0; i < this.fieldHeight; i++) { + final List field = new ArrayList(); + for (int j = 0; j < this.fieldWidth; j++) { + field.add(NO_SEED); } + fields.add(field); } - return field; + return fields; + } + + /** 引数に置いた畑のコピーを作成. */ + public List> cloneField(final List> field) { + final List> clone = new ArrayList>(); + for (int i = 0; i < this.fieldHeight; i++) { + final List fields = new ArrayList(); + for (int j = 0; j < this.fieldWidth; j++) { + + fields.add(field.get(i).get(j)); + } + clone.add(fields); + } + return clone; } - // 畑の範囲内であるかどうかの判定 - private boolean isField(final int x, final int y, final int[][] field) { - return field[0].length > y && y >= 0 && field.length > x && x >= 0; + /** 畑の範囲内であるかどうかの判定. */ + private boolean isField(final int x, final int y, final List> field) { + return field.get(0).size() > y && y >= 0 && field.size() > x && x >= 0; } /** - * 畑を表示する. + * 畑を表示String型に変更する. * @param seedingField 種まき後の畑 * @return String型の種まき後の畑 */ - public String showField(final int[][] seedingField) { + public String toStringField(final List> seedingField) { final StringBuilder FieldText = new StringBuilder(); for (int i = 0; i < this.fieldHeight; i++) { for (int j = 0; j < this.fieldWidth; j++) { if (j == this.fieldWidth - 1) { FieldText - .append(seedingField[i][j] + .append(seedingField.get(i).get(j) + "\n"); } else { FieldText - .append(seedingField[i][j] + .append(seedingField.get(i).get(j) + " "); } } @@ -86,71 +105,94 @@ public class B134 { * * @return 種まき後の畑を返す */ - public int[][] seedingField(final int droneHeight, final int droneX, - final int droneY, final int[][] field) { - int[][] seededField = field; + public List> seedingField(final int droneHeight, final int droneX, + final int droneY, final List> field) { + List> nowField = cloneField(field); final int position_x = droneX - 1; final int position_y = droneY - 1; + int seed; /* * 種まきされる場所はドローンの座標を中心として一辺が高さと同じ数になる場所のため ドローンの座標から(ドローンの高さ/2)マス目の座標 */ - final int range = droneHeight / RANGE; + final int roundDownRadius = droneHeight / RANGE; // ドローンの座標に種まきがされるとき - if (range == 0 && isField(position_y, position_x, seededField)) { - seededField[position_y][position_x]++; + if (roundDownRadius == 0 && isField(position_y, position_x, nowField)) { + seed = nowField.get(position_y).get(position_x); + seed++; + nowField.get(position_y).set(position_x, seed); } else { // 高さが3以上の時 - for (int depth = position_x - range; depth <= position_x + range; depth++) { - seededField = seedingCountSideways(position_y, depth, range, seededField); + for (int x = position_x - roundDownRadius; x <= position_x + roundDownRadius; x++) { + nowField = seedingLandscape(position_y, x, roundDownRadius, nowField); } - for (int length = position_y - range; length <= position_y + range; length++) { + for (int y = position_y - roundDownRadius; y <= position_y + roundDownRadius; y++) { - seededField = seedingCountVerticalways(length, position_x, range, seededField); + nowField = seedingVerticalways(y, position_x, roundDownRadius, nowField); } // 四隅は1回余分にカウントされるため1減らす - seededField = decreaseCorner(position_y + range, position_x + range, seededField); - seededField = decreaseCorner(position_y - range, position_x + range, seededField); - seededField = decreaseCorner(position_y + range, position_x - range, seededField); - seededField = decreaseCorner(position_y - range, position_x - range, seededField); + final int upper = position_y - roundDownRadius; + final int lower = position_y + roundDownRadius; + final int left = position_x - roundDownRadius; + final int right = position_x + roundDownRadius; + nowField = decreaseCorner(upper, right, nowField); + nowField = decreaseCorner(lower, right, nowField); + nowField = decreaseCorner(upper, left, nowField); + nowField = decreaseCorner(lower, left, nowField); } - return seededField; + return nowField; } - // 横方向の種まき - private int[][] seedingCountSideways(final int py, final int px, final int range, - final int[][] field) { - if (isField(py - range, px, field)) { - field[py - range][px]++; - } + /** 横方向の種まき. */ + private List> seedingLandscape(final int py, final int px, + final int roundDownRadius, + final List> field) { + int seed; + if (isField(py - roundDownRadius, px, field)) { - if (isField(py + range, px, field)) { - field[py + range][px]++; + seed = field.get(py - roundDownRadius).get(px); + seed++; + field.get(py - roundDownRadius).set(px, seed); } + if (isField(py + roundDownRadius, px, field)) { + + seed = field.get(py + roundDownRadius).get(px); + seed++; + field.get(py + roundDownRadius).set(px, seed); + } return field; } - // 縦方向の種まき - private int[][] seedingCountVerticalways(final int py, final int px, final int range, - final int[][] field) { - if (isField(py, px - range, field)) { - field[py][px - range]++; + /** 縦方向の種まき. */ + private List> seedingVerticalways(final int py, final int px, + final int roundDownRadius, + final List> field) { + int seed; + if (isField(py, px - roundDownRadius, field)) { + seed = field.get(py).get(px - roundDownRadius); + seed++; + field.get(py).set(px - roundDownRadius, seed); } - if (isField(py, px + range, field)) { - field[py][px + range]++; + if (isField(py, px + roundDownRadius, field)) { + seed = field.get(py).get(px + roundDownRadius); + seed++; + field.get(py).set(px + roundDownRadius, seed); } return field; } - // 角のカウントをへらす - private int[][] decreaseCorner(final int py, final int px, final int[][] field) { + /** 角のカウントをへらす. */ + private List> decreaseCorner(final int py, final int px, + final List> field) { + int seed; if (isField(py, px, field)) { - field[py][px]--; + seed = field.get(py).get(px); + seed--; + field.get(py).set(px, seed); } - return field; } diff --git a/syamauchi/test/B134Test.java b/syamauchi/test/B134Test.java index 6d0199f..e1c20aa 100644 --- a/syamauchi/test/B134Test.java +++ b/syamauchi/test/B134Test.java @@ -1,79 +1,82 @@ package test; import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.junit.Test; import src.B134; +/** + * B134種まきシミュレーションのテスト. + */ + public class B134Test { @Test public void 正しく種まきがされるテスト() { final B134 sut = new B134(4, 6); - int[][] actual = sut.createField(); + List> actual = sut.createField(); actual = sut.seedingField(3, 3, 2, actual); actual = sut.seedingField(1, 6, 1, actual); actual = sut.seedingField(5, 6, 4, actual); - final int[][] expected = { - { - 0, 1, 1, 1, 0, 1 - }, - { - 0, 1, 0, 2, 1, 1 - }, { - 0, 1, 1, 2, 0, 0 - }, { - 0, 0, 0, 1, 0, 0 - } - }; + final List> expected = new ArrayList>( + Arrays.asList( + new ArrayList(Arrays.asList(0, 1, 1, 1, 0, 1)), + new ArrayList(Arrays.asList(0, 1, 0, 2, 1, 1)), + new ArrayList(Arrays.asList(0, 1, 1, 2, 0, 0)), + new ArrayList(Arrays.asList(0, 0, 0, 1, 0, 0)))); assertThat(actual, is(expected)); } // 畑の区画の範囲は1<=height,width<=100 @Test - public void 畑の区画が最小の時のテスト() { + public void 正常系_畑が最小の時の種まき() { final B134 sut = new B134(1, 1); - int[][] actual = sut.createField(); + List> actual = sut.createField(); actual = sut.seedingField(1, 1, 1, actual); - final int[][] expected = { - { - 1 - } - }; + final List> expected = new ArrayList>( + Arrays.asList( + new ArrayList(Arrays.asList(1)))); + assertThat(actual, is(expected)); } @Test - public void 畑の区画が最大の時のテスト() { + public void 畑の区画が最大の時に正常に作成されているか() { final B134 sut = new B134(100, 100); - int[][] actual = sut.createField(); + List> actual = sut.createField(); actual = sut.seedingField(1, 1, 1, actual); - final int[][] expected = new int[100][100]; - expected[0][0] = 1; + final int expectedSize = 100; + final int expectedCount = 1; - assertThat(actual, is(expected)); + assertThat(actual.size(), is(expectedSize)); + assertThat(actual.get(0).size(), is(expectedSize)); + assertThat(actual.get(0).get(0), is(expectedCount)); } @Test public void 種まきあとの畑がshowFieldで正しく表示されるテスト() { final B134 sut = new B134(4, 6); - int[][] field = sut.createField(); + List> field = sut.createField(); field = sut.seedingField(3, 3, 2, field); field = sut.seedingField(1, 6, 1, field); field = sut.seedingField(5, 6, 4, field); - final String actual = sut.showField(field); - final String expected = "0 1 1 1 0 1\n" - + "0 1 0 2 1 1\n" - + "0 1 1 2 0 0\n" - + "0 0 0 1 0 0\n"; + final String actual = sut.toStringField(field); + final String expected = + "0 1 1 1 0 1\n" + + "0 1 0 2 1 1\n" + + "0 1 1 2 0 0\n" + + "0 0 0 1 0 0\n"; assertThat(actual, is(expected)); } -- GitLab From 866a18eb06e5eafa1c0c30af1747f009a1102ad2 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Thu, 13 Jul 2023 16:39:43 +0900 Subject: [PATCH 7/8] =?UTF-8?q?B134=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java index fccaa72..3e3788c 100644 --- a/syamauchi/src/B134.java +++ b/syamauchi/src/B134.java @@ -73,7 +73,7 @@ public class B134 { /** * 畑を表示String型に変更する. - + * * @param seedingField 種まき後の畑 * @return String型の種まき後の畑 */ @@ -97,7 +97,7 @@ public class B134 { /** * 種まきをするメソッド. - + * * @param droneHeight ドローンの高さ * @param droneX ドローンの座標 * @param droneY ドローンの座標 @@ -116,6 +116,10 @@ public class B134 { * 種まきされる場所はドローンの座標を中心として一辺が高さと同じ数になる場所のため ドローンの座標から(ドローンの高さ/2)マス目の座標 */ final int roundDownRadius = droneHeight / RANGE; + final int upper = position_y - roundDownRadius; + final int lower = position_y + roundDownRadius; + final int left = position_x - roundDownRadius; + final int right = position_x + roundDownRadius; // ドローンの座標に種まきがされるとき if (roundDownRadius == 0 && isField(position_y, position_x, nowField)) { seed = nowField.get(position_y).get(position_x); @@ -123,18 +127,15 @@ public class B134 { nowField.get(position_y).set(position_x, seed); } else { // 高さが3以上の時 - for (int x = position_x - roundDownRadius; x <= position_x + roundDownRadius; x++) { + for (int x = left; x <= right; x++) { nowField = seedingLandscape(position_y, x, roundDownRadius, nowField); } - for (int y = position_y - roundDownRadius; y <= position_y + roundDownRadius; y++) { + for (int y = upper; y <= lower; y++) { nowField = seedingVerticalways(y, position_x, roundDownRadius, nowField); } // 四隅は1回余分にカウントされるため1減らす - final int upper = position_y - roundDownRadius; - final int lower = position_y + roundDownRadius; - final int left = position_x - roundDownRadius; - final int right = position_x + roundDownRadius; + nowField = decreaseCorner(upper, right, nowField); nowField = decreaseCorner(lower, right, nowField); nowField = decreaseCorner(upper, left, nowField); -- GitLab From 417a236291d8d32f44a30a24f170d34f8fe3c28d Mon Sep 17 00:00:00 2001 From: syamauchi Date: Fri, 14 Jul 2023 11:34:29 +0900 Subject: [PATCH 8/8] =?UTF-8?q?B134=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/B134.java | 75 ++++++++++++++++++++++++++---------- syamauchi/test/B134Test.java | 6 +-- 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/syamauchi/src/B134.java b/syamauchi/src/B134.java index 3e3788c..3232c3a 100644 --- a/syamauchi/src/B134.java +++ b/syamauchi/src/B134.java @@ -38,7 +38,11 @@ public class B134 { sc.close(); } - /** 種まきされる前の畑の作成. */ + /** + * 種まきされる前の畑の作成. 種まき前の畑はリスト内が0で埋まっている. + + * @return 種まき前の畑のリスト + */ public List> createField() { final List> fields = new ArrayList>(); for (int i = 0; i < this.fieldHeight; i++) { @@ -52,28 +56,37 @@ public class B134 { return fields; } - /** 引数に置いた畑のコピーを作成. */ + /** + * 引数に置いた畑のコピーを作成. + + * @param field コピーされる畑のリスト + * @return コピーした畑のリスト + */ public List> cloneField(final List> field) { final List> clone = new ArrayList>(); for (int i = 0; i < this.fieldHeight; i++) { - final List fields = new ArrayList(); - for (int j = 0; j < this.fieldWidth; j++) { - - fields.add(field.get(i).get(j)); - } - clone.add(fields); + clone.add(new ArrayList(field.get(i))); } return clone; } - /** 畑の範囲内であるかどうかの判定. */ + /** + * 畑の範囲内であるかどうかの判定. + + * @param x 縦の座標 + * @param y 横の座標 + * @param field 畑のリスト + * + * @return 引数の座標は畑の中であればtrue、畑の外であればfalseを返す + * + */ private boolean isField(final int x, final int y, final List> field) { return field.get(0).size() > y && y >= 0 && field.size() > x && x >= 0; } /** * 畑を表示String型に変更する. - * + * @param seedingField 種まき後の畑 * @return String型の種まき後の畑 */ @@ -97,7 +110,7 @@ public class B134 { /** * 種まきをするメソッド. - * + * @param droneHeight ドローンの高さ * @param droneX ドローンの座標 * @param droneY ドローンの座標 @@ -111,7 +124,6 @@ public class B134 { final int position_x = droneX - 1; final int position_y = droneY - 1; - int seed; /* * 種まきされる場所はドローンの座標を中心として一辺が高さと同じ数になる場所のため ドローンの座標から(ドローンの高さ/2)マス目の座標 */ @@ -122,13 +134,13 @@ public class B134 { final int right = position_x + roundDownRadius; // ドローンの座標に種まきがされるとき if (roundDownRadius == 0 && isField(position_y, position_x, nowField)) { - seed = nowField.get(position_y).get(position_x); + int seed = nowField.get(position_y).get(position_x); seed++; nowField.get(position_y).set(position_x, seed); } else { // 高さが3以上の時 for (int x = left; x <= right; x++) { - nowField = seedingLandscape(position_y, x, roundDownRadius, nowField); + nowField = seedingHorizontalways(position_y, x, roundDownRadius, nowField); } for (int y = upper; y <= lower; y++) { @@ -145,8 +157,16 @@ public class B134 { return nowField; } - /** 横方向の種まき. */ - private List> seedingLandscape(final int py, final int px, + /** + * 横方向の種まき. + + * @param py 縦の座標 + * @param px 横の座標 + * @param roundDownRadius ドローンの座標から種まきをする座標までの距離 + * + * @return 種まき後の畑のリスト + */ + private List> seedingHorizontalways(final int py, final int px, final int roundDownRadius, final List> field) { int seed; @@ -166,7 +186,15 @@ public class B134 { return field; } - /** 縦方向の種まき. */ + /** + * 縦方向の種まき. + + * @param py 縦の座標 + * @param px 横の座標 + * @param roundDownRadius ドローンの座標から種まきをする座標までの距離 + * + * @return 種まき後の畑のリスト + */ private List> seedingVerticalways(final int py, final int px, final int roundDownRadius, final List> field) { @@ -185,12 +213,19 @@ public class B134 { return field; } - /** 角のカウントをへらす. */ + /** + * 角のカウントをへらす. + + * @param py 縦の座標 + * @param px 横の座標 + * @param field 畑のリスト + * + * @return 余分にカウントしたものを抜いた畑のリスト + */ private List> decreaseCorner(final int py, final int px, final List> field) { - int seed; if (isField(py, px, field)) { - seed = field.get(py).get(px); + int seed = field.get(py).get(px); seed--; field.get(py).set(px, seed); } diff --git a/syamauchi/test/B134Test.java b/syamauchi/test/B134Test.java index e1c20aa..4414292 100644 --- a/syamauchi/test/B134Test.java +++ b/syamauchi/test/B134Test.java @@ -36,7 +36,7 @@ public class B134Test { // 畑の区画の範囲は1<=height,width<=100 @Test - public void 正常系_畑が最小の時の種まき() { + public void 畑の区画が最小の時に正しく種まきされるテスト() { final B134 sut = new B134(1, 1); List> actual = sut.createField(); @@ -49,7 +49,7 @@ public class B134Test { } @Test - public void 畑の区画が最大の時に正常に作成されているか() { + public void 畑の区画が最大の時に正しく畑が作成されるテスト() { final B134 sut = new B134(100, 100); List> actual = sut.createField(); @@ -63,7 +63,7 @@ public class B134Test { } @Test - public void 種まきあとの畑がshowFieldで正しく表示されるテスト() { + public void 畑の区画が種まき後にshowFieldで正しく表示されるテスト() { final B134 sut = new B134(4, 6); List> field = sut.createField(); -- GitLab