Project Euler: Problem 59

https://projecteuler.net/problem=59

Each character on a computer is assigned a unique code and the preferred standard is ASCII (American Standard Code for Information Interchange). For example, uppercase A = 65, asterisk (*) = 42, and lowercase k = 107.

A modern encryption method is to take a text file, convert the bytes to ASCII, then XOR each byte with a given value, taken from a secret key. The advantage with the XOR function is that using the same encryption key on the cipher text, restores the plain text; for example, 65 XOR 42 = 107, then 107 XOR 42 = 65.

For unbreakable encryption, the key is the same length as the plain text message, and the key is made up of random bytes. The user would keep the encrypted message and the encryption key in different locations, and without both "halves", it is impossible to decrypt the message.

Unfortunately, this method is impractical for most users, so the modified method is to use a password as a key. If the password is shorter than the message, which is likely, the key is repeated cyclically throughout the message. The balance for this method is using a sufficiently long password key for security, but short enough to be memorable.

Your task has been made easy, as the encryption key consists of three lower case characters. Using cipher.txt (in this directory), a file containing the encrypted ASCII codes, and the knowledge that the plain text must contain common English words, decrypt the message and find the sum of the ASCII values in the original text.

The following cell shows examples of how to perform XOR in Python and how to go back and forth between characters and integers:


In [51]:
assert 65 ^ 42 == 107
assert 107 ^ 42 == 65
assert ord('a') == 97
assert chr(97) == 'a'

Certain functions in the itertools module may be useful for computing permutations:


In [52]:
# creates a list of all possible three character ciphers
# I need to better understand how tuples work.

from itertools import combinations_with_replacement
# list(combinations_with_replacement('abcdefghijklmnopqrstuvwxyz', r = 3))
x = combinations_with_replacement('abcdefghijklmnopqrstuvwxyz', r = 3)
type(x)
#[ord(i) for i in x]
list(x)


Out[52]:
[('a', 'a', 'a'),
 ('a', 'a', 'b'),
 ('a', 'a', 'c'),
 ('a', 'a', 'd'),
 ('a', 'a', 'e'),
 ('a', 'a', 'f'),
 ('a', 'a', 'g'),
 ('a', 'a', 'h'),
 ('a', 'a', 'i'),
 ('a', 'a', 'j'),
 ('a', 'a', 'k'),
 ('a', 'a', 'l'),
 ('a', 'a', 'm'),
 ('a', 'a', 'n'),
 ('a', 'a', 'o'),
 ('a', 'a', 'p'),
 ('a', 'a', 'q'),
 ('a', 'a', 'r'),
 ('a', 'a', 's'),
 ('a', 'a', 't'),
 ('a', 'a', 'u'),
 ('a', 'a', 'v'),
 ('a', 'a', 'w'),
 ('a', 'a', 'x'),
 ('a', 'a', 'y'),
 ('a', 'a', 'z'),
 ('a', 'b', 'b'),
 ('a', 'b', 'c'),
 ('a', 'b', 'd'),
 ('a', 'b', 'e'),
 ('a', 'b', 'f'),
 ('a', 'b', 'g'),
 ('a', 'b', 'h'),
 ('a', 'b', 'i'),
 ('a', 'b', 'j'),
 ('a', 'b', 'k'),
 ('a', 'b', 'l'),
 ('a', 'b', 'm'),
 ('a', 'b', 'n'),
 ('a', 'b', 'o'),
 ('a', 'b', 'p'),
 ('a', 'b', 'q'),
 ('a', 'b', 'r'),
 ('a', 'b', 's'),
 ('a', 'b', 't'),
 ('a', 'b', 'u'),
 ('a', 'b', 'v'),
 ('a', 'b', 'w'),
 ('a', 'b', 'x'),
 ('a', 'b', 'y'),
 ('a', 'b', 'z'),
 ('a', 'c', 'c'),
 ('a', 'c', 'd'),
 ('a', 'c', 'e'),
 ('a', 'c', 'f'),
 ('a', 'c', 'g'),
 ('a', 'c', 'h'),
 ('a', 'c', 'i'),
 ('a', 'c', 'j'),
 ('a', 'c', 'k'),
 ('a', 'c', 'l'),
 ('a', 'c', 'm'),
 ('a', 'c', 'n'),
 ('a', 'c', 'o'),
 ('a', 'c', 'p'),
 ('a', 'c', 'q'),
 ('a', 'c', 'r'),
 ('a', 'c', 's'),
 ('a', 'c', 't'),
 ('a', 'c', 'u'),
 ('a', 'c', 'v'),
 ('a', 'c', 'w'),
 ('a', 'c', 'x'),
 ('a', 'c', 'y'),
 ('a', 'c', 'z'),
 ('a', 'd', 'd'),
 ('a', 'd', 'e'),
 ('a', 'd', 'f'),
 ('a', 'd', 'g'),
 ('a', 'd', 'h'),
 ('a', 'd', 'i'),
 ('a', 'd', 'j'),
 ('a', 'd', 'k'),
 ('a', 'd', 'l'),
 ('a', 'd', 'm'),
 ('a', 'd', 'n'),
 ('a', 'd', 'o'),
 ('a', 'd', 'p'),
 ('a', 'd', 'q'),
 ('a', 'd', 'r'),
 ('a', 'd', 's'),
 ('a', 'd', 't'),
 ('a', 'd', 'u'),
 ('a', 'd', 'v'),
 ('a', 'd', 'w'),
 ('a', 'd', 'x'),
 ('a', 'd', 'y'),
 ('a', 'd', 'z'),
 ('a', 'e', 'e'),
 ('a', 'e', 'f'),
 ('a', 'e', 'g'),
 ('a', 'e', 'h'),
 ('a', 'e', 'i'),
 ('a', 'e', 'j'),
 ('a', 'e', 'k'),
 ('a', 'e', 'l'),
 ('a', 'e', 'm'),
 ('a', 'e', 'n'),
 ('a', 'e', 'o'),
 ('a', 'e', 'p'),
 ('a', 'e', 'q'),
 ('a', 'e', 'r'),
 ('a', 'e', 's'),
 ('a', 'e', 't'),
 ('a', 'e', 'u'),
 ('a', 'e', 'v'),
 ('a', 'e', 'w'),
 ('a', 'e', 'x'),
 ('a', 'e', 'y'),
 ('a', 'e', 'z'),
 ('a', 'f', 'f'),
 ('a', 'f', 'g'),
 ('a', 'f', 'h'),
 ('a', 'f', 'i'),
 ('a', 'f', 'j'),
 ('a', 'f', 'k'),
 ('a', 'f', 'l'),
 ('a', 'f', 'm'),
 ('a', 'f', 'n'),
 ('a', 'f', 'o'),
 ('a', 'f', 'p'),
 ('a', 'f', 'q'),
 ('a', 'f', 'r'),
 ('a', 'f', 's'),
 ('a', 'f', 't'),
 ('a', 'f', 'u'),
 ('a', 'f', 'v'),
 ('a', 'f', 'w'),
 ('a', 'f', 'x'),
 ('a', 'f', 'y'),
 ('a', 'f', 'z'),
 ('a', 'g', 'g'),
 ('a', 'g', 'h'),
 ('a', 'g', 'i'),
 ('a', 'g', 'j'),
 ('a', 'g', 'k'),
 ('a', 'g', 'l'),
 ('a', 'g', 'm'),
 ('a', 'g', 'n'),
 ('a', 'g', 'o'),
 ('a', 'g', 'p'),
 ('a', 'g', 'q'),
 ('a', 'g', 'r'),
 ('a', 'g', 's'),
 ('a', 'g', 't'),
 ('a', 'g', 'u'),
 ('a', 'g', 'v'),
 ('a', 'g', 'w'),
 ('a', 'g', 'x'),
 ('a', 'g', 'y'),
 ('a', 'g', 'z'),
 ('a', 'h', 'h'),
 ('a', 'h', 'i'),
 ('a', 'h', 'j'),
 ('a', 'h', 'k'),
 ('a', 'h', 'l'),
 ('a', 'h', 'm'),
 ('a', 'h', 'n'),
 ('a', 'h', 'o'),
 ('a', 'h', 'p'),
 ('a', 'h', 'q'),
 ('a', 'h', 'r'),
 ('a', 'h', 's'),
 ('a', 'h', 't'),
 ('a', 'h', 'u'),
 ('a', 'h', 'v'),
 ('a', 'h', 'w'),
 ('a', 'h', 'x'),
 ('a', 'h', 'y'),
 ('a', 'h', 'z'),
 ('a', 'i', 'i'),
 ('a', 'i', 'j'),
 ('a', 'i', 'k'),
 ('a', 'i', 'l'),
 ('a', 'i', 'm'),
 ('a', 'i', 'n'),
 ('a', 'i', 'o'),
 ('a', 'i', 'p'),
 ('a', 'i', 'q'),
 ('a', 'i', 'r'),
 ('a', 'i', 's'),
 ('a', 'i', 't'),
 ('a', 'i', 'u'),
 ('a', 'i', 'v'),
 ('a', 'i', 'w'),
 ('a', 'i', 'x'),
 ('a', 'i', 'y'),
 ('a', 'i', 'z'),
 ('a', 'j', 'j'),
 ('a', 'j', 'k'),
 ('a', 'j', 'l'),
 ('a', 'j', 'm'),
 ('a', 'j', 'n'),
 ('a', 'j', 'o'),
 ('a', 'j', 'p'),
 ('a', 'j', 'q'),
 ('a', 'j', 'r'),
 ('a', 'j', 's'),
 ('a', 'j', 't'),
 ('a', 'j', 'u'),
 ('a', 'j', 'v'),
 ('a', 'j', 'w'),
 ('a', 'j', 'x'),
 ('a', 'j', 'y'),
 ('a', 'j', 'z'),
 ('a', 'k', 'k'),
 ('a', 'k', 'l'),
 ('a', 'k', 'm'),
 ('a', 'k', 'n'),
 ('a', 'k', 'o'),
 ('a', 'k', 'p'),
 ('a', 'k', 'q'),
 ('a', 'k', 'r'),
 ('a', 'k', 's'),
 ('a', 'k', 't'),
 ('a', 'k', 'u'),
 ('a', 'k', 'v'),
 ('a', 'k', 'w'),
 ('a', 'k', 'x'),
 ('a', 'k', 'y'),
 ('a', 'k', 'z'),
 ('a', 'l', 'l'),
 ('a', 'l', 'm'),
 ('a', 'l', 'n'),
 ('a', 'l', 'o'),
 ('a', 'l', 'p'),
 ('a', 'l', 'q'),
 ('a', 'l', 'r'),
 ('a', 'l', 's'),
 ('a', 'l', 't'),
 ('a', 'l', 'u'),
 ('a', 'l', 'v'),
 ('a', 'l', 'w'),
 ('a', 'l', 'x'),
 ('a', 'l', 'y'),
 ('a', 'l', 'z'),
 ('a', 'm', 'm'),
 ('a', 'm', 'n'),
 ('a', 'm', 'o'),
 ('a', 'm', 'p'),
 ('a', 'm', 'q'),
 ('a', 'm', 'r'),
 ('a', 'm', 's'),
 ('a', 'm', 't'),
 ('a', 'm', 'u'),
 ('a', 'm', 'v'),
 ('a', 'm', 'w'),
 ('a', 'm', 'x'),
 ('a', 'm', 'y'),
 ('a', 'm', 'z'),
 ('a', 'n', 'n'),
 ('a', 'n', 'o'),
 ('a', 'n', 'p'),
 ('a', 'n', 'q'),
 ('a', 'n', 'r'),
 ('a', 'n', 's'),
 ('a', 'n', 't'),
 ('a', 'n', 'u'),
 ('a', 'n', 'v'),
 ('a', 'n', 'w'),
 ('a', 'n', 'x'),
 ('a', 'n', 'y'),
 ('a', 'n', 'z'),
 ('a', 'o', 'o'),
 ('a', 'o', 'p'),
 ('a', 'o', 'q'),
 ('a', 'o', 'r'),
 ('a', 'o', 's'),
 ('a', 'o', 't'),
 ('a', 'o', 'u'),
 ('a', 'o', 'v'),
 ('a', 'o', 'w'),
 ('a', 'o', 'x'),
 ('a', 'o', 'y'),
 ('a', 'o', 'z'),
 ('a', 'p', 'p'),
 ('a', 'p', 'q'),
 ('a', 'p', 'r'),
 ('a', 'p', 's'),
 ('a', 'p', 't'),
 ('a', 'p', 'u'),
 ('a', 'p', 'v'),
 ('a', 'p', 'w'),
 ('a', 'p', 'x'),
 ('a', 'p', 'y'),
 ('a', 'p', 'z'),
 ('a', 'q', 'q'),
 ('a', 'q', 'r'),
 ('a', 'q', 's'),
 ('a', 'q', 't'),
 ('a', 'q', 'u'),
 ('a', 'q', 'v'),
 ('a', 'q', 'w'),
 ('a', 'q', 'x'),
 ('a', 'q', 'y'),
 ('a', 'q', 'z'),
 ('a', 'r', 'r'),
 ('a', 'r', 's'),
 ('a', 'r', 't'),
 ('a', 'r', 'u'),
 ('a', 'r', 'v'),
 ('a', 'r', 'w'),
 ('a', 'r', 'x'),
 ('a', 'r', 'y'),
 ('a', 'r', 'z'),
 ('a', 's', 's'),
 ('a', 's', 't'),
 ('a', 's', 'u'),
 ('a', 's', 'v'),
 ('a', 's', 'w'),
 ('a', 's', 'x'),
 ('a', 's', 'y'),
 ('a', 's', 'z'),
 ('a', 't', 't'),
 ('a', 't', 'u'),
 ('a', 't', 'v'),
 ('a', 't', 'w'),
 ('a', 't', 'x'),
 ('a', 't', 'y'),
 ('a', 't', 'z'),
 ('a', 'u', 'u'),
 ('a', 'u', 'v'),
 ('a', 'u', 'w'),
 ('a', 'u', 'x'),
 ('a', 'u', 'y'),
 ('a', 'u', 'z'),
 ('a', 'v', 'v'),
 ('a', 'v', 'w'),
 ('a', 'v', 'x'),
 ('a', 'v', 'y'),
 ('a', 'v', 'z'),
 ('a', 'w', 'w'),
 ('a', 'w', 'x'),
 ('a', 'w', 'y'),
 ('a', 'w', 'z'),
 ('a', 'x', 'x'),
 ('a', 'x', 'y'),
 ('a', 'x', 'z'),
 ('a', 'y', 'y'),
 ('a', 'y', 'z'),
 ('a', 'z', 'z'),
 ('b', 'b', 'b'),
 ('b', 'b', 'c'),
 ('b', 'b', 'd'),
 ('b', 'b', 'e'),
 ('b', 'b', 'f'),
 ('b', 'b', 'g'),
 ('b', 'b', 'h'),
 ('b', 'b', 'i'),
 ('b', 'b', 'j'),
 ('b', 'b', 'k'),
 ('b', 'b', 'l'),
 ('b', 'b', 'm'),
 ('b', 'b', 'n'),
 ('b', 'b', 'o'),
 ('b', 'b', 'p'),
 ('b', 'b', 'q'),
 ('b', 'b', 'r'),
 ('b', 'b', 's'),
 ('b', 'b', 't'),
 ('b', 'b', 'u'),
 ('b', 'b', 'v'),
 ('b', 'b', 'w'),
 ('b', 'b', 'x'),
 ('b', 'b', 'y'),
 ('b', 'b', 'z'),
 ('b', 'c', 'c'),
 ('b', 'c', 'd'),
 ('b', 'c', 'e'),
 ('b', 'c', 'f'),
 ('b', 'c', 'g'),
 ('b', 'c', 'h'),
 ('b', 'c', 'i'),
 ('b', 'c', 'j'),
 ('b', 'c', 'k'),
 ('b', 'c', 'l'),
 ('b', 'c', 'm'),
 ('b', 'c', 'n'),
 ('b', 'c', 'o'),
 ('b', 'c', 'p'),
 ('b', 'c', 'q'),
 ('b', 'c', 'r'),
 ('b', 'c', 's'),
 ('b', 'c', 't'),
 ('b', 'c', 'u'),
 ('b', 'c', 'v'),
 ('b', 'c', 'w'),
 ('b', 'c', 'x'),
 ('b', 'c', 'y'),
 ('b', 'c', 'z'),
 ('b', 'd', 'd'),
 ('b', 'd', 'e'),
 ('b', 'd', 'f'),
 ('b', 'd', 'g'),
 ('b', 'd', 'h'),
 ('b', 'd', 'i'),
 ('b', 'd', 'j'),
 ('b', 'd', 'k'),
 ('b', 'd', 'l'),
 ('b', 'd', 'm'),
 ('b', 'd', 'n'),
 ('b', 'd', 'o'),
 ('b', 'd', 'p'),
 ('b', 'd', 'q'),
 ('b', 'd', 'r'),
 ('b', 'd', 's'),
 ('b', 'd', 't'),
 ('b', 'd', 'u'),
 ('b', 'd', 'v'),
 ('b', 'd', 'w'),
 ('b', 'd', 'x'),
 ('b', 'd', 'y'),
 ('b', 'd', 'z'),
 ('b', 'e', 'e'),
 ('b', 'e', 'f'),
 ('b', 'e', 'g'),
 ('b', 'e', 'h'),
 ('b', 'e', 'i'),
 ('b', 'e', 'j'),
 ('b', 'e', 'k'),
 ('b', 'e', 'l'),
 ('b', 'e', 'm'),
 ('b', 'e', 'n'),
 ('b', 'e', 'o'),
 ('b', 'e', 'p'),
 ('b', 'e', 'q'),
 ('b', 'e', 'r'),
 ('b', 'e', 's'),
 ('b', 'e', 't'),
 ('b', 'e', 'u'),
 ('b', 'e', 'v'),
 ('b', 'e', 'w'),
 ('b', 'e', 'x'),
 ('b', 'e', 'y'),
 ('b', 'e', 'z'),
 ('b', 'f', 'f'),
 ('b', 'f', 'g'),
 ('b', 'f', 'h'),
 ('b', 'f', 'i'),
 ('b', 'f', 'j'),
 ('b', 'f', 'k'),
 ('b', 'f', 'l'),
 ('b', 'f', 'm'),
 ('b', 'f', 'n'),
 ('b', 'f', 'o'),
 ('b', 'f', 'p'),
 ('b', 'f', 'q'),
 ('b', 'f', 'r'),
 ('b', 'f', 's'),
 ('b', 'f', 't'),
 ('b', 'f', 'u'),
 ('b', 'f', 'v'),
 ('b', 'f', 'w'),
 ('b', 'f', 'x'),
 ('b', 'f', 'y'),
 ('b', 'f', 'z'),
 ('b', 'g', 'g'),
 ('b', 'g', 'h'),
 ('b', 'g', 'i'),
 ('b', 'g', 'j'),
 ('b', 'g', 'k'),
 ('b', 'g', 'l'),
 ('b', 'g', 'm'),
 ('b', 'g', 'n'),
 ('b', 'g', 'o'),
 ('b', 'g', 'p'),
 ('b', 'g', 'q'),
 ('b', 'g', 'r'),
 ('b', 'g', 's'),
 ('b', 'g', 't'),
 ('b', 'g', 'u'),
 ('b', 'g', 'v'),
 ('b', 'g', 'w'),
 ('b', 'g', 'x'),
 ('b', 'g', 'y'),
 ('b', 'g', 'z'),
 ('b', 'h', 'h'),
 ('b', 'h', 'i'),
 ('b', 'h', 'j'),
 ('b', 'h', 'k'),
 ('b', 'h', 'l'),
 ('b', 'h', 'm'),
 ('b', 'h', 'n'),
 ('b', 'h', 'o'),
 ('b', 'h', 'p'),
 ('b', 'h', 'q'),
 ('b', 'h', 'r'),
 ('b', 'h', 's'),
 ('b', 'h', 't'),
 ('b', 'h', 'u'),
 ('b', 'h', 'v'),
 ('b', 'h', 'w'),
 ('b', 'h', 'x'),
 ('b', 'h', 'y'),
 ('b', 'h', 'z'),
 ('b', 'i', 'i'),
 ('b', 'i', 'j'),
 ('b', 'i', 'k'),
 ('b', 'i', 'l'),
 ('b', 'i', 'm'),
 ('b', 'i', 'n'),
 ('b', 'i', 'o'),
 ('b', 'i', 'p'),
 ('b', 'i', 'q'),
 ('b', 'i', 'r'),
 ('b', 'i', 's'),
 ('b', 'i', 't'),
 ('b', 'i', 'u'),
 ('b', 'i', 'v'),
 ('b', 'i', 'w'),
 ('b', 'i', 'x'),
 ('b', 'i', 'y'),
 ('b', 'i', 'z'),
 ('b', 'j', 'j'),
 ('b', 'j', 'k'),
 ('b', 'j', 'l'),
 ('b', 'j', 'm'),
 ('b', 'j', 'n'),
 ('b', 'j', 'o'),
 ('b', 'j', 'p'),
 ('b', 'j', 'q'),
 ('b', 'j', 'r'),
 ('b', 'j', 's'),
 ('b', 'j', 't'),
 ('b', 'j', 'u'),
 ('b', 'j', 'v'),
 ('b', 'j', 'w'),
 ('b', 'j', 'x'),
 ('b', 'j', 'y'),
 ('b', 'j', 'z'),
 ('b', 'k', 'k'),
 ('b', 'k', 'l'),
 ('b', 'k', 'm'),
 ('b', 'k', 'n'),
 ('b', 'k', 'o'),
 ('b', 'k', 'p'),
 ('b', 'k', 'q'),
 ('b', 'k', 'r'),
 ('b', 'k', 's'),
 ('b', 'k', 't'),
 ('b', 'k', 'u'),
 ('b', 'k', 'v'),
 ('b', 'k', 'w'),
 ('b', 'k', 'x'),
 ('b', 'k', 'y'),
 ('b', 'k', 'z'),
 ('b', 'l', 'l'),
 ('b', 'l', 'm'),
 ('b', 'l', 'n'),
 ('b', 'l', 'o'),
 ('b', 'l', 'p'),
 ('b', 'l', 'q'),
 ('b', 'l', 'r'),
 ('b', 'l', 's'),
 ('b', 'l', 't'),
 ('b', 'l', 'u'),
 ('b', 'l', 'v'),
 ('b', 'l', 'w'),
 ('b', 'l', 'x'),
 ('b', 'l', 'y'),
 ('b', 'l', 'z'),
 ('b', 'm', 'm'),
 ('b', 'm', 'n'),
 ('b', 'm', 'o'),
 ('b', 'm', 'p'),
 ('b', 'm', 'q'),
 ('b', 'm', 'r'),
 ('b', 'm', 's'),
 ('b', 'm', 't'),
 ('b', 'm', 'u'),
 ('b', 'm', 'v'),
 ('b', 'm', 'w'),
 ('b', 'm', 'x'),
 ('b', 'm', 'y'),
 ('b', 'm', 'z'),
 ('b', 'n', 'n'),
 ('b', 'n', 'o'),
 ('b', 'n', 'p'),
 ('b', 'n', 'q'),
 ('b', 'n', 'r'),
 ('b', 'n', 's'),
 ('b', 'n', 't'),
 ('b', 'n', 'u'),
 ('b', 'n', 'v'),
 ('b', 'n', 'w'),
 ('b', 'n', 'x'),
 ('b', 'n', 'y'),
 ('b', 'n', 'z'),
 ('b', 'o', 'o'),
 ('b', 'o', 'p'),
 ('b', 'o', 'q'),
 ('b', 'o', 'r'),
 ('b', 'o', 's'),
 ('b', 'o', 't'),
 ('b', 'o', 'u'),
 ('b', 'o', 'v'),
 ('b', 'o', 'w'),
 ('b', 'o', 'x'),
 ('b', 'o', 'y'),
 ('b', 'o', 'z'),
 ('b', 'p', 'p'),
 ('b', 'p', 'q'),
 ('b', 'p', 'r'),
 ('b', 'p', 's'),
 ('b', 'p', 't'),
 ('b', 'p', 'u'),
 ('b', 'p', 'v'),
 ('b', 'p', 'w'),
 ('b', 'p', 'x'),
 ('b', 'p', 'y'),
 ('b', 'p', 'z'),
 ('b', 'q', 'q'),
 ('b', 'q', 'r'),
 ('b', 'q', 's'),
 ('b', 'q', 't'),
 ('b', 'q', 'u'),
 ('b', 'q', 'v'),
 ('b', 'q', 'w'),
 ('b', 'q', 'x'),
 ('b', 'q', 'y'),
 ('b', 'q', 'z'),
 ('b', 'r', 'r'),
 ('b', 'r', 's'),
 ('b', 'r', 't'),
 ('b', 'r', 'u'),
 ('b', 'r', 'v'),
 ('b', 'r', 'w'),
 ('b', 'r', 'x'),
 ('b', 'r', 'y'),
 ('b', 'r', 'z'),
 ('b', 's', 's'),
 ('b', 's', 't'),
 ('b', 's', 'u'),
 ('b', 's', 'v'),
 ('b', 's', 'w'),
 ('b', 's', 'x'),
 ('b', 's', 'y'),
 ('b', 's', 'z'),
 ('b', 't', 't'),
 ('b', 't', 'u'),
 ('b', 't', 'v'),
 ('b', 't', 'w'),
 ('b', 't', 'x'),
 ('b', 't', 'y'),
 ('b', 't', 'z'),
 ('b', 'u', 'u'),
 ('b', 'u', 'v'),
 ('b', 'u', 'w'),
 ('b', 'u', 'x'),
 ('b', 'u', 'y'),
 ('b', 'u', 'z'),
 ('b', 'v', 'v'),
 ('b', 'v', 'w'),
 ('b', 'v', 'x'),
 ('b', 'v', 'y'),
 ('b', 'v', 'z'),
 ('b', 'w', 'w'),
 ('b', 'w', 'x'),
 ('b', 'w', 'y'),
 ('b', 'w', 'z'),
 ('b', 'x', 'x'),
 ('b', 'x', 'y'),
 ('b', 'x', 'z'),
 ('b', 'y', 'y'),
 ('b', 'y', 'z'),
 ('b', 'z', 'z'),
 ('c', 'c', 'c'),
 ('c', 'c', 'd'),
 ('c', 'c', 'e'),
 ('c', 'c', 'f'),
 ('c', 'c', 'g'),
 ('c', 'c', 'h'),
 ('c', 'c', 'i'),
 ('c', 'c', 'j'),
 ('c', 'c', 'k'),
 ('c', 'c', 'l'),
 ('c', 'c', 'm'),
 ('c', 'c', 'n'),
 ('c', 'c', 'o'),
 ('c', 'c', 'p'),
 ('c', 'c', 'q'),
 ('c', 'c', 'r'),
 ('c', 'c', 's'),
 ('c', 'c', 't'),
 ('c', 'c', 'u'),
 ('c', 'c', 'v'),
 ('c', 'c', 'w'),
 ('c', 'c', 'x'),
 ('c', 'c', 'y'),
 ('c', 'c', 'z'),
 ('c', 'd', 'd'),
 ('c', 'd', 'e'),
 ('c', 'd', 'f'),
 ('c', 'd', 'g'),
 ('c', 'd', 'h'),
 ('c', 'd', 'i'),
 ('c', 'd', 'j'),
 ('c', 'd', 'k'),
 ('c', 'd', 'l'),
 ('c', 'd', 'm'),
 ('c', 'd', 'n'),
 ('c', 'd', 'o'),
 ('c', 'd', 'p'),
 ('c', 'd', 'q'),
 ('c', 'd', 'r'),
 ('c', 'd', 's'),
 ('c', 'd', 't'),
 ('c', 'd', 'u'),
 ('c', 'd', 'v'),
 ('c', 'd', 'w'),
 ('c', 'd', 'x'),
 ('c', 'd', 'y'),
 ('c', 'd', 'z'),
 ('c', 'e', 'e'),
 ('c', 'e', 'f'),
 ('c', 'e', 'g'),
 ('c', 'e', 'h'),
 ('c', 'e', 'i'),
 ('c', 'e', 'j'),
 ('c', 'e', 'k'),
 ('c', 'e', 'l'),
 ('c', 'e', 'm'),
 ('c', 'e', 'n'),
 ('c', 'e', 'o'),
 ('c', 'e', 'p'),
 ('c', 'e', 'q'),
 ('c', 'e', 'r'),
 ('c', 'e', 's'),
 ('c', 'e', 't'),
 ('c', 'e', 'u'),
 ('c', 'e', 'v'),
 ('c', 'e', 'w'),
 ('c', 'e', 'x'),
 ('c', 'e', 'y'),
 ('c', 'e', 'z'),
 ('c', 'f', 'f'),
 ('c', 'f', 'g'),
 ('c', 'f', 'h'),
 ('c', 'f', 'i'),
 ('c', 'f', 'j'),
 ('c', 'f', 'k'),
 ('c', 'f', 'l'),
 ('c', 'f', 'm'),
 ('c', 'f', 'n'),
 ('c', 'f', 'o'),
 ('c', 'f', 'p'),
 ('c', 'f', 'q'),
 ('c', 'f', 'r'),
 ('c', 'f', 's'),
 ('c', 'f', 't'),
 ('c', 'f', 'u'),
 ('c', 'f', 'v'),
 ('c', 'f', 'w'),
 ('c', 'f', 'x'),
 ('c', 'f', 'y'),
 ('c', 'f', 'z'),
 ('c', 'g', 'g'),
 ('c', 'g', 'h'),
 ('c', 'g', 'i'),
 ('c', 'g', 'j'),
 ('c', 'g', 'k'),
 ('c', 'g', 'l'),
 ('c', 'g', 'm'),
 ('c', 'g', 'n'),
 ('c', 'g', 'o'),
 ('c', 'g', 'p'),
 ('c', 'g', 'q'),
 ('c', 'g', 'r'),
 ('c', 'g', 's'),
 ('c', 'g', 't'),
 ('c', 'g', 'u'),
 ('c', 'g', 'v'),
 ('c', 'g', 'w'),
 ('c', 'g', 'x'),
 ('c', 'g', 'y'),
 ('c', 'g', 'z'),
 ('c', 'h', 'h'),
 ('c', 'h', 'i'),
 ('c', 'h', 'j'),
 ('c', 'h', 'k'),
 ('c', 'h', 'l'),
 ('c', 'h', 'm'),
 ('c', 'h', 'n'),
 ('c', 'h', 'o'),
 ('c', 'h', 'p'),
 ('c', 'h', 'q'),
 ('c', 'h', 'r'),
 ('c', 'h', 's'),
 ('c', 'h', 't'),
 ('c', 'h', 'u'),
 ('c', 'h', 'v'),
 ('c', 'h', 'w'),
 ('c', 'h', 'x'),
 ('c', 'h', 'y'),
 ('c', 'h', 'z'),
 ('c', 'i', 'i'),
 ('c', 'i', 'j'),
 ('c', 'i', 'k'),
 ('c', 'i', 'l'),
 ('c', 'i', 'm'),
 ('c', 'i', 'n'),
 ('c', 'i', 'o'),
 ('c', 'i', 'p'),
 ('c', 'i', 'q'),
 ('c', 'i', 'r'),
 ('c', 'i', 's'),
 ('c', 'i', 't'),
 ('c', 'i', 'u'),
 ('c', 'i', 'v'),
 ('c', 'i', 'w'),
 ('c', 'i', 'x'),
 ('c', 'i', 'y'),
 ('c', 'i', 'z'),
 ('c', 'j', 'j'),
 ('c', 'j', 'k'),
 ('c', 'j', 'l'),
 ('c', 'j', 'm'),
 ('c', 'j', 'n'),
 ('c', 'j', 'o'),
 ('c', 'j', 'p'),
 ('c', 'j', 'q'),
 ('c', 'j', 'r'),
 ('c', 'j', 's'),
 ('c', 'j', 't'),
 ('c', 'j', 'u'),
 ('c', 'j', 'v'),
 ('c', 'j', 'w'),
 ('c', 'j', 'x'),
 ('c', 'j', 'y'),
 ('c', 'j', 'z'),
 ('c', 'k', 'k'),
 ('c', 'k', 'l'),
 ('c', 'k', 'm'),
 ('c', 'k', 'n'),
 ('c', 'k', 'o'),
 ('c', 'k', 'p'),
 ('c', 'k', 'q'),
 ('c', 'k', 'r'),
 ('c', 'k', 's'),
 ('c', 'k', 't'),
 ('c', 'k', 'u'),
 ('c', 'k', 'v'),
 ('c', 'k', 'w'),
 ('c', 'k', 'x'),
 ('c', 'k', 'y'),
 ('c', 'k', 'z'),
 ('c', 'l', 'l'),
 ('c', 'l', 'm'),
 ('c', 'l', 'n'),
 ('c', 'l', 'o'),
 ('c', 'l', 'p'),
 ('c', 'l', 'q'),
 ('c', 'l', 'r'),
 ('c', 'l', 's'),
 ('c', 'l', 't'),
 ('c', 'l', 'u'),
 ('c', 'l', 'v'),
 ('c', 'l', 'w'),
 ('c', 'l', 'x'),
 ('c', 'l', 'y'),
 ('c', 'l', 'z'),
 ('c', 'm', 'm'),
 ('c', 'm', 'n'),
 ('c', 'm', 'o'),
 ('c', 'm', 'p'),
 ('c', 'm', 'q'),
 ('c', 'm', 'r'),
 ('c', 'm', 's'),
 ('c', 'm', 't'),
 ('c', 'm', 'u'),
 ('c', 'm', 'v'),
 ('c', 'm', 'w'),
 ('c', 'm', 'x'),
 ('c', 'm', 'y'),
 ('c', 'm', 'z'),
 ('c', 'n', 'n'),
 ('c', 'n', 'o'),
 ('c', 'n', 'p'),
 ('c', 'n', 'q'),
 ('c', 'n', 'r'),
 ('c', 'n', 's'),
 ('c', 'n', 't'),
 ('c', 'n', 'u'),
 ('c', 'n', 'v'),
 ('c', 'n', 'w'),
 ('c', 'n', 'x'),
 ('c', 'n', 'y'),
 ('c', 'n', 'z'),
 ('c', 'o', 'o'),
 ('c', 'o', 'p'),
 ('c', 'o', 'q'),
 ('c', 'o', 'r'),
 ('c', 'o', 's'),
 ('c', 'o', 't'),
 ('c', 'o', 'u'),
 ('c', 'o', 'v'),
 ('c', 'o', 'w'),
 ('c', 'o', 'x'),
 ('c', 'o', 'y'),
 ('c', 'o', 'z'),
 ('c', 'p', 'p'),
 ('c', 'p', 'q'),
 ('c', 'p', 'r'),
 ('c', 'p', 's'),
 ('c', 'p', 't'),
 ('c', 'p', 'u'),
 ('c', 'p', 'v'),
 ('c', 'p', 'w'),
 ('c', 'p', 'x'),
 ('c', 'p', 'y'),
 ('c', 'p', 'z'),
 ('c', 'q', 'q'),
 ('c', 'q', 'r'),
 ('c', 'q', 's'),
 ('c', 'q', 't'),
 ('c', 'q', 'u'),
 ('c', 'q', 'v'),
 ('c', 'q', 'w'),
 ('c', 'q', 'x'),
 ('c', 'q', 'y'),
 ('c', 'q', 'z'),
 ('c', 'r', 'r'),
 ('c', 'r', 's'),
 ('c', 'r', 't'),
 ('c', 'r', 'u'),
 ('c', 'r', 'v'),
 ('c', 'r', 'w'),
 ('c', 'r', 'x'),
 ('c', 'r', 'y'),
 ('c', 'r', 'z'),
 ('c', 's', 's'),
 ('c', 's', 't'),
 ('c', 's', 'u'),
 ('c', 's', 'v'),
 ('c', 's', 'w'),
 ('c', 's', 'x'),
 ('c', 's', 'y'),
 ('c', 's', 'z'),
 ('c', 't', 't'),
 ('c', 't', 'u'),
 ('c', 't', 'v'),
 ('c', 't', 'w'),
 ('c', 't', 'x'),
 ('c', 't', 'y'),
 ('c', 't', 'z'),
 ('c', 'u', 'u'),
 ('c', 'u', 'v'),
 ('c', 'u', 'w'),
 ('c', 'u', 'x'),
 ('c', 'u', 'y'),
 ('c', 'u', 'z'),
 ('c', 'v', 'v'),
 ('c', 'v', 'w'),
 ('c', 'v', 'x'),
 ('c', 'v', 'y'),
 ('c', 'v', 'z'),
 ('c', 'w', 'w'),
 ('c', 'w', 'x'),
 ('c', 'w', 'y'),
 ('c', 'w', 'z'),
 ('c', 'x', 'x'),
 ('c', 'x', 'y'),
 ('c', 'x', 'z'),
 ('c', 'y', 'y'),
 ('c', 'y', 'z'),
 ('c', 'z', 'z'),
 ('d', 'd', 'd'),
 ('d', 'd', 'e'),
 ('d', 'd', 'f'),
 ('d', 'd', 'g'),
 ('d', 'd', 'h'),
 ('d', 'd', 'i'),
 ('d', 'd', 'j'),
 ('d', 'd', 'k'),
 ('d', 'd', 'l'),
 ('d', 'd', 'm'),
 ('d', 'd', 'n'),
 ('d', 'd', 'o'),
 ('d', 'd', 'p'),
 ('d', 'd', 'q'),
 ('d', 'd', 'r'),
 ('d', 'd', 's'),
 ('d', 'd', 't'),
 ('d', 'd', 'u'),
 ('d', 'd', 'v'),
 ('d', 'd', 'w'),
 ('d', 'd', 'x'),
 ('d', 'd', 'y'),
 ('d', 'd', 'z'),
 ('d', 'e', 'e'),
 ...]

In [53]:
# read in the cipher data

cipher_file = open("cipher.txt", "r")
cipher = cipher_file.read()
cipher_file.close()
# make into list
cipher = cipher.split(",")
# make integers
cipher_int = [int(x) for x in cipher]
cipher_chr = [chr(x) for x in cipher_int]

In [54]:
# cipher_chr

In [55]:
from itertools import cycle
from math import ceil

# this function extends the key to an arbitrary length. There might be a better
# way to do this.
def extendKey(key, length):
    return((key*ceil(length/3))[0:length])
    
extendKey('abc',8)


Out[55]:
'abcabcab'

In [56]:
# this function encodes single characters
def encode(text, key):
    return chr(ord(text) ^ ord(key))

# this function encodes and decodes strings
def encodeString(text, key):
    # make key as long as text
    keyStr = extendKey(key, len(text))
    out = []
    for i in range(len(text)):
        out += encode(text[i], keyStr[i])
    return(out)
    #return(''.join(out))

# encodeString(encodeString('hi there', 'ab'),'ab')

In [57]:
print(encodeString(cipher_chr, 'aaa'))
'd' in encodeString(cipher_chr, 'aaa')


['.', 'Z', 'm', 'c', '.', 'B', 'i', '}', 'u', 'c', 'b', '%', 'i', 'h', '%', 'L', 'a', 'm', 'h', '"', '%', 'e', 'f', 'd', 'v', 'z', '`', 't', '.', '4', '/', '.', '4', '&', 'G', 'k', '&', 'z', 'm', 'c', '.', 'g', 'c', 'i', 'l', 'h', '`', 'l', 'h', 'i', '%', 'r', 'f', '`', '&', 'Y', 'j', 't', 'j', '%', 'g', 'b', 'w', 'c', 'o', 'a', '\x7f', '.', '`', '~', 'g', 'v', 'r', 'k', 'a', '(', '.', 'M', 'c', '.', 'r', 'g', '}', '%', 'q', 'g', 'q', 'n', '.', 'B', 'i', 'j', ')', '&', 'o', 'k', 'b', '.', 'm', 'c', '.', 'r', 'g', '}', '%', 'A', 'a', 'a', '(', '.', '7', '&', 'F', '`', '&', 'y', 'd', 'u', '.', 'l', 'h', '.', 'q', 'n', 'k', '%', 'd', 'k', 'b', 'o', '`', 'k', 'o', '`', 'b', '&', 'y', 'l', 'r', 'f', '%', 'A', 'a', 'a', '(', '.', '6', '&', 'F', '`', '&', 'm', 'w', 'c', 'o', 'q', 'c', 'j', '%', 'c', 'x', '`', 't', 'w', 'q', 'n', 'g', 'k', 'a', '.', 'q', 'n', 'k', 'w', 'c', '.', 'l', 'u', ' ', '%', 'H', 'a', 'q', 'n', 'g', 'k', 'a', '.', '`', '~', 'g', 'v', 'r', '}', '%', 'r', 'f', 'd', 'r', '.', 'm', 'c', '.', 'a', 'o', 'j', 'k', '!', 'z', '%', 'k', 'o', 'n', 'c', ' ', '%', '2', '.', 'I', 'o', 'h', '`', '&', 'g', 'q', 'u', 'k', 'i', '`', '.', 'r', 'g', '}', '%', 'o', '`', '%', 'n', 'g', 'h', '*', '.', 'd', 'h', 'j', '%', 'r', 'f', 'l', 'u', '.', 'i', 'o', 'h', '`', '&', 'i', 'l', 'p', 'k', 'v', '&', 'b', 'l', 'a', 'f', 'q', '&', 'z', 'j', '&', 'k', 's', 'c', '|', '|', 'i', '`', '`', '(', '.', '0', '&', 'Z', 'm', 'c', '.', 'i', 'o', 'i', 'm', 'r', '.', 'v', 'n', 'g', 'k', 'c', '}', '%', 'r', 'f', 'w', 'i', '{', 'b', 'n', '.', 'q', 'n', 'k', '%', 'b', 'o', 'w', 'm', '`', '`', 'u', '}', ')', '&', 'o', 'k', 'b', '.', 'q', 'n', 'k', '%', 'b', 'o', 'w', 'm', '`', '`', 'u', '}', '%', 'e', 'o', 'k', '&', '`', '`', 'p', 'k', 'w', '&', 'k', '}', 'r', 'g', 'k', 'a', '{', 'l', 'u', 'f', '%', 'o', 'z', '+', '&', '8', '%', 'A', 'a', 'a', '&', '}', '`', 'h', 'z', '%', 'L', 'a', 'm', 'h', '.', 'q', 'n', 'k', '%', 'D', 'o', 'u', 'r', 'g', 'v', 'r', '.', '2', '&', 'z', 'j', '&', 'z', '`', 'j', 'b', '%', 'c', 'x', '`', 't', 'w', 'j', 'h', 'k', '%', 'g', 'l', 'j', 's', 'z', '%', 'r', 'f', '`', '&', 'b', 'l', 'a', 'f', 'q', '&', '}', 'j', '&', 'z', 'm', 'g', 'z', '%', 'c', 'x', '`', 't', 'w', 'j', 'h', 'k', '%', 'k', 'g', 'b', 'n', 'z', '%', 'd', 'k', 'i', 'o', 'k', 's', 'c', '.', 'g', 'c', 'm', 'd', 's', '}', '`', '&', 'a', 'c', '&', 'f', 'l', 'u', '.', 'q', 'c', '}', 'q', 'o', 'c', 'j', 'h', 'w', '+', '&', '6', '%', 'L', 'a', 'm', 'h', '.', 'm', 'o', 'c', 'v', 'c', 'b', 'c', '&', 'y', 'd', 'u', '.', 'k', 'i', 'z', '%', 'r', 'f', '`', '&', 'b', 'l', 'a', 'f', 'q', '=', '.', 'm', 'c', '.', 'r', 'g', '}', '%', 'i', '`', 'i', '\x7f', '.', 'd', '&', 'y', 'l', 'r', '`', '`', 'u', '}', '%', 'r', 'a', '%', 'r', 'f', '`', '&', 'b', 'l', 'a', 'f', 'q', '(', '.', '<', '&', 'Z', 'm', 'c', '.', 'j', 'h', 'k', '%', 'q', 'f', 'j', '&', 'g', 'v', '&', 'z', 'm', 'c', '.', 'q', 't', '{', '`', '&', 'b', 'l', 'a', 'f', 'q', '*', '.', 'r', 'n', 'a', '%', 'a', 'g', 's', 'c', '}', '%', 'j', 'g', 'b', 'n', 'z', '%', 'r', 'a', '%', 'c', 'x', '`', 't', 'w', 'j', 'h', 'k', ')', '&', 'y', 'd', 'u', '.', 'b', 'i', 'g', 'k', 'a', '.', 'q', 'i', '.', 'f', 'i', 'c', '`', '&', 'g', 'k', 'r', 'a', '%', 'r', 'f', '`', '&', 'y', 'j', 't', 'b', 'a', '(', '.', '4', '6', '.', 'G', 's', 'z', '%', 'g', 'b', 'q', 'n', 'a', 'p', 'a', 'f', '%', 'r', 'f', '`', '&', 'y', 'j', 't', 'b', 'a', '&', 'y', 'd', 'u', '.', 'h', 'g', 'j', '`', '&', 'z', 'm', 't', 'a', 'p', 'a', 'f', '%', 'n', 'g', 'h', '*', '.', 'q', 'n', 'k', '%', 'q', 'a', 'w', 'j', 'j', '%', 'b', 'g', 'a', 'h', ')', 'q', '&', '|', '`', 'e', 'a', 'b', 'h', 'g', '\x7f', 'c', '.', 'm', 'o', 'c', '%', 'q', 'f', '`', 'h', '.', 'm', 'c', '.', 'f', 'g', 'c', '`', '(', '.', '4', '7', '.', '@', 'p', 'k', 'k', '&', 'g', 'k', '&', 'f', 'l', 'u', '.', 'j', 'q', '`', '%', 'j', 'o', 'k', 'b', '.', 'd', 'h', 'j', '%', 'g', 'c', 'j', 'h', 'i', '%', 'n', 'g', 'v', '&', 'a', 'r', 'h', '.', 'u', 'c', 'a', 'u', 'j', 'k', ')', '&', 'f', '`', '&', 'y', 'd', 'u', '.', 'k', 'i', 'z', '%', 'g', 'm', 'f', 'c', '~', 'q', 'c', 'j', '+', '&', '?', '7', '&', 'L', 'p', 'r', '.', 'q', 'i', '.', 'd', 'j', 'b', '%', 'q', 'f', 'j', '&', 'l', '`', 'j', 'g', '`', 'p', 'k', 'a', '&', 'f', 'l', 'k', '.', 'd', 'h', 'j', '%', 'g', 'm', 'f', 'c', '~', 'q', 'c', 'j', '%', 'n', 'g', 'h', '*', '.', 'm', 'c', '.', 'b', 'g', 'x', '`', '&', 'z', 'm', 'c', '.', 'w', 'o', 'i', 'm', 'r', '.', 'q', 'i', '.', 'g', 'c', 'm', 'j', 'k', 'k', '%', 'e', 'f', 'l', 'j', 'j', 'w', 'c', '`', '%', 'i', 'h', '%', 'A', 'a', 'a', '(', '.', '4', '5', '.', 'Q', 'n', 'k', '|', '&', 'o', 'w', 'c', '.', 'w', 'c', 'l', 'j', 't', '`', '$', '&', 'Z', 'm', 'o', '}', '%', 'o', '}', '%', 'h', 'a', 'q', '&', 'o', '%', 'v', 'f', '|', 'u', 'g', 'f', 'g', 'b', '%', 'd', 'g', 'w', 'r', 'f', '%', 't', 'k', 'v', 's', 'b', 'q', 'o', '`', 'b', '&', 'h', 'w', 'i', 'c', '%', 'n', '{', 'h', 'g', '`', '%', 'v', 'o', 'v', 'u', 'g', 'j', 'h', '.', 'j', 't', '.', 'u', 'j', 'o', 'k', '*', '.', 'q', 'n', 'g', 'v', '&', '|', '`', 'd', 'g', 'w', 'r', 'f', '%', 'e', 'a', 'h', 'c', '}', '%', '`', '|', 'j', 'k', '.', 'B', 'i', 'j', '+', '7', ':', '%', 'U', 'a', '%', 'r', 'f', '`', '&', 'Y', 'j', 't', 'j', '%', 'd', 'k', 'f', 'g', 'c', '`', '&', 'f', 'p', 'k', 'o', 'k', '&', 'o', 'k', 'b', '.', 'i', 'o', 'x', '`', 'b', '.', 'm', 'c', '|', '`', '&', 'a', 'k', '&', 'k', 'd', 't', 'z', 'm', '&', 'o', 'h', 'i', '`', 'b', '&', '{', 'v', '(', '.', 'M', 'c', '.', 'r', 'g', '}', '%', '`', '{', 'i', 'j', '.', 'j', '`', '.', 'p', 'h', 'h', 'd', 'o', 'b', 'l', 'h', 'i', '%', 'j', 'a', 's', 'c', '.', 'd', 'h', 'j', '%', '`', 'o', 'l', 'r', 'f', 'c', 's', 'b', 'k', 'c', '}', 'v', '(', '.', 'D', 'h', 'j', '%', 'q', 'k', '%', 'n', 'o', 's', 'c', '.', 'v', 'c', 'k', 'k', '&', 'f', 'l', 'u', '.', 'b', 'j', 'a', 'w', '\x7f', '"', '%', 'r', 'f', '`', '&', 'i', 'i', 'i', '|', '|', '&', 'a', 'c', '&', 'z', 'm', 'c', '.', 'j', 'h', 'b', '|', '&', ']', 'j', 'h', '.', 'j', '`', '.', 'q', 'n', 'k', '%', '@', 'o', 'q', 'n', 'k', 'w', '(']
Out[57]:
True

In [58]:
# This cell will be used for grading, leave it at the end of the notebook.