From 831c122f017cf0834a682e98f56e28d9c33b58d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=96=A2=20=E5=A4=A7=E8=BC=9D?= Date: Mon, 10 Jul 2023 16:18:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?paiza=20B128=20=E5=9B=9E=E7=AD=94=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dseki/paiza/src/B128.java | 209 +++++++++++++++++++++++++++++++++ dseki/paiza/test/B128Test.java | 182 ++++++++++++++++++++++++++++ 2 files changed, 391 insertions(+) create mode 100644 dseki/paiza/src/B128.java create mode 100644 dseki/paiza/test/B128Test.java diff --git a/dseki/paiza/src/B128.java b/dseki/paiza/src/B128.java new file mode 100644 index 0000000..6595ef6 --- /dev/null +++ b/dseki/paiza/src/B128.java @@ -0,0 +1,209 @@ +import java.util.ArrayList; +import java.util.Scanner; + +/** + * 簡易的二次元バーコードの出力. + * ルール + * ・1桁の数値は3×3で"."と"#"で表される. + * ・1桁の数値は、その数値の数の分だけ"#"を左上から右下に向かって埋め、残りのマスは"."で表現する. + * ・1つの行で表せる数値は3つまで. + * 条件 + * ・入力する数値の桁数は3の倍数でなければならない. + * ・最小の桁数は3桁、最大の桁数は9桁 + * + */ +public class B128 { + private static final int ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER = 3; // 1つの値を表すバーコードの1辺の長さ + private static final int NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE = 3; + private static final String NEW_LINE = System.getProperty("line.separator"); // 改行のための文字列 + final int inputNumber; // 読み込む数値 + + B128(final int inputNumber) { + this.inputNumber = inputNumber; + } + + /** + * メインメソッド. + */ + public static void main(final String[] args) { + final Scanner sc = new Scanner(System.in); + final int inputNumber = sc.nextInt(); + final B128 b128 = new B128(inputNumber); + b128.getBarcode(b128.makeTwoDimensionalArray(b128.splitSingleDigitsList())); + sc.close(); + } + + /** + * 作成したバーコードを出力するメソッド. + * + * @param twoDimensionalList 1桁に区切ったリストを元に作成した二次元リスト + */ + public void getBarcode(final ArrayList> twoDimensionalList) { + System.out.println(makeBarcode(twoDimensionalList)); + } + + /** + * バーコードを作成するメソッド. + * + * @param twoDimensionalList 数値を区切った二次元配列 + * @return バーコードを返す + */ + String makeBarcode(final ArrayList> twoDimensionalList) { + String barcode = ""; + for (int i = 0; i < twoDimensionalList.size(); i++) { + barcode += makeBarcodeOfOneRow(twoDimensionalList, i); + } + return barcode; + } + + /** + * バーコード1行分を作成するメソッド. + * + * @param twoDimensionalList 1桁ずつ区切ったリストを元に作成した二次元リスト + * @param indexOfGet 取得したいインデックス番号 + * @return 1行分のバーコード(1桁につき3×3のため、3×9) + */ + private String makeBarcodeOfOneRow(final ArrayList> twoDimensionalList, + final int indexOfGet) { + String barcode = ""; + for (int j = 0; j < ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER; j++) { + for (int k = 0; k < ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER; k++) { + if (twoDimensionalList.get(indexOfGet).get(k) >= ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER + && twoDimensionalList.get(indexOfGet).get(k) != 0) { + barcode += "###"; + updateValue(twoDimensionalList, indexOfGet, k); + } else if (twoDimensionalList.get(indexOfGet).get(k) + % ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER == 2) { + barcode += "##."; + updateValue(twoDimensionalList, indexOfGet, k); + } else if (twoDimensionalList.get(indexOfGet).get(k) + % ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER == 1) { + barcode += "#.."; + updateValue(twoDimensionalList, indexOfGet, k); + } else if (twoDimensionalList.get(indexOfGet).get(k) <= 0) { + barcode += "..."; + } + } + barcode += NEW_LINE; + } + return barcode; + } + + /** + * 二次元リストの中のリストの値を変更するメソッド. + * + * @param twoDimensionalList 数値を区切った二次元リスト + * @param indexOfGet 取得したいインデックス番号 + * @param indexToChange 変更したいインデックス番号 + */ + private void updateValue(final ArrayList> twoDimensionalList, + final int indexOfGet, + final int indexToChange) { + final int valueOfUpdate = twoDimensionalList.get(indexOfGet).get(indexToChange) - 3; + twoDimensionalList.get(indexOfGet).set(indexToChange, valueOfUpdate); + } + + /** + * 区切られた数値を元に二次元リストを作成するメソッド. + * 1行に出力できる値が3つまでであるため、1つのリストに格納できる要素数を3つまでとする。 + * + * @param splitSingleDigitsList 数値を区切ったリスト + * @return 区切られた数値を元に作成した二次元リストを返す + */ + ArrayList> makeTwoDimensionalArray( + final ArrayList splitSingleDigitsList) { + ArrayList> twoDimensionalList = new ArrayList>(); + if (splitSingleDigitsList.size() / NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE == 1) { + twoDimensionalList = makeListWithThreeElements(splitSingleDigitsList); + } else if (splitSingleDigitsList.size() / NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE == 2) { + twoDimensionalList = makeListWithSixElements(splitSingleDigitsList); + } else if (splitSingleDigitsList.size() / NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE == 3) { + twoDimensionalList = makeListWithNineElements(splitSingleDigitsList); + } + return twoDimensionalList; + } + + /** + * 1行で表す(splitSingleDigitsListの要素数が3)の場合の二次元リストを返す. + * + * @param splitSingleDigitsList 数値を1桁ずつに区切ったリスト + * @return 1桁ずつ区切ったリストを元に作成した二次元リスト + */ + private ArrayList> makeListWithThreeElements( + final ArrayList splitSingleDigitsList) { + final ArrayList> twoDimensionalList = new ArrayList>(); + final ArrayList firstList = new ArrayList(); + for (int i = 0; i < splitSingleDigitsList.size(); i++) { + firstList.add(splitSingleDigitsList.get(i)); + } + twoDimensionalList.add(firstList); + return twoDimensionalList; + } + + /** + * 2行で表す(splitSingleDigitsListの要素数が6)の場合の二次元リストを返す. + * + * @param splitSingleDigitsList 数値を1桁ずつに区切ったリスト + * @return 1桁ずつ区切ったリストを元に作成した二次元リスト + */ + private ArrayList> makeListWithSixElements( + final ArrayList splitSingleDigitsList) { + final ArrayList> twoDimensionalList = new ArrayList>(); + final ArrayList firstList = new ArrayList(); + final ArrayList secondList = new ArrayList(); + for (int i = 0; i < splitSingleDigitsList.size(); i++) { + if (firstList.size() >= NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { + secondList.add(splitSingleDigitsList.get(i)); + } else { + firstList.add(splitSingleDigitsList.get(i)); + } + } + twoDimensionalList.add(firstList); + twoDimensionalList.add(secondList); + return twoDimensionalList; + } + + /** + * 3行で表す(splitSingleDigitsListの要素数が9)の場合の二次元リストを返す. + * + * @param splitSingleDigitsList 数値を1桁ずつに区切ったリスト + * @return 1桁ずつ区切ったリストを元に作成した二次元リスト + */ + private ArrayList> makeListWithNineElements( + final ArrayList splitSingleDigitsList) { + final ArrayList> twoDimensionalList = new ArrayList>(); + final ArrayList firstList = new ArrayList(); + final ArrayList secondList = new ArrayList(); + final ArrayList thirdList = new ArrayList(); + for (int i = 0; i < splitSingleDigitsList.size(); i++) { + if (secondList.size() >= NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { + thirdList.add(splitSingleDigitsList.get(i)); + } else if (firstList.size() >= NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { + secondList.add(splitSingleDigitsList.get(i)); + } else { + firstList.add(splitSingleDigitsList.get(i)); + } + } + twoDimensionalList.add(firstList); + twoDimensionalList.add(secondList); + twoDimensionalList.add(thirdList); + return twoDimensionalList; + } + + /** + * 受け取った数値を1桁ずつ区切り、リストに格納するメソッド. + * + * @param inputNumber 入力された数値 + * @return 区切った数値のリストを返す + */ + ArrayList splitSingleDigitsList() { + final Integer intInputNumber = Integer.valueOf(this.inputNumber); + final String strInputNumber = intInputNumber.toString(); + final String[] separateSingleDigitsArray = strInputNumber.split(""); + final ArrayList separateSingleDigitsList = new ArrayList(); + for (int i = 0; i < separateSingleDigitsArray.length; i++) { + separateSingleDigitsList.add(Integer.parseInt(separateSingleDigitsArray[i])); + } + return separateSingleDigitsList; + } +} diff --git a/dseki/paiza/test/B128Test.java b/dseki/paiza/test/B128Test.java new file mode 100644 index 0000000..0dabce8 --- /dev/null +++ b/dseki/paiza/test/B128Test.java @@ -0,0 +1,182 @@ +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import java.util.ArrayList; +import org.junit.Test; + +public class B128Test { + private static final String NEW_LINE = System.getProperty("line.separator"); + + @Test + public void splitSingleDigitsListで100を1桁ずつ区切ったリストを作る() { + B128 b128 = new B128(100); + ArrayList list = new ArrayList(); + list.add(1); + list.add(0); + list.add(0); + assertThat(b128.splitSingleDigitsList(), is(list)); + } + + @Test + public void splitSingleDigitsListで987654を1桁ずつ区切ったリストを作る() { + B128 b128 = new B128(987654); + ArrayList list = new ArrayList(); + list.add(9); + list.add(8); + list.add(7); + list.add(6); + list.add(5); + list.add(4); + assertThat(b128.splitSingleDigitsList(), is(list)); + } + + @Test + public void splitSingleDigitsListで999999999を1桁ずつ区切ったリストを作る() { + B128 b128 = new B128(999999999); + ArrayList list = new ArrayList(); + list.add(9); + list.add(9); + list.add(9); + list.add(9); + list.add(9); + list.add(9); + list.add(9); + list.add(9); + list.add(9); + assertThat(b128.splitSingleDigitsList(), is(list)); + } + + @Test + public void makeTwoDimensionalArrayで100を1桁ずつ区切ったリストから3要素ずつのリストに区切った二次元リストを作る() { + B128 b128 = new B128(100); + ArrayList> expected = new ArrayList>(); + ArrayList actual = new ArrayList(); + actual.add(1); + actual.add(0); + actual.add(0); + expected.add(actual); + assertThat(b128.makeTwoDimensionalArray(actual), is(expected)); + } + + @Test + public void makeTwoDimensionalArrayで987654を1桁ずつ区切ったリストから3要素ずつのリストに区切った二次元リストを作る() { + B128 b128 = new B128(987654); + ArrayList> expected = new ArrayList>(); + ArrayList actual = new ArrayList(); + ArrayList list_1 = new ArrayList(); + ArrayList list_2 = new ArrayList(); + list_1.add(9); + actual.add(9); + list_1.add(8); + actual.add(8); + list_1.add(7); + actual.add(7); + list_2.add(6); + actual.add(6); + list_2.add(5); + actual.add(5); + list_2.add(4); + actual.add(4); + expected.add(list_1); + expected.add(list_2); + assertThat(b128.makeTwoDimensionalArray(actual), is(expected)); + } + + @Test + public void makeTwoDimensionalArrayで999999999を1桁ずつ区切ったリストから3要素ずつのリストに区切った二次元リストを作る() { + B128 b128 = new B128(999999999); + ArrayList> expected = new ArrayList>(); + ArrayList actual = new ArrayList(); + ArrayList list_1 = new ArrayList(); + ArrayList list_2 = new ArrayList(); + ArrayList list_3 = new ArrayList(); + list_1.add(9); + actual.add(9); + list_1.add(9); + actual.add(9); + list_1.add(9); + actual.add(9); + list_2.add(9); + actual.add(9); + list_2.add(9); + actual.add(9); + list_2.add(9); + actual.add(9); + list_3.add(9); + actual.add(9); + list_3.add(9); + actual.add(9); + list_3.add(9); + actual.add(9); + expected.add(list_1); + expected.add(list_2); + expected.add(list_3); + assertThat(b128.makeTwoDimensionalArray(actual), is(expected)); + } + + @Test + public void makeBarcodeから100のバーコードを取得する() { + B128 b128 = new B128(128); + ArrayList> actual = new ArrayList>(); + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(8); + actual.add(list); + assertThat(b128.makeBarcode(actual), is("#..##.###" + NEW_LINE + + "......###" + NEW_LINE + "......##." + NEW_LINE)); + } + + @Test + public void makeBarcodeから987654のバーコードを取得する() { + B128 b128 = new B128(987654); + ArrayList> actual = new ArrayList>(); + ArrayList list_1 = new ArrayList(); + ArrayList list_2 = new ArrayList(); + list_1.add(9); + list_1.add(8); + list_1.add(7); + list_2.add(6); + list_2.add(5); + list_2.add(4); + actual.add(list_1); + actual.add(list_2); + assertThat(b128.makeBarcode(actual), is( + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#####.#.." + NEW_LINE + + "#########" + NEW_LINE + + "#####.#.." + NEW_LINE + + "........." + NEW_LINE)); + } + + @Test + public void makeBarcodeから999999999のバーコードを取得する() { + B128 b128 = new B128(999999999); + ArrayList> actual = new ArrayList>(); + ArrayList list_1 = new ArrayList(); + ArrayList list_2 = new ArrayList(); + ArrayList list_3 = new ArrayList(); + list_1.add(9); + list_1.add(9); + list_1.add(9); + list_2.add(9); + list_2.add(9); + list_2.add(9); + list_3.add(9); + list_3.add(9); + list_3.add(9); + actual.add(list_1); + actual.add(list_2); + actual.add(list_3); + assertThat(b128.makeBarcode(actual), is( + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE)); + } +} -- GitLab From 28141c0cd798273b0bf0982d4d9d669ac8abc90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=96=A2=20=E5=A4=A7=E8=BC=9D?= Date: Thu, 13 Jul 2023 11:56:30 +0900 Subject: [PATCH 2/4] =?UTF-8?q?paiza=20B128=20=E3=81=AE=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=83=BB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dseki/paiza/src/B128.java | 209 ------------------ dseki/paiza/src/Barcode.java | 69 ++++++ dseki/paiza/src/OneDigitBarcode.java | 31 +++ dseki/paiza/src/ThreeDigitsBarcode.java | 74 +++++++ .../test/{B128Test.java => BarcodeTest.java} | 0 5 files changed, 174 insertions(+), 209 deletions(-) delete mode 100644 dseki/paiza/src/B128.java create mode 100644 dseki/paiza/src/Barcode.java create mode 100644 dseki/paiza/src/OneDigitBarcode.java create mode 100644 dseki/paiza/src/ThreeDigitsBarcode.java rename dseki/paiza/test/{B128Test.java => BarcodeTest.java} (100%) diff --git a/dseki/paiza/src/B128.java b/dseki/paiza/src/B128.java deleted file mode 100644 index 6595ef6..0000000 --- a/dseki/paiza/src/B128.java +++ /dev/null @@ -1,209 +0,0 @@ -import java.util.ArrayList; -import java.util.Scanner; - -/** - * 簡易的二次元バーコードの出力. - * ルール - * ・1桁の数値は3×3で"."と"#"で表される. - * ・1桁の数値は、その数値の数の分だけ"#"を左上から右下に向かって埋め、残りのマスは"."で表現する. - * ・1つの行で表せる数値は3つまで. - * 条件 - * ・入力する数値の桁数は3の倍数でなければならない. - * ・最小の桁数は3桁、最大の桁数は9桁 - * - */ -public class B128 { - private static final int ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER = 3; // 1つの値を表すバーコードの1辺の長さ - private static final int NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE = 3; - private static final String NEW_LINE = System.getProperty("line.separator"); // 改行のための文字列 - final int inputNumber; // 読み込む数値 - - B128(final int inputNumber) { - this.inputNumber = inputNumber; - } - - /** - * メインメソッド. - */ - public static void main(final String[] args) { - final Scanner sc = new Scanner(System.in); - final int inputNumber = sc.nextInt(); - final B128 b128 = new B128(inputNumber); - b128.getBarcode(b128.makeTwoDimensionalArray(b128.splitSingleDigitsList())); - sc.close(); - } - - /** - * 作成したバーコードを出力するメソッド. - * - * @param twoDimensionalList 1桁に区切ったリストを元に作成した二次元リスト - */ - public void getBarcode(final ArrayList> twoDimensionalList) { - System.out.println(makeBarcode(twoDimensionalList)); - } - - /** - * バーコードを作成するメソッド. - * - * @param twoDimensionalList 数値を区切った二次元配列 - * @return バーコードを返す - */ - String makeBarcode(final ArrayList> twoDimensionalList) { - String barcode = ""; - for (int i = 0; i < twoDimensionalList.size(); i++) { - barcode += makeBarcodeOfOneRow(twoDimensionalList, i); - } - return barcode; - } - - /** - * バーコード1行分を作成するメソッド. - * - * @param twoDimensionalList 1桁ずつ区切ったリストを元に作成した二次元リスト - * @param indexOfGet 取得したいインデックス番号 - * @return 1行分のバーコード(1桁につき3×3のため、3×9) - */ - private String makeBarcodeOfOneRow(final ArrayList> twoDimensionalList, - final int indexOfGet) { - String barcode = ""; - for (int j = 0; j < ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER; j++) { - for (int k = 0; k < ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER; k++) { - if (twoDimensionalList.get(indexOfGet).get(k) >= ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER - && twoDimensionalList.get(indexOfGet).get(k) != 0) { - barcode += "###"; - updateValue(twoDimensionalList, indexOfGet, k); - } else if (twoDimensionalList.get(indexOfGet).get(k) - % ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER == 2) { - barcode += "##."; - updateValue(twoDimensionalList, indexOfGet, k); - } else if (twoDimensionalList.get(indexOfGet).get(k) - % ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER == 1) { - barcode += "#.."; - updateValue(twoDimensionalList, indexOfGet, k); - } else if (twoDimensionalList.get(indexOfGet).get(k) <= 0) { - barcode += "..."; - } - } - barcode += NEW_LINE; - } - return barcode; - } - - /** - * 二次元リストの中のリストの値を変更するメソッド. - * - * @param twoDimensionalList 数値を区切った二次元リスト - * @param indexOfGet 取得したいインデックス番号 - * @param indexToChange 変更したいインデックス番号 - */ - private void updateValue(final ArrayList> twoDimensionalList, - final int indexOfGet, - final int indexToChange) { - final int valueOfUpdate = twoDimensionalList.get(indexOfGet).get(indexToChange) - 3; - twoDimensionalList.get(indexOfGet).set(indexToChange, valueOfUpdate); - } - - /** - * 区切られた数値を元に二次元リストを作成するメソッド. - * 1行に出力できる値が3つまでであるため、1つのリストに格納できる要素数を3つまでとする。 - * - * @param splitSingleDigitsList 数値を区切ったリスト - * @return 区切られた数値を元に作成した二次元リストを返す - */ - ArrayList> makeTwoDimensionalArray( - final ArrayList splitSingleDigitsList) { - ArrayList> twoDimensionalList = new ArrayList>(); - if (splitSingleDigitsList.size() / NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE == 1) { - twoDimensionalList = makeListWithThreeElements(splitSingleDigitsList); - } else if (splitSingleDigitsList.size() / NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE == 2) { - twoDimensionalList = makeListWithSixElements(splitSingleDigitsList); - } else if (splitSingleDigitsList.size() / NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE == 3) { - twoDimensionalList = makeListWithNineElements(splitSingleDigitsList); - } - return twoDimensionalList; - } - - /** - * 1行で表す(splitSingleDigitsListの要素数が3)の場合の二次元リストを返す. - * - * @param splitSingleDigitsList 数値を1桁ずつに区切ったリスト - * @return 1桁ずつ区切ったリストを元に作成した二次元リスト - */ - private ArrayList> makeListWithThreeElements( - final ArrayList splitSingleDigitsList) { - final ArrayList> twoDimensionalList = new ArrayList>(); - final ArrayList firstList = new ArrayList(); - for (int i = 0; i < splitSingleDigitsList.size(); i++) { - firstList.add(splitSingleDigitsList.get(i)); - } - twoDimensionalList.add(firstList); - return twoDimensionalList; - } - - /** - * 2行で表す(splitSingleDigitsListの要素数が6)の場合の二次元リストを返す. - * - * @param splitSingleDigitsList 数値を1桁ずつに区切ったリスト - * @return 1桁ずつ区切ったリストを元に作成した二次元リスト - */ - private ArrayList> makeListWithSixElements( - final ArrayList splitSingleDigitsList) { - final ArrayList> twoDimensionalList = new ArrayList>(); - final ArrayList firstList = new ArrayList(); - final ArrayList secondList = new ArrayList(); - for (int i = 0; i < splitSingleDigitsList.size(); i++) { - if (firstList.size() >= NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { - secondList.add(splitSingleDigitsList.get(i)); - } else { - firstList.add(splitSingleDigitsList.get(i)); - } - } - twoDimensionalList.add(firstList); - twoDimensionalList.add(secondList); - return twoDimensionalList; - } - - /** - * 3行で表す(splitSingleDigitsListの要素数が9)の場合の二次元リストを返す. - * - * @param splitSingleDigitsList 数値を1桁ずつに区切ったリスト - * @return 1桁ずつ区切ったリストを元に作成した二次元リスト - */ - private ArrayList> makeListWithNineElements( - final ArrayList splitSingleDigitsList) { - final ArrayList> twoDimensionalList = new ArrayList>(); - final ArrayList firstList = new ArrayList(); - final ArrayList secondList = new ArrayList(); - final ArrayList thirdList = new ArrayList(); - for (int i = 0; i < splitSingleDigitsList.size(); i++) { - if (secondList.size() >= NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { - thirdList.add(splitSingleDigitsList.get(i)); - } else if (firstList.size() >= NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { - secondList.add(splitSingleDigitsList.get(i)); - } else { - firstList.add(splitSingleDigitsList.get(i)); - } - } - twoDimensionalList.add(firstList); - twoDimensionalList.add(secondList); - twoDimensionalList.add(thirdList); - return twoDimensionalList; - } - - /** - * 受け取った数値を1桁ずつ区切り、リストに格納するメソッド. - * - * @param inputNumber 入力された数値 - * @return 区切った数値のリストを返す - */ - ArrayList splitSingleDigitsList() { - final Integer intInputNumber = Integer.valueOf(this.inputNumber); - final String strInputNumber = intInputNumber.toString(); - final String[] separateSingleDigitsArray = strInputNumber.split(""); - final ArrayList separateSingleDigitsList = new ArrayList(); - for (int i = 0; i < separateSingleDigitsArray.length; i++) { - separateSingleDigitsList.add(Integer.parseInt(separateSingleDigitsArray[i])); - } - return separateSingleDigitsList; - } -} diff --git a/dseki/paiza/src/Barcode.java b/dseki/paiza/src/Barcode.java new file mode 100644 index 0000000..6604fe2 --- /dev/null +++ b/dseki/paiza/src/Barcode.java @@ -0,0 +1,69 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * バーコード全体を出力するクラス. + */ +public class Barcode { + private static final int NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE = 3; // 1行に表せる数値の数 + final int numberOfCharactersRepresentingOneDigits = 9; + final int inputNumber; // 読み込む数値 + + Barcode(final int inputNumber) { + this.inputNumber = inputNumber; + } + + /** + * メインメソッド. + */ + public static void main(final String[] args) { + final Scanner sc = new Scanner(System.in); + final int inputNumber = sc.nextInt(); + final Barcode b128 = new Barcode(inputNumber); + b128.outputBarcode(); + sc.close(); + } + + /** + * バーコードを出力するクラス. + */ + public void outputBarcode() { + final String barcode = makeBarcode(); + System.out.println(barcode); + } + + /** + * バーコードを最小1行3列から最大3行3列まで作成するメソッド. + * + * @return 作成したバーコードを文字列で返す + */ + String makeBarcode() { + final ThreeDigitsBarcode threeDigitsBarcode = new ThreeDigitsBarcode(); + final StringBuilder barcode = new StringBuilder(); + final List separatedDigitsList = separateDigitsList(); + for (int i = 0; i < separatedDigitsList.size(); i++) { + final String oneLineBarcode = threeDigitsBarcode.getThreeDigitsBarcode( + separatedDigitsList.get(i)); + barcode.append(oneLineBarcode); + } + + return barcode.toString(); + } + + + /** + * 入力された数値を3桁ずつ区切り、リストに格納するメソッド. + * + * @return 区切ったリストを返す + */ + private List separateDigitsList() { + final List separatedDigitsList = new ArrayList(); + final String strInputNumber = String.valueOf(this.inputNumber); + for (int i = 0; i < strInputNumber.length(); i = i + NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE) { + separatedDigitsList.add(strInputNumber.substring( + i, i + NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE)); + } + return separatedDigitsList; + } +} \ No newline at end of file diff --git a/dseki/paiza/src/OneDigitBarcode.java b/dseki/paiza/src/OneDigitBarcode.java new file mode 100644 index 0000000..4d09511 --- /dev/null +++ b/dseki/paiza/src/OneDigitBarcode.java @@ -0,0 +1,31 @@ + +/** + * 1つのバーコードを表すクラス. + */ +public class OneDigitBarcode { + final int numberOfCaractersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 + final String mainMark = "#"; // メインのマーク(この数で数値が決まる) + final String subMark = "."; // サブのマーク(残りのマスを埋めるためだけにある) + + /** + * 数字1桁のバーコードを文字列として作成するメソッド. + * + * @param strNumber バーコード化したい数字 + * @return バーコード化した文字列を返す + */ + public String makeOneDigitBarcode(final String strNumber) { + final int intNumber = Integer.parseInt(strNumber); + final StringBuilder stringBuilderOneDigitBarcode = new StringBuilder(); + + for (int i = 0; i < intNumber; i++) { + stringBuilderOneDigitBarcode.append(mainMark); + } + + for (int i = 0; i < numberOfCaractersRepresentingOneDigits - intNumber; i++) { + stringBuilderOneDigitBarcode.append(subMark); + } + + final String stringOneDigitBarcode = stringBuilderOneDigitBarcode.toString(); + return stringOneDigitBarcode; + } +} diff --git a/dseki/paiza/src/ThreeDigitsBarcode.java b/dseki/paiza/src/ThreeDigitsBarcode.java new file mode 100644 index 0000000..521ddf9 --- /dev/null +++ b/dseki/paiza/src/ThreeDigitsBarcode.java @@ -0,0 +1,74 @@ +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 1行(数字3桁)のバーコードを作成するクラス. + */ +public class ThreeDigitsBarcode { + private static final int ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER = 3; // 1つの値を表すバーコードの1辺の長さ + private static final String NEW_LINE = System.getProperty("line.separator"); // 改行コード + final int numberOfCharactersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 + OneDigitBarcode oneDigitBarcode = new OneDigitBarcode(); + + /** + * 1行(数字3桁)分のバーコードを取得するメソッド. + * + * @param number 受け取った数字 + * @return 1行分のString型バーコードを返す + */ + public String getThreeDigitsBarcode(final String number) { + final List oneRowListOfBarcodes = oneRowListOfBarcodes(number); + final StringBuilder threeDigitsBarcode = makeThreeDigitsBarcode(oneRowListOfBarcodes); + return threeDigitsBarcode.toString(); + } + + /** + * 1行(数字3桁)分のバーコードを作成するメソッド. + * + * @param oneRowListOfBarcodes 1行分のバーコードが格納されているリスト + * @return 1行分のバーコードを返す + */ + private StringBuilder makeThreeDigitsBarcode(final List oneRowListOfBarcodes) { + final StringBuilder threeDigitsBarcode = new StringBuilder(); + for (int i = 0; i < numberOfCharactersRepresentingOneDigits; + i = i + ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER) { + for (int j = 0; j < ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER; j++) { + threeDigitsBarcode.append( + oneRowListOfBarcodes.get(j).substring( + i, i + ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER)); + } + threeDigitsBarcode.append(NEW_LINE); + } + return threeDigitsBarcode; + } + + /** + * 1行(数字3桁)分のバーコードをリストに格納するメソッド. + * + * @param number 取得する数字 + * @return 1行分のバーコードを格納したリストを返す + */ + private List oneRowListOfBarcodes(final String number) { + final List oneRowListOfBarcodes = new ArrayList(); + for (int i = 0; i < separateByDigits(number).size(); i++) { + final String indexToGet = separateByDigits(number).get(i); + oneRowListOfBarcodes.add(oneDigitBarcode.makeOneDigitBarcode(indexToGet)); + } + return oneRowListOfBarcodes; + } + + /** + * 受け取った数字を1桁ずつに区切るメソッド. + * + * @param number 取得する数字 + * @return 数字を1桁ずつに区切ったリストを返す + */ + private List separateByDigits(final String number) { + final List separatedByDigits = new LinkedList(); + for (int i = 0; i < number.length(); i++) { + separatedByDigits.add(number.substring(i, i + 1)); + } + return separatedByDigits; + } +} \ No newline at end of file diff --git a/dseki/paiza/test/B128Test.java b/dseki/paiza/test/BarcodeTest.java similarity index 100% rename from dseki/paiza/test/B128Test.java rename to dseki/paiza/test/BarcodeTest.java -- GitLab From 333dd7011f6d11ca89e662ea7b398d1b2a646d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=96=A2=20=E5=A4=A7=E8=BC=9D?= Date: Thu, 13 Jul 2023 11:59:52 +0900 Subject: [PATCH 3/4] =?UTF-8?q?paiza=20B128=20=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dseki/paiza/test/BarcodeTest.java | 215 ++++--------------- dseki/paiza/test/OneDigitBarcodeTest.java | 23 ++ dseki/paiza/test/ThreeDigitsBarcodeTest.java | 28 +++ 3 files changed, 91 insertions(+), 175 deletions(-) create mode 100644 dseki/paiza/test/OneDigitBarcodeTest.java create mode 100644 dseki/paiza/test/ThreeDigitsBarcodeTest.java diff --git a/dseki/paiza/test/BarcodeTest.java b/dseki/paiza/test/BarcodeTest.java index 0dabce8..f8971ae 100644 --- a/dseki/paiza/test/BarcodeTest.java +++ b/dseki/paiza/test/BarcodeTest.java @@ -1,182 +1,47 @@ import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; -import java.util.ArrayList; import org.junit.Test; -public class B128Test { - private static final String NEW_LINE = System.getProperty("line.separator"); - - @Test - public void splitSingleDigitsListで100を1桁ずつ区切ったリストを作る() { - B128 b128 = new B128(100); - ArrayList list = new ArrayList(); - list.add(1); - list.add(0); - list.add(0); - assertThat(b128.splitSingleDigitsList(), is(list)); - } - - @Test - public void splitSingleDigitsListで987654を1桁ずつ区切ったリストを作る() { - B128 b128 = new B128(987654); - ArrayList list = new ArrayList(); - list.add(9); - list.add(8); - list.add(7); - list.add(6); - list.add(5); - list.add(4); - assertThat(b128.splitSingleDigitsList(), is(list)); - } - - @Test - public void splitSingleDigitsListで999999999を1桁ずつ区切ったリストを作る() { - B128 b128 = new B128(999999999); - ArrayList list = new ArrayList(); - list.add(9); - list.add(9); - list.add(9); - list.add(9); - list.add(9); - list.add(9); - list.add(9); - list.add(9); - list.add(9); - assertThat(b128.splitSingleDigitsList(), is(list)); - } - - @Test - public void makeTwoDimensionalArrayで100を1桁ずつ区切ったリストから3要素ずつのリストに区切った二次元リストを作る() { - B128 b128 = new B128(100); - ArrayList> expected = new ArrayList>(); - ArrayList actual = new ArrayList(); - actual.add(1); - actual.add(0); - actual.add(0); - expected.add(actual); - assertThat(b128.makeTwoDimensionalArray(actual), is(expected)); - } - - @Test - public void makeTwoDimensionalArrayで987654を1桁ずつ区切ったリストから3要素ずつのリストに区切った二次元リストを作る() { - B128 b128 = new B128(987654); - ArrayList> expected = new ArrayList>(); - ArrayList actual = new ArrayList(); - ArrayList list_1 = new ArrayList(); - ArrayList list_2 = new ArrayList(); - list_1.add(9); - actual.add(9); - list_1.add(8); - actual.add(8); - list_1.add(7); - actual.add(7); - list_2.add(6); - actual.add(6); - list_2.add(5); - actual.add(5); - list_2.add(4); - actual.add(4); - expected.add(list_1); - expected.add(list_2); - assertThat(b128.makeTwoDimensionalArray(actual), is(expected)); - } - - @Test - public void makeTwoDimensionalArrayで999999999を1桁ずつ区切ったリストから3要素ずつのリストに区切った二次元リストを作る() { - B128 b128 = new B128(999999999); - ArrayList> expected = new ArrayList>(); - ArrayList actual = new ArrayList(); - ArrayList list_1 = new ArrayList(); - ArrayList list_2 = new ArrayList(); - ArrayList list_3 = new ArrayList(); - list_1.add(9); - actual.add(9); - list_1.add(9); - actual.add(9); - list_1.add(9); - actual.add(9); - list_2.add(9); - actual.add(9); - list_2.add(9); - actual.add(9); - list_2.add(9); - actual.add(9); - list_3.add(9); - actual.add(9); - list_3.add(9); - actual.add(9); - list_3.add(9); - actual.add(9); - expected.add(list_1); - expected.add(list_2); - expected.add(list_3); - assertThat(b128.makeTwoDimensionalArray(actual), is(expected)); - } - - @Test - public void makeBarcodeから100のバーコードを取得する() { - B128 b128 = new B128(128); - ArrayList> actual = new ArrayList>(); - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(8); - actual.add(list); - assertThat(b128.makeBarcode(actual), is("#..##.###" + NEW_LINE - + "......###" + NEW_LINE + "......##." + NEW_LINE)); - } - - @Test - public void makeBarcodeから987654のバーコードを取得する() { - B128 b128 = new B128(987654); - ArrayList> actual = new ArrayList>(); - ArrayList list_1 = new ArrayList(); - ArrayList list_2 = new ArrayList(); - list_1.add(9); - list_1.add(8); - list_1.add(7); - list_2.add(6); - list_2.add(5); - list_2.add(4); - actual.add(list_1); - actual.add(list_2); - assertThat(b128.makeBarcode(actual), is( - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#####.#.." + NEW_LINE + - "#########" + NEW_LINE + - "#####.#.." + NEW_LINE + - "........." + NEW_LINE)); - } - +public class BarcodeTest { + private static final String NEW_LINE = System.getProperty("line.separator"); // 改行コード + @Test - public void makeBarcodeから999999999のバーコードを取得する() { - B128 b128 = new B128(999999999); - ArrayList> actual = new ArrayList>(); - ArrayList list_1 = new ArrayList(); - ArrayList list_2 = new ArrayList(); - ArrayList list_3 = new ArrayList(); - list_1.add(9); - list_1.add(9); - list_1.add(9); - list_2.add(9); - list_2.add(9); - list_2.add(9); - list_3.add(9); - list_3.add(9); - list_3.add(9); - actual.add(list_1); - actual.add(list_2); - actual.add(list_3); - assertThat(b128.makeBarcode(actual), is( - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE + - "#########" + NEW_LINE)); + public void makebarcodeで3桁の数字_100_のバーコードを取得する() { + final Barcode barcode = new Barcode(100); + final String actual = barcode.makeBarcode(); + final String expected = "#........" + NEW_LINE + + "........." + NEW_LINE + + "........." + NEW_LINE; + assertThat(actual, is(expected)); + } + + @Test + public void makebarcodeで6桁の数字_123456_のバーコードを取得する() { + final Barcode barcode = new Barcode(123456); + final String actual = barcode.makeBarcode(); + final String expected = "#..##.###" + NEW_LINE + + "........." + NEW_LINE + + "........." + NEW_LINE + + "#########" + NEW_LINE + + "#..##.###" + NEW_LINE + + "........." + NEW_LINE; + assertThat(actual, is(expected)); + } + + @Test + public void makebarcodeで9桁の数字_999999999_のバーコードを取得する() { + final Barcode barcode = new Barcode(999999999); + final String actual = barcode.makeBarcode(); + final String expected = "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE; + assertThat(actual, is(expected)); } + } diff --git a/dseki/paiza/test/OneDigitBarcodeTest.java b/dseki/paiza/test/OneDigitBarcodeTest.java new file mode 100644 index 0000000..93f9c88 --- /dev/null +++ b/dseki/paiza/test/OneDigitBarcodeTest.java @@ -0,0 +1,23 @@ +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import org.junit.Test; + +public class OneDigitBarcodeTest { + + @Test + public void makeOneDigitBarcodeで0のバーコードを文字列で取得() { + final OneDigitBarcode oneDigitBarcode = new OneDigitBarcode(); + final String actual = oneDigitBarcode.makeOneDigitBarcode("0"); + final String expected = ("........."); + assertThat(actual, is(expected)); + } + + @Test + public void makeOneDigitBarcodeで9のバーコードを文字列で取得() { + final OneDigitBarcode oneDigitBarcode = new OneDigitBarcode(); + final String actual = oneDigitBarcode.makeOneDigitBarcode("9"); + final String expected = ("#########"); + assertThat(actual, is(expected)); + } + +} diff --git a/dseki/paiza/test/ThreeDigitsBarcodeTest.java b/dseki/paiza/test/ThreeDigitsBarcodeTest.java new file mode 100644 index 0000000..d4769a7 --- /dev/null +++ b/dseki/paiza/test/ThreeDigitsBarcodeTest.java @@ -0,0 +1,28 @@ +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import org.junit.Test; + +public class ThreeDigitsBarcodeTest { + private static final String NEW_LINE = System.getProperty("line.separator"); // 改行コード + + @Test + public void getThreeDigitsBarcodeで3桁の数字_100_のバーコードを取得する() { + final ThreeDigitsBarcode threeDigitsBarcode = new ThreeDigitsBarcode(); + final String actual = threeDigitsBarcode.getThreeDigitsBarcode("100"); + final String expected = "#........" + NEW_LINE + + "........." + NEW_LINE + + "........." + NEW_LINE; + assertThat(actual, is(expected)); + } + + @Test + public void getThreeDigitsBarcodeで3桁の数字_999_のバーコードを取得する() { + final ThreeDigitsBarcode threeDigitsBarcode = new ThreeDigitsBarcode(); + final String actual = threeDigitsBarcode.getThreeDigitsBarcode("999"); + final String expected = "#########" + NEW_LINE + + "#########" + NEW_LINE + + "#########" + NEW_LINE; + assertThat(actual, is(expected)); + } + +} -- GitLab From 0333f5f9a7f680ed7312245ba8f28f7c2fa16c34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=96=A2=20=E5=A4=A7=E8=BC=9D?= Date: Thu, 13 Jul 2023 14:50:56 +0900 Subject: [PATCH 4/4] =?UTF-8?q?paiza=20B128=20=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dseki/paiza/src/Barcode.java | 16 ++++------------ dseki/paiza/src/OneDigitBarcode.java | 6 +++--- dseki/paiza/src/ThreeDigitsBarcode.java | 8 ++++---- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/dseki/paiza/src/Barcode.java b/dseki/paiza/src/Barcode.java index 6604fe2..7245971 100644 --- a/dseki/paiza/src/Barcode.java +++ b/dseki/paiza/src/Barcode.java @@ -7,8 +7,7 @@ import java.util.Scanner; */ public class Barcode { private static final int NUMBER_THAT_CAN_BE_OUTPUT_IN_ONE_LINE = 3; // 1行に表せる数値の数 - final int numberOfCharactersRepresentingOneDigits = 9; - final int inputNumber; // 読み込む数値 + private final int inputNumber; // 読み込む数値 Barcode(final int inputNumber) { this.inputNumber = inputNumber; @@ -20,19 +19,12 @@ public class Barcode { public static void main(final String[] args) { final Scanner sc = new Scanner(System.in); final int inputNumber = sc.nextInt(); - final Barcode b128 = new Barcode(inputNumber); - b128.outputBarcode(); + final Barcode barcode = new Barcode(inputNumber); + final String outputBarcode = barcode.makeBarcode(); + System.out.println(outputBarcode); sc.close(); } - /** - * バーコードを出力するクラス. - */ - public void outputBarcode() { - final String barcode = makeBarcode(); - System.out.println(barcode); - } - /** * バーコードを最小1行3列から最大3行3列まで作成するメソッド. * diff --git a/dseki/paiza/src/OneDigitBarcode.java b/dseki/paiza/src/OneDigitBarcode.java index 4d09511..4af5811 100644 --- a/dseki/paiza/src/OneDigitBarcode.java +++ b/dseki/paiza/src/OneDigitBarcode.java @@ -3,9 +3,9 @@ * 1つのバーコードを表すクラス. */ public class OneDigitBarcode { - final int numberOfCaractersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 - final String mainMark = "#"; // メインのマーク(この数で数値が決まる) - final String subMark = "."; // サブのマーク(残りのマスを埋めるためだけにある) + private final int numberOfCaractersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 + private final String mainMark = "#"; // メインのマーク(この数で数値が決まる) + private final String subMark = "."; // サブのマーク(残りのマスを埋めるためだけにある) /** * 数字1桁のバーコードを文字列として作成するメソッド. diff --git a/dseki/paiza/src/ThreeDigitsBarcode.java b/dseki/paiza/src/ThreeDigitsBarcode.java index 521ddf9..dbc13df 100644 --- a/dseki/paiza/src/ThreeDigitsBarcode.java +++ b/dseki/paiza/src/ThreeDigitsBarcode.java @@ -8,8 +8,8 @@ import java.util.List; public class ThreeDigitsBarcode { private static final int ONE_SIDE_OF_BARCODE_REPRESENTED_BY_NUMBER = 3; // 1つの値を表すバーコードの1辺の長さ private static final String NEW_LINE = System.getProperty("line.separator"); // 改行コード - final int numberOfCharactersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 - OneDigitBarcode oneDigitBarcode = new OneDigitBarcode(); + private final int numberOfCharactersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 + private final OneDigitBarcode oneDigitBarcode = new OneDigitBarcode(); /** * 1行(数字3桁)分のバーコードを取得するメソッド. @@ -52,8 +52,8 @@ public class ThreeDigitsBarcode { private List oneRowListOfBarcodes(final String number) { final List oneRowListOfBarcodes = new ArrayList(); for (int i = 0; i < separateByDigits(number).size(); i++) { - final String indexToGet = separateByDigits(number).get(i); - oneRowListOfBarcodes.add(oneDigitBarcode.makeOneDigitBarcode(indexToGet)); + final String valueToBeBarcoded = separateByDigits(number).get(i); + oneRowListOfBarcodes.add(oneDigitBarcode.makeOneDigitBarcode(valueToBeBarcoded)); } return oneRowListOfBarcodes; } -- GitLab