1

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]
jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
white
  • 129
  • 1
  • 4
  • 2
    What precisely does *"move up the list"* mean? Also note that you'd have an easier time adding the offset with integers than strings. – jonrsharpe Oct 22 '17 at 12:22
  • If I understand well, you should make an inverted dictionary and just look the value at that dictionary. For example with 'd' you will get 4, and then you look 4 + offset at the inverted dictionary. – prossellob Oct 22 '17 at 12:24
  • So, if someone were to enter "hi" I need to translate that into the corresponding numbers (this part is working fine). Then count up for whatever number is entered into "offset". So if they entered 3: hi would be translated into "8", "9" and I would need to make that "11", "12". – white Oct 22 '17 at 12:25
  • Would [this example](https://inventwithpython.com/chapter14.html) help? – Sidharth Shah Oct 22 '17 at 12:26
  • Possible duplicate of [ASCII value of a character in Python](https://stackoverflow.com/questions/227459/ascii-value-of-a-character-in-python) – Amit Singh Oct 22 '17 at 12:37

1 Answers1

3

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.

DeepSpace
  • 78,697
  • 11
  • 109
  • 154
  • well you could use ascii_lowercase and wrap this part `(string.ascii_letters.index(ch) + offset` in brackets(% has higher precedence than +), to solve the wrapping issue – Nullman Oct 22 '17 at 12:34