Refactored out sanitise, added loading of English letter counts
[cipher-tools.git] / cipher.py
1 import string
2 import collections
3
4 english_counts = collections.defaultdict(int)
5 with open('count_1l.txt', 'r') as f:
6 for line in f:
7 (letter, count) = line.split("\t")
8 english_counts[letter] = int(count)
9
10 def sanitise(text):
11 sanitised = [c.lower() for c in text if c in string.ascii_letters]
12 return ''.join(sanitised)
13
14 def letter_frequencies(message):
15 frequencies = collections.defaultdict(int)
16 for letter in sanitise(message):
17 frequencies[letter]+=1
18 return frequencies
19
20 def caesar_cipher_letter(letter, shift):
21 if letter in string.ascii_letters:
22 if letter in string.ascii_lowercase:
23 return chr((ord(letter) - ord('a') + shift) % 26 + ord('a'))
24 else:
25 new_letter = letter.lower()
26 yolo = chr((ord(new_letter) - ord('a') + shift) % 26 + ord('a'))
27 return yolo.upper()
28 else:
29 return letter
30
31 def caesar_decipher_letter(letter, shift):
32 return caesar_cipher_letter(letter, -shift)
33
34 def caesar_cipher_message(message, shift):
35 big_cipher = [caesar_cipher_letter(l, shift) for l in message]
36 return ''.join(big_cipher)
37
38 def caesar_decipher_message(message, shift):
39 return caesar_cipher_message(message, -shift)