Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで作るモールス信号変換ツール|暗号化・復号化の仕組みとサンプルコード

モールス信号とは?

モールス信号(Morse Code)は、暗号技術(クリプトグラフィー)の分野で古くから活用されてきた通信手法のひとつです。その名前は、発明者のサミュエル・F・B・モース(Samuel F. B. Morse)に由来します。この技術では、メッセージを「.(ドット)」「-(ダッシュ)」「/」などの記号の組み合わせへと変換します。

仕組みは非常にシンプルです。英語のアルファベット1文字ごとに、特定の記号列が割り当てられており、元のメッセージを記号列へ変換する暗号化(エンコード)と、記号列を元のテキストへ戻す復号化(デコード)の2つの処理だけで成り立ちます。

モールス符号対応表(辞書)

変換には、各文字とモールス符号の対応を定義した辞書を使用します。アルファベット26文字に加え、数字や主要な記号も含まれています。

'A':'.-', 'B':'-...',
'C':'-.-.', 'D':'-..', 'E':'.',
'F':'..-.', 'G':'--.', 'H':'....',
'I':'..', 'J':'.---', 'K':'-.-',
'L':'.-..', 'M':'--', 'N':'-.',
'O':'---', 'P':'.--.', 'Q':'--.-',
'R':'.-.', 'S':'...', 'T':'-',
'U':'..-', 'V':'...-', 'W':'.--',
'X':'-..-', 'Y':'-.--', 'Z':'--..',
'1':'.----', '2':'..---', '3':'...--',
'4':'....-', '5':'.....', '6':'-....',
'7':'--...', '8':'---..', '9':'----.',
'0':'-----', ',':'--..--', '.':'.-.-.-',
'?':'..--..', '/':'-..-.', '-':'-....-',
(':'-.--.', ')':'-.--.-'

変換例

入力メッセージ:PYTHON-PROGRAM
出力結果:.--. -.-- - .... --- -.  -....- .--. .-. --- --. .-. .- --

アルゴリズム

暗号化(テキスト → モールス符号)の手順

Step1: 文字列を受け取ったら、まず1文字ずつ取り出し、モールス符号辞書と照合して対応する符号を取得します。
Step2: 取得した符号を変数に格納していきます。このとき、各モールス符号の間には必ず1つの半角スペースを挿入します。
Step3: 単語と単語の境界には、2つの連続した半角スペースを挿入して区切りを明示します。

復号化(モールス符号 → テキスト)の手順

Step1: まず、文字列の末尾にスペースを1つ追加します。
Step2: スペースに到達するまで、メッセージの各文字(記号)を順番に読み進めます。
Step3: スペースを見つけたら、そこまでの記号列をモールス符号辞書と照合し、対応する文字を変数に格納します。
Step4: 連続して2つのスペースが出現した場合は、単語の区切りとして復号結果にスペースを追加します。
Step5: メッセージ末尾のスペースに到達した時点で、最後のモールス符号の処理が完了したことになります。

Pythonサンプルコード

# -*- coding: utf-8 -*-
"""
Created on Tue Oct  2 11:21:31 2018
@author: Satyajit
"""

# モールス符号表を表す辞書
MORSE_CODE_DICT = { 'A':'.-', 'B':'-...',
   'C':'-.-.', 'D':'-..', 'E':'.',
   'F':'..-.', 'G':'--.', 'H':'....',
   'I':'..', 'J':'.---', 'K':'-.-',
   'L':'.-..', 'M':'--', 'N':'-.',
   'O':'---', 'P':'.--.', 'Q':'--.-',
   'R':'.-.', 'S':'...', 'T':'-',
   'U':'..-', 'V':'...-', 'W':'.--',
   'X':'-..-', 'Y':'-.--', 'Z':'--..',
   '1':'.----', '2':'..---', '3':'...--',
   '4':'....-', '5':'.....', '6':'-....',
   '7':'--...', '8':'---..', '9':'----.',
   '0':'-----', ',':'--..--', '.':'.-.-.-',
   '?':'..--..', '/':'-..-.', '-':'-....-',
   '(':'-.--.', ')':'-.--.-'
}

# テキストをモールス符号へ暗号化する関数
def encryption(message):
   my_cipher = ''
   for myletter in message:
      if myletter != ' ':
         my_cipher += MORSE_CODE_DICT[myletter] + ' '
      else:
         my_cipher += ' '
   return my_cipher

# モールス符号をテキストへ復号化する関数
def decryption(message):
   message += ' '
   decipher = ''
   mycitext = ''
   i = 0
   for myletter in message:
      # スペースかどうかを判定
      if myletter != ' ':
         i = 0
         mycitext += myletter
      else:
         i += 1
         if i == 2:
            # 連続する2つのスペース=単語の区切り
            decipher += ' '
         else:
            decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT
            .values()).index(mycitext)]
            mycitext = ''
   return decipher

def main():
   my_message = "PYTHON-PROGRAM"
   output = encryption(my_message.upper())
   print(output)

   my_message = ".--. -.-- - .... --- -.  -....- .--. .-. --- --. .-. .- -- "
   output = decryption(my_message)
   print(output)

# メイン関数を実行
if __name__ == '__main__':
   main()

コードのポイント

encryption関数は、受け取った文字列を大文字に揃えた上で1文字ずつ辞書引きし、各符号の後にスペースを付加して連結しています。一方、decryption関数は、スペースを区切り文字として記号列を分割しながら復号します。ここで重要なのが「スペースの数」の扱いです。1つのスペースなら文字の区切り、2つの連続スペースなら単語の区切りとして判断することで、空白を含む文章も正確に復号できます。

なお、辞書の値からキーを逆引きする際は list(MORSE_CODE_DICT.values()).index(...) を使用していますが、頻繁に変換を行う場合は「符号 → 文字」の逆引き辞書をあらかじめ作成しておくと、より高速かつ可読性の高い実装になります。

実行結果

.--. -.-- - .... --- -.  -....- .--. .-. --- --. .-. .- --
PYTHON-PROGRAM
  1. Pythonコードを高速化する11の最適化テクニック

    Pythonはコンパイル言語ほど高速ではないことは周知の事実ですが、大手企業がPythonで大規模なワークロードを処理している事例からも分かるように、決して「遅い言語」ではありません。この記事では、正しく動作するPythonプログラムをさらに速く、効率的にするために押さえておきたい最適化のヒントを11個紹介します。 ヒント1: 組み込み関数を活用する Pythonで独自に効率的なコードを書くことも可能ですが、C言語で実装された組み込み関数の速度には到底及びません。利用可能な組み込み関数はdir(__builtins__)で一覧表示できるので、車輪の再発明をする前に必ず確認しましょう。 ヒン

  2. Pythonのインデントエラー(IndentationError)を修正する方法|原因と解決策を徹底解説

    Pythonとは Pythonは1991年に初めてリリースされたプログラミング言語です。大規模かつ充実したライブラリを備えており、関数型・命令型・手続き型・オブジェクト指向など、さまざまなプログラミングパラダイムをサポートしていることで知られています。 「IndentationError: Expected an indented block(インデントエラー:インデントされたブロックが必要です)」は、初心者から経験豊富な開発者まで、あらゆるユーザーに発生しうるエラーです。Pythonでは正しい空白(ホワイトスペース)によってコードの構造が定められているため、インデントが不正だとコードはコン