acokikoy's notes

最近気になる=[NoCode, Shopify], I am..=[Python, ウクレレ, マニュアル車, CMS] LoveなWebディレクター

毎朝Codewars@2019.05.05(日): Morse Code

毎朝ちびちびCodewars。

Morse Code [6級] www.codewars.com

今日のお題:

""" モールス信号デコーダー

- 大文字と小文字の区別はしない。モールス符号では伝統的に大文字が使われる。
- 単一のスペースが文字の区切り、3つのスペースが単語の区切り。
- 冒頭・末尾のスペースは無視する。
- モールス信号-アルファベットの表引きデータ MORSE_CODE (dict型)が与えられる想定。

例: 入力: "···· · −·−−   ·−−− ··− −·· ·" -> 出力: "HEY JUDE"

Args:
    morse_code (str): モールス信号

Returns:
    デコード結果 (str)
"""

コード

me

# Morse Code
# https://www.codewars.com/kata/decode-the-morse-code/

def decodeMorse(morse_code):
    morse_list = morse_code.strip().replace('   ', ' # ').split()
    message = ''

    for m in morse_list:
        if m == '#':
            message += ' '
        else:
            message += MORSE_CODE[m]
    return message
  • 事前処理:
    単語区切りコード ' '(スペース3つ)と、文字区切りの' '(スペース1つ)を区別するために、単語区切りコードを、' # '(スペースで挟まれた#)に置き換える。ここで、#を挟むスペースは、前後の文字との区切りコードとして必要。
  • その後は、一文字ずつ辞書引き変換で処理すればOK。

文法、関数・メソッドnote

str.replace(old, new)

https://docs.python.org/ja/3/library/stdtypes.html?highlight=str%20replace#str.replace

  • str中に現れる部分文字列 old 全てを new に置換した文字列を返す。
  • 返値はstrのコピーであって、元のstrは変化しない。
str.split(sep)

https://docs.python.org/ja/3/library/stdtypes.html#str.split

  • sepは省略すると' 'でsplitされる。ただし、' 'が続いた場合の振る舞いはsepを明示的にあたえるときと与えない時とで異なるので注意が必要。
  • デリミタとして複数文字を指定可能。スペース3つをデリミタ指定するとき、単独のスペースはデリミタとは認識されない。曖昧だったのでφ(・ェ・o)~メモメモ
str = 'AAA   BBB CCC DDD'

print(str.split('   '))
#['AAA', 'BBB CCC DDD']
# 複数文字をデリミタに指定可能。例えば、デリミタに'   '(スペース3つ)を指定するなら、当然ながらスペース1つ部分では区切られない。

print(str.split(' '))
# ['AAA', '', '', 'BBB', 'CCC', 'DDD']
# デリミタを' 'に指定し、' 'が連続して入っていた場合は、空の文字列を区切る動作となる。


print(str.split()) 
# ['AAA', 'BBB', 'CCC', 'DDD']
# デリミタ未指定時は' 'で区切られるが、' 'が連続していた場合の処理が明示的にデリミタを指定した時と異なる。