2015-08-19 12 views
6

voglio convertire codice Morse a inglese utilizzando Python 3+ sono riuscito a convertire inglese di codice Morse con questo http://code.activestate.com/recipes/578407-simple-morse-code-translator-in-python/codice morse all'inglese python3

Ma voglio convertire codice Morse a Inglese

Ho tentato di farlo da un personaggio alla volta, ma il problema è che le lettere di codice morse non sono lunghe come lettere inglesi, quindi E è "." e S è "...", il problema che ho è che il ciclo del dizionario troverà il "." e abbinarlo a E, quindi invece di ottenere S ottengo "EEE" ho provato a risolvere questo problema rilevando gli spazi e facendone una parola alla volta, ma invece di cercare le lettere nella parola cerca l'intera parola contro il dizionario sono nuovo di Python e dei dizionari e non so come distinguere tra una E "." e una S "..." quando si cerca il mio dizionario

Ecco il mio codice

# defines the dictionary to convert morse to english 
CODE_reversed = {'..-.': 'F', '-..-': 'X', 
       '.--.': 'P', '-': 'T', '..---': '2', 
       '....-': '4', '-----': '0', '--...': '7', 
       '...-': 'V', '-.-.': 'C', '.': 'E', '.---': 'J', 
       '---': 'O', '-.-': 'K', '----.': '9', '..': 'I', 
       '.-..': 'L', '.....': '5', '...--': '3', '-.--': 'Y', 
       '-....': '6', '.--': 'W', '....': 'H', '-.': 'N', '.-.': 'R', 
       '-...': 'B', '---..': '8', '--..': 'Z', '-..': 'D', '--.-': 'Q', 
       '--.': 'G', '--': 'M', '..-': 'U', '.-': 'A', '...': 'S', '.----': '1'} 


    def main(): 
     #takes user message and makes it upper case 
     msg = input('MESSAGE: ') 
     msg = msg.upper() 

    addtolist = "" # creates blank string 
    message = [] # creates blank list 
    for i in msg: 
     addtolist = addtolist + i # adds every letter in MSG into a string until it finds a space 
     addtolist.upper() # makes every letter uppercase 

     if i == " ": # if it detects a space 
      message.extend(addtolist) 
      # adds the previously created addtolist to a list, this makes one word 
      addtolist = "" # clears previous variable 

    for i in message: 
     # for every word in the list 
     str(i) # make it into a string 
    print(CODE_reversed[i()]) # search the dictionary for that word 


if __name__ == "__main__": 
    main() 

Questo codice prende una parola, e cerca di guardare in su contro il dizionario, ma non funziona ho anche provato a cercare ogni singola lettera di codice morse contro il dizionario, ma il problema è che non si può sapere quando una lettera inizia e finisce, quindi "..." esce come "EEE" invece di "S" e io so come risolvere questo

ho anche provato a cercare soluzioni ma le ho trovate solo in Java e non conosco Java

+1

È necessario eseguire la scansione dell'ingresso fino a raggiungere una pausa che indica il carattere successivo. Ad esempio, se hai inserito "" ... "" c'è spazio tra i punti e hai tre '". "' S, ma se l'input è '" ... "' non hai spazio quindi ne hai uno ' "..." '. Puoi farlo usando il metodo 'split' sull'input. – skyking

+0

È un problema matematico che il codice (Morse) non è una funzione iniettiva. Devi conoscere gli spazi (interruzioni) tra gli elementi del codice. https://en.wikipedia.org/wiki/Injective_function – cansik

risposta

14

Dopo aver definito la mappatura in una direzione, è possibile utilizzare una comprensione dict per mappare il contrario

CODE = {'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': '----.' 
     } 

CODE_REVERSED = {value:key for key,value in CODE.items()} 

Quindi è possibile utilizzare join con un'espressione generatore per eseguire le traduzioni.

def to_morse(s): 
    return ' '.join(CODE.get(i.upper()) for i in s) 

def from_morse(s): 
    return ''.join(CODE_REVERSED.get(i) for i in s.split()) 

>>> to_morse('hello') 
'.... . .-.. .-.. ---' 
>>> from_morse('.... . .-.. .-.. ---') 
'HELLO' 
+3

ottimo esempio di potenza python – svfat

+1

grazie! sapevo che c'era un modo più semplice per farlo, Python è davvero incredibile! –