Search code examples
pythonpython-3.xdictionarycaesar-cipher

Count up a list


Essentially I need to take an input, convert it into the corresponding number, then count up in the list for whatever is entered in "offset" and return the new corresponding numbers.

For example for "de" I would translate it into "4" , "5" and I then need to count up to "7" , "8" and have the program return "gh".

Struggling to figure out how to actually move up the list.

import string

translate = {
'a': "1", 'b': "2", 'c': "3", 'd': "4", 'e': "5", 'f': "6",
'g': "7", 'h': "8", 'i': "9", 'j': "10", 'k': "11", 'l': "12",
'm': "13", 'n': "14", 'o': "15", 'p': "16", 'q': "17", 'r': "18",
's': "19", 't': "20", 'u': "21", 'v': "22", 'w': "23", 'x': "24",
'y': "25", 'z': "26",
}

msg = input("Enter Message: ")
offset = input("Enter Offset: ")
caesar = [translate[ch.lower()] for ch in msg if ch in string.ascii_letters]

Solution

  • You are already importing string, so you can index into string.ascii_letters instead of manually defining the dictionary and calculating the offset. Do not forget to use modulo to wrap around from z to A.

    import string
    
    msg = 'de'
    offset = 3
    caesar = ''.join(string.ascii_letters[(string.ascii_letters.index(ch) + offset) % len(string.ascii_letters)]
                     for ch in msg)
    
    print(caesar)
    # gh
    

    This can be expanded to be slightly more readable:

    msg = 'de'
    offset = 3
    
    caesar = []
    for ch in msg:
        ch_index = string.ascii_letters.index(ch)
        new_index_with_offset = (ch_index + offset) % len(string.ascii_letters)
        new_ch = string.ascii_letters[new_index_with_offset]
        caesar.append(new_ch)
    
    caesar = ''.join(caesar)
    
    print(caesar)
    # gh
    

    I'll leave wrapping from z to a (rather than A) as an exercise to the reader.