पायथन मोर्स कोड अनुवादक

Aug 18 2020

मैं पिछले कुछ हफ्तों से अपने आप को पायथन सिखा रहा हूं, मुझे क्रिप्टोग्राफी, कोड्स आदि में रुचि है, इसलिए मुझे लगा कि मोर्स कोड ट्रांसलेटर शुरू करना एक अच्छा प्रोजेक्ट होगा। मुझे पता है कि मेरे चर नाम अलग हो सकते हैं, यह वास्तव में एन्क्रिप्ट नहीं है, डिक्रिप्टिंग, आदि। मैं ज्यादातर सलाह के लिए देख रहा हूं कि मैं कोड क्लीनर कैसे बना सकता हूं और मैं कहां अधिक कुशल हो सकता हूं।

मुझे लगता है कि मेरी सबसे बड़ी समस्या वास्तव में यह जानना नहीं है कि थोड़ी देर के लूप में इनपुट को कैसे संभालना है जैसे मैं आमतौर पर करता हूं। मेरे पास समस्या यह थी कि मैं जांच नहीं कर सकता था कि इनपुट 'ई' या 'डी' है या नहीं, इसलिए यह वास्तव में जीता है।

जिन क्षेत्रों में मुझे पता है कि मैं सुधार कर सकता हूं:

  • इनपुट लूप जोड़ें
  • यदि, एलीफ, कार्रवाई के लिए अन्य
  • 'ध्वनि' को एक वास्तविक बूलियन मान बनाएं
  • डिट और डाह के वास्तविक ध्वनि समय का पता लगाएं, लेकिन यह वास्तव में एक कोड मुद्दा नहीं है
# Started: 08/17/2020
# Finished: 08/17/2020
# Takes an input message and outputs the message in morse code
# Keys taken from 'https://en.wikipedia.org/wiki/Morse_code'

from playsound import playsound
import time

# Dictionary that holds each letter and it's corresponding value
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': '-----',
        ' ': '/', '.': '.-.-.-', ',': '.-.-', '?': '..--..', "'": '.----.', '!': '-.-.--', '/': '-..-.', '(': '-.--.', ')': '-.--.-',
        ':': '---...', ';': '-.-.-.', '=': '-...-', '+': '.-.-.', '-': '-....-', '_': '..--.-', '"': '.-..-.', '$': '...-..-', '@': '.--.-.'}

outputMessage = ""               # Holds our output message

# Sounds
sound = 'False'
dit = 'dit.wav'
dah = 'dah.wav'


def Encrypt(message):

    output = ''

    for char in message:
        if char in dict:
            output = output + dict[char]
            output = output + ' '

    return output


def Get_Key(val):
    for key, value in dict.items():
        if val == value:
            return key


def Decrypt(message):

    output = ''

    letters = message.split(' ')

    for letter in letters:
        temp = Get_Key(letter)
        output = output + temp

    return output


def Get_Inputs():
    # Get Inputs
    inputString = input('Enter a message to start.\n')
    action = input('(E)ncrypt or (D)ecrypt?\n')

    # Format Inputs
    message = inputString.lower().strip()
    action = action.lower().strip()

    return message, action


def Play_Sound(message):

    for char in message:
        if char == '.':
            playsound(dit)
        elif char == '-':
            playsound(dah)
        elif char == ' ':
            time.sleep(0.15)
        elif char == '/':
            time.sleep(0.30)


message, action = Get_Inputs()

if action == 'e' or action == 'encrypt':
    outputMessage = Encrypt(message)
elif action == 'd' or action == 'decrypt':
    outputMessage = Decrypt(message)
else:
    print('Error!')

print(outputMessage)

print('')
sound = input('Play sound? (T)rue / (F)alse\n')
if sound.lower().strip() == 't' or sound.lower().strip() == 'true':
    Play_Sound(outputMessage)

जवाब

6 RichardNeumann Aug 18 2020 at 19:25

सामान्य शैली

आपके अनुवाद dictमें कीवर्ड और लोअर केस लेटर्स का उपयोग होता है। ऊपरी मामलों के अक्षरों के साथ लगातार लिखने और उन्हें अभिव्यंजक नाम देने पर विचार करें MORSE_CODES = {...}

पीईपी 8 के अनुसार , कार्यों का उपयोग करके नाम दिया जाना चाहिए snake_caseCamelCaseवर्गों के लिए आरक्षित है: outputMessageoutput_message, def Encrypt(...)def encrypt(...), आदि।

प्रदर्शन

Get_Keyफ़ंक्शन का उपयोग करना बहुत अच्छा नहीं है, क्योंकि यह तानाशाही की रैखिक खोज करता है। एक बार अनुवाद को केवल एक बार उल्टा करें और फिर उसका उपयोग करें:

MORSE_ENCODING = {
    'a': '.-',
    'b': '-...',
    ...
}
MORSE_DECODING = {value: key for key, value in MORSE_ENCODING.items()}

...

        temp = MORSE_DECODING[letter]

त्रुटियों को संभालना

वर्तमान में Encryptफ़ंक्शन चुपचाप सभी गैर-अनुवाद योग्य पात्रों को छोड़ देता है। ValueError()यह इंगित करने के बजाय फेंकने पर विचार करें कि अमान्य इनपुट प्रदान किया गया था:

def encode(message):
    """Encodes a string into morse code."""

    code = ''

    for index, char in enumerate(message):
        try:
            code += MORSE_ENCODING[char.lower()]
        except KeyError:
            raise ValueError(f'Char "{char}" at {index} cannot be encoded.')

        code += ' '

    return code[:-1]  # Remove trailing space.


def decode(morse_code):
    """Decodes morse code."""

    message = ''

    for index, sequence in enumerate(morse_code.split()):
        try:
            message += MORSE_DECODING[sequence]
        except KeyError:
            raise ValueError(f'Cannot decode code "{sequence}" at {index}.')

    return message

यथार्थता

आपका Encryptफ़ंक्शन वर्तमान में हमेशा एक अनुगामी स्थान देता है। आप लौटकर उससे बच सकते हैं output[:-1]

शब्दावली

मोर्स कोड से पाठ को आगे और पीछे बदलना वास्तव में इसके अर्थ में एक एन्क्रिप्शन नहीं है। आप के {en,de}cryptसाथ rephrase करना चाहते हो सकता है {en,de}code

वैश्विक

outputMessageजब प्रोग्राम का उपयोग लाइब्रेरी के रूप में किया जाता है, तो वैश्विक वैरिएबल का उपयोग करने से बुरा दुष्प्रभाव हो सकता है। def Play_Soundफ़ंक्शन के नीचे का सभी कोड एक def main()फ़ंक्शन में जाना चाहिए जिसे आप के माध्यम से आमंत्रित कर सकते हैं

if __name__ == '__main__':
    main()

इकाई के निचले भाग में।