euler/python/e059.py

62 lines
1.4 KiB
Python

def get_encrypted_msg():
with open("../txt/e059.txt", "r") as f:
msg = [int(d) for d in f.read().split(',')]
return msg
def get_words():
with open("../txt/e042.txt", "r") as f:
words = [w.strip('"') for w in f.read().split(",")]
return set(words)
def generate_keys():
alphabet = list(map(chr, range(97, 123)))
return [(ord(a), ord(b), ord(c))
for a in alphabet
for b in alphabet
for c in alphabet]
def to_string(msg):
return "".join(map(chr, msg))
def to_ascii(msg):
return list(map(ord, msg))
def decrypt_msg(key, msg):
return [d ^ key[i % len(key)] for i, d in enumerate(msg)]
def clean_word(word):
return word.strip('').strip(",").strip(".").strip("!").strip("?").upper()
def test_key(key, msg, word_list):
msg = to_string(decrypt_msg(key, msg))
word_count = 0
words = msg.split(" ")
for word in words:
if clean_word(word) in word_list:
word_count += 1
return word_count / len(words)
def euler_059():
msg = get_encrypted_msg()
word_list = get_words()
keys = generate_keys()
ss = [(test_key(key, msg, word_list), key) for key in keys]
s = sorted(ss, reverse=True)[0]
key = s[1]
s = sum(decrypt_msg(key, msg))
return s
if __name__ == "__main__":
print("e059.py: " + str(euler_059()))
assert(euler_059() == 107359)