Groovyでモールス信号を実装しました!
コレで遭難した時も安心です。
音も出したかったんですがとりあえず表示のみということで。
基本的にASCII文字(より少ない。アンダーバーとかは無し)のみ扱えます。
各文字の区切りはスペースです。
また、実際に表示される文字(モールス信号からの複合)にスペースを利用したい場合は、それもスペースです。
下記のソースの最後のassertから抜粋するとこんなかんじです。
assert toString('.- -...') == "AB"
assert toString('.- -...') == "A B"
全コードは以下。
def charSep = ' '
def wordSep = charSep * 2
def morseCodeDatabase = [
' ':' ',
'A':'.-',
'J':'.---',
'S':'...',
'B':'-...',
'K':'-.-',
'T':'-',
'C':'-.-.',
'L':'.-..',
'U':'..-',
'D':'-..',
'M':'--',
'V':'...-',
'E':'.',
'N':'-.',
'W':'.--',
'F':'..-.',
'O':'---',
'X':'-..-',
'G':'--.',
'P':'.--.',
'Y':'-.--',
'H':'....',
'Q':'--.-',
'Z':'--..',
'I':'..',
'R':'.-.',
'1':'.----',
'2':'..---',
'3':'...--',
'4':'....-',
'5':'.....',
'6':'-....',
'7':'--...',
'8':'---..',
'9':'----.',
'0':'-----',
'.':'.-.-.-',
',':'--..--',
'?':'..--..',
'!':'-.-.--',
'-':'-....-',
'/':'-..-.',
'@':'.--.-.',
'(':'-.--.',
')':'-.--.-'
].asImmutable()
def toMorse = {String str ->
str.collect{ character ->
def morseCode = morseCodeDatabase[character.toUpperCase()]
morseCode != charSep ? morseCode : ""
}.join(" ")
}
def toString = {String str ->
str.split(wordSep).collect{ String morseCode ->
morseCode.split(charSep).collect{ oneMorseCode ->
(morseCodeDatabase.find{it.value == oneMorseCode})?.key
}.join()
}.join(charSep)
}
// ===============================
// 使い方!
// ===============================
def org ="My Name is Koji. Nice to meet you."
def morse = "-- -.-- -. .- -- . .. ... -.- --- .--- .."
assert toString('.- -...') == "AB"
assert toString('.- -...') == "A B"
assert toMorse(org) == "-- -.-- -. .- -- . .. ... -.- --- .--- .. .-.-.- -. .. -.-. . - --- -- . . - -.-- --- ..- .-.-.-"
assert toString(morse) == "MY NAME IS KOJI"