diff --git a/sitou/src/B032.java b/sitou/src/B032.java new file mode 100644 index 0000000000000000000000000000000000000000..9e077af8d8c47d3050daa784d016b0c9fb8ebb95 --- /dev/null +++ b/sitou/src/B032.java @@ -0,0 +1,48 @@ +package src; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public class B032 { + private final static int SOROBANHEIGHT = 8; + private static int sorobanLength; + private final static String[] addendOfSoroban1 = new String[SOROBANHEIGHT]; + private final static String[] addendOfSoroban2 = new String[SOROBANHEIGHT]; + private PrintStream out; + + public B032(InputStream in, PrintStream out) { + final Scanner scan = new Scanner(in); + + try { + sorobanLength = scan.nextInt(); + for (int i = 0; i < SOROBANHEIGHT; i++) { + addendOfSoroban1[i] = scan.next(); + } + for (int i = 0; i < SOROBANHEIGHT; i++) { + addendOfSoroban2[i] = scan.next(); + } + + } finally { + scan.close(); + } + this.out = out; + } + + public static void main(String[] args) { + final B032 b032 = new B032(System.in, System.out); + String[] result = b032.execute(); + b032.output(result); + } + + public String[] execute() { + Calculate calculate = new Calculate(sorobanLength, addendOfSoroban1, addendOfSoroban2); + return calculate.add(); + } + + public void output(final String[] result) { + for (String row : result) { + out.println(row); + } + } +} diff --git a/sitou/src/Calculate.java b/sitou/src/Calculate.java new file mode 100644 index 0000000000000000000000000000000000000000..a015e5e1e9a06d917d90eaa80b08aabb54e68487 --- /dev/null +++ b/sitou/src/Calculate.java @@ -0,0 +1,88 @@ +package src; + +import java.util.ArrayList; +import java.util.List; + +public class Calculate { + private final int SOROBANHEIGHT = 8; + private final int sorobanLength; + private final String[] addendOfSoroban1; + private final String[] addendOfSoroban2; + + public Calculate(int sorobanLength, String[] addendOfSoroban1, String[] addendOfSoroban2) { + this.sorobanLength = sorobanLength; + this.addendOfSoroban1 = addendOfSoroban1; + this.addendOfSoroban2 = addendOfSoroban2; + } + + /** + * 入力したデータの加算処理. + * + * @return 計算結果(そろばん表示) + */ + public String[] add() { + + int[] addend1 = sorobanToNumber(addendOfSoroban1); + int[] addend2 = sorobanToNumber(addendOfSoroban2); + List sumResult = new ArrayList<>(); + int carry = 0; + + // 1の位から順に加算する + // addend1とaddend2の同じ位の数を足して、sumの同じ位に入れる + // 繰り上げはcarryに入れる + for (int digit = sorobanLength - 1; digit >= 0; digit--) { + int tempSum = addend1[digit] + addend2[digit] + carry; + sumResult.add(0, tempSum % 10); + carry = tempSum / 10; + + // 一番大きい位で繰り上がるとき + if (digit == 0 && carry != 0) { + sumResult.add(0, carry); + } + } + + return numberToSoroban(sumResult); + } + + /** + * そろばん表示を数字にする. + * + * @param soroban そろばん表示 + * @return 受け取ったそろばん表示に該当する数字 + */ + public int[] sorobanToNumber(final String[] soroban) { + int[] number = new int[soroban[0].length()]; + for (int digit = 0; digit < soroban[0].length(); digit++) { + String beads = ""; + for (int i = 0; i < SOROBANHEIGHT; i++) { + beads += soroban[i].charAt(digit); + } + SorobanNum sorobanNum = SorobanNum.getByBeads(beads); + number[digit] = sorobanNum.getNum(); + } + + return number; + } + + /** + * 数字をそろばん表示にする. + * + * @param number 数字 + * @return 受け取った数字に該当するそろばん表示 + */ + public String[] numberToSoroban(final List number) { + String[] soroban = new String[SOROBANHEIGHT]; + for (int i = 0; i < SOROBANHEIGHT; i++) { + soroban[i] = ""; + } + + for (Integer n : number) { + SorobanNum sorobanNum = SorobanNum.getByNum(n); + String beads = sorobanNum.getBeads(); + for (int i = 0; i < SOROBANHEIGHT; i++) { + soroban[i] += beads.charAt(i); + } + } + return soroban; + } +} diff --git a/sitou/src/SorobanNum.java b/sitou/src/SorobanNum.java new file mode 100644 index 0000000000000000000000000000000000000000..a1ace93c8c74d3854c45208cf37cbcc6f58f9a3b --- /dev/null +++ b/sitou/src/SorobanNum.java @@ -0,0 +1,48 @@ +package src; + +public enum SorobanNum { + ZERO(0, "*|=|****"), + ONE(1, "*|=*|***"), + TWO(2, "*|=**|**"), + THREE(3, "*|=***|*"), + FOUR(4, "*|=****|"), + FIVE(5, "|*=|****"), + SIX(6, "|*=*|***"), + SEVEN(7, "|*=**|**"), + EIGHT(8, "|*=***|*"), + NINE(9, "|*=****|"); + + private final int num; + private final String beads; + + private SorobanNum(int num, String beads) { + this.num = num; + this.beads = beads; + } + + public int getNum() { + return num; + } + + public String getBeads() { + return beads; + } + + public static SorobanNum getByNum(final int num) { + for (SorobanNum sorobanNum : SorobanNum.values()) { + if (sorobanNum.getNum() == num) { + return sorobanNum; + } + } + return null; + } + + public static SorobanNum getByBeads(final String beads) { + for (SorobanNum sorobanNum : SorobanNum.values()) { + if (sorobanNum.getBeads().equals(beads)) { + return sorobanNum; + } + } + return null; + } +} diff --git a/sitou/test/B032_Test.java b/sitou/test/B032_Test.java new file mode 100644 index 0000000000000000000000000000000000000000..91a02c55e0fe28ca73e55461d1d00df45985f5a1 --- /dev/null +++ b/sitou/test/B032_Test.java @@ -0,0 +1,90 @@ +package test; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.PrintStream; +import org.junit.Test; +import src.B032; +import src.Calculate; + +public class B032_Test { + @Test + public void 入力されたそろばん表示の文字を計算処理して正しい結果をそろばん表示で出力できる() throws CloneNotSupportedException { + final InputStream is = new ByteArrayInputStream(("6\n" + +"**|***\n" + +"||*|||\n" + +"======\n" + +"*|*|*|\n" + +"****|*\n" + +"******\n" + +"**|***\n" + +"|*****\n" + +"**|***\n" + +"||*|||\n" + +"======\n" + +"||*|*|\n" + +"****|*\n" + +"******\n" + +"**|***\n" + +"******").getBytes()); + + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final PrintStream ps = new PrintStream(baos); + + final B032 b032 = new B032(is, ps); + final String[] result = b032.execute(); + b032.output(result); + + final String actual = baos.toString(); + assertEquals("**|***" + System.lineSeparator() + + "||*|||" + System.lineSeparator() + + "======" + System.lineSeparator() + + "***|*|" + System.lineSeparator() + + "*||***" + System.lineSeparator() + + "****|*" + System.lineSeparator() + + "******" + System.lineSeparator() + + "|*****" + System.lineSeparator(), actual); + } + + @Test + public void executeメソッドで一番大きい位が繰り上がる計算した結果を正しくそろばん表示で返す(){ + int digitsNum = 3; + String[] s1 = new String[] {"|||" ,"***", "===", "***", "***", "***", "***", "|||"}; + String[] s2 = new String[] {"|||" ,"***", "===", "***", "***", "***", "***", "|||"}; + + Calculate c = new Calculate(digitsNum, s1, s2); + String[] actual = c.add(); + + assertThat(actual, arrayContaining("*|||" + , "|***" + , "====" + , "****" + , "|***" + , "****" + , "***|" + , "*||*")); + } + + @Test + public void executeメソッドで一番大きい位が繰り上がらない計算した結果を正しくそろばん表示で返す(){ + int digitsNum = 3; + String[] s1 = new String[] {"***", "|||", "===", "***", "***", "***", "***", "|||"}; + String[] s2 = new String[] {"***", "|||", "===", "***", "***", "***", "***", "|||"}; + + Calculate c = new Calculate(digitsNum, s1, s2); + String[] actual = c.add(); + + assertThat(actual, arrayContaining("|||" + , "***" + , "===" + , "***" + , "***" + , "***" + , "|||" + , "***")); + } + +}