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
-
Pythonコードを高速化する11の最適化テクニック
Pythonはコンパイル言語ほど高速ではないことは周知の事実ですが、大手企業がPythonで大規模なワークロードを処理している事例からも分かるように、決して「遅い言語」ではありません。この記事では、正しく動作するPythonプログラムをさらに速く、効率的にするために押さえておきたい最適化のヒントを11個紹介します。 ヒント1: 組み込み関数を活用する Pythonで独自に効率的なコードを書くことも可能ですが、C言語で実装された組み込み関数の速度には到底及びません。利用可能な組み込み関数はdir(__builtins__)で一覧表示できるので、車輪の再発明をする前に必ず確認しましょう。 ヒン
-
Pythonのインデントエラー(IndentationError)を修正する方法|原因と解決策を徹底解説
Pythonとは Pythonは1991年に初めてリリースされたプログラミング言語です。大規模かつ充実したライブラリを備えており、関数型・命令型・手続き型・オブジェクト指向など、さまざまなプログラミングパラダイムをサポートしていることで知られています。 「IndentationError: Expected an indented block(インデントエラー:インデントされたブロックが必要です)」は、初心者から経験豊富な開発者まで、あらゆるユーザーに発生しうるエラーです。Pythonでは正しい空白(ホワイトスペース)によってコードの構造が定められているため、インデントが不正だとコードはコン