Merging back into solutions
authorNeil Smith <neil.git@njae.me.uk>
Mon, 14 Jul 2014 18:56:26 +0000 (19:56 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Mon, 14 Jul 2014 18:56:26 +0000 (19:56 +0100)
1  2 
cipher.py

diff --combined cipher.py
index bde9ea1edae60438c4ea131690c9221c689f1eab,d284afe94e0534b3e11fe6f819fc81d5fe6061db..d2438b720693c6abc231b827fe26a8d5ce52dddf
+++ b/cipher.py
@@@ -16,6 -16,53 +16,52 @@@ for a in range(26)
          modular_division_table[b][c] = a
  
  
 -
+ def every_nth(text, n, fillvalue=''):
+     """Returns n strings, each of which consists of every nth character,
+     starting with the 0th, 1st, 2nd, ... (n-1)th character
+     >>> every_nth(string.ascii_lowercase, 5)
+     ['afkpuz', 'bglqv', 'chmrw', 'dinsx', 'ejoty']
+     >>> every_nth(string.ascii_lowercase, 1)
+     ['abcdefghijklmnopqrstuvwxyz']
+     >>> every_nth(string.ascii_lowercase, 26) # doctest: +NORMALIZE_WHITESPACE
+     ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+      'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
+     >>> every_nth(string.ascii_lowercase, 5, fillvalue='!')
+     ['afkpuz', 'bglqv!', 'chmrw!', 'dinsx!', 'ejoty!']
+     """
+     split_text = chunks(text, n, fillvalue)
+     return [''.join(l) for l in zip_longest(*split_text, fillvalue=fillvalue)]
+ def combine_every_nth(split_text):
+     """Reforms a text split into every_nth strings
+     >>> combine_every_nth(every_nth(string.ascii_lowercase, 5))
+     'abcdefghijklmnopqrstuvwxyz'
+     >>> combine_every_nth(every_nth(string.ascii_lowercase, 1))
+     'abcdefghijklmnopqrstuvwxyz'
+     >>> combine_every_nth(every_nth(string.ascii_lowercase, 26))
+     'abcdefghijklmnopqrstuvwxyz'
+     """
+     return ''.join([''.join(l)
+                     for l in zip_longest(*split_text, fillvalue='')])
+ def chunks(text, n, fillvalue=None):
+     """Split a text into chunks of n characters
+     >>> chunks('abcdefghi', 3)
+     ['abc', 'def', 'ghi']
+     >>> chunks('abcdefghi', 4)
+     ['abcd', 'efgh', 'i']
+     >>> chunks('abcdefghi', 4, fillvalue='!')
+     ['abcd', 'efgh', 'i!!!']
+     """
+     if fillvalue:
+         padding = fillvalue[0] * (n - len(text) % n)
+     else:
+         padding = ''
+     return [(text+padding)[i:i+n] for i in range(0, len(text), n)]
  def deduplicate(text):
      """If a string contains duplicate letters, remove all but the first. Retain
      the order of the letters.