# Python for Kids

## Puzzle Number 2 (Solution)

Posted, 21 Jan 2013

First of all we set up a couple of variables with the "encrypted" letters and the unencrypted letters:

``````encrypted_letters = 'jklmnopqrstuvwxyzabcdefghi '
unencrypted_letters = 'abcdefghijklmnopqrstuvwxyz '
``````

So if you think about the two circles of letters, this is a bit like how we would line up one circle with another.

Next we create a couple of maps (or Python dictionaries to be exact). We use the `range` function to create a loop from 0 up to the length of the `encrypted_letters` string (which is 27). Each time we loop, we grab one letter from the `encrypted_letters` variable and one letter from the `unencrypted_letters` variable. Those are the values we use to populate our two maps:

``````decrypt_map = { }
encrypt_map = { }
for x in range(len(encrypted_letters)):
encrypted_letter = encrypted_letters[x]
unencrypted_letter = unencrypted_letters[x]
decrypt_map[unencrypted_letter] = encrypted_letter
encrypt_map[encrypted_letter] = unencrypted_letter
``````

At the end of the loop we have two maps where you can look up a decrypted letter and find the encrypted version, or look up an encrypted letter and find the decrypted version. Here's what the decrypt_map looks like at the end of this loop:

``````{' ': ' ', 'a': 'j', 'c': 'l', 'b': 'k', 'e': 'n', 'd': 'm', 'g': 'p', 'f': 'o',
'i': 'r', 'h': 'q', 'k': 't', 'j': 's', 'm': 'v', 'l': 'u', 'o': 'x', 'n': 'w',
'q': 'z', 'p': 'y', 's': 'b', 'r': 'a', 'u': 'd', 't': 'c', 'w': 'f', 'v': 'e',
'y': 'h', 'x': 'g', 'z': 'i'}
``````

(If you remember from Chapter 3 of the book, the first string is the key, followed by a colon (:) followed by the value for that key).

Now we've created our variables, we can create functions for encrypting and decrypting some text. They're both almost exactly the same: for each letter in the variable `text` (`for l in text`) we append the corresponding letter from the decrypt or encrypt map to a list (a variable named `rtn`):

``````def decrypt(text):
rtn = [ ]
for l in text:
rtn.append(decrypt_map[l])
return ''.join(rtn)
def encrypt(text):
rtn = [ ]
for l in text:
rtn.append(encrypt_map[l])
return ''.join(rtn)
``````

Finally we can decrypt and print the text:

``````print(decrypt('nyve r tcftb zj jkzcc ylexip zk xfvj srtb wfli jvtfeuj'))
``````