c = (a * b) % 26
modular_division_table[b][c] = a
+def letters(text):
+ """Remove all non-alphabetic characters from a text
+ >>> letters('The Quick')
+ 'TheQuick'
+ >>> letters('The Quick BROWN fox jumped! over... the (9lazy) DOG')
+ 'TheQuickBROWNfoxjumpedoverthelazyDOG'
+ """
+ return ''.join([c for c in text if c in string.ascii_letters])
def sanitise(text):
"""Remove all non-alphabetic characters and convert the text to lowercase
>>> sanitise('The Quick BROWN fox jumped! over... the (9lazy) DOG')
'thequickbrownfoxjumpedoverthelazydog'
"""
- sanitised = [c.lower() for c in text if c in string.ascii_letters]
- return ''.join(sanitised)
+ # sanitised = [c.lower() for c in text if c in string.ascii_letters]
+ # return ''.join(sanitised)
+ return letters(text).lower()
def ngrams(text, n):
"""Returns all n-grams of a text
('h', 2), ('i', 1), ('j', 1), ('k', 1), ('l', 1), ('m', 1), ('n', 1),
('o', 4), ('p', 1), ('q', 1), ('r', 2), ('t', 2), ('u', 2), ('v', 1),
('w', 1), ('x', 1), ('y', 1), ('z', 1)]
+ >>> frequencies('abcdefabcdef')['x']
+ 0
"""
- counts = collections.defaultdict(int)
- for c in text:
- counts[c] += 1
- return counts
+ #counts = collections.defaultdict(int)
+ #for c in text:
+ # counts[c] += 1
+ #return counts
+ return collections.Counter(c for c in text)
letter_frequencies = frequencies
def deduplicate(text):
>>> transpositions_of('clever')
[0, 2, 1, 4, 3]
"""
- transpositions = []
key = deduplicate(keyword)
- for l in sorted(key):
- transpositions += [key.index(l)]
+ transpositions = [key.index(l) for l in sorted(key)]
return transpositions
def column_transposition_encipher(message, keyword):
>>> column_transposition_encipher('hellothere', 'clever')
'hleolteher'
"""
- transpositions = transpositions_of(keyword)
- columns = every_nth(message, len(transpositions), fillvalue=' ')
- transposed_columns = transpose(columns, transpositions)
- return combine_every_nth(transposed_columns)
+ return column_transposition_worker(message, keyword, encipher=True)
def column_transposition_decipher(message, keyword):
"""
>>> column_transposition_decipher('hleolteher', 'clever')
'hellothere'
"""
+ return column_transposition_worker(message, keyword, encipher=False)
+
+def column_transposition_worker(message, keyword, encipher=True):
+ """
+ >>> column_transposition_worker('hellothere', 'clever')
+ 'hleolteher'
+ >>> column_transposition_worker('hellothere', 'clever', encipher=True)
+ 'hleolteher'
+ >>> column_transposition_worker('hleolteher', 'clever', encipher=False)
+ 'hellothere'
+ """
transpositions = transpositions_of(keyword)
columns = every_nth(message, len(transpositions), fillvalue=' ')
- transposed_columns = untranspose(columns, transpositions)
+ if encipher:
+ transposed_columns = transpose(columns, transpositions)
+ else:
+ transposed_columns = untranspose(columns, transpositions)
return combine_every_nth(transposed_columns)