モールス信号は、 ドット 、 ダッシュ 、 スペース を使用してメッセージをエンコードする方法です。秘密裏にメッセージを伝達するために広く使用されています。
多くの映画の海軍のシーンで、メッセージを伝達するためにモールス信号が使用されているのを見たことがあるかもしれません。ここでは同じモールス信号について話していますが、唯一の違いは、英語からモールス信号へ、またはその逆に翻訳する Python プログラムを作成することです。

モールス信号について
モールス信号には、英語のアルファベット、数字、句読点、非ラテン文字ごとに異なるパターンがあります。さまざまな文字のモールス信号パターンを理解すると、それらをエンコードおよびデコードするのが簡単になります。詳細とパターンについては、 ウィキペディアのモールス信号のページ を参照してください。

このチュートリアルでは、普通の英語テキストをモールス信号にエンコードする方法、またはその逆の方法を学びます。デコードのエンコード中に英語のアルファベット、数字、句読点を使用します。さらに多くの種類の文字を追加したい場合は、エンコードとデコードの基礎を学べば、簡単に追加できます。
覚えておくべきことの 1 つは、アルファベットの大文字と小文字の両方が同じモールス信号パターンを持つということです。モールス信号は主に日常会話のようなアルファベットの大文字小文字を気にしないコミュニケーションに使用されるためです。
エンコードとデコードのコーディング部分に入りましょう。

英語からモールス信号へ
英語の平文をモールス信号に変換するアルゴリズムは簡単です。アルゴリズムを確認してみましょう。
- 英語のアルファベット、数字、句読点とモールス信号パターンをマッピングした辞書を作成します。
-
テキストを反復処理し、各テキスト文字のモールス信号パターンを結果に追加します。
- モールス信号には、各文字の後に スペースが 含まれ、各単語の後にダブルスペースが含まれます。
- したがって、テキスト内で単語の区切り文字であるスペースが見つかった場合は、結果にダブルスペースを追加する必要があります。
- 結果の文字列は、必要なモールス信号になります。
- 最後に結果を返します。
Python でコードを書いてみます。完全に書けなくても心配しないでください。
英語の平文をモールス信号にエンコードするコードを確認してみましょう。
# dictionary for mapping characters to morse code
CHARS_TO_MORSE_CODE_MAPPING = {
'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': '-----',
'.': '.-.-.-',
',': '--..--',
'?': '..--..',
'\'': '· − − − − ·',
'!': '− · − · − −',
'/': '− · · − ·',
'(': '− · − − ·',
')': '− · − − · −',
'&': '· − · · ·',
':': '− − − · · ·',
';': '− · − · − ·',
'=': '− · · · −',
'+': '· − · − ·',
'-': '− · · · · −',
'_': '· · − − · −',
'"': '· − · · − ·',
'$': '· · · − · · −',
'@': '· − − · − ·',
}
# function to encode plain English text to morse code
def to_morse_code(english_plain_text):
morse_code = ''
for char in english_plain_text:
# checking for space
# to add single space after every character and double space after every word
if char == ' ':
morse_code += ' '
else:
# adding encoded morse code to the result
morse_code += CHARS_TO_MORSE_CODE_MAPPING[char.upper()] + ' '
return morse_code
morse_code = to_morse_code(
' produces high-quality technology & finance articles, makes tools, and APIs to help businesses and people grow.'
)
print(morse_code)
以下にモールス信号の出力を示します。メッセージを変更しなかった場合は、端末にも同様のモールス信号が表示されるはずです。
--. . . -.- ..-. .-.. .- .-. . .--. .-. --- -.. ..- -.-. . ... .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.-- - . -.-. .... -. --- .-.. --- --. -.-- · − · · · ..-. .. -. .- -. -.-. . .- .-. - .. -.-. .-.. . ... --..-- -- .- -.- . ... - --- --- .-.. ... --..-- .- -. -.. .- .--. .. ... - --- .... . .-.. .--. -... ..- ... .. -. . ... ... . ... .- -. -.. .--. . --- .--. .-.. . --. .-. --- .-- .-.-.-
万歳!モールス信号が分かりました。その後に何が起こるかはわかります。
デコード プログラムに入る前に、少し立ち止まって、デコードするためのコードの書き方について考えてみましょう。
…
手順の 1 つとして、
CHARS_TO_MORSE_CODE_MAPPING
ディクショナリを逆にすることを考えるべきでした。これを手動で行うのは多忙で、元のマッピングが変更されるたびに更新する必要があります。辞書を逆引きするコードを書いてみましょう。
def reverse_mapping(mapping):
reversed = {}
for key, value in mapping.items():
reversed[value] = key
return reversed
上記のコードでは、指定された辞書のキーと値のペアを逆にしているだけです。結果として得られる辞書には、新しいキーの値と新しい値としてのキーが含まれます。
モールス信号を平文に復号化するための要素がすべて揃っています。早速、モールス信号を解読してみましょう。

モールス信号を英語に変換
モールス信号エンコードのプロセスを逆にして、デコード アルゴリズムを取得できます。モールス信号を平文にデコードするアルゴリズムを見てみましょう。
-
作成した util 関数を使用して、
CHARS_TO_MORSE_CODE_MAPPING
ディクショナリを逆にします。 -
モールス信号を繰り返し処理し、現在のモールス信号の文字を追跡します。
-
スペースが見つかった場合は、デコードする完全なモールス信号文字があることを意味します。
- 現在のモールス信号文字が空で、連続する 2 つのスペースがある場合は、平文の英語テキストに 1 つのスペースである単語区切り文字を追加します。
- 上記の条件が false の場合は、デコードされた文字を辞書から取得し、結果に追加します。現在のモールス信号文字をリセットします。
- スペースが見つからなかった場合は、現在のモールス文字にスペースを追加します。
-
スペースが見つかった場合は、デコードする完全なモールス信号文字があることを意味します。
- 最後の文字がある場合は、辞書を使用してデコードした後、結果に追加します。
- 最後に結果を返します。
上記のアルゴリズムのコードを確認してみましょう。
def reverse_mapping(mapping):
# add function code from the previous snippet...
CHARS_TO_MORSE_CODE_MAPPING = {} # add dictionary values
MORSE_CODE_TO_CHARS_MAPPING = reverse_mapping(CHARS_TO_MORSE_CODE_MAPPING)
def to_english_plain_text(morse_code):
english_plain_text = ''
current_char_morse_code = ''
i = 0
while i < len(morse_code) - 1:
# checking for each character
if morse_code[i] == ' ':
# checking for word
if len(current_char_morse_code) == 0 and morse_code[i + 1] == ' ':
english_plain_text += ' '
i += 1
else:
# adding decoded character to the result
english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
current_char_morse_code]
current_char_morse_code = ''
else:
# adding morse code char to the current character
current_char_morse_code += morse_code[i]
i += 1
# adding last character to the result
if len(current_char_morse_code) > 0:
english_plain_text += MORSE_CODE_TO_CHARS_MAPPING[
current_char_morse_code]
return english_plain_text
english_plain_text = to_english_plain_text(
'--. . . -.- ..-. .-.. .- .-. . .--. .-. --- -.. ..- -.-. . ... .... .. --. .... − · · · · − --.- ..- .- .-.. .. - -.-- - . -.-. .... -. --- .-.. --- --. -.-- · − · · · ..-. .. -. .- -. -.-. . .- .-. - .. -.-. .-.. . ... --..-- -- .- -.- . ... - --- --- .-.. ... --..-- .- -. -.. .- .--. .. ... - --- .... . .-.. .--. -... ..- ... .. -. . ... ... . ... .- -. -.. .--. . --- .--. .-.. . --. .-. --- .-- .-.-.- '
)
print(english_plain_text)
エンコード関数から生成されたモールス信号を与えました。上記のプログラムを実行すると、次の出力が得られます。
GEEKFLARE PRODUCES HIGH-QUALITY TECHNOLOGY & FINANCE ARTICLES, MAKES TOOLS, AND APIS TO HELP BUSINESSES AND PEOPLE GROW.
注: 辞書でのマッピングに大文字のアルファベットを使用したため、出力は英語の大文字のアルファベットで表示されます。
最後の言葉
デコード関数の出力が大文字であることがわかりました。英語のアルファベットの大文字と小文字を追跡して、指定された時間内でそのまま出力することでプログラムを改善できます。大文字と小文字の両方が同じパターンを持つため、これはモールス信号とは関係ありません。コーディングするのがもっと楽しいので、試してみてください。
このチュートリアルはこれで終わりです。次回モールス信号に遭遇したときは、私たちが作成したプログラムを使用してください。
コーディングを楽しんでください 👨💻
ここで、Python でランダムなパスワードを作成する方法を見てみましょう。
また、英語からモールス信号への翻訳者もチェックしてください。
