From 90331a12b5c04c4418bad70ff41b95741ee0aff0 Mon Sep 17 00:00:00 2001 From: syamauchi Date: Mon, 10 Jul 2023 15:25:26 +0900 Subject: [PATCH 1/2] =?UTF-8?q?C068=E5=9B=9E=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/C068.java | 88 ++++++++++++++++++++++++++++++++++++ syamauchi/test/C068Test.java | 62 +++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 syamauchi/src/C068.java create mode 100644 syamauchi/test/C068Test.java diff --git a/syamauchi/src/C068.java b/syamauchi/src/C068.java new file mode 100644 index 0000000..40d6724 --- /dev/null +++ b/syamauchi/src/C068.java @@ -0,0 +1,88 @@ +package src; + +import java.util.Arrays; +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); + + new C068().decodeLetter(sc.nextInt(), sc.next()); + sc.close(); + } + + // 解読した手紙を出力 + public void decodeLetter(final int decodeNumber, final String codeString) { + String[] letter = codeString.split(""); + letter = decode(decodeNumber, letter); + for (String sentence : letter) { + System.out.print(sentence); + } + System.out.println(); + } + + // 解読 + public String[] decode(final int decodeNumber, final String[] code) { + + for (int i = 0; i < code.length; i++) { + final int codeNumber = Arrays.asList(ALPHABET).indexOf(code[i]); + // 配列のインデックスが0or偶数の時は逆方向にずらす + if (i == 0 || i % 2 == 0) { + code[i] = reverceShiftCode(codeNumber, decodeNumber); + // インデックスが奇数の時は順方向にずらす + } else { + code[i] = shiftCode(codeNumber, decodeNumber); + } + } + return code; + } + + // 順方向に文字をずらす + 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 Arrays.asList(ALPHABET).get(Number); + + } else { + Number = corresponceNumber; + return Arrays.asList(ALPHABET).get(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 Arrays.asList(ALPHABET).get(Number); + } else { + Number = corresponceNumber; + return Arrays.asList(ALPHABET).get(Number); + } + } + + // テスト用 + public String combinationString(final String[] code) { + String combCode = ""; + for (String sentence : code) { + combCode += sentence; + } + return combCode; + } + +} diff --git a/syamauchi/test/C068Test.java b/syamauchi/test/C068Test.java new file mode 100644 index 0000000..89f802e --- /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.combinationString(sut.decode(4, "QEPG".split(""))); + 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.combinationString(sut.decode(1, "QEPG".split(""))); + final String expected = "PFOH"; + assertThat(actual, is(expected)); + } + + @Test + public void decodeNumberが25の時のテスト() { + final C068 sut = new C068(); + final String actual = sut.combinationString(sut.decode(25, "QEPG".split(""))); + 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.combinationString(sut.decode(4, "Q".split(""))); + 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.combinationString(sut.decode(1, str.split(""))); + final String expected = exstr; + assertThat(actual, is(expected)); + } +} -- GitLab From e6ab2949640a92f7ef0db35fcccacd26a052873a Mon Sep 17 00:00:00 2001 From: syamauchi Date: Mon, 10 Jul 2023 17:12:23 +0900 Subject: [PATCH 2/2] =?UTF-8?q?C068=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syamauchi/src/C068.java | 67 ++++++++++++++++-------------------- syamauchi/test/C068Test.java | 12 +++---- 2 files changed, 36 insertions(+), 43 deletions(-) diff --git a/syamauchi/src/C068.java b/syamauchi/src/C068.java index 40d6724..53f0dbc 100644 --- a/syamauchi/src/C068.java +++ b/syamauchi/src/C068.java @@ -1,63 +1,65 @@ 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); - new C068().decodeLetter(sc.nextInt(), sc.next()); + final C068 decrypted = new C068(); + System.out.println(decrypted.decodeLetter(sc.nextInt(), sc.next())); sc.close(); } - // 解読した手紙を出力 - public void decodeLetter(final int decodeNumber, final String codeString) { - String[] letter = codeString.split(""); - letter = decode(decodeNumber, letter); - for (String sentence : letter) { - System.out.print(sentence); - } - System.out.println(); + // 解読した文章を出力 + 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) { - + 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 = Arrays.asList(ALPHABET).indexOf(code[i]); + final int codeNumber = alphabetList.indexOf(code[i]); // 配列のインデックスが0or偶数の時は逆方向にずらす - if (i == 0 || i % 2 == 0) { - code[i] = reverceShiftCode(codeNumber, decodeNumber); + if (i % 2 == 0) { + decrypedText.append(reverceShiftCode(codeNumber, decodeNumber)); // インデックスが奇数の時は順方向にずらす } else { - code[i] = shiftCode(codeNumber, decodeNumber); + decrypedText.append(shiftCode(codeNumber, decodeNumber)); } } - return code; + return decrypedText.toString(); } // 順方向に文字をずらす public String shiftCode(final int codeNumber, final int decodeNumber) { // decodeNumber分文字をずらしたときのインデックス番号 final int corresponceNumber = codeNumber + decodeNumber; - final int Number; + final int number; // 対応表の要素数より多い場合 if (corresponceNumber >= ALPHABET_NUMBER) { - Number = corresponceNumber - ALPHABET_NUMBER; - return Arrays.asList(ALPHABET).get(Number); + number = corresponceNumber - ALPHABET_NUMBER; + return ALPHABET[number]; } else { - Number = corresponceNumber; - return Arrays.asList(ALPHABET).get(Number); + number = corresponceNumber; + return ALPHABET[number]; } } @@ -65,24 +67,15 @@ public class C068 { public String reverceShiftCode(final int codeNumber, final int decodeNumber) { // decodeNumber分文字をずらしたときのインデックス番号 final int corresponceNumber = codeNumber - decodeNumber; - final int Number; + final int number; // インデックスがマイナスになってしまう場合 if (corresponceNumber < 0) { - Number = ALPHABET_NUMBER + corresponceNumber; - return Arrays.asList(ALPHABET).get(Number); + number = ALPHABET_NUMBER + corresponceNumber; + return ALPHABET[number]; } else { - Number = corresponceNumber; - return Arrays.asList(ALPHABET).get(Number); - } - } - - // テスト用 - public String combinationString(final String[] code) { - String combCode = ""; - for (String sentence : code) { - combCode += sentence; + number = corresponceNumber; + return ALPHABET[number]; } - return combCode; } } diff --git a/syamauchi/test/C068Test.java b/syamauchi/test/C068Test.java index 89f802e..06fb63a 100644 --- a/syamauchi/test/C068Test.java +++ b/syamauchi/test/C068Test.java @@ -10,7 +10,7 @@ public class C068Test { @Test public void decodeで文字の解読ができるテスト() { final C068 sut = new C068(); - final String actual = sut.combinationString(sut.decode(4, "QEPG".split(""))); + final String actual = sut.decodeLetter(4, "QEPG"); final String expected = "MILK"; assertThat(actual, is(expected)); } @@ -19,7 +19,7 @@ public class C068Test { @Test public void decodeNumberが1の時のテスト() { final C068 sut = new C068(); - final String actual = sut.combinationString(sut.decode(1, "QEPG".split(""))); + final String actual = sut.decodeLetter(1, "QEPG"); final String expected = "PFOH"; assertThat(actual, is(expected)); } @@ -27,7 +27,7 @@ public class C068Test { @Test public void decodeNumberが25の時のテスト() { final C068 sut = new C068(); - final String actual = sut.combinationString(sut.decode(25, "QEPG".split(""))); + final String actual = sut.decodeLetter(25, "QEPG"); final String expected = "RDQF"; assertThat(actual, is(expected)); } @@ -36,7 +36,7 @@ public class C068Test { @Test public void codeStringの長さが1の時のテスト() { final C068 sut = new C068(); - final String actual = sut.combinationString(sut.decode(4, "Q".split(""))); + final String actual = sut.decodeLetter(4, "Q"); final String expected = "M"; assertThat(actual, is(expected)); } @@ -53,9 +53,9 @@ public class C068Test { exstr += "B"; } } - + final C068 sut = new C068(); - final String actual = sut.combinationString(sut.decode(1, str.split(""))); + final String actual = sut.decodeLetter(1, str); final String expected = exstr; assertThat(actual, is(expected)); } -- GitLab