diff --git a/syamauchi/src/C068.java b/syamauchi/src/C068.java new file mode 100644 index 0000000000000000000000000000000000000000..53f0dbc23bb823a49635c54c5ede4b1fc3eda3bc --- /dev/null +++ b/syamauchi/src/C068.java @@ -0,0 +1,81 @@ +package src; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class C068 { + + // 復号するときに使う文字列 + static String[] ALPHABET = { + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", "Y", "Z" + }; + + // アルファベットの数 + static int ALPHABET_NUMBER = 26; + + public static void main(String[] args) { + final Scanner sc = new Scanner(System.in); + + final C068 decrypted = new C068(); + System.out.println(decrypted.decodeLetter(sc.nextInt(), sc.next())); + sc.close(); + } + + // 解読した文章を出力 + public String decodeLetter(final int decodeNumber, final String codeString) { + final String[] encryptedText = codeString.split(""); + final String decryptedText = decode(decodeNumber, encryptedText); + return decryptedText; + } + + // 解読 + public String decode(final int decodeNumber, final String[] code) { + final StringBuilder decrypedText = new StringBuilder(); + final List alphabetList = Arrays.asList(ALPHABET); + for (int i = 0; i < code.length; i++) { + final int codeNumber = alphabetList.indexOf(code[i]); + // 配列のインデックスが0or偶数の時は逆方向にずらす + if (i % 2 == 0) { + decrypedText.append(reverceShiftCode(codeNumber, decodeNumber)); + // インデックスが奇数の時は順方向にずらす + } else { + decrypedText.append(shiftCode(codeNumber, decodeNumber)); + } + } + return decrypedText.toString(); + } + + // 順方向に文字をずらす + public String shiftCode(final int codeNumber, final int decodeNumber) { + // decodeNumber分文字をずらしたときのインデックス番号 + final int corresponceNumber = codeNumber + decodeNumber; + final int number; + // 対応表の要素数より多い場合 + if (corresponceNumber >= ALPHABET_NUMBER) { + number = corresponceNumber - ALPHABET_NUMBER; + return ALPHABET[number]; + + } else { + number = corresponceNumber; + return ALPHABET[number]; + } + } + + // 逆方向に文字をずらす + public String reverceShiftCode(final int codeNumber, final int decodeNumber) { + // decodeNumber分文字をずらしたときのインデックス番号 + final int corresponceNumber = codeNumber - decodeNumber; + final int number; + // インデックスがマイナスになってしまう場合 + if (corresponceNumber < 0) { + number = ALPHABET_NUMBER + corresponceNumber; + return ALPHABET[number]; + } else { + number = corresponceNumber; + return ALPHABET[number]; + } + } + +} diff --git a/syamauchi/test/C068Test.java b/syamauchi/test/C068Test.java new file mode 100644 index 0000000000000000000000000000000000000000..06fb63a20f71c9c09cbc51a4d9636baacf5ebcc5 --- /dev/null +++ b/syamauchi/test/C068Test.java @@ -0,0 +1,62 @@ +package test; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; +import org.junit.Test; +import src.C068; + +public class C068Test { + + @Test + public void decodeで文字の解読ができるテスト() { + final C068 sut = new C068(); + final String actual = sut.decodeLetter(4, "QEPG"); + final String expected = "MILK"; + assertThat(actual, is(expected)); + } + + // 1 <= decodeNumber <= 25 + @Test + public void decodeNumberが1の時のテスト() { + final C068 sut = new C068(); + final String actual = sut.decodeLetter(1, "QEPG"); + final String expected = "PFOH"; + assertThat(actual, is(expected)); + } + + @Test + public void decodeNumberが25の時のテスト() { + final C068 sut = new C068(); + final String actual = sut.decodeLetter(25, "QEPG"); + final String expected = "RDQF"; + assertThat(actual, is(expected)); + } + + // 1<= codeString.length <= 500 + @Test + public void codeStringの長さが1の時のテスト() { + final C068 sut = new C068(); + final String actual = sut.decodeLetter(4, "Q"); + final String expected = "M"; + assertThat(actual, is(expected)); + } + + @Test + public void codeStringの長さが500の時のテスト() { + String str = ""; + String exstr = ""; + for (int i = 0; i < 500; i++) { + str += "A"; + if (i == 0 || i % 2 == 0) { + exstr += "Z"; + } else { + exstr += "B"; + } + } + + final C068 sut = new C068(); + final String actual = sut.decodeLetter(1, str); + final String expected = exstr; + assertThat(actual, is(expected)); + } +}