Home > Blockchain >  I need to encode a message from an input in Python
I need to encode a message from an input in Python

Time:03-03

So i have to encode a message but it's a different encoding, if the input is CAT the output must be DQ6 it's supposed to encode changing every letter of the input into the upper left key on the keyboard, for example again: in: bear out: G3Q4. I tried to code this in dictionaries like this:

d1 = {"q": 1,"Q": 1,"w": 2,"W": 2,"e": 3,"E": 3,"r": 4,"R": 4,"t": 5,"T": 5,"y": 6,"Y": 6,"u": 7,"U": 7,"i": 8,"I": 8,"o": 9,"O": 9,"p": 0,"P": 0}

d2 = {"a": 'Q',"A": 'Q',"s": 'W',"S": 'W',"d": 'E',"D": 'E',"f": 'R',"F": 'R',"g": 'T',"G": 'T',"h": 'Y',"H": 'Y',"j": 'U',"J": 'U',"k": 'I',"K": 'I',"l": 'O',"L": 'O',"ñ": 'P',"Ñ": 'P'}

d3 = {"z": 'A',"Z": 'A',"x": 'S',"X": 'S',"c": 'D',"C": 'D',"v": 'F',"V": 'F',"b": 'G',"B": 'G',"n": 'H', "N": 'H',"m": 'J',"M": 'J',",": 'K',".": 'L',"-": 'Ñ'}

I tried this function to check for every key but everything i'm getting is "None" as the value.

text = input("Text: ")
def cif(text):
    cifrd = ""
    for i in text:
        if i in d1:
            cifrd  = d1[(d1.index(i))%(len(d1))]
        elif i in d2:    
            cifrd  = d2[(d2.index(i))%(len(d2))]
        elif i in d3:    
            cifrd  = d3[(d3.index(i))%(len(d3))]
        else:
            cifrd  = i
print("New text: ",cif(cifrd))

Appreciate any help.

This is the outputs i'm getting

CodePudding user response:

Your encoding:

d1 = {"q": 1,"Q": 1,"w": 2,"W": 2,"e": 3,"E": 3,"r": 4,"R": 4,"t": 5,"T": 5,"y": 6,"Y": 6,"u": 7,"U": 7,"i": 8,"I": 8,"o": 9,"O": 9,"p": 0,"P": 0}

d2 = {"a": 'Q',"A": 'Q',"s": 'W',"S": 'W',"d": 'E',"D": 'E',"f": 'R',"F": 'R',"g": 'T',"G": 'T',"h": 'Y',"H": 'Y',"j": 'U',"J": 'U',"k": 'I',"K": 'I',"l": 'O',"L": 'O',"ñ": 'P',"Ñ": 'P'}

d3 = {"z": 'A',"Z": 'A',"x": 'S',"X": 'S',"c": 'D',"C": 'D',"v": 'F',"V": 'F',"b": 'G',"B": 'G',"n": 'H', "N": 'H',"m": 'J',"M": 'J',",": 'K',".": 'L',"-": 'Ñ'}

There are a few issues. See my comments

text = input("Text: ")
def cif(text):
    cifrd = ""
    for letter in text:
        # There is no need to manually write out each dictionary and do a check
        # Put the dictionaries in a list, iterate over each one, and if the letter
        # is in the dictionary, you will get the respective letter back
        for encode in [d1, d2, d3]:
            # check if my letter is in the dictionary
            actual = encode.get(letter)
            # If you check a dictionary and the key is not there, you will get `None`, this if statement ensures you only append actual number/characters
            if actual:
                cifrd  = str(actual)
    # When using a function, return something if you need it outside of the function
    return cifrd

decoded = cif(text)
print("New text: {}".format(decoded))

CodePudding user response:

There are a number of issues with your code:

  1. You need to return the "encoded" text at the end of the cif() function
  2. You need to pass the text variable to the cif() function, not cifrd which isn't defined outside your function
  3. Dictionaries do not have an .index() method, you access dictionary items by key, e.g., d1["q"] returns 1.

For what it's worth, there's no need to maintain three separate dictionaries, nor is there reason to maintain both lower- and upper-cased letters in your dictionary; store lower-cased or upper-cased keys, and transform the input to the correct case when accessing the translation, i.e., input "Q" -> lowercase "q" -> d1["q"].

Here:

mapping = {'q': 1, 'w': 2, 'e': 3, 'r': 4, 't': 5, 'y': 6, 'u': 7, 'i': 8, 'o': 9, 'p': 0,
           'a': 'q', 's': 'w', 'd': 'e', 'f': 'r', 'g': 't', 'h': 'y', 'j': 'u', 'k': 'i', 'l': 'o', 'ñ': 'p',
           'z': 'a', 'x': 's', 'c': 'd', 'v': 'f', 'b': 'g', 'n': 'h', 'm': 'j', ',': 'k', '.': 'l', '-': 'ñ'}


def cif(s: string) -> string:
    encoded_string = ""
    for char in s:
        encoded_string  = mapping.get(char.lower(), char)  # leaves the character un-encoded, if the character does not have a mapping
    return encoded string

I would actually suggest using str.translate(). You can pass two strings, the first being the input characters, the second being the characters to which those inputs should map:

t = str.maketrans("qwertyuiopasdfghjklñzxcvbnm,.-", "1234567890qwertyuiopasdfghjklñ")


"hello world".translate(t)
'y3oo9 294oe'
  • Related