給一個莫斯密碼,將其解碼

題目描述

定義一個簡單的莫斯密碼解碼器,將一串莫斯密碼轉換爲完整的句子,莫斯密碼中用一個空格分隔單個字符,3個空格分隔單詞,好比「···· · −·−− ·−−− ··− −·· ·」 解碼後爲「HEY JUDE」java

解題思路

  1. 將莫斯密碼先按單詞、字符的順序來分割;
  2. 對從莫斯密碼字典中獲取對應的字符

代碼實現

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編碼

相關文章
相關標籤/搜索