diff --git a/kkanazawa/src/AlphabetAddition.java b/kkanazawa/src/AlphabetAddition.java new file mode 100644 index 0000000000000000000000000000000000000000..b9b215817736eb131b54473828eff8025bb1d4d6 --- /dev/null +++ b/kkanazawa/src/AlphabetAddition.java @@ -0,0 +1,218 @@ +package paiza.src; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Scanner; + +public class AlphabetAddition { + + public static void main(final String[] args) { + + // 入力処理 + final AlphabetPair alphabetPair = AlphabetIO.inputVal(); + + // 入力値の和の計算&計算結果の出力処理 + System.out.println(alphabetPair.calcTotal()); + + } +} + + +/** + * 入力処理、出力処理を行うクラス + * + */ +final class AlphabetIO { + + // 二つのアルファベットの値を入力し、それらをまとめるadditioValクラスとして返す + public static AlphabetPair inputVal() { + String firstVal = new String(); + String secondVal = new String(); + + // 入力処理 + try (Scanner scanner = new Scanner(System.in)) { + firstVal = scanner.next(); + secondVal = scanner.next(); + } catch (NoSuchElementException e) { + throw new NoSuchElementException("エラー:入力値がありません"); + + } + + // 入力値が単一の"A"でないなら、一文字目は"A"でないことを確認 + if (isIncorrectValue(firstVal) || isIncorrectValue(secondVal)) { + System.out.println("不正な値です"); + } + + final AlphabetPair additionNum = new AlphabetPair(firstVal, secondVal); + return additionNum; + } + + // 入力値が適切な値か判定するメソッド + // 適切な値は「入力値が単一の"A"でないなら、一文字目は"A"でない」を満たす + public static boolean isIncorrectValue(final String val) { + if (val.equals("A")) { + return false; + } else { + return val.split("")[0].equals("A"); + } + } + +} + + +/** + * アルファベットのペアの和をとるクラス + * + */ +final class AlphabetPair { + private final String firstVal; + private final String secondVal; + + public AlphabetPair(final String firstNum, final String secondNum) { + this.firstVal = new String(firstNum); + this.secondVal = new String(secondNum); + } + + public String getFirstVal() { + return firstVal; + } + + public String getSecondVal() { + return secondVal; + } + + // 二つのアルファベットの値を一度10進数に変換して和をとった後、再びアルファベットに直して返す + public String calcTotal() { + AlphabetToNum firstFix = new AlphabetToNum(firstVal); + AlphabetToNum secondFix = new AlphabetToNum(secondVal); + + // 10進数に変換した値の和をとる + final long decimalSum = firstFix.getDecimalNum() + secondFix.getDecimalNum(); + + // 10進数の和の値をアルファベットに変換して返す + return new NumToAlphabet(decimalSum).getAlphabetVal(); + } + +} + + +final class FixMap { + // アルファベットから5進数への対応 + public final static Map quinaryFix = new HashMap<>() { + { + put("A", 0); + put("B", 1); + put("C", 2); + put("D", 3); + put("E", 4); + } + }; + + // 5進数からアルファベットへの対応 + public final static Map AlphabetFix = new HashMap<>() { + { + put("0", "A"); + put("1", "B"); + put("2", "C"); + put("3", "D"); + put("4", "E"); + } + }; +} + + +/** + * アルファベットから10進数に変換するクラス + * + */ +final class AlphabetToNum { + + // 5進数を10進数に変換する際に使用する基数 + static final int FUND_NUM = 5; + private final String AlphabetVal; + private final long quinaryNum; + private final long decimalNum; + + public AlphabetToNum(final String AlphabetNum) { + this.AlphabetVal = AlphabetNum; + this.quinaryNum = alphabetToQuinary(AlphabetVal); + this.decimalNum = quinaryToDecimal(quinaryNum); + } + + public long getDecimalNum() { + return decimalNum; + } + + // アルファベットを5進数に変換して返す + public long alphabetToQuinary(String AlphabetVal) { + long quinaryNum = 0; + String[] firstSplit = AlphabetVal.split(""); + // 桁数のカウント + long digitsCount = firstSplit.length - 1; + + // アルファベットに対応する5進数を桁の大きい方から順に変換 + for (String str : firstSplit) { + quinaryNum += FixMap.quinaryFix.get(str) * (long) Math.pow(10, digitsCount); + digitsCount--; + } + return quinaryNum; + } + + // 5進数から10進数に変換して返す + public long quinaryToDecimal(long quinaryNum) { + String numStr = String.valueOf(quinaryNum); + long decimalNum = Long.parseLong(numStr, FUND_NUM); + return decimalNum; + } + +} + + +/** + * 10進数からアルファベットに変換するクラス + * + */ +final class NumToAlphabet { + + // 10進数を5進数に変換する際に使用する基数 + static final int FUND_NUM = 5; + private final long decimalNum; + private final long quinaryNum; + private final String AlphabetVal; + + public NumToAlphabet(final long decimalNum) { + this.decimalNum = decimalNum; + this.quinaryNum = decimalToQuinary(this.decimalNum); + this.AlphabetVal = quinaryToAlphabet(quinaryNum); + } + + public String getAlphabetVal() { + return AlphabetVal; + } + + // 10進数を5進数に変換して返す + public long decimalToQuinary(long decinalNum) { + long quinaryNum = Long.parseLong(Long.toString(decimalNum, FUND_NUM)); + + return quinaryNum; + } + + // 5進数をアルファベットに変換して返す + public String quinaryToAlphabet(long quinaryNum) { + + String numStr = String.valueOf(quinaryNum); + List splitAlphabet = new ArrayList<>(); + + // 文字列型にした5進数をsplit()で1つずつに分け、順番にアルファベットに変換 + for (String str : numStr.split("")) { + splitAlphabet.add(FixMap.AlphabetFix.get(str)); + } + // 変換したアルファベットのリストを文字列に結合 + String AlphabetVal = String.join("", splitAlphabet); + return AlphabetVal; + } + +} diff --git a/kkanazawa/test/AlphabetAdditionTest.java b/kkanazawa/test/AlphabetAdditionTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3d9bca1a5809a70b01b683eca78bb1953c664367 --- /dev/null +++ b/kkanazawa/test/AlphabetAdditionTest.java @@ -0,0 +1,194 @@ +package paiza.src; + +import static org.junit.Assert.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.util.NoSuchElementException; +import org.junit.Before; +import org.junit.Test; + +// @RunWith(Enclosed.class) +public class AlphabetAdditionTest { + + public static class AlphabetIOTest { + AlphabetIO alphabetIO; + + @Before + public void setUp() { + alphabetIO = new AlphabetIO(); + + } + + String firstInput = "BEE"; + String secondInput = "CD"; + + @Test + public void BEEとCEが入力値のときinputValがBEEとCDが格納されたAdditionVal型のオブジェクトを返す() { + String input = "BEE CD"; + ByteArrayInputStream testInputStream = new ByteArrayInputStream(input + .getBytes(StandardCharsets.UTF_8)); + // System.in をテスト用のInputStreamに置き換える + System.setIn(testInputStream); + AlphabetPair expect = new AlphabetPair("BEE", "CD"); + AlphabetPair actual = AlphabetIO.inputVal(); + assertEquals(expect.getFirstVal(), actual.getFirstVal()); + assertEquals(expect.getSecondVal(), actual.getSecondVal()); + } + + @Test(expected = NoSuchElementException.class) + public void 何も入力されないとき入力値がない時のエラーを返す() { + String input = ""; + ByteArrayInputStream testInputStream = new ByteArrayInputStream(input + .getBytes(StandardCharsets.UTF_8)); + // System.in をテスト用のInputStreamに置き換える + System.setIn(testInputStream); + AlphabetIO.inputVal(); + } + + @Test + public void 入力値の1番目が単一のAでないかつ一文字目はAのとき不正な値であることを表示() { + String input = "ABB CD"; + String expected = "不正な値です" + + System.lineSeparator(); + ByteArrayInputStream testInputStream = new ByteArrayInputStream(input + .getBytes(StandardCharsets.UTF_8)); + // System.in をテスト用のInputStreamに置き換える + System.setIn(testInputStream); + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + AlphabetIO.inputVal(); + assertEquals(expected, out.toString()); + } + + @Test + public void 入力値の2番目が単一のAでないかつ一文字目はAのとき不正な値であることを表示() { + String input = "CBB AD"; + String expected = "不正な値です" + + System.lineSeparator(); + ByteArrayInputStream testInputStream = new ByteArrayInputStream(input + .getBytes(StandardCharsets.UTF_8)); + // System.in をテスト用のInputStreamに置き換える + System.setIn(testInputStream); + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + AlphabetIO.inputVal(); + assertEquals(expected, out.toString()); + } + + @Test + public void 入力値の両方が単一のAでないかつ一文字目はAのとき不正な値であることを表示() { + String input = "ABB AD"; + String expected = "不正な値です" + + System.lineSeparator(); + ByteArrayInputStream testInputStream = new ByteArrayInputStream(input + .getBytes(StandardCharsets.UTF_8)); + // System.in をテスト用のInputStreamに置き換える + System.setIn(testInputStream); + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + AlphabetIO.inputVal(); + assertEquals(expected, out.toString()); + } + + @Test + public void isIncorrectValueに単一のAを渡すとfalseを返す() { + String input = "A"; + boolean actual = AlphabetIO.isIncorrectValue(input); + assertEquals(false, actual); + } + + @Test + public void isIncorrectValueに一文字目がAではない文字列BBAを渡すとfalseを返す() { + String input = "BAA"; + boolean actual = AlphabetIO.isIncorrectValue(input); + assertEquals(false, actual); + } + + @Test + public void isIncorrectValueに一文字目がAである文字列ABBを渡すとtrueを返す() { + String input = "ABB"; + boolean actual = AlphabetIO.isIncorrectValue(input); + assertEquals(true, actual); + } + + } + + public static class AdditionValTest { + + AlphabetPair testPair; + + @Before + public void setUp() { + testPair = new AlphabetPair("BEE", "CD"); + + } + + @Test + public void BEEとCDがコンストラクタの引数のときalphabetSumがCCCを返す() { + + String expect = "CCC"; + assertEquals(expect, testPair.calcTotal()); + + } + + } + + public static class AlphabetToNumTest { + AlphabetToNum alphabet; + + @Before + public void seUp() { + alphabet = new AlphabetToNum("BEE"); + } + + @Test + public void 引数がBEEの時alphabetToQuinaryは5進数に変換した結果144を返す() { + final int expect = 144; + assertEquals(expect, alphabet.alphabetToQuinary("BEE")); + } + + @Test + public void 引数がAの時alphabetToQuinaryは5進数に変換した結果0を返す() { + final int expect = 0; + assertEquals(expect, alphabet.alphabetToQuinary("A")); + } + + @Test + public void 引数が144の時alphabetToQuinaryは5進数に変換した結果49を返す() { + final int expect = 49; + assertEquals(expect, alphabet.quinaryToDecimal(144)); + } + + } + + public static class NumToAlphabetTest { + NumToAlphabet num; + + @Before + public void seUp() { + num = new NumToAlphabet(62); + } + + @Test + public void 引数が62の時decimalToQuinaryは5進数に変換した結果222を返す() { + final int expect = 222; + assertEquals(expect, num.decimalToQuinary(62)); + } + + @Test + public void 引数が222の時quinaryToAlphabetは5進数からアルファベットに変換した結果CCCを返す() { + final String expect = "CCC"; + assertEquals(expect, num.quinaryToAlphabet(222)); + } + + @Test + public void 引数が0の時quinaryToAlphabetは5進数からアルファベットに変換した結果Aを返す() { + final String expect = "A"; + assertEquals(expect, num.quinaryToAlphabet(0)); + } + + } + +}