Python を使用してモールス信号トランスレータを作成する方法

公開: 2022-10-19

モールス符号は、ドットダッシュ、およびスペースを使用してメッセージをエンコードする方法です。 メッセージを秘密裏に通信するために広く使用されています。

多くの映画の海軍シーンで、メッセージを伝えるためにモールス信号が使用されているのを見たことがあるかもしれません。 ここでは同じモールス符号について話していますが、唯一の違いは、英語からモールス符号に、またはその逆に変換する Python プログラムを作成することです。

モールス信号

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

モールス信号

このチュートリアルでは、プレーンな英語のテキストをモールス符号に、またはその逆にエンコードする方法を学習します。 デコードをエンコードする際には、英語のアルファベット、数字、および句読点を使用します。 より多くの種類の文字を追加したい場合は、エンコードとデコードの基礎を学べば簡単に行うことができます。

覚えておくべきことの1つは、大文字と小文字の両方のアルファベットが同じモールス信号パターンを持っているということです. これは、日常会話のようにアルファベットの大文字小文字を問わないコミュニケーションにモールス符号が主に使われているためです。

エンコードとデコードのコーディング部分に入りましょう。

英語からモールス信号へ

プレーンな英語のテキストをモールス信号に変換するアルゴリズムは簡単です。 アルゴリズムを確認してみましょう。

  1. 英語のアルファベット、数字、および句読点を使用したモールス信号パターンのマッピングで辞書を作成します。
  2. テキストを繰り返し処理し、各テキスト文字のモールス符号パターンを結果に追加します。
    • モールス符号には、各文字の後にスペースがあり、各単語の後にダブル スペースがあります。
    • そのため、単語の区切り文字であるテキスト内にスペースが発生した場合は、結果にダブル スペースを追加する必要があります。
  3. 結果の文字列は、必要なモールス符号になります。
  4. 最後に、結果を返します。

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( 'Geekflare 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

上記のコードを使用して、指定された辞書のキーと値のペアを逆にしています。 結果のディクショナリには、値が新しいキーであり、キーが新しい値として含まれます。

モールス符号をプレーンな英語のテキストにデコードするためのすべてのピースが揃っています。 早速、モールス符号を解読してみましょう。

モールス信号を英語に

モールス信号符号化のプロセスを逆にして、復号化アルゴリズムを取得できます。 モールス符号をプレーンな英語のテキストにデコードするアルゴリズムを見てみましょう。

  1. 作成した util 関数を使用して、 CHARS_TO_MORSE_CODE_MAPPING辞書を逆にします。
  2. モールス符号を反復処理し、現在のモールス符号文字を追跡します。
    • スペースが見つかった場合は、デコードする完全なモールス符号文字があることを意味します。
      • 現在のモールス符号文字が空で、2 つの連続するスペースがある場合は、プレーンな英語のテキストで 1 つのスペースである単語区切りを追加します。
      • 上記の条件が false の場合、デコードされた文字を辞書から取得し、結果に追加します。 現在のモールス信号文字をリセットします。
    • スペースが見つからない場合は、現在のモールス文字に追加します。
  3. 最後の文字がある場合は、辞書を使用してデコードした結果に追加します。
  4. 最後に結果を返します。

上記のアルゴリズムのコードを確認してみましょう。

 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 でランダムなパスワードを作成する方法も参照してください。