Search code examples
symbols

not coded symbol


Could anyone please help with one right solution? Convert to english with certain spaces between every letter and words. l did:

eng_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', '-----': '0',
         '.----': '1', '..---': '2', '...--': '3',
         '....-': '4', '.....': '5', '-....': '6',
         '--...': '7', '---..': '8', '----.': '9'
        }

nomorse = input("Enter your code here: ")
nomorse_list = nomorse.split(' ')
text = ''
morse= True
for letter in nomorse_list:
    for key in morse_eng_dict.keys():
        if letter == key:
            text = text + str(morse_eng_dict[key])
    if letter == '':
        text = text + " "
if morse == True:
    string = "".join(text)
    print(string)

the problem.. Sometimes there can be not possible conversion of some coded symbols. that symbols can be displayed like " * "

for example: "- .... .. ....... - . .- --" should be "thi* team"

if try to put like

   if letter != key:
                letter = '*'
            text = text + str(morse_eng_dict[key] + '*')

that shows * after every doubled letter the rest of my attempts all resulted text with spaces in every certain letters.


Solution

  • A couple of notes on the code above. When trying to access the value of a dictionary instead of this...

    for key in morse_eng_dict.keys():
        if letter == key:
            text = text + str(morse_eng_dict[key])
    

    try

    if letter in morse_eng_dict:
        text = text + str(morse_eng_dict[letter])
    

    This will accomplish the same thing in a much more efficient way.

    If you want to only replace dots and dashes, you have a few options. One would be this...

    if letter in morse_eng_dict:
        text += str(morse_eng_dict[letter])
    else:
        text += letter
    

    Alternatively, you can use regular expressions to match values and substitute them. In this case r'[\.-]*' can be used to match words morse code words.

    Here is a runnable example!

    #!/usr/bin/env python
    import re
    
    morse_eng_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', '-----': '0',
             '.----': '1', '..---': '2', '...--': '3',
             '....-': '4', '.....': '5', '-....': '6',
             '--...': '7', '---..': '8', '----.': '9'
            }
    
    nomorse = input("Enter your Morse code here:")
    
    def replacer(match: re.Match):
        m = match.group()
        return morse_eng_dict.get(m, m)
    
    text = re.sub(r'[\.-]*', replacer, nomorse)
    morse = text != nomorse
    if morse:
        string = "".join(text)
        print(string)
    <script src="https://modularizer.github.io/pyprez/pyprez.min.js"></script>