diff --git a/dseki/paiza/src/Barcode.java b/dseki/paiza/src/Barcode.java new file mode 100644 index 0000000000000000000000000000000000000000..72459713e881563220ca2341ac041de45a277de5 --- /dev/null +++ b/dseki/paiza/src/Barcode.java @@ -0,0 +1,61 @@ +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行に表せる数値の数 + private 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 barcode = new Barcode(inputNumber); + final String outputBarcode = barcode.makeBarcode(); + System.out.println(outputBarcode); + sc.close(); + } + + /** + * バーコードを最小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 0000000000000000000000000000000000000000..4af581109d571875eb932c22c3caa7357a966be8 --- /dev/null +++ b/dseki/paiza/src/OneDigitBarcode.java @@ -0,0 +1,31 @@ + +/** + * 1つのバーコードを表すクラス. + */ +public class OneDigitBarcode { + private final int numberOfCaractersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 + private final String mainMark = "#"; // メインのマーク(この数で数値が決まる) + private 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 0000000000000000000000000000000000000000..dbc13df83d7d60d12221bbbe8e0d413e8c22aa99 --- /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"); // 改行コード + private final int numberOfCharactersRepresentingOneDigits = 9; // 1桁分のバーコードを表す数 + private final 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 valueToBeBarcoded = separateByDigits(number).get(i); + oneRowListOfBarcodes.add(oneDigitBarcode.makeOneDigitBarcode(valueToBeBarcoded)); + } + 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/BarcodeTest.java b/dseki/paiza/test/BarcodeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f8971ae5961db980febde190928354aa082e14d8 --- /dev/null +++ b/dseki/paiza/test/BarcodeTest.java @@ -0,0 +1,47 @@ +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import org.junit.Test; + +public class BarcodeTest { + private static final String NEW_LINE = System.getProperty("line.separator"); // 改行コード + + @Test + 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 0000000000000000000000000000000000000000..93f9c88c916400880f5be078ab205e9bba0ad98f --- /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 0000000000000000000000000000000000000000..d4769a7dc4b3fb4c2adeb47e0caf678eebe2200a --- /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)); + } + +}