LoginSignup
4
4

More than 5 years have passed since last update.

[Groovy]モールス信号を実装!

Posted at

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"
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4