Many tests done, still more to come.
[szyfrow.git] / szyfrow / column_transposition.py
index 7e0fc28a3d002208ccfd0ea0c6958216aa61fa09..6d6fe687810925f990b6b1527fac29860cf0b6a5 100644 (file)
@@ -1,49 +1,54 @@
 import math
 import multiprocessing 
 from itertools import chain
-from support.utilities import *
-from support.language_models import *
+from szyfrow.support.utilities import *
+from szyfrow.support.language_models import *
 
-from logger import logger
+# def transpositions_of(keyword):
+#     """Finds the transpostions given by a keyword. For instance, the keyword
+#     'clever' rearranges to 'celrv', so the first column (0) stays first, the
+#     second column (1) moves to third, the third column (2) moves to second, 
+#     and so on.
 
-def transpositions_of(keyword):
-    """Finds the transpostions given by a keyword. For instance, the keyword
-    'clever' rearranges to 'celrv', so the first column (0) stays first, the
-    second column (1) moves to third, the third column (2) moves to second, 
-    and so on.
+#     If passed a tuple, assume it's already a transposition and just return it.
 
-    If passed a tuple, assume it's already a transposition and just return it.
+#     >>> transpositions_of('clever')
+#     (0, 2, 1, 4, 3)
+#     >>> transpositions_of('fred')
+#     (3, 2, 0, 1)
+#     >>> transpositions_of((3, 2, 0, 1))
+#     (3, 2, 0, 1)
+#     """
+#     if isinstance(keyword, tuple):
+#         return keyword
+#     else:
+#         key = deduplicate(keyword)
+#         transpositions = tuple(key.index(l) for l in sorted(key))
+#         return transpositions
 
-    >>> transpositions_of('clever')
-    (0, 2, 1, 4, 3)
-    >>> transpositions_of('fred')
-    (3, 2, 0, 1)
-    >>> transpositions_of((3, 2, 0, 1))
-    (3, 2, 0, 1)
-    """
-    if isinstance(keyword, tuple):
-        return keyword
-    else:
-        key = deduplicate(keyword)
-        transpositions = tuple(key.index(l) for l in sorted(key))
-        return transpositions
 
+# transpositions = collections.defaultdict(list)
+# for word in keywords:
+#     transpositions[transpositions_of(word)] += [word]
 
-transpositions = collections.defaultdict(list)
-for word in keywords:
-    transpositions[transpositions_of(word)] += [word]
 
+# def pad(message_len, group_len, fillvalue):
+#     """Return the padding needed to extend a message to a multiple of group_len
+#     in length.
 
-def pad(message_len, group_len, fillvalue):
-    padding_length = group_len - message_len % group_len
-    if padding_length == group_len: padding_length = 0
-    padding = ''
-    for i in range(padding_length):
-        if callable(fillvalue):
-            padding += fillvalue()
-        else:
-            padding += fillvalue
-    return padding
+#     fillvalue can be a function or a literal value. If a function, it is called
+#     once for each padded character. Use this will fillvalue=random_english_letter
+#     to pad a message with random letters.
+#     """
+#     padding_length = group_len - message_len % group_len
+#     if padding_length == group_len: padding_length = 0
+#     padding = ''
+#     for i in range(padding_length):
+#         if callable(fillvalue):
+#             padding += fillvalue()
+#         else:
+#             padding += fillvalue
+#     return padding
 
 def column_transposition_encipher(message, keyword, fillvalue=' ', 
       fillcolumnwise=False,
@@ -147,7 +152,7 @@ def scytale_encipher(message, rows, fillvalue=' '):
     # transpositions = [i for i in range(math.ceil(len(message) / rows))]
     # return column_transposition_encipher(message, transpositions, 
     #     fillvalue=fillvalue, fillcolumnwise=False, emptycolumnwise=True)
-    transpositions = [i for i in range(rows)]
+    transpositions = (i for i in range(rows))
     return column_transposition_encipher(message, transpositions, 
         fillvalue=fillvalue, fillcolumnwise=True, emptycolumnwise=False)
 
@@ -179,6 +184,9 @@ def column_transposition_break_mp(message, translist=transpositions,
     """Breaks a column transposition cipher using a dictionary and
     n-gram frequency analysis
 
+    >>> len(keywords)
+    20
+
     >>> column_transposition_break_mp(column_transposition_encipher(sanitise( \
             "It is a truth universally acknowledged, that a single man in \
              possession of a good fortune, must be in want of a wife. However \
@@ -223,10 +231,6 @@ def column_transposition_break_worker(message, transposition,
     plaintext = column_transposition_decipher(message, transposition,
         fillcolumnwise=fillcolumnwise, emptycolumnwise=emptycolumnwise)
     fit = fitness(sanitise(plaintext))
-    logger.debug('Column transposition break attempt using key {0} '
-                         'gives fit of {1} and decrypt starting: {2}'.format(
-                             transposition, fit, 
-                             sanitise(plaintext)[:50]))
     return (transposition, fillcolumnwise, emptycolumnwise), fit