定義一個簡單的莫斯密碼解碼器,將一串莫斯密碼轉換爲完整的句子,莫斯密碼中用一個空格分隔單個字符,3個空格分隔單詞,好比「···· · −·−− ·−−− ··− −·· ·」 解碼後爲「HEY JUDE」java
package com.codewars; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import java.util.HashMap; import java.util.Map; import org.junit.Test; public class MorseCodeTest { static class MorseCodeDecoder { private static Map<String, String> codeMap; static { codeMap = new HashMap<String, String>(); // 26個字母的莫爾斯電碼加密 codeMap.put("A", ".-");codeMap.put("B", "-...");codeMap.put("C", "-.-.");codeMap.put("D", "-.."); codeMap.put("E", ".");codeMap.put("F", "..-.");codeMap.put("G", "--.");codeMap.put("H", "...."); codeMap.put("I", "..");codeMap.put("J", ".---");codeMap.put("K", "-.-");codeMap.put("L", ".-..."); codeMap.put("M", "--");codeMap.put("N", "-.");codeMap.put("O", "---");codeMap.put("P", ".--."); codeMap.put("Q", "--.-");codeMap.put("R", ".-.");codeMap.put("S", "...");codeMap.put("T", "-"); codeMap.put("U", "..-");codeMap.put("V", "...-");codeMap.put("W", ".--");codeMap.put("X", "-..-"); codeMap.put("Y", "-.--");codeMap.put("Z", "--.."); // 數字的莫爾斯電碼加密 codeMap.put("0", "-----");codeMap.put("1", ".----");codeMap.put("2", "..---");codeMap.put("3", "...--"); codeMap.put("4", "....-");codeMap.put("5", ".....");codeMap.put("6", "-....");codeMap.put("7", "--..."); codeMap.put("8", "---..");codeMap.put("9", "----."); // 標點符號的莫爾斯電碼加密 codeMap.put(".", "-----");codeMap.put(":", ".----");codeMap.put(",", "..---");codeMap.put(";", "...--"); codeMap.put("?", "....-");codeMap.put("=", ".....");codeMap.put("'", "-....");codeMap.put("/", "--..."); codeMap.put("!", "....-");codeMap.put("-", ".....");codeMap.put("_", "-....");codeMap.put("\"", "--..."); codeMap.put("(", "....-");codeMap.put(")", ".....");codeMap.put("$", "-....");codeMap.put("&", "--..."); codeMap.put("@", "---.."); } /** * 獲取密碼對應的字符 * @param code * @return */ private static String getChar(String code) { return codeMap.get(code); } /** * 獲取字符對應的密碼 * @param ch * @return */ private static String getCode(String ch) { for(Map.Entry<String, String> entry : codeMap.entrySet()) { if (ch.equals(entry.getValue())) { return entry.getKey(); } } return ""; } /** * 解碼 * @param morseCode * @return */ public static String decode(String morseCode) { String words = ""; String[] codes = morseCode.split(" "); for(String code : codes) { String[] chars = code.split(" "); for(String ch : chars) { words += getCode(ch); } words += " "; } return words.trim(); } /** * 編碼 * @param sentence * @return */ public static String encode(String sentence) { String codes = ""; String[] words = sentence.split(" "); for(String code : words) { String[] chars = code.split(""); for(String ch : chars) { codes += getChar(ch) + " "; } codes = codes.trim() + " "; } return codes.trim(); } } @Test public void testExampleFromDescription() { assertThat(MorseCodeDecoder.decode(".... . -.-- .--- ..- -.. ."), is("HEY JUDE")); } }
原題地址:https://www.codewars.com/kata/decode-the-morse-code/train/java編碼