Our second challenge is to decode a message written in a secret code. We'll look at substitution ciphers, in which each letter is replaced by another. The description of what replaces what is called the key, which we can represent as a string of 26 letters; the first letter replaces "a", the second replaces "b", and so on. Here is the function to encode a message with a substitution cipher key (the Python library functions
translate do most of the work):
encode(msg, key): "Encode a message with a substitution cipher." return msg.translate(string.maketrans(ul(alphabet), ul(key))) def
ul(text): return text.upper( ) + text.lower( )
Perhaps the simplest of all codes is the shift cipher, a substitution cipher in which each letter in the message is replaced by the letter n letters later in the alphabet. If n = 1, then "a" is replaced by "b" and "b" is replaced by "c", up to "z", which is replaced by "a". Shift ciphers are also called Caesar ciphers; they were state-of-the-art in 50 BC. The function
shift encodes with a shift cipher:
shift(msg, n=13): "Encode a message with a shift (Caesar) cipher." return encode(msg, alphabet[n:]+alphabet[:n])
We use the function like this:
>>> shift('Listen, do you want to know a secret?') 'Yvfgra, qb lbh jnag gb xabj n frperg?' >>> shift('HAL 9000 xyz', 1) 'IBM 9000 yza'
To decode a message without knowing the key, we follow the same methodology we did with segmentations: define a ...