diff --git a/kkanazawa/src/TwoDimensionBarcodeConverter.java b/kkanazawa/src/TwoDimensionBarcodeConverter.java new file mode 100644 index 0000000000000000000000000000000000000000..43fbd518a41bf3c2ff0bf7bdded4636f530deb28 --- /dev/null +++ b/kkanazawa/src/TwoDimensionBarcodeConverter.java @@ -0,0 +1,158 @@ +package paiza.src; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Scanner; +/** + * 受け取った数字を二次元の簡易バーコードに変換して出力する + * + * @author 金澤継心 + */ +public class TwoDimensionBarcodeConverter { + //入力値を一桁ごとに分ける際に使用 + final static int DIVISOR = 10; + + public static void main(final String[] args) { + + final int inputNumber = inputNumber(); + + final List allNumber = divideThreeEach(inputNumber); + + for (ThreeNumbers threeNum : allNumber) { + threeNum.outputDecodeResult(); + } + } + /** + * 整数値を入力して返す + * 整数の入力は以下の条件を満たす + * ・100 ≦ N ≦ 999,999,999 + * ・(N の桁数) = 3 の倍数 + */ + public static int inputNumber() { + int inputNum = 0; + + try(Scanner scanner = new Scanner(System.in)){ + inputNum = scanner.nextInt(); + }catch(Exception e) { + System.out.println("エラー発生"); + } + return inputNum; + } + /** + * 引数の整数値を1桁ごとに分け、それを三つずつまとめたリストを返す + * + * @param inputNumber 入力された整数値 + */ + public static List divideThreeEach(final int inputNumber){ + final List splitNum = divideOneEach(inputNumber); + List allNumbers = new ArrayList<>(); + + //一桁ごとに分けられた数字を3つずつにまとめてリストに格納 + for (int count = 0; count < splitNum.size(); count += 2) { + ThreeNumbers three = new ThreeNumbers(splitNum.get(count),splitNum.get(count+1),splitNum.get(count+2)); + allNumbers.add(three); + count++; + } + return allNumbers; + } + /** + * 引数の整数値を一桁ごとに分けてリストとして返す + * + * @param inputNumber 入力された整数値 + */ + public static List divideOneEach(final int inputNumber){ + int originNumber = inputNumber; + List splitNum = new ArrayList<>(); + while (originNumber > 0) { + splitNum.add(originNumber % DIVISOR); + originNumber /= DIVISOR; + } + Collections.reverse(splitNum); + + return splitNum; + } +} + +/** + * 入力値において並んだ三つの桁の値を保存するクラス + * + */ +class ThreeNumbers { + private int leftNumber; + private int centerNumber; + private int rightNumber; + + public ThreeNumbers(int leftNumber, int centerNumber, int rightNumber) { + this.leftNumber = leftNumber; + this.centerNumber = centerNumber; + this.rightNumber = rightNumber; + } + + public int getLeftNumber() { + return leftNumber; + } + + public int getCenterNumber() { + return centerNumber; + } + + public int getRightNumber() { + return rightNumber; + } + + public void outputDecodeResult() { + for(StringBuilder decodeNum : decodeThreeNum()) { + System.out.println(decodeNum); + } + } + /** + * 三つの数を二次元バーコードに変換して返す. + * decodeNum()で一つ一つの数字をバーコードに変換した後、 + * それらを横並びにつなげる + * + */ + public List decodeThreeNum() { + List leftDecode = decodeSingleNum(leftNumber); + List centerDecode = decodeSingleNum(centerNumber); + List rightDecode = decodeSingleNum(rightNumber); + + List decodedThreeNum = new ArrayList<>(); + //左、中央、右の数のバーコードを表す文字列で + //同じcount行目の文字列をつなげる + for (int count = 0; count < 3; count++) { + StringBuilder row = new StringBuilder(); + row.append(leftDecode.get(count)); + row.append(centerDecode.get(count)); + row.append(rightDecode.get(count)); + decodedThreeNum.add(row); + } + return decodedThreeNum; + } + /** + * 一つの数字を二次元バーコードに変換して返す. + * 二次元バーコードを三行の文字列として扱う. + */ + public List decodeSingleNum(final int number) { + int num = number; + //decodedNumに1行目、2行目、3行目の文字列をそれぞれ入れる + List decodedNum = new ArrayList<>(); + //上から1行目、2行目、3行目の順に文字列を作成 + for (int rowindex = 0; rowindex < 3; rowindex++) { + //rowに1行分の文字列を入れる + StringBuilder row = new StringBuilder(); + //1行文の文字列を作成 + for (int columnIndex = 0; columnIndex < 3; columnIndex++) { + if (0 < num) { + row.append("#"); + } else { + row.append("."); + } + num--; + } + decodedNum.add(row); + } + return decodedNum; + } + +}