Merge conflict resolved
authorNeil Smith <neil.git@njae.me.uk>
Sun, 27 Mar 2016 12:35:08 +0000 (13:35 +0100)
committerNeil Smith <neil.git@njae.me.uk>
Sun, 27 Mar 2016 12:35:08 +0000 (13:35 +0100)
20 files changed:
Programming for A level Computing through automated cipher breaking.pdf [new file with mode: 0644]
SIGNED.md
affine_break_parameter_trials.csv [deleted file]
caesar_break_parameter_trials.csv [deleted file]
challenge6.ipynb [deleted file]
challenge7.ipynb [deleted file]
cipher.py [deleted file]
cipherbreak.py [deleted file]
course-blurb.docx [new file with mode: 0644]
course-blurb.odt [new file with mode: 0644]
find_best_affine_break_parameters.py [deleted file]
find_best_caesar_break_parameters.py [deleted file]
find_wikipedia_titles.py [deleted file]
language_models.py [deleted file]
lettercount.py [deleted file]
make-cracking-dictionary.py [deleted file]
norms.py [deleted file]
plot-caesar-parameters.ipynb [deleted file]
segment.py [deleted file]
unknown-word-probability-investigation.ipynb [deleted file]

diff --git a/Programming for A level Computing through automated cipher breaking.pdf b/Programming for A level Computing through automated cipher breaking.pdf
new file mode 100644 (file)
index 0000000..7956915
Binary files /dev/null and b/Programming for A level Computing through automated cipher breaking.pdf differ
index d07ec2a36ce592c293710841a054ddc3eb0fa677..b3967c6237a971424e77f6b4b8eb75211d3ffb33 100644 (file)
--- a/SIGNED.md
+++ b/SIGNED.md
@@ -3,19 +3,19 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
-iQIcBAABCAAGBQJWjpkcAAoJEJPB2e07PgbqyX4QAIMe/BAgFiLDcxDXp6IUQvd8
-TSkZitbbe4WVSiGZ2rsS/LbuHeJr7WGBnUYACp1AeMeJqE62mPl0xbForExH7rRS
-PWF9qw8H+Ie6Cu6KeF9hPbAje+24pntjUT/49slb3zNwcmPP3IytA20w50T6Arw7
-aDq7pZ8IUfWnxTR6ZeWLWDo1rRjNMumQ4CmjcP24HElEm84IJJE9sBpd1uqGDHzW
-q12wajgwO8jANVdAAxXHye3QieEINzvkCNBShhIwE1/oxYs0Gl94UwSVtHuAFqxv
-oul5THS9WFdDCafhgqQkjJC0iOgk9VY833TGIBYzHVA4ktPJmxVvjiDa2aG9vybZ
-JJ5MUriSjnf/K65KJl/5mt9bZtskteS5xP0njzjv2579vD2qiqTsX7h8WgYmTjKe
-ZxyICi/c5fg2188J0qyr0AUYX9blF3ixlGnovZqXbGa1hIjW2HgZUUrTrvkhyLw5
-RwH5B98LIsmVyI0ZNAQejkyHweUYscwyBS0SZDmu5r+23FJ4wlLNUHi2ThK0ep7e
-2ix7QQ3qKsaISDcl6xxARSnBPqScJVHwb8cxI47KeBkVwE48zqaw6BfxjF7IskeN
-ypU/7vjy5XjgwxnTanjYZr8LfnpO84I6qMibL1SRz6YgUkzml6Yp+Nq3viBuv1nh
-6rhe8Q/XLCg5I3VvegZt
-=Ry9+
+iQIcBAABCAAGBQJWjphGAAoJEJPB2e07Pgbq0+wQAII6vI8FpwiD0kEdLDw/2CH3
+9DjXHEe8FEf5cSt7jfg8uwvUO703FzjiR9fZvy+VcryE4BM4PKaJzb0D1t2NifV8
+IsCccX1YZG5R5RruPmnQvmHZQn2JWk34lsHjjwUvv6QWbMZPkdIlMW5lt/QG81vy
+IuFmEhoqzp8QwKIhJla/4/buWGgJRliGdjLMrzn3xWgIqVOtSLtpIhvpXT9sIpfa
+5/YnE0H4QcT+FgOxkvn9htMLK2FMMY1Oh4eSha0vcp028A7xYTysN766I1a2Vm87
+jpe/jZ04qUxrVgF5d/hNr5wWRgEChrATTrL6Xj3jtxHNbbV+6+wDew5h1FJ38NdT
+auILHtRkxmRaUl+39yehxRSzOz6NSRFbqNsy2hpcIxFMkre+9WYCQgqoEbtlLiaJ
+Wo2Z2t2WIQL3tHDask0k9PkUVGi7YcOxpNJ+Xcr1s028YeKpcFqS6cDMGDV3zCbj
+KyRWMsxBx2plhLcXcVQkLwKyTe17XrvBB02jzKP2GnNmaHeYezhbmnl5yrlGiV4r
+eQgfo6Jw7L11IHn3QFYeR5B6RSBqn46Eld1VXmYREY9mwfeFyvKpQnn+nLilBQn0
+w6Oss26B2HHFAO4xcUAdd91AFylBlGle9egANDpUZV0lrIXsiyvSDov116VnRFDS
+caoDSNKSuugHWQZOFMx+
+=vYxp
 -----END PGP SIGNATURE-----
 
 ```
@@ -27,69 +27,113 @@ ypU/7vjy5XjgwxnTanjYZr8LfnpO84I6qMibL1SRz6YgUkzml6Yp+Nq3viBuv1nh
 #### Expect
 
 ```
-size     exec  file                                            contents                                                                                                                         
-               ./                                                                                                                                                                               
-384              .gitignore                                    a93de2ae5c2a47a38599751d1f914566569dfa09dd1778e207117db6c71421dd                                                                 
-18025            LICENSE                                       a01259a1b522cf0de95824f9860613b453153eebac468e96196d5d7dba84786c                                                                 
-61               README.md                                     277247b410300ee16477b12ca54ad878d81c8061f6134e2e1cadccaf299de3a3                                                                 
-469              affine_break_parameter_trials.csv             1a9d635d0af2f41fc6f1e83ae87d6372034259321ba288a11fb024e98ed52f4f|dd9c840434de596a30c84e79de26a9824b36c217a84876c2aab0579b76999735
-6488666          big.txt                                       fa066c7d40f0f201ac4144e652aa62430e58a6b3805ec70650f678da5804e87b                                                                 
-514              caesar_break_parameter_trials.csv             6586223bcc00e06e3ff79d107202d6c29ef962a6dd544add00610c5907407e85|1cb7cc77831ef3ef4f994a9ea77e82a841b38acdde45ede9cedbe7a54f1e8e46
-135303           challenge6.ipynb                              5b37a8b10db4c8d9831827a2acdffdcdb65369557d15b3e08a900ee8e088da73                                                                 
-75506            challenge7.ipynb                              ee9a99fa7a9845ad7db77199927fe8ad1d05a6b0272e50d8175e874e7a3e4cdf                                                                 
-318              cipher-training.sublime-project               58e5d5b4e54fb29abecaef2d41266e3355adccb8b6a70bd595e509bd07c16587                                                                 
-42922            cipher.py                                     58637b8946b4fb973b19a374a2066a896d86c928dacaa1ccd2252e6f8bb6e810                                                                 
-28908            cipherbreak.py                                0fb22645ddce4e04c7e441a1f7bdc0e4a397a3c9b2cfb3098bcb213e79a361c9                                                                 
-11564            count_1edit.txt                               3bf563ef032ba151ec1a4b2d1f33f50c49f4a47e4dc5b8152394bc5b63f57655|b5fbacbebcc25f5011ce97bc9ac967a09c50eef28b4aa98379a6c426df6ac08b
-223              count_1l.txt                                  335388d457db6ef1da05d8b55ab879e9be7d4e021085efc8d9dfeac0e4a79aa9                                                                 
-4956241          count_1w.txt                                  51df159fd3de12b20e403c108f526e96dbd723d9cabdd5f17955cdc16059e690                                                                 
-9270             count_2l.txt                                  bc2895f800189070c193907cd8bca956ad65fed2e25c14300d4bb5b6a243ba99                                                                 
-5566017          count_2w.txt                                  781c0596c3eea532d30bef9f3dba1d5137d652f00376260822c761a7584dfb8c                                                                 
-220441           count_3l.txt                                  8702c95530c7d0d182ab94dc03ed7681fcf969819f6db011a58de31411dc6365                                                                 
-320508           count_big.txt                                 3ba257fba1934bd138413d8274e79b56c5992431a27692fd562929aa43ec01a3                                                                 
-3355             find_best_affine_break_parameters.py          6b11004bb93ac26ec7d42d33504e758edbaf9d55365ae2e4ca2fca7589263f25                                                                 
-3027             find_best_caesar_break_parameters.py          0347d80309179d937a88fd1c8684490a513ccd086366c5a0dd55b8a2fe5c565f                                                                 
-1236             find_wikipedia_titles.py                      f040bf855dfec7fff9d8e5eba2fb509179bc53bc02a20b26b7fc61fef983aa45                                                                 
-5645             language_models.py                            bfd5b60cdef8af20cdb061b24a1691f569984be3be333782c3d76e3370e16d14                                                                 
-368              lettercount.py                                ed36497d62cf75b91994055e4a18848b2fabe5ce793cd76a77fabfc94d81d4f3                                                                 
-592              make-cracking-dictionary.py                   71791e64e4853cd9ca292cb436bbe8c72dd60f509811174df93ed2067683d5c1                                                                 
-7077             norms.py                                      a657a36c1741e6f3a513386b318fcc99e6b11f98ec64a48284b47462ff2acf30                                                                 
-8411             norms.pyc                                     ac7a18765c7bcc27e406d8f38d943408097b3384a271502185d53482e6ec0da7|002b186e716cec64869a00bd2d72e16614931e696daa0cf3529d634a0f270e42
-112847           plot-caesar-parameters.ipynb                  639459b4b2e434f9f0852c012ed9a8a8d87bd1cb6c2d65ca5abfdb0e42c3dea6                                                                 
-881              segment.py                                    94d257cc6151861ef3d3033c4d2d03d8c121b0a982344abf400f65fd507fed28                                                                 
-4538523          shakespeare.txt                               6f9c770efced5c3d87efa6197cd3091b982341372e36c6357f865df91ddecde6                                                                 
-592309           sherlock-holmes.txt                           0027de6f4110440ea51d67a2f3af3484898c630808f13b1d4db108e6283e67a3|2034ee1ebdec47e839607124d22b674d4614e1cc6209d758f7b6e99e69ae8e08
-                 slides/                                                                                                                                                                        
-2493               affine-break.html                           e2ffcbe50ceefb51638a54163829f9eec880a43a900cb7d0e945ce2df153f036                                                                 
-6441               affine-encipher.html                        4f239d2d9e0ef1f5080d1ab3cbb7c876ea1997e5b6f2b6ba0ff5099297006d8c                                                                 
-3320               aims.html                                   a45e8f4b0cc2987656a1b008351e089dcdc2a717aa1b6aa540bf4e8a4435fe17                                                                 
-6835               alternative-plaintext-scoring.html          c313d095c04faa6dae6c57fc20dd5b94f08746c4e8352c73178f335328a8a02d                                                                 
-7831               c1a_frequency_histogram.png                 a79cdaebf4db843aae7e302c2cb3c4606908465f5d6aed702c5c33d591780561|13ea628dccda1a22116fce7fc348b0977b451ba76f671184e45dcad239db6dd6
-8116               caesar-break.html                           786312aa2d85b655d084af45120abb937d65137f19cb9f8e7635107569cbbc94                                                                 
-3793               caesar-encipher.html                        66d4b2d96571a9d7edb10f79d176327efbc3923af2e19c7f61800eea376716e3                                                                 
-7860               caesarwheel1.gif                            fd5a9d2d8ef261b0b7ec4536fc56a27ebec94ac91ff2ca136b74d5c066f3ecce|4c536ee4df63c73c2e5e213ca1f96c2fea0bc058efe991f78fd304ff215e6fcd
-8200               english_frequency_histogram.png             c4a1afec62d2fcda15824f71df3c997088c4a952ee5fe0bc6fa753ede08b2098|6eabd4ebdc616722c9fe3a419e8ca5fc309452120e5023b2e5cb783b9d6d2df8
-9192               fast-good-cheap.gif                         4bc052364a91f4c7f98d5ac4e5ac6abd3a3968cabc7f892eb7c3b987adf9e793|4359cbb234f29ca93ff2fa8dd931ce95dab97cd723788937c5d5d259f913afb7
-2714               further-work.html                           66339213b16c1a98e4afc5c1ec4878bb4839c43ae963e56dd4be624fc60b8895                                                                 
-31180              gcd.svg                                     d5b93a7fe870742df02c201d8e12172f2a67798376c54761281c0a660160e753                                                                 
-2870               index.html                                  f6c2cbaaaeb43db84e9e1bbd2654c31103e22ae3bdf683bfe6d6719a074c9024                                                                 
-5312               keyword-break.html                          3217d573ee8ce0ce73e57d23122dec2de39088d006eb0af16d14405361e99d6c                                                                 
-5456               keyword-encipher.html                       d8d54fc7ebc88b52bade6c3da2ba81bceb110beeb1a82ff5ffd3fa2593ecdab8                                                                 
-2989               pocket-enigma-break.html                    aff9bd947680764ebc7fbf7e62cee948f290b1b81f4c2c2f819734ed24c34da1                                                                 
-6195               pocket-enigma-encipher.html                 d930d9149da4ca6766343524aa7df77a64bceaa5264f97bad48574bf0f46e69b                                                                 
-108903             pocket-enigma-small.jpg                     df9796ce51dbd5b86c1c1ec8a3a6806a77a67025c4dd4400676d24ae53b02cfe|395240459ad459032cab96c25d7ad682faaf7e4e2d9c58f64175ce5eb5467235
-409764             pocket-enigma.jpg                           aeb79ca953b7fac863340d71f675a50029687aa97bae8af4068927414aeec96c|0fd2d5b1683451ecee1a6501c4ccfa311293e15bcdb063314776493e5746a04b
-3460               transposition-break.html                    5d3df37e584ac2b0cf2a6b49cc9276bf0964cf4290bda35e808467c12224b2ea                                                                 
-5758               transposition-encipher.html                 2c1c3e64dc875de00a481eefe782fd1a812a9035a10a27e993ccf9414e087762                                                                 
-52398              typingmonkeylarge.jpg                       04eba431d38b1d9b5a89065c6a6571e28cddb7052ade379b532d4475ab99cf4a|1357b8bbc859ae4487dac3e431463a2df0ac46851baf24e2811a70bc3b11100c
-15756              vector-dot-product.svg                      7dbdf0245ee01f8c920518164ef88f3978312a85ef0e9b6c7771c5a053227d26                                                                 
-9845               vector-subtraction.svg                      25bf3a4c46253c529f9fe801c350e26f34401e8176496b1de2041b329cd8f1d8                                                                 
-8918               word-segmentation.html                      f39cb54c31412c00c5bdeadcc235f261663596293ecb639921d6dc79ac1fafa8                                                                 
-451530           spell-errors.txt                              a4abe6ce6c24280f9a8d0485cbf78ddd2e58279ca01293692630a08ba4b13407                                                                 
-45378            unknown-word-probability-investigation.ipynb  a866c807557980091a284bec04ad49a22c3ff14554ea6dca3edd71157318d52a                                                                 
-3291641          war-and-peace.txt                             3ed0f41cfdf660846878943bad5b9d575bcae1e4a92ee9a7f43d3c9dba2af344|6799e48d3fd0a6f4c40b9951ec86de6da81f0b9cd36e413490ac511542ca54d3
-868202           words.txt                                     aa77abbcba3c6dee1306d93adcedc2b2ccb8a4e0344a39d0676732ff58ebd5e5                                                                 
-868384           words_2013.txt                                57faa4841fe28dd82a5da4488b6381c194df6e1ecc04e61fb9f60e842bbca18c                                                                 
+size     exec  file                                                                       contents                                                                                                                         
+               ./                                                                                                                                                                                                          
+384              .gitignore                                                               a93de2ae5c2a47a38599751d1f914566569dfa09dd1778e207117db6c71421dd                                                                 
+                 2012/                                                                                                                                                                                                     
+1678               1a.ciphertext                                                          c7c16198650e7d91577683acca664a0e588ac5474046a028dea3d9dc4b388df8                                                                 
+1678               1a.plaintext                                                           1b34de5b1d1422a3089c54d751dfd3938449c98526137a0b8b3b6561a700f9b5                                                                 
+3312               1b.ciphertext                                                          ec263c5cb415f99924e5744846c618b2566a072ac79f6b3cfdde294b99c491fd                                                                 
+3323               1b.plaintext                                                           a7fde879259e64fccca52618a9c008f2111e485ed1c6bfad863c90d8e6ceacae                                                                 
+1716               2a.ciphertext                                                          2203112c5b43e09b61d8e2918554831559efc7a1157aafda85c25d5ae67f2f0f                                                                 
+1716               2a.plaintext                                                           28afae88a3b3f0e553f326be7efb896587cb4ac43b9fd664d2cc3f9b2489de35                                                                 
+2268               2b.ciphertext                                                          587ba7bb4c39d6bd23cbefdcef63d1211d81f6340d401027f9b8e97c97a71b6c                                                                 
+2268               2b.plaintext                                                           4ee16e37ec82a6ea5446c3d03689bcf608d7408cf79542accaabc297fe6d9f97                                                                 
+1549               3a.ciphertext                                                          fcfff1c90fb5e0cb4240b0617cd7a0bfb1f81ee513a572b44562a0e9db9b4a1b                                                                 
+1549               3a.plaintext                                                           54c6b1ec3364c34a824ee693c00fa41c466f4bfccad281c4111ce1966232c9f4                                                                 
+2009               3b.ciphertext                                                          4a568ac5e67430cd30a2bfd73214a7b3984b3117be16f649ea99c40d3de551c3                                                                 
+2118               3b.plaintext                                                           a2b398c99fe1f00d3e7c558c5a9ea9d6739120d63e84b17f19d8f524ae9adf26                                                                 
+1495               4a.ciphertext                                                          4cbf7aa5d463087f40c3ca724a3860f38b8cad1fc281374eb4567df004d3b5ca                                                                 
+1559               4a.plaintext                                                           b1c02b4ed9df29fcefb046aec75a7702f6e6c1cd28bd56cc67bec1f4ae2af4fb                                                                 
+2137               4b.ciphertext                                                          829ef4812a023567b9652c57f92da6f48c0b854694eac1a7c9452645723e15db                                                                 
+2212               4b.plaintext                                                           d811c945afab0212c346531fd557c0f1d9a3fb0207835152a1426deda9e0b2a1                                                                 
+1449               5a.ciphertext                                                          9fb9fbe92a26b3d1b2f54909e732a0d1afde90f97483affcfa9bbacb4edf3d77                                                                 
+1524               5a.plaintext                                                           203ea3702e17269cbed804f019dd887ae7fc27b2585f1551fc758692e5ba14dd                                                                 
+2561               5b.ciphertext                                                          c0bc2532c853e723fb7c3529c60ca859b7d61af238a98ddaabe0c01423e2a3ab                                                                 
+2618               5b.plaintext                                                           61431a5bfd9a0e1e21e8ac7ba764ba46cc4b2a3e7adf22fff13153fdc278a451                                                                 
+1225               6a.ciphertext                                                          d22c65b2445ab1228c8351239c37310188d4ec9e173825da43f79509d957aada                                                                 
+1285               6a.plaintext                                                           27e574c224ad11d7b6258ef6212e8961decac5af3e93c9b08b0919c82c376f98                                                                 
+1478               6b.ciphertext                                                          e80fc065648e8a4207a7d698cd0f39722d69df819fdf756a7d30e2886670542c                                                                 
+1544               6b.plaintext                                                           424fc647b26f1ef153ec73eda2745896813bc1c6b498a5a0b0b05ff931ec5bf6                                                                 
+1331               7a.ciphertext                                                          d73fe6633bafb097a283396bb5a9b8a5f025031453d1df14156f9c41e898fac3                                                                 
+1412               7a.plaintext                                                           e13149a6f2df3d7d466f761d58c4a8ca3a82fbbc4f6dca983e83442e5caa748f                                                                 
+2551               7b.ciphertext                                                          15200bf858dede4f6cabffaac54c14d37171cd4f7641a059258cd44b6cb98e7d                                                                 
+2661               7b.plaintext                                                           430d167225a8f8c98d6e3f69aaca5846ba7d112567b987f3481832b07b03fc05                                                                 
+1125               8a.ciphertext                                                          5c47ee5314dc118b515b2ab8dc5ed14c492294e70a67f9329ed10d3486fd9ba6                                                                 
+1195               8a.plaintext                                                           a1deee4fa908fb536035435eb066d5c1fed91f962cfd0390f5c51fbb60caceb7                                                                 
+1783               8b.ciphertext                                                          c782e2765c9e3cb0ec72cc77f063ad7f90f2a003d5078b452c24ce3a4549f696                                                                 
+1783               8b.plaintext                                                           925b270f35dce522f0447085f78795a6f8101013648c836b029f0535f4d752e6                                                                 
+                 2013/                                                                                                                                                                                                     
+1340               1a.ciphertext                                                          6b69f06bd684fdaa79ff35497715af6ded3c176277859d1d774bb2569dd53a97                                                                 
+1340               1a.plaintext                                                           cbdaac33a7943a752ba5dd21cf7af23bdbdd22e4a5feb0bccecce45d605d0581                                                                 
+1495               1b.ciphertext                                                          2e0389e2c7d3156892f7d361ee79f86eb79d34812fca37d8ce692cb6f3976446                                                                 
+1495               1b.plaintext                                                           717b1f8955515a5d5d2f049f0ffe137820d71f8b2a1689e1a29ec30ed7c9d473                                                                 
+1135               2a.ciphertext                                                          85ad3dac4751a8db90f391d0f06935a5ef2118d9ac72e05fe0518d7f77bff058                                                                 
+1135               2a.plaintext                                                           11cdf7c462c536085daced417023adaeff2f6b7a6162ccd12b340b079bd36b48                                                                 
+926                2b.ciphertext                                                          0fc59b28e4cd2db0aa9f28a603e2b25988a6688f05f90a59b205088093721340                                                                 
+973                2b.plaintext                                                           019c012f87531e2f9173acae952e7d4a304ed1a62ef341e71455a128d3e7056f                                                                 
+983                3a.ciphertext                                                          20ab3ad9342e51d82243a678eaf2bc9187553bcedb50c830541a54f34dc9b3dd                                                                 
+1090               3b.ciphertext                                                          c35efccfb68ce3eaa5e7c699ed36a09f23aa719125e4df9f2faef11da1cd5d8a                                                                 
+1134               4a.ciphertext                                                          523d35a8b412bf2e2a88b160529cae76c512d08f2a589ba53b2ac3c4d4184858                                                                 
+1061               4b.ciphertext                                                          2cdebce220d9d20ef4c85f208999f81940383a9181bbb0e63b37b7031edcb688                                                                 
+875                5a.ciphertext                                                          b841414d1fbf8af991df389b1b9466d0401c39074f7433dcf3e90648b4d9ab5f                                                                 
+957                5b.ciphertext                                                          5b6303144fde83cdcdb74976da515933444b7c29efd8ad15d33e65edd2ef78fb                                                                 
+712                6a.ciphertext                                                          1313d5ffe4e6d2ee82b4f4bbffbe522d5e073775baa53a11bec10c2a693bc7da                                                                 
+1888               6b.ciphertext                                                          137618d9d92a8a28b7b7fff9a385c4c2db76dff10e0d326895cb0723a63a6adc                                                                 
+2132               7a.ciphertext                                                          d604c136b793701d7501c72821d4069975ce098c2da55fac29331f0045c62b5f                                                                 
+1565               7b.ciphertext                                                          adeef9d9e985c534c40acee5c6734d04195895a32efd9452a89cafef1fdc91b8                                                                 
+182                mona-lisa-words.txt                                                    d7d05c9c86f6282fa66df5f4ca795c89f01cef88a9ce8c921ce4484b3d6078a7                                                                 
+1190               solutions.txt                                                          bd14d8cb1b6694ee4b07d7f38f4df7931e89c10247f101878b6056647bf67cee                                                                 
+                 2014/                                                                                                                                                                                                     
+                 2015/                                                                                                                                                                                                     
+10000              pysol.zip                                                              64e25c247e877f37285db635fcb5dea101e0c531fdbfe5000bcc088c22caad79|68d878fb019198e691d321be1dd6744fae0b48da9c4e705c34f96e351b00fbed
+2195               sol.py.zip                                                             4c22e57eaacd8a91ef9b0c338429e400210a03dec9fbacec4a45fe1faed50720|1fd0a62af53125eacfa11016088451e2c58269d98aaef74c320730ebc7601b66
+18025            LICENSE                                                                  a01259a1b522cf0de95824f9860613b453153eebac468e96196d5d7dba84786c                                                                 
+429647           Programming+for+A+level+Computing+through+automated+cipher+breaking.pdf  2f4008ad7217d7902c99bbfc7394c9b9128a3073f4c5d096ef4653d753358b9d|6c1eb93f74c8e3fd5a180e80ce7b315cb642a9f5f66805a4398f6b793dd9b852
+61               README.md                                                                277247b410300ee16477b12ca54ad878d81c8061f6134e2e1cadccaf299de3a3                                                                 
+6488666          big.txt                                                                  fa066c7d40f0f201ac4144e652aa62430e58a6b3805ec70650f678da5804e87b                                                                 
+318              cipher-training.sublime-project                                          58e5d5b4e54fb29abecaef2d41266e3355adccb8b6a70bd595e509bd07c16587                                                                 
+11564            count_1edit.txt                                                          3bf563ef032ba151ec1a4b2d1f33f50c49f4a47e4dc5b8152394bc5b63f57655|b5fbacbebcc25f5011ce97bc9ac967a09c50eef28b4aa98379a6c426df6ac08b
+4956241          count_1w.txt                                                             51df159fd3de12b20e403c108f526e96dbd723d9cabdd5f17955cdc16059e690                                                                 
+9270             count_2l.txt                                                             bc2895f800189070c193907cd8bca956ad65fed2e25c14300d4bb5b6a243ba99                                                                 
+5566017          count_2w.txt                                                             781c0596c3eea532d30bef9f3dba1d5137d652f00376260822c761a7584dfb8c                                                                 
+220441           count_3l.txt                                                             8702c95530c7d0d182ab94dc03ed7681fcf969819f6db011a58de31411dc6365                                                                 
+320508           count_big.txt                                                            3ba257fba1934bd138413d8274e79b56c5992431a27692fd562929aa43ec01a3                                                                 
+6357             course-blurb.docx                                                        b363ea532c9a12f47e7282ddfcb2a92d72ab6d62d669ea2e5fe31d864486f2f8|dfadc44f8ebac5145acd01156029539bc1e2b697d461ddd9e042f1ce9cc74bbd
+52120            course-blurb.odt                                                         c4ef99012123e3d073cd7895efbe7bcd725e8ecaac7fb82a2936b64d757be90f|c6efb4dcdd883d30a0763c8c1c152e9c8a708a0cfc187aaab7378ff795267650
+8411             norms.pyc                                                                ac7a18765c7bcc27e406d8f38d943408097b3384a271502185d53482e6ec0da7|002b186e716cec64869a00bd2d72e16614931e696daa0cf3529d634a0f270e42
+4538523          shakespeare.txt                                                          6f9c770efced5c3d87efa6197cd3091b982341372e36c6357f865df91ddecde6                                                                 
+592309           sherlock-holmes.txt                                                      0027de6f4110440ea51d67a2f3af3484898c630808f13b1d4db108e6283e67a3|2034ee1ebdec47e839607124d22b674d4614e1cc6209d758f7b6e99e69ae8e08
+                 slides/                                                                                                                                                                                                   
+2493               affine-break.html                                                      e2ffcbe50ceefb51638a54163829f9eec880a43a900cb7d0e945ce2df153f036                                                                 
+6441               affine-encipher.html                                                   4f239d2d9e0ef1f5080d1ab3cbb7c876ea1997e5b6f2b6ba0ff5099297006d8c                                                                 
+3320               aims.html                                                              a45e8f4b0cc2987656a1b008351e089dcdc2a717aa1b6aa540bf4e8a4435fe17                                                                 
+6835               alternative-plaintext-scoring.html                                     c313d095c04faa6dae6c57fc20dd5b94f08746c4e8352c73178f335328a8a02d                                                                 
+7831               c1a_frequency_histogram.png                                            a79cdaebf4db843aae7e302c2cb3c4606908465f5d6aed702c5c33d591780561|13ea628dccda1a22116fce7fc348b0977b451ba76f671184e45dcad239db6dd6
+8128               caesar-break.html                                                      51cbf526cbdaef6ec506f888f883eb9239cf6afef54d1321721247e1e7029874                                                                 
+3793               caesar-encipher.html                                                   66d4b2d96571a9d7edb10f79d176327efbc3923af2e19c7f61800eea376716e3                                                                 
+7860               caesarwheel1.gif                                                       fd5a9d2d8ef261b0b7ec4536fc56a27ebec94ac91ff2ca136b74d5c066f3ecce|4c536ee4df63c73c2e5e213ca1f96c2fea0bc058efe991f78fd304ff215e6fcd
+8200               english_frequency_histogram.png                                        c4a1afec62d2fcda15824f71df3c997088c4a952ee5fe0bc6fa753ede08b2098|6eabd4ebdc616722c9fe3a419e8ca5fc309452120e5023b2e5cb783b9d6d2df8
+9192               fast-good-cheap.gif                                                    4bc052364a91f4c7f98d5ac4e5ac6abd3a3968cabc7f892eb7c3b987adf9e793|4359cbb234f29ca93ff2fa8dd931ce95dab97cd723788937c5d5d259f913afb7
+2714               further-work.html                                                      66339213b16c1a98e4afc5c1ec4878bb4839c43ae963e56dd4be624fc60b8895                                                                 
+31180              gcd.svg                                                                d5b93a7fe870742df02c201d8e12172f2a67798376c54761281c0a660160e753                                                                 
+2870               index.html                                                             f6c2cbaaaeb43db84e9e1bbd2654c31103e22ae3bdf683bfe6d6719a074c9024                                                                 
+5312               keyword-break.html                                                     3217d573ee8ce0ce73e57d23122dec2de39088d006eb0af16d14405361e99d6c                                                                 
+5456               keyword-encipher.html                                                  d8d54fc7ebc88b52bade6c3da2ba81bceb110beeb1a82ff5ffd3fa2593ecdab8                                                                 
+2989               pocket-enigma-break.html                                               aff9bd947680764ebc7fbf7e62cee948f290b1b81f4c2c2f819734ed24c34da1                                                                 
+6195               pocket-enigma-encipher.html                                            d930d9149da4ca6766343524aa7df77a64bceaa5264f97bad48574bf0f46e69b                                                                 
+108903             pocket-enigma-small.jpg                                                df9796ce51dbd5b86c1c1ec8a3a6806a77a67025c4dd4400676d24ae53b02cfe|395240459ad459032cab96c25d7ad682faaf7e4e2d9c58f64175ce5eb5467235
+409764             pocket-enigma.jpg                                                      aeb79ca953b7fac863340d71f675a50029687aa97bae8af4068927414aeec96c|0fd2d5b1683451ecee1a6501c4ccfa311293e15bcdb063314776493e5746a04b
+3460               transposition-break.html                                               5d3df37e584ac2b0cf2a6b49cc9276bf0964cf4290bda35e808467c12224b2ea                                                                 
+5758               transposition-encipher.html                                            2c1c3e64dc875de00a481eefe782fd1a812a9035a10a27e993ccf9414e087762                                                                 
+52398              typingmonkeylarge.jpg                                                  04eba431d38b1d9b5a89065c6a6571e28cddb7052ade379b532d4475ab99cf4a|1357b8bbc859ae4487dac3e431463a2df0ac46851baf24e2811a70bc3b11100c
+15756              vector-dot-product.svg                                                 7dbdf0245ee01f8c920518164ef88f3978312a85ef0e9b6c7771c5a053227d26                                                                 
+9845               vector-subtraction.svg                                                 25bf3a4c46253c529f9fe801c350e26f34401e8176496b1de2041b329cd8f1d8                                                                 
+8918               word-segmentation.html                                                 f39cb54c31412c00c5bdeadcc235f261663596293ecb639921d6dc79ac1fafa8                                                                 
+451530           spell-errors.txt                                                         a4abe6ce6c24280f9a8d0485cbf78ddd2e58279ca01293692630a08ba4b13407                                                                 
+3291641          war-and-peace.txt                                                        3ed0f41cfdf660846878943bad5b9d575bcae1e4a92ee9a7f43d3c9dba2af344|6799e48d3fd0a6f4c40b9951ec86de6da81f0b9cd36e413490ac511542ca54d3
+868202           words.txt                                                                aa77abbcba3c6dee1306d93adcedc2b2ccb8a4e0344a39d0676732ff58ebd5e5                                                                 
+868384           words_2013.txt                                                           57faa4841fe28dd82a5da4488b6381c194df6e1ecc04e61fb9f60e842bbca18c                                                                 
 ```
 
 #### Ignore
diff --git a/affine_break_parameter_trials.csv b/affine_break_parameter_trials.csv
deleted file mode 100644 (file)
index 75f3f16..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-"name",500,250,100,50,20\r
-"Pletters",2442,2425,2550,2461,2067\r
-"cosine_similarity + euclidean_scaled",2487,2492,2513,2455,1731\r
-"cosine_similarity + normalised",2503,2573,2454,2435,1680\r
-"l1 + euclidean_scaled",2495,2477,2506,2419,1812\r
-"l1 + normalised",2488,2521,2465,2466,1895\r
-"l2 + euclidean_scaled",2524,2467,2529,2470,1763\r
-"l2 + normalised",2566,2545,2481,2433,1756\r
-"l3 + euclidean_scaled",2444,2458,2560,2426,1582\r
-"l3 + normalised",2476,2524,2463,2354,1433\r
diff --git a/caesar_break_parameter_trials.csv b/caesar_break_parameter_trials.csv
deleted file mode 100644 (file)
index a414d22..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-"name",100,50,30,20,10,5\r
-"Pletters",4995,4997,4971,4893,4092,2401\r
-"cosine_similarity + euclidean_scaled",4997,4980,4915,4671,3590,2174\r
-"cosine_similarity + normalised",4999,4993,4931,4660,3559,2207\r
-"l1 + euclidean_scaled",4997,4995,4950,4761,3751,2175\r
-"l1 + normalised",4999,4993,4950,4770,3662,2188\r
-"l2 + euclidean_scaled",4997,4991,4914,4664,3579,2209\r
-"l2 + normalised",4998,4988,4915,4637,3536,2195\r
-"l3 + euclidean_scaled",4997,4979,4822,4477,3243,1978\r
-"l3 + normalised",4999,4959,4774,4351,2966,1949\r
diff --git a/challenge6.ipynb b/challenge6.ipynb
deleted file mode 100644 (file)
index ca4e493..0000000
+++ /dev/null
@@ -1,1141 +0,0 @@
-{
- "metadata": {
-  "name": ""
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "%matplotlib inline\n",
-      "import matplotlib.pyplot as plt\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "with open('2013/mona-lisa-words.txt') as f:\n",
-      "    mlwords = [line.rstrip() for line in f]\n",
-      "mltrans = collections.defaultdict(list)\n",
-      "for word in mlwords:\n",
-      "    mltrans[transpositions_of(word)] += [word]\n",
-      "c6a = open('2013/6a.ciphertext').read()\n",
-      "c6b = open('2013/6b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c1a = open('2013/1a.ciphertext').read()\n",
-      "c1b = open('2013/1b.ciphertext').read()\n",
-      "c2a = open('2013/2a.ciphertext').read()\n",
-      "c2b = open('2013/2b.ciphertext').read()\n",
-      "c3a = open('2013/3a.ciphertext').read()\n",
-      "c3b = open('2013/3b.ciphertext').read()\n",
-      "c4a = open('2013/4a.ciphertext').read()\n",
-      "c4b = open('2013/4b.ciphertext').read()\n",
-      "c5a = open('2013/5a.ciphertext').read()\n",
-      "c5b = open('2013/5b.ciphertext').read()\n",
-      "\n",
-      "p1a = caesar_decipher(c1a, 8)\n",
-      "p1b = caesar_decipher(c1b, 14)\n",
-      "p2a = affine_decipher(c2a, 3, 3, True)\n",
-      "p2b = caesar_decipher(c2b, 6)\n",
-      "p3a = affine_decipher(c3a, 7, 8, True)\n",
-      "p3b = keyword_decipher(c3b, 'louvigny', 2)\n",
-      "p4a = keyword_decipher(c4a, 'montal', 2)\n",
-      "p4b = keyword_decipher(c4b, 'salvation', 2)\n",
-      "p5a = keyword_decipher(c5a, 'alfredo', 2)\n",
-      "p5b = vigenere_decipher(sanitise(c5b), 'florence')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(frequencies(sanitise(c6a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stderr",
-       "text": [
-        "/usr/local/lib/python3.3/dist-packages/matplotlib/figure.py:372: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
-        "  \"matplotlib is currently using a non-GUI backend, \"\n"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nTSKWQQ011FATHzEH0Y4dO3TVVVcpLy9PvXv31m233aaXXnqpK3tLE8EE1CRiGdRQQw018RFzEB05\nckRDhw5t/XzIkCE6cuRIlzQFAOg+Yg6ic6MvAADoJCdGf/3rX50ZM2a0fv7www87gUDggmnGjh3r\n6NxYQV68ePHi1c1fY8eOvWiexHwfUVNTk0aMGKFNmzbpy1/+siZNmqTVq1dr5MiRscwOANBN9Yq5\nsFcv/fKXv9SMGTPU3Nysb3zjG4QQAKDD4vpkBQAAouHJCkmitrZWRUVFCV9uVVWVHnvssbjNf+XK\nlSosLNT8+fPjMv/OrLepU6cmpK5///4xLQfxdezYMT311FOm24AIom4v3qMfn3rqKW3cuFG/+93v\n4rqcWGzbti0hdYwwjZ3jOHF7XmVDQ4OefPLJuMwbHUMQxcmcOXM0YcIEjR49Ws8++6yrmqamJt15\n550qLCzUvHnzdPr06ag1L7zwgsaOHavi4mJ97Wtfc7Wcn/70pxoxYoRKSkr03nvvuap58cUXNXny\nZHm9Xt17771qaWmJWnPvvffq/fff1w033KBf/OIXrpbz4x//WAUFBSopKdFXv/pVV0drzc3Nuuee\nezR69GjNmDFDZ86ccbWsWI9U4nGEU1tbq4KCAt11110aMWKE7rjjDr322muaOnWq8vPz9be//a3d\n2pEjR3Z4HfzsZz9TUVGRioqKtGLFCtc9dmQb/fy25vb7WVtbqxEjRsjv96uoqEiHDx+OWnPy5End\ndNNNKi4uVlFRkdasWRO1ZvHixfrXv/4lr9eryspKV319/uh7+fLleuihh9qtWbJkyQVhF+0MxKOP\nPqrHH39cknT//fertLRUkrR582bdeeedbdYtXbr0gu/hgw8+qJUrV7bb269+9St5vV55vV4NGzZM\n1113XbvTx1Wsw7fRvnA47DiO45w6dcoZPXq08/HHH7c7/cGDBx3Lspw33njDcRzHWbBggbN8+fJ2\na9555x0nPz+/dd7nl9met956yykqKnJOnz7tHD9+3Lnqqqucxx57rN2affv2OTNnznSampocx3Gc\n++67z3nhhReiLstxHCcvLy/qez9vx44dTnFxsXP27FmnsbHRGT58eNTeDh486PTq1cvZu3ev4ziO\nU1FR4bz44ouulte/f39X03W2zs3059/HO++847S0tDjjx493FixY4DiO47z00kvO7Nmzo9Z2ZB2c\n3w5OnTrlnDhxwhk1apSze/fuqD12ZBuNZVs7v5wePXo4b775ZtRpz1u7dq2zcOHC1s+PHTsWtaa2\nttYZPXq062UcPHjwgumXL1/uVFVVtVuze/duZ9q0aa2fFxYWOocPH25z+u3btzvz5s1zHMdxrrnm\nGmfy5MnOp59+6lRVVTnPPPNMm3W1tbXOuHHjHMdxnObmZufKK690tT9wHMf59NNPnZKSEmfdunWu\npo8HjojiZMWKFSouLtaUKVN0+PBh/eMf/4haM3ToUE2ZMkWSdOedd2rr1q3tTr9582ZVVFQoK+vc\n33XJzMyMuozXX39dc+fOVZ8+fZSRkaFZs2ZFPfWxadMm7dy5UxMmTJDX69XmzZt18ODBqMvqqG3b\ntmn27Nm65JJL1L9/f82cOdPVaZlhw4ZpzJgxkqTx48ertra2y3tLhGHDhmnUqFGyLEujRo3S9ddf\nL0kaPXp01PfU0XWwdetWzZ07V3379lW/fv00d+5cvf7661F77Mg2Gsu2dt4VV1yhSZMmuZpWksaM\nGaMNGzZo8eLF2rp1qzweT9Qat710RnFxsT788EPV1dVp7969yszM1ODBg9ucfty4cdq5c6caGxvV\np08fTZkyRW+99Za2bt2qkpKSNuuuuOIKZWdna8+ePXrttdc0btw4V/sDSfr2t7+t0tJS3XTTTR1+\nf10l5uHbaFswGNSmTZu0fft29enTR9OnT9fZs2ej1n3+WoLT+rdD2p++oz9M/1vjtt7v9+vhhx/u\n0LI6KtbevvSlL7V+3LNnT1enNJPR599Hjx49dMkll7R+3NTU5LrWzTq42Lp2cy2rI9torN9PSerX\nr5/raSVp+PDh2r17t1555RV9//vfV2lpqX7wgx90aB7R9OrV64JT0m63s3nz5mnt2rWqr6/Xbbfd\n1u60vXv31rBhw/Tcc8/p6quv1pgxY7R582b985//VEFBQbu1d999t1atWqVQKKQFCxa46u25557T\nBx98YPxaGUdEcXD8+HFlZmaqT58+2r9/v7Zv3+6q7tChQ63T/v73v2/3NyBJuu666/THP/5R4XBY\nklr/bc+1116r6upqnTlzRo2NjVq3bl3UHVBpaanWrl2rjz76qHU5hw4dcvOWOmTq1Kl6+eWXdfbs\nWZ04cUKvvPIKF/rjpKSkRNXV1Tp9+rROnjyp6urqqNub1LFtNJZtLVZ1dXXq06eP7rjjDn3ve9/T\nrl27otZkZGSosbHR9TJs29aHH36ocDiss2fPat26da7qbr31Vq1evVpr167VvHnzok5fUlKi5cuX\na9q0aSopKdHTTz+tcePGRa2bM2eO1q9fr7feekszZsyIOv3OnTv12GOPJcVAIo6I4uCGG27Q008/\nrcLCQo0YMaL1VEZ7LMvSiBEj9MQTT2jBggUaNWqU7rvvvnZrCgsL9eCDD2ratGnq2bOnxo0bp9/+\n9rft1ni9Xt16660aO3ascnJyXJ3+GDlypH7yk5+ovLxcLS0t6t27t5588kn93//9n6v35daECRM0\na9YsjRkzRrZtq6ioSJdddlmHl+F2mbHuFDtaF2s/n//czdFxR5bp9Xr19a9/vfX7v3DhQo0dOzZq\njx3ZRv93W5s4caLro6KOruO3335bDzzwQOuRpJth2dnZ2Zo6daqKiop04403Rv2bar1799YPf/hD\nTZo0SYMHD1ZhYaGrPgsLC3XixAkNGTJEtm1Hnb6kpEQPP/ywpkyZor59+6pv376ufkno3bu3rrvu\nOmVmZrrq64knnlBDQ4OmT58uSZo4caKeeeaZqHXxwA2tSConT55Uv379dOrUKU2bNk3PPvusiouL\nTbfV6uOPP07p61CdUVtbq5kzZ+rtt9+Oqf6hhx5S//799d3vfreLO4MktbS0aPz48Vq7dq2uvPJK\n0+10CKfmkFTuueceeb1ejR8/XrfccktShdB//vMfXX311XrggQdMt2JMZ0+tcao1Pvbt26fhw4fr\n+uuvT7kQkjgiAgAYxhERAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABG/T+xw3Fhb8rTYQAAAABJ\nRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeb9980c>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6af = frequencies(sanitise(c6a))\n",
-      "plot_frequency_histogram(c6af, sort_key=lambda l: c6af[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9bdf4c>"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts, sort_key=lambda l: normalised_english_counts[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAawAAAEkCAYAAABzKwUZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHx5JREFUeJzt3X9QVXX+x/HXNSgLpNQxG++lUCF+KF5QkFHXpGwXtXTM\ntJg03aQidx23xmprahNn+1ZMuptGP7CZtXHb3B/ujrjKMq26d0ZLl0zsx6CNFtQFw9rMwF8E18/3\nD4siL+deEMSPPB8zZ7zH8z6f+zmHw33xOefce13GGCMAAM5zvbq7AwAAhIPAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFghZGCVlZUpKSlJCQkJKiwsPGP5vn37NGbMGPXu3VvLly8/Y3kgEFB6erqmTp3a\nOT0GAPRIEU4LA4GAFi5cqM2bN8vtdiszM1PTpk1TcnJyS03//v31/PPPa/369UHbWLFihVJSUtTQ\n0NC5PQcA9CiOI6zy8nLFx8crLi5OkZGRys3NVUlJSauaAQMGKCMjQ5GRkWesX1NTo9LSUt19993i\n/ckAgLPhGFi1tbWKjY1tmfd4PKqtrQ278QceeEDPPvusevXiUhkA4Ow4JonL5epwwxs3btSVV16p\n9PR0RlcAgLPmeA3L7XbL7/e3zPv9fnk8nrAafuutt7RhwwaVlpbq5MmTqq+v19y5c7VmzZpWdWlp\naXr33Xc70HUAwIXG6/Vqz549wRcaB01NTWbIkCGmqqrKNDY2Gq/XayorK4PWLlmyxCxbtizoMp/P\nZ26++eagy0J0wXpLliyh9jzqB7Xtrz1f+kFtx+tt4pQJjiOsiIgIFRUVKScnR4FAQHl5eUpOTlZx\ncbEkKT8/X3V1dcrMzFR9fb169eqlFStWqLKyUtHR0a3aOpvTiwAAOAaWJE2ePFmTJ09u9X/5+fkt\nj6+66qpWpw2DmTBhgiZMmNDBLgIAIF1UUFBQ0J0dWLp0qbq5C10uLi6O2vOoH9S2v/Z86Qe1Ha+3\nhVMmuL49Z9htXC4XdxECACQ5ZwJvkAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHA\nAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYIazAKisrU1JSkhISElRYWHjG8n37\n9mnMmDHq3bu3li9f3vL/fr9f119/vYYNG6bhw4dr5cqVnddzAECP4jLGGKeCQCCgxMREbd68WW63\nW5mZmVq7dq2Sk5Nbar744gt98sknWr9+vfr27avFixdLkurq6lRXV6e0tDQdPXpUo0aN0vr161ut\n63K5FKILAIAewikTQo6wysvLFR8fr7i4OEVGRio3N1clJSWtagYMGKCMjAxFRka2+v+rrrpKaWlp\nkqTo6GglJyfr4MGDHd0OAEAPFjKwamtrFRsb2zLv8XhUW1vb7ieqrq5WRUWFsrKy2r0uAPRUMTH9\n5HK5HKeYmH7d3c1zIiJUgcvlOusnOXr0qGbOnKkVK1YoOjr6rNsDgJ6ioeErSc6XTRoazv512gYh\nA8vtdsvv97fM+/1+eTyesJ+gqalJt956q+bMmaPp06cHrSkoKGh5nJ2drezs7LDbBwDYy+fzyefz\nhVUb8qaL5uZmJSYmasuWLRo0aJBGjx59xk0X3ykoKFCfPn1abrowxmjevHnq37+/fv/73wfvADdd\nAECbTp/lCvUaeeG8jjplQsjAkqR//etfuv/++xUIBJSXl6dHH31UxcXFkqT8/HzV1dUpMzNT9fX1\n6tWrl/r06aPKykrt2bNH1113nUaMGNFyavHpp5/WpEmTwuocAPR0BNYPloUTWF2JwAKAthFY3+OT\nLgAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAA\nAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABW\nILAAAFYgsAAAViCwAABWILAAAFYgsAAAVggZWGVlZUpKSlJCQoIKCwvPWL5v3z6NGTNGvXv31vLl\ny9u1LgAA4XIZY0xbCwOBgBITE7V582a53W5lZmZq7dq1Sk5Obqn54osv9Mknn2j9+vXq27evFi9e\nHPa6kuRyueTQBQDo0Vwul6RQr5EXzuuoUyY4jrDKy8sVHx+vuLg4RUZGKjc3VyUlJa1qBgwYoIyM\nDEVGRrZ7XQAAwuUYWLW1tYqNjW2Z93g8qq2tDavhs1kXAIAfcwys00PRjjmbdQEA+LEIp4Vut1t+\nv79l3u/3y+PxhNVwe9YtKChoeZydna3s7OywngMAYDefzyefzxdWreNNF83NzUpMTNSWLVs0aNAg\njR49OuiNE9Lp0OnTp0/LTRfhrstNFwDQNm66+J7jCCsiIkJFRUXKyclRIBBQXl6ekpOTVVxcLEnK\nz89XXV2dMjMzVV9fr169emnFihWqrKxUdHR00HUBAOgIxxHWOekAIywAaBMjrO/xSRcAACsQWAAA\nKxBYAAArEFgAACsQWAAAKxBYAAArEFgAACsQWAAAKxBYAAArEFgAACsQWAAAKxBYAAArEFgAACsQ\nWAAAKxBYAAArEFgAcI7FxPSTy+VynGJi+nV3N887fIEjAJxj7flSRr7A8XuMsAAAViCwAABWILAA\nAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWCBlYZWVlSkpKUkJCggoL\nC4PWLFq0SAkJCfJ6vaqoqGj5/6efflrDhg1Tamqq7rjjDjU2NnZezwEAPYpjYAUCAS1cuFBlZWWq\nrKzU2rVrtXfv3lY1paWlOnDggPbv369Vq1ZpwYIFkqTq6mq98sor2r17t95//30FAgH9+c9/7rot\nAQBc0BwDq7y8XPHx8YqLi1NkZKRyc3NVUlLSqmbDhg2aN2+eJCkrK0tHjhzRoUOHFBMTo8jISB0/\nflzNzc06fvy43G53120JAOCC5hhYtbW1io2NbZn3eDyqra0Nq6Zfv35avHixrr76ag0aNEhXXHGF\nbrzxxk7uPgCgp3AMrNPfwxJasO8u+eijj/Tcc8+purpaBw8e1NGjR/WnP/2pY70EgPMcX8rY9SKc\nFrrdbvn9/pZ5v98vj8fjWFNTUyO32y2fz6exY8eqf//+kqQZM2borbfe0uzZs894noKCgpbH2dnZ\nys7O7si2AEC3aWj4SqG+aLGhIbxBQE/i8/nk8/nCKzYOmpqazJAhQ0xVVZVpbGw0Xq/XVFZWtqrZ\ntGmTmTx5sjHGmB07dpisrCxjjDEVFRVm2LBh5vjx4+bUqVNm7ty5pqio6IznCNEFALCCJCOZEJO6\ntPZC4LQtjiOsiIgIFRUVKScnR4FAQHl5eUpOTlZxcbEkKT8/X1OmTFFpaani4+MVFRWl1atXS5LS\n0tI0d+5cZWRkqFevXho5cqTuvffeDiUwAACubxOt+zrgcgW9BgYA3S0mpt+3p/ra1qdPX9XXH/72\nmn+o17LTr3ddVXshcMoEAgsA2nA+hBCB9T0+mgkAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAF\nAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQIL\nAGAFAgtAjxIT008ul8txionp193dRBAEFgDrhQqhHwZQQ8NXkozjdLoG5xsCC8B5p72joFAhRABd\nGCK6uwMA8GPfB5BTjevcdAbnDUZYAAArEFgAzgludsDZ4pQggHOC03w4W4ywAABWILAAAFYIGVhl\nZWVKSkpSQkKCCgsLg9YsWrRICQkJ8nq9qqioaPn/I0eOaObMmUpOTlZKSop27tzZeT0HAPQojoEV\nCAS0cOFClZWVqbKyUmvXrtXevXtb1ZSWlurAgQPav3+/Vq1apQULFrQs+9WvfqUpU6Zo7969eu+9\n95ScnNw1WwEAuOA5BlZ5ebni4+MVFxenyMhI5ebmqqSkpFXNhg0bNG/ePElSVlaWjhw5okOHDunr\nr7/Wtm3bNH/+fElSRESELr/88i7aDADAhc4xsGpraxUbG9sy7/F4VFtbG7KmpqZGVVVVGjBggO66\n6y6NHDlS99xzj44fP97J3QcA9BSOgeVyhXeLqTGtb1V1uVxqbm7W7t279Ytf/EK7d+9WVFSUnnnm\nmY73FADQozm+D8vtdsvv97fM+/1+eTwex5qamhq53W4ZY+TxeJSZmSlJmjlzZpuBVVBQ0PI4Oztb\n2dnZ7d0OAN0gJqZfyM/p69Onr+rrD5+jHsE2Pp9PPp8vvGLjoKmpyQwZMsRUVVWZxsZG4/V6TWVl\nZauaTZs2mcmTJxtjjNmxY4fJyspqWTZ+/Hjz4YcfGmOMWbJkiXn44YfPeI4QXQBwHpNkJBNiUpfW\nhlffntqu73NX7gvbOW2L4wgrIiJCRUVFysnJUSAQUF5enpKTk1VcXCxJys/P15QpU1RaWqr4+HhF\nRUVp9erVLes///zzmj17tr755hsNHTq01TIAANrD9W2idV8HXK4zroEBsMPp69yhfn9P/453VW14\n/WhPbdf3uSv3he2cMoFPugAAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcAC\nAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBY\ngcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWCFkYJWVlSkpKUkJCQkqLCwM\nWrNo0SIlJCTI6/WqoqKi1bJAIKD09HRNnTq1c3oMoEvFxPSTy+VynGJi+nV3N9EDOQZWIBDQwoUL\nVVZWpsrKSq1du1Z79+5tVVNaWqoDBw5o//79WrVqlRYsWNBq+YoVK5SSkiKXy9X5vQfQ6RoavpJk\nHKfTNcC55RhY5eXlio+PV1xcnCIjI5Wbm6uSkpJWNRs2bNC8efMkSVlZWTpy5IgOHTokSaqpqVFp\naanuvvtuGWO6aBMAhMKoCRcCx8Cqra1VbGxsy7zH41FtbW3YNQ888ICeffZZ9erFpTKgOzFqwoXA\nMUnCPY3349GTMUYbN27UlVdeqfT0dEZXAICzFuG00O12y+/3t8z7/X55PB7HmpqaGrndbv3973/X\nhg0bVFpaqpMnT6q+vl5z587VmjVrzniegoKClsfZ2dnKzs7u4OYAAGzi8/nk8/nCKzYOmpqazJAh\nQ0xVVZVpbGw0Xq/XVFZWtqrZtGmTmTx5sjHGmB07dpisrKwz2vH5fObmm28O+hwhugCgE0gykgkx\nycra8OrbU3t+bV9794XtnLbFcYQVERGhoqIi5eTkKBAIKC8vT8nJySouLpYk5efna8qUKSotLVV8\nfLyioqK0evXqoG1xlyAA4Gy4vk207uuAy8U1LqCLnf6DMdTv2enfRdtqpXC2rz21Xd/nrtwXtnPK\nBG7fAwBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiB\nwAIAWIHAAgBYgcACAFiBwAIsFRPTTy6Xy3GKienX3d0EOo3jFzgCOH81NHylUN+T1NDAF6fiwsEI\nCwBgBQILAGAFAgsAYAUCCziPcCMF0DZuugDOI9xIAbSNERYAwAoEFgDACgQWAMAKBBbQxbiRAugc\n3HQBdDFupAA6ByMsAIAVCCwAgBXCCqyysjIlJSUpISFBhYWFQWsWLVqkhIQEeb1eVVRUSJL8fr+u\nv/56DRs2TMOHD9fKlSs7r+dAJwt1remH15m4LgV0AxNCc3OzGTp0qKmqqjLffPON8Xq9prKyslXN\npk2bzOTJk40xxuzcudNkZWUZY4z57LPPTEVFhTHGmIaGBnPttdeesW4YXQDOCUlGMg6T2lH7fT21\nXVvLz6719tnOaVtCjrDKy8sVHx+vuLg4RUZGKjc3VyUlJa1qNmzYoHnz5kmSsrKydOTIER06dEhX\nXXWV0tLSJEnR0dFKTk7WwYMH2x2qQEcwCgIuLCEDq7a2VrGxsS3zHo9HtbW1IWtqampa1VRXV6ui\nokJZWVln22cgLN/fndf2dLoGgA1CBpbLFd7ttqdHcsHXO3r0qGbOnKkVK1YoOjq6nV0EACCM92G5\n3W75/f6Web/fL4/H41hTU1Mjt9stSWpqatKtt96qOXPmaPr06UGfo6CgoOVxdna2srOz27MNAABL\n+Xw++Xy+8IpDXQBramoyQ4YMMVVVVaaxsTHkTRc7duxoueni1KlT5s477zT3339/hy6wAWdDXLjv\nEbX87Fpvn+2ctiXkCCsiIkJFRUXKyclRIBBQXl6ekpOTVVxcLEnKz8/XlClTVFpaqvj4eEVFRWn1\n6tWSpDfffFOvvfaaRowYofT0dEnS008/rUmTJoWXpsCPxMT0C3ndqU+fvqqvP3yOegTgXHF9m2jd\n1wGXS93cBVjk9LXRUMfL6WOqPbXhtd2e2o71g1p+dmdTeyFwygQ+6QIAYAUCCwBgBQILAGAFAgvd\njk+kABAOvg8L3Y7viwIQDkZY6BKMmgB0NkZY6BKMmgB0NkZYAAArEFgAACsQWAAAKxBYAAArEFgA\nACsQWAAAKxBYCBvvrQLQnXgfFsLGe6sAdCdGWAAAKxBYAAArEFg9HNelANiCa1g9HNelANiCERYA\nwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKIQOrrKxMSUlJSkhIUGFh\nYdCaRYsWKSEhQV6vVxUVFe1aFwCAsBgHzc3NZujQoaaqqsp88803xuv1msrKylY1mzZtMpMnTzbG\nGLNz506TlZUV9rrGGBOiC9b7z3/+c17XSjKS+cH0nx/Nf/8zOrvaYPXnT21429ee2s7ab+dDLT+7\n86vWefts57QtjiOs8vJyxcfHKy4uTpGRkcrNzVVJSUmrmg0bNmjevHmSpKysLB05ckR1dXVhrdsT\n+Hw+q2qlrqrtyrap7drarmyb2vbXdqT+wuAYWLW1tYqNjW2Z93g8qq2tDavm4MGDIdft6X78SelL\nly5t81PSQ9X+sL49tQBgC8fAcrnC+5Tu06M4BPuqDqcQ+v6T0r+blrSaP708vNof1renFgCs4XQu\ncceOHSYnJ6dl/qmnnjLPPPNMq5r8/Hyzdu3alvnExERTV1cX1rrGGOP1elu/kjIxMTEx9djJ6/W2\nmUmO34eVkZGh/fv3q7q6WoMGDdJf/vIXrV27tlXNtGnTVFRUpNzcXO3cuVNXXHGFBg4cqP79+4dc\nV5L27Nnj1AUAACSF+ALHiIgIFRUVKScnR4FAQHl5eUpOTlZxcbEkKT8/X1OmTFFpaani4+MVFRWl\n1atXO64LAEBHuAwXoAAAFuCTLiw2bty4TmururpaqampndZeV7fbEStXrlRKSoruvPPO7u5Kt4uO\njm73OgUFBVq+fHkX9MZZVx9Dnfl71BFff/21XnrppW7tgy0ILIu9+eab3d0Fq7z00kvavHmz/vjH\nP3Z3V7pduHcAd3QdY4w1dw939+/RV199pRdffLFb+2ALAquLFBcXKz09Xenp6Ro8eLBuuOGGNmv/\n7//+T4mJiRo/frzuuOOOsP+KDfVX8ttvvy2v16vGxkYdO3ZMw4cPV2VlZch2P/74Y40cOVLvvPNO\n0OWPPvpoq1+wUH95Nzc3a86cOUpJSdGsWbN04sSJoHXV1dVKSkoKq1aSfvvb3yopKSms/Xbffffp\n448/1qRJk/Tcc8+1WfedNWvWyOv1Ki0tTXPnzg1as2TJEq1YsaJl/rHHHtPKlSvPqHv22Wf1/PPP\nS5IeeOABTZw4UZK0detWzZkzp1Xtd/vgrrvuUmJiombPnq033nhD48aN07XXXqu33377jPZ/PAJZ\ntmyZli5dGnIbw/HDY/PDDz90rK2urlZiYqLmzZun1NRU1dTUtFl77Ngx3XTTTUpLS1Nqaqr++te/\nOrYdCAR07733avjw4crJydHJkyfb7ENycnJYtd8Jd7R5yy23KCMjQ8OHD9crr7ziWPu73/1Oqamp\nSk1NbXWMBPPII4/oo48+Unp6un7961871r722mvKyspSenq67rvvPp06dSqsvl8wnG5rx9lramoy\n48ePNxs3bgy6fNeuXSY1NdWcOHHC1NfXm/j4eLN8+fKw2o6Ojg5Z8/jjj5sHH3zQ/PKXvwz6toLv\nVFVVmeHDh5t9+/aZ9PR0895777VZW1FRYSZMmNAyn5KSYmpqatps1+VymbfeessYY8z8+fPNsmXL\nzrq2vLzcpKWlmcbGRtPQ0GASEhJC7re4uDjz5ZdfOtYYY8wHH3xgrr322pbaw4cPB62rrq42I0eO\nNMYYEwgEzNChQ4PW7ty508yaNcsYY8xPfvITk5WVZZqamkxBQYFZtWpVq9qqqioTERFhPvjgA3Pq\n1CkzatQoM3/+fGOMMSUlJWb69OlntP/dz+47y5YtMwUFBY7bGM6x095js6qqyvTq1cv897//Ddn2\nunXrzD333NMy//XXXzu2GxERYd59911jjDG33Xabee2118669jvh7Atjvj8Ojh8/boYPH97msfTd\nfjt+/Lg5evSoGTZsmKmoqGiz3erq6lY/v7ZUVlaaqVOnmubmZmOMMQsWLDBr1qwJq+8XCkZYXWzR\nokWaOHGibrrppqDLt23bphkzZqh3797q06ePpk2b1qmnUp544gm98cYb2rVrlx5++GHH2s8//1zT\np0/X66+/7njNIC0tTZ9//rk+++wzvfvuu+rbt6/cbneb9bGxsRozZowkac6cOdq+fftZ17755pua\nPn26Lr74YkVHR2vq1Kmdtt+2bt2q2267Tf36nX6Td9++fYPWXXPNNerfv7/27NmjN954QyNHjgxa\n+91otaGhQb1799aYMWO0a9cubd++XePHjz+jfvDgwRo2bJhcLpeGDRumG2+8UZI0fPhwVVdXd8o2\nhqMjx+Y111yj0aNHh2x7xIgR+ve//61HHnlE27dvV0xMjGP94MGDNWLECEnSqFGjHPdDe2rbY8WK\nFUpLS9OYMWNUU1Oj/fv3B63bvn27ZsyYoUsvvVRRUVGaMWOGtm3b1ma74R63W7Zs0TvvvKOMjAyl\np6dr69atqqqq6tC22MrxtnacnVdffVV+v9/x/LTL5Wp1wHZmWEnS//73Px07dkyBQEAnTpzQZZdd\n1mbtFVdcoWuuuUbbtm1TUlKSY7uzZs3SunXrVFdXp9zcXMfaH177MMY4XgsJt7Yr99uP23Zy9913\na/Xq1Tp06JDmz58ftCYyMlKDBw/Wq6++qrFjx2rEiBHaunWrDhw4EHQ/X3LJJS2Pe/XqpYsvvrjl\ncXNz8xn1ERERrU4NOZ1GbY+O7OOoqKiw2k5ISFBFRYU2bdqkxx9/XBMnTtRvfvObNut/uE8uuugi\nx21sT224fD6ftmzZop07d6p37966/vrr1djYGLQ22H7ryDXDYObNm6ennnqqU9qyESOsLvLOO+9o\n+fLlIS/wX3fddVq/fr1OnjyphoYGbdy4sdMObun0e+WefPJJ3XHHHSHPj1988cX6xz/+oTVr1gR9\nk/cP3X777Vq7dq3WrVunWbNmOdZ++umn2rlzpyTp9ddfDzqqaG/tuHHj9M9//lONjY06evSoNm3a\n1Gn77YYbbtDf/vY3HT58WJJa/g3mlltuUVlZmXbt2qWcnJw268aPH69ly5ZpwoQJGj9+vF5++WWN\nHDmyU/o7cOBAff755zp8+LAaGxu1cePGTmm3K4/Nzz77TL1799bs2bP14IMPavfu3Z3Sblepr69X\n37591bt3b+3bt6/lGA1m/PjxWr9+vU6cOKFjx45p/fr1jsd8nz591NDQELIPEydO1Lp16/TFF19I\nOn1cfvrpp+3fGIsxwuoiL7zwgr766itdf/31kqTMzEytWrXqjLr09HTdfvvt8nq9uvLKK5WZmRn2\nX/ehXjzWrFmjSy65RLm5uTp16pTGjh0rn8+n7OzsNtu77LLLtHHjRv30pz9Vnz59dPPNNwetTUlJ\n0dGjR+XxeDRw4EDHPiYmJuqFF17Q/PnzNWzYMC1YsKDN+nBrMzIyNG3aNI0YMUIDBw5UamqqLr/8\n8rZ3hsK/yy0lJUWPPfaYJkyYoIsuukgjR47UH/7wh6C1kZGRuuGGG9S3b1/H9sePH6+nnnpKY8aM\n0aWXXqpLL720zRexH7fzw/lgzxEZGaknnnhCo0ePltvtVkpKSshtDWdf/PjYDOdUX7j7+P3339dD\nDz3UMoIMdVu30z45m9pwlkvSpEmT9PLLLyslJUWJiYktp62DSU9P189//vOW/XXPPffI6/W2Wd+/\nf3+NGzdOqampmjJlSpvfHZicnKwnn3xSP/vZz3Tq1ClFRkbqxRdf1NVXXx2y/xcK3jh8nlm6dKmi\no6O1ePFix7ovv/yyU8/Pnw+qq6s1depUvf/++2HVHzt2TFFRUTp+/LgmTJigV155RWlpaV3cy9ZO\nnTqlUaNGad26dRo6dOg5fW6gp+GU4Hko1F98Bw8e1NixY/XQQw+dox6dO+055XTvvfcqPT1do0aN\n0syZM895WFVWViohIUE33ngjYQWcA4ywAABWYIQFALACgQUAsAKBBQCwAoEFALACgQUAsAKBBQCw\nwv8DbMnA/BWkp54AAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaea606ec>"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bf = frequencies(sanitise(c6b))\n",
-      "plot_frequency_histogram(c6bf, sort_key=lambda l: c6bf[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEkCAYAAAB6wKVjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGGFJREFUeJzt3XtQlNf9x/HPKhiNQIPpuLZgxYkIrqywanDUUFFEM01l\niKl4TWgwSWPb6bTNpTYXhTZVMtVONY25ODbBOtFap0Vrpg6N/jajtha1as1Qq22kEUSMQSOi8cbz\n+4OyUdkbuitn4f2a2RF2v3ues/us++E8l/PYLMuyBACAYbp1dAcAAPCGgAIAGImAAgAYiYACABiJ\ngAIAGImAAgAYyW9AHTt2TOPHj9fQoUOVlpam5cuXS5IaGhqUm5urwYMHa9KkSTpz5oznOYsXL1Zy\ncrJSU1NVUVER3t4DADotm7/zoE6cOKETJ04oIyND586d04gRI1ReXq633npLX/ziF/Xss8/q5Zdf\n1unTp1VaWqqqqirNmjVLu3fvVm1trSZOnKjDhw+rWzcGagCA9vGbHP369VNGRoYkKSYmRkOGDFFt\nba02bdqkwsJCSVJhYaHKy8slSRs3btTMmTMVHR2tpKQkDRo0SJWVlWF+CQCAzijooU11dbX27dun\nUaNGqb6+Xna7XZJkt9tVX18vSTp+/LgSExM9z0lMTFRtbW2IuwwA6AqCCqhz587poYce0rJlyxQb\nG3vdYzabTTabzedz/T0GAIAvUYEKLl++rIceekgPP/yw8vPzJbWMmk6cOKF+/fqprq5Offv2lSQl\nJCTo2LFjnufW1NQoISGhTZsZGRk6cOBAqF4DACCCpaena//+/W3u9zuCsixLc+fOlcPh0Pe//33P\n/Xl5eSorK5MklZWVeYIrLy9P69at06VLl3T06FEdOXJEmZmZbdo9cOCALMvqlLeFCxeGpTacbVPL\n+oj0WlP6YUJtJN58DVj8jqB27typNWvWaNiwYXK5XJJaDiOfP3++CgoKtGrVKiUlJWn9+vWSJIfD\noYKCAjkcDkVFRWnFihVs4gMA3BS/AXXfffepubnZ62Pvvfee1/ufe+45Pffcc7feMwBAl9a9uLi4\n+HYvtKSkRB2w2NsmKSkpLLXhbJva9tea0g9qzeqHCbWRxlcm+D1RN1xsNps6YLEAAAP5ygSmeAAA\nGImAAgAYiYACABiJgAIAw8TF9fHM0uPrFhfXp6O7GXYcJAEAhmk5fzTQd2Tn+R7lIAkAQEQhoAAA\nRiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYi\noAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAA\nAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABG\nIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKg\nAABGIqAAAEYKGFBFRUWy2+1yOp2e+4qLi5WYmCiXyyWXy6U//elPnscWL16s5ORkpaamqqKiIjy9\nBgB0ejbLsix/Bdu3b1dMTIweeeQRHTx4UJJUUlKi2NhY/fCHP7yutqqqSrNmzdLu3btVW1uriRMn\n6vDhw+rW7foctNlsCrBYAOiybDabpEDfkZ3ne9RXJgQcQWVlZSk+Pr7N/d4a27hxo2bOnKno6Ggl\nJSVp0KBBqqysvMkuAwC6spveB/XKK68oPT1dc+fO1ZkzZyRJx48fV2JioqcmMTFRtbW1t95LAECX\nE3UzT5o3b54WLFggSXrxxRf11FNPadWqVV5rW4aqbRUXF3t+zs7OVnZ29s10BQAQYdxut9xud8C6\nmwqovn37en5+7LHHNGXKFElSQkKCjh075nmspqZGCQkJXtu4NqAAAF3HjYOSkpISr3U3tYmvrq7O\n8/Mf/vAHzxF+eXl5WrdunS5duqSjR4/qyJEjyszMvJlFAECnEhfXRzabzectLq5PR3fROAFHUDNn\nztT777+vU6dOqX///iopKZHb7db+/ftls9k0cOBAvfHGG5Ikh8OhgoICORwORUVFacWKFT438QFA\nV9LYeFr+jsxrbOS78kYBDzMPy0I5zBxAFxP40PHPvxc5zLwFM0kAAIxEQAEAjERAAQCMREABAIxE\nQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREAB\nAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCM\nREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABwE2Ii+sjm83m9xYX16ejuxnRbJZlWbd9\noTabOmCxABAyNptNUqDvsc+/6wLXt6f2+vpI5ysTGEEBAIxEQAEAjERAAQCMREABAIxEQAEAjERA\nAQCMREABAIxEQAEAjERAAcD/MDuEWZhJAgD+pz0zODCTROgwkwQAIKIQUAA6NTbbRS4CCkDEaU/o\nNDaeVsvmMt+3lhqYhn1QACJOuPYVsQ+qY7APCoDR2BSHG0V1dAcAQLp2U5y/Gtvt6QyMwAgKAGAk\nAgoAYCQCCgBgJAIKAGAkAgoAYKSAAVVUVCS73S6n0+m5r6GhQbm5uRo8eLAmTZqkM2fOeB5bvHix\nkpOTlZqaqoqKivD0GgDQ6QUMqEcffVRbtmy57r7S0lLl5ubq8OHDysnJUWlpqSSpqqpKv/3tb1VV\nVaUtW7bo29/+tpqbm8PTcwBApxYwoLKyshQfH3/dfZs2bVJhYaEkqbCwUOXl5ZKkjRs3aubMmYqO\njlZSUpIGDRqkysrKMHQbANDZ3dQ+qPr6etntdkmS3W5XfX29JOn48eNKTEz01CUmJqq2tjYE3QQA\ndDW3PJNE6xQk/h73pri42PNzdna2srOzb7UrAIAI4Ha75Xa7A9bdVEDZ7XadOHFC/fr1U11dnfr2\n7StJSkhI0LFjxzx1NTU1SkhI8NrGtQEFAOg6bhyUlJSUeK27qU18eXl5KisrkySVlZUpPz/fc/+6\ndet06dIlHT16VEeOHFFmZubNLAIA0MUFHEHNnDlT77//vk6dOqX+/fvrJz/5iebPn6+CggKtWrVK\nSUlJWr9+vSTJ4XCooKBADodDUVFRWrFihd/NfwAA+ML1oAAYwYTrNnE9qI7B9aAAABGFgAIAGImA\nAgAYiYACEDZcxh23gku+AwgbLuOOW8EICgBgJAIKAGAkAgoAYCQCCgBgJAIKAGAkAgoAYCQCCgBg\nJAIKAGAkAgoAYCQCCgBgJAIKQLswvx5uF+biA9AuzK+H24URFADASAQUAMBIBBQAwEgEFADASAQU\nAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADA\nSAQUAMBIBBQALuMOI3HJdwBcxh1GYgQFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADAS\nAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQVEiPZe9TZQPVfI\nhelslmX5v4xmOBZqs6kDFgtENJvNpkBXvZU+/78VuL49tZ/XU9v+Wil866Mz8JUJjKAAAEYioAAA\nRoq6lScnJSUpLi5O3bt3V3R0tCorK9XQ0KDp06frv//9r5KSkrR+/XrdddddoeovAKCLuKURlM1m\nk9vt1r59+1RZWSlJKi0tVW5urg4fPqycnByVlpaGpKMAgK7lljfx3bhja9OmTSosLJQkFRYWqry8\n/FYXAQDogm55BDVx4kSNHDlSK1eulCTV19fLbrdLkux2u+rr62+9lwCALueW9kHt3LlTX/rSl/Tx\nxx8rNzdXqamp1z3eer6FN8XFxZ6fs7OzlZ2dfStdAQBECLfbLbfbHbAuZOdBlZSUKCYmRitXrpTb\n7Va/fv1UV1en8ePH69ChQ9cvlPOgAEktJ9M2Np72WxMbG6+zZxuMOe+GWs6DCrWQnwd1/vx5NTY2\nSpKamppUUVEhp9OpvLw8lZWVSZLKysqUn59/s4sAOr2WcLL83gIFGNBZ3fQmvvr6ej344IOSpCtX\nrmj27NmaNGmSRo4cqYKCAq1atcpzmDkAAO3FVEdAB4rETUrUmrU+OgOmOgIARBQCCgBgJAIKAGAk\nAgoAYCQCCgBgJAIKCLH2XvkWgHe3NNURgLY+P/nWX433KcAAfI4RFADASAQUAMBIBBQAwEgEFADA\nSAQUAMBIBBQAwEgEFADASAQUuqz2nFDLybfA7ceJuuiy2nNCLSffArcfIygAgJEIKACAkQgoAICR\nCCgAgJEIKBiPo+2AromAQodoT5B8fgSd71tLTftqAZiNw8zRIThsG0AgjKAAAEYioAAARiKgAABG\nIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioBAygebXY5JWAO3BXHwImUDz6zG3\nHoD2YAQFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFnwJNXcT0\nRQDCiamO4FOgqYtaapi+CEB4MIICABiJgAIAGImA6mLYrwQgUrAPqothvxKASMEICgBgJAIKAGAk\nAgoAYCQCCgBgJAIKAGCksATUli1blJqaquTkZL388svhWASuwaHjADqjkAfU1atX9d3vfldbtmxR\nVVWV1q5dq3/+85+hXoyx3G63z8faEyTtqf380PFrb/933e8tNT573Z5XSG3Y26a2/bXhbDvSajuP\n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\nSUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9b112c>"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(c6bf)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEkCAYAAAB6wKVjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGI5JREFUeJzt3XtQVPf9xvFnFYxGoMF0XFuw4kQEV1ZYNThqqCiimaYy\nxFS8JjSYpLHtdNrmUpuLgTZVMtVONY25ODbBOtFap0Vrpg6NdjNqa1Gr1gy12gYaQcQYNEE03ji/\nP/y58bI3YBe+C+/XzE5g97PnfPbskSffc7VZlmUJAADD9OjsBgAA8IaAAgAYiYACABiJgAIAGImA\nAgAYiYACABjJb0AdO3ZMEydO1PDhw5WWlqYVK1ZIkhobG5Wbm6uhQ4dqypQpOnPmjOc9S5YsUXJy\nslJTU1VRURHe7gEAXZbN33lQJ06c0IkTJ5SRkaGzZ89q1KhRKi8v15tvvqkvfvGLevrpp/XSSy/p\n9OnTKi0tVVVVlebMmaM9e/aorq5OkydP1pEjR9SjBwM1AEDr+E2OAQMGKCMjQ5IUExOjYcOGqa6u\nTps3b1ZhYaEkqbCwUOXl5ZKkTZs2afbs2YqOjlZSUpKGDBmiysrKMH8EAEBXFPTQpqamRvv379eY\nMWPU0NAgu90uSbLb7WpoaJAkHT9+XImJiZ73JCYmqq6uLsQtAwC6g6AC6uzZs3rggQe0fPlyxcbG\n3vCazWaTzWbz+V5/rwEA4EtUoIJLly7pgQce0IMPPqj8/HxJV0dNJ06c0IABA1RfX6/+/ftLkhIS\nEnTs2DHPe2tra5WQkHDLNDMyMnTw4MFQfQYAQARLT0/XgQMHbnne7wjKsizNnz9fDodD3//+9z3P\n5+XlqaysTJJUVlbmCa68vDytX79eFy9eVHV1tY4eParMzMxbpnvw4EFZltUlHy+88EJYasM5bWr5\nPiK91pQ+TKiNxIevAYvfEdSuXbu0du1ajRgxQi6XS9LVw8gXLlyogoICrV69WklJSdqwYYMkyeFw\nqKCgQA6HQ1FRUVq5ciWb+AAAbeI3oO655x61tLR4fe3dd9/1+vwzzzyjZ555pv2dAQC6tZ7FxcXF\nHT3TkpISdcJsO0xSUlJYasM5bWpbX2tKH9Sa1YcJtZHGVyb4PVE3XGw2mzphtgAAA/nKBC7xAAAw\nEgEFADASAQUAMBIB1c3ExfXzXP3D1yMurl9ntwkAHCTR3Vw9Ly3Qsuf7AdBxOEgCABBRCCgAgJEI\nKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgA\ngJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICR\nCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgo\nAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACA\nkQgoAICRAgZUUVGR7Ha7nE6n57ni4mIlJibK5XLJ5XLpT3/6k+e1JUuWKDk5WampqaqoqAhP1wCA\nLs9mWZblr2DHjh2KiYnRQw89pEOHDkmSSkpKFBsbqx/+8Ic31FZVVWnOnDnas2eP6urqNHnyZB05\nckQ9etyYgzabTQFmizCx2WySAi17vh8AHcdXJgQcQWVlZSk+Pv6W571NbNOmTZo9e7aio6OVlJSk\nIUOGqLKyso0tAwC6szbvg3r55ZeVnp6u+fPn68yZM5Kk48ePKzEx0VOTmJiourq69ncJAOh2otry\npgULFmjRokWSpOeff15PPPGEVq9e7bX26ialWxUXF3t+zs7OVnZ2dltaAQBEGLfbLbfbHbCuTQHV\nv39/z8+PPPKIpk2bJklKSEjQsWPHPK/V1tYqISHB6zSuDygAQPdx86CkpKTEa12bNvHV19d7fv7D\nH/7gOcIvLy9P69ev18WLF1VdXa2jR48qMzOzLbMA0M3ExfWTzWbz+4iL69fZbaIDBRxBzZ49W++9\n955OnTqlgQMHqqSkRG63WwcOHJDNZtPgwYP1+uuvS5IcDocKCgrkcDgUFRWllStX+tzEBwDXa2o6\nrUBHmDY18fekOwl4mHlYZsph5p2Gw8xhKtbN7qvNh5kDANAZCCgAgJEIKACAkQgoAICRCCgAgJEI\nKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgA\ngJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICR\nCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQiodoqL6yebzeb3ERfXr7PbBICIY7Msy+rwmdps6oTZ\nhoXNZpMU6LOY83kjrV90H6yb3ZevTGAEBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAw\nEgEFADASAQV0Iq5EAvjGlSTaKdLOfo+0frs6vo/PsSy6L64kAQCIKAQUECHYHIjuhoCC8fjDfFVT\n02ld3QTm+3G1Buga2AfVTpG23TzS+pUis+dgteazdeXlIHXt7xn+sQ8KQEgwokVHiersBgBEls83\nNfqrsXVMM+jSGEEBAIxEQAEAjERAAQCMREABAIxEQAEAjBQwoIqKimS32+V0Oj3PNTY2Kjc3V0OH\nDtWUKVN05swZz2tLlixRcnKyUlNTVVFREZ6uAQBdXsCAevjhh7V169YbnistLVVubq6OHDminJwc\nlZaWSpKqqqr029/+VlVVVdq6dau+/e1vq6WlJTydAwC6tIABlZWVpfj4+Bue27x5swoLCyVJhYWF\nKi8vlyRt2rRJs2fPVnR0tJKSkjRkyBBVVlaGoW0AQFfXpn1QDQ0NstvtkiS73a6GhgZJ0vHjx5WY\nmOipS0xMVF1dXQjaBAB0N+2+ksS1S5v4e92b4uJiz8/Z2dnKzs5ubysAgAjgdrvldrsD1rUpoOx2\nu06cOKEBAwaovr5e/fv3lyQlJCTo2LFjnrra2lolJCR4ncb1AQUA6D5uHpSUlJR4rWvTJr68vDyV\nlZVJksrKypSfn+95fv369bp48aKqq6t19OhRZWZmtmUWAIBuLuAIavbs2Xrvvfd06tQpDRw4UD/5\nyU+0cOFCFRQUaPXq1UpKStKGDRskSQ6HQwUFBXI4HIqKitLKlSv9bv4DAMAX7gfVTpF2D5tI61eK\nzJ6DFYn3gwpXH6Z8PnQ87gcFAIgoBBQAwEgEFADASAQUgLDh9vBoD275DiBsuD082oMRFADASAQU\nAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUOgXXaAMQCNfiQ6fg\nGm0AAmEEBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEF\nADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUEgVvUAx2PW74DQeAW9UDHYwQFADAS\nAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEF\nADASAQUAMBIBBQAwEgEFADASAdUFcLdXdDes892DzbIs/7cJDcdMbTZ1wmzDwmazKdCdVqXwft7W\n9GBCv1Lk9RyuHiJtOUjh6zkSlwVCw1cmMIICABiJgAIAGCmqPW9OSkpSXFycevbsqejoaFVWVqqx\nsVEzZ87U//73PyUlJWnDhg264447QtUvAKCbaNcIymazye12a//+/aqsrJQklZaWKjc3V0eOHFFO\nTo5KS0tD0igAoHtp9ya+m3dsbd68WYWFhZKkwsJClZeXt3cWAIBuqN0jqMmTJ2v06NFatWqVJKmh\noUF2u12SZLfb1dDQ0P4uAQDdTrv2Qe3atUtf+tKX9NFHHyk3N1epqak3vH7tfARviouLPT9nZ2cr\nOzu7Pa0AACKE2+2W2+0OWBey86BKSkoUExOjVatWye12a8CAAaqvr9fEiRN1+PDhG2fKeVCd1kNr\nauPi+qmp6bTfytjYeH36aWMruv3/OUTYOS+cB3XdHAw4t8mUZYHQCPl5UOfOnVNTU5Mkqbm5WRUV\nFXI6ncrLy1NZWZkkqaysTPn5+W2dBTrZ1XCy/D4CBRgAtFWbN/E1NDTo/vvvlyRdvnxZc+fO1ZQp\nUzR69GgVFBRo9erVnsPMAQBoLS511E4mbGqIxM0opvQRLDbxXTcHA9Y3U5YFQoNLHQEAIgoBBQAw\nEgEFADASAQUAMBIBBQAwEgEFdFGB7jrLHWdhunZd6giAuT4/0drX694vQwaYghEUAMBIBBQAwEgE\nFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBRChhNDEekCrcOsxx2LE3URMpwYikgXaB2+WsN63FEY\nQQEAjERAAQCMREABAIxEQAEAjERAGYqjiSIX3x0QGgSUoT4/msj342oNTMN3B284DaP1OMwcADoA\np2G0HiMoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCKgO\nxEVEASB4XIuvA3E7aQAIHiMoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEI\nKACAkQgoAF0alxiLXFzqCECXxiXGIhcjKACAkQgoAICRCCh0W+ybAMzGPih0W+ybAMzGCAoAYCQC\nCgBgJAIKAGAkAgoAYCQCCgBgpLAE1NatW5Wamqrk5GS99NJL4ZgFAHQqTlMIv5AH1JUrV/Td735X\nW7duVVVVldatW6d//etfoZ6Nwdxhqg3ntLtObfv+aLSmh9bWm13bccstXLXhnLb32s9PU7j+8Zcb\nfr9a0/4e3O7ga7uSkAdUZWWlhgwZoqSkJEVHR2vWrFnatGlTqGdjMHeYasM57a5Te+sfjRd08x8R\n3380WtNDa+vNru245Rau2nBOu/NrCagQqaur08CBAz2/JyYmqq6uLtSzAQB0cSEPKJuNM+8BoD1u\n3uRaUlLSPfdvWSH2t7/9zZo6darn98WLF1ulpaU31KSnp9+84ZYHDx48eHTTR3p6utc8sVmWZSmE\nLl++rJSUFG3btk1f/vKXlZmZqXXr1mnYsGGhnA0AoIsL+cVio6Ki9Ktf/UpTp07VlStXNH/+fMIJ\nANBqIR9BAQAQClxJohPU1NTI6XSGfT7FxcVatmxZyKa3YsUKORwOPfjggyGbZluWxfjx40Na35Ye\nYmJiWlWP1vnkk0/06quvdnYb6GQEVBcW6iMqX331Vb377rv6zW9+E9LpttauXbvCWh8Mjla9lWVZ\nCtUGmdOnT2vlypUhmRYiFwEVQvfff79Gjx6ttLQ0rVq1ym/t5cuXNW/ePDkcDs2YMUPnz5/3Wbtm\nzRqlp6crIyNDDz30kN/p/uxnP1NKSoqysrL073//22/t2rVrNWbMGLlcLj3++ONqaWnxWfv444/r\ngw8+0L333qtf/vKXfqcrST/96U+VmpqqrKwszZkzx+9I7sqVK3rssceUlpamqVOn6rPPPvM77daO\nXlpT/8EHH2jkyJHat29fq+Zxs5qaGqWmpurhhx9WSkqK5s6dq4qKCo0fP15Dhw7Vnj17bqkfNmxY\n0MvhF7/4hZxOp5xOp5YvXx5UL8Gub9evQ4G+u5qaGqWkpKiwsFBOp1O1tbVe65qbm3XfffcpIyND\nTqdTGzZs8NvzwoUL9d///lcul0s/+tGP/M7/+tHv0qVLVVJS4rX2xz/+8Q2h52sLw89//nO9/PLL\nkqQf/OAHysnJkSRt375d8+bNu6V+z549Sk9P14ULF9Tc3Ky0tDRVVVV57eGFF1644ft69tlntWLF\nCp+f7/XXX5fL5ZLL5dLgwYM1adIkn7VdUqgPM+/OGhsbLcuyrHPnzllpaWnWxx9/7LWuurrastls\n1l//+lfLsiyrqKjIWrp0qdfa999/3xo6dKhnWtfm4c3evXstp9NpnT9/3vr000+tIUOGWMuWLfNa\nW1VVZU2bNs26fPmyZVmWtWDBAmvNmjV+P19SUpLPz3S9yspKKyMjw7pw4YLV1NRkJScn++yjurra\nioqKsg4ePGhZlmUVFBRYa9eu9Tv9mJiYgD20pr66utpKS0uzDh8+bLlcLuuf//xnSKYZFRVlvf/+\n+1ZLS4s1atQoq6ioyLIsy9q0aZOVn5/vtT6Y5XDtez537px19uxZa/jw4db+/fv99hLs+taadeja\ntHv06GH9/e9/970wLMvauHGj9eijj3p+/+STT/zW19TUWGlpaX5rrs3/+rqlS5daxcXFXmv3799v\nTZgwwfO7w+Gwamtrb6nbvXu3NWPGDMuyLOuee+6xxowZY126dMkqLi623njjDa/Tfu6556wnn3zS\n+s53vnPLaTU3f66RI0dalmVZV65cse666y6//6avuXTpkpWVlWVt2bIlYG1XwggqhJYvX66MjAyN\nHTtWtbW1Onr0qM/agQMHauzYsZKkefPmaefOnV7rtm/froKCAvXrd/WkvPj4eJ/T3LFjh6ZPn67e\nvXsrNjZWeXl5Pje5bNu2Tfv27dPo0aPlcrm0fft2VVdXB/tR/dq1a5fy8/PVq1cvxcTEaNq0aX43\n/QwePFgjRoyQJI0aNUo1NTUh6aM1Tp48qfz8fL399tsh2z84ePBgDR8+XDabTcOHD9fkyZMlSWlp\naV4/Y7DLYefOnZo+fbr69Omjvn37avr06dqxY4ffXoJd31qzDl0zaNAgZWZm+q0ZMWKE/vznP2vh\nwoXauXOn4uLi/NYHmmdbZGRk6OTJk6qvr9fBgwcVHx+vhISEW+qujaCbmprUu3dvjR07Vnv37tXO\nnTuVlZXlddqLFi1SRUWF9u7dq6efftpnD4MGDdKdd96pAwcOqKKiQiNHjvT7b/qa733ve8rJydF9\n990X/AfuAkJ+mHl35Xa7tW3bNu3evVu9e/fWxIkTdeHCBZ/11+/DsCzL5z4Nm80W9D/Wm2sDva+w\nsFCLFy8Oatqt0do+brvtNs/PPXv29Lv5KVzuuOMODRo0SDt27FBqampIpnn95+rRo4d69erl+fny\n5ct+6/0tB2/LN9A+sbaub8Gse3379g1Yk5ycrP379+udd97Rc889p5ycHD3//PMB3xdIVFTUDZum\nA607M2bM0MaNG3XixAnNmjXLa010dLQGDx6st956S+PGjdOIESO0fft2/ec///G5bpw6dUrNzc26\ncuWKzp8/r9tvv91nD4888ojefPNNNTQ0qKioKOBnfOutt3Ts2LFuuU+OEVSIfPrpp4qPj1fv3r11\n+PBh7d6922/9hx9+6Kl5++23ff6f2aRJk/S73/1OjY2NkuT5rzdf/epXVV5ers8++0xNTU3asmWL\nzz9EOTk52rhxoz766CPPdD/88MOAnzMY48eP1x//+EdduHBBZ8+e1TvvvGP8QQW9evXS73//e61Z\ns0br1q3r7Hb8ysrKUnl5uc6fP6/m5maVl5f7XH+uCXZ9a8061Br19fXq3bu35s6dqyeffFL/+Mc/\n/NbHxsaqqakp4HTtdrtOnjypxsZGXbhwQVu2bPFbP3PmTK1bt04bN27UjBkzfNZlZWVp6dKlmjBh\ngrKysvTaa69p5MiRPuu/9a1v6cUXX9ScOXP87jOTru6r3rp1q/bu3aupU6f6rd23b5+WLVvW6Qcm\ndRZGUCFy77336rXXXpPD4VBKSopnc4o3NptNKSkpeuWVV1RUVKThw4drwYIFXmsdDoeeffZZTZgw\nQT179tTIkSP161//2muty+XSzJkzlZ6erv79+/vd7DJs2DC9+OKLmjJlilpaWhQdHa2VK1fqK1/5\nit++gzF69Gjl5eVpxIgRstvtcjqd+sIXvhD0dFszGghGMPU2m0233367tmzZotzcXMXGxurrX/96\nu6fp63dv7w92ObhcLn3zm9/0fL+PPvqo0tPT/fYS7Pp28zp09913BxxFBbMsDh06pKeeesozkgx0\nCPmdd96p8ePHy+l06mtf+5rP+8pFR0dr0aJFyszMVEJCghwOh99+HA6Hzp49q8TERNntdp91WVlZ\nWrx4scaOHas+ffqoT58+PkN9zZo1uu222zRr1iy1tLRo3Lhxcrvdys7O9tnzpEmTFB8fH3DZvfLK\nKzp9+rQmTpwoSbr77rv1xhtv+H1PV8KJugiL5uZm9e3bV+fOndOECRO0atUqZWRkdHgfH3/8caft\n1zJFTU2Npk2bpkOHDrX6vSUlJYqJidETTzwRhs66p5aWFo0aNUobN27UXXfd1dntGI1NfAiLxx57\nTC6XS6NGjdI3vvGNTgmn48ePa9y4cXrqqac6fN6mac9mOtM3z0aSqqoqJScna/LkyYRTEBhBAQCM\nxAgKAGAkAgoAYCQCCgBgJAIKAGAkAgoAYCQCCgBgpP8D+njZv7/d4VMAAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaea4c52c>"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nMEAjR45s8cIJ6Uzo9OrVq+mii1DX5aKLrsVFFwDCiVMmOM6wIiIiVFhYqNzcXAUCAc2bN0/Jyckq\nKiqSJOXn5+vQoUPKzMxUbW2tevTooRUrVqiiokLR0dEtrgsAQHs4zrAuSAPMsLoUMywA4aTdl7UD\nABAuCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACA\nFQgsAIAVCCwAgBUILACAFQgsAGEnJqaPXC6X4y0mpk9Xt4kLjA9wvMjxAY4IR7wuL158gCMAwHoE\nFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACkEDq7S0VElJ\nSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P1nnnlGQ4YMUVpamu68807V19efv84BABcVx8AKBAJa\nsGCBSktLVVFRobVr12rv3r3NakpKSnTgwAHt379fq1at0vz58yVJVVVVevXVV7V792598MEHCgQC\n+vOf/9x5IwEAdGuOgVVWVqb4+HjFxcUpMjJSeXl5Ki4ublazYcMGzZkzR5KUlZWlo0eP6vDhw4qJ\niVFkZKROnDihxsZGnThxQm63u/NGAgDo1hwDq6amRrGxsU3LHo9HNTU1IdX06dNHixYt0rXXXqsB\nAwboqquu0k033XSe2wcAXCwcA+vMZ9IE19Jnl3z88cd6/vnnVVVVpYMHD+rYsWP605/+1L4uAZyD\nDznExSbC6U632y2/39+07Pf75fF4HGuqq6vldrvl8/k0evRo9e3bV5I0bdo0vf3225o5c+Y5j1NQ\nUND0dU5OjnJyctozFuCiUlf3tYJ9yGFdXWi/dAJdxefzyefzhVZsHDQ0NJhBgwaZyspKU19fb7xe\nr6moqGhWs2nTJjNx4kRjjDE7duwwWVlZxhhjysvLzZAhQ8yJEyfM6dOnzezZs01hYeE5jxGkBXQy\nSUYyQW48R+GoOz933XlscOb0vDrOsCIiIlRYWKjc3FwFAgHNmzdPycnJKioqkiTl5+dr0qRJKikp\nUXx8vKKiorR69WpJUnp6umbPnq0RI0aoR48eGjZsmO677752JTAAAK7vEq3rGnC5WjwHZqOYmD7f\nHaZpXa9evVVbe+QCdRTcmfOUwfZ/93mOupPu/Nx157HBmVMmEFjnkY0/ZDb2jDO683PXnccGZ06Z\nwFszAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxA\nYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgwSoxMX3kcrkcbzExfbq6TQCdgMCC\nVerqvpZkHG9nauxEIAOtI7DQ5fhP+nvdPZCBjojo6gaA7/+TdqpxXZhmAIQtZlgAACsQWAAuCA79\noqM4JAjgguDQLzqKGRYAwAoEFgDACkEDq7S0VElJSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P2j\nR49q+vTpSk5OVkpKinbu3Hn+OgcAXFQcAysQCGjBggUqLS1VRUWF1q5dq7179zarKSkp0YEDB7R/\n/36tWrVK8+fPb7rvV7/6lSZNmqS9e/fq/fffV3JycueMAgDQ7TkGVllZmeLj4xUXF6fIyEjl5eWp\nuLi4Wc2GDRs0Z84cSVJWVpaOHj2qw4cP65tvvtG2bds0d+5cSVJERISuvPLKThoGAKC7cwysmpoa\nxcbGNi17PB7V1NQEramurlZlZaX69eunu+++W8OGDdO9996rEydOnOf2AQAXC8fAcrlCu8TUmOaX\nqrpcLjU2Nmr37t36xS9+od27dysqKkrPPvts+zsFAFzUHP8Oy+12y+/3Ny37/X55PB7Hmurqarnd\nbhlj5PF4lJmZKUmaPn16q4FVUFDQ9HVOTo5ycnLaOg4AXSAmpk/Q9zbs1au3amuPXKCOYBufzyef\nzxdasXHQ0NBgBg0aZCorK019fb3xer2moqKiWc2mTZvMxIkTjTHG7Nixw2RlZTXdl52dbT766CNj\njDGLFy82jzzyyDmPEaQFq0gykglyC6/xhkPPbekhHPrtTLbti87qNxzGhq7h9Lw6zrAiIiJUWFio\n3NxcBQIBzZs3T8nJySoqKpIk5efna9KkSSopKVF8fLyioqK0evXqpvVfeOEFzZw5U99++60GDx7c\n7D4AANrC9V2idV0DLtc558BsdeacX7CxhNd4w6HntvQQDv12Jtv2RWf1Gw5jQ9dwygTe6QIAYAUC\nCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsA\nYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAF\n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\nrY7prLKyMpOenm7q6+tNXV2dSUhIaLWHyspKExERYd577z1jjDG33367ef311x23Hx0d7Xh/e9ap\nrKw0qampZt++fSYjI8O8//77Hdrm2XF9+OGH5vTp02b48OFm7ty5xhhjiouLzdSpU1tdJ5R9cfZ5\nPnHihDl27JgZMmSIKS8vb7WXUF9rbXn9nN12jx49zH//+99Wa85at26duffee5uWv/nmm1Zrq6qq\nTGpqatBtnu3hh7XLli0zBQUF59SVl5ebsWPHNi2npKSY6urqFre5c+dOM2PGDGOMMT/5yU9MVlaW\naWhoMAUFBWbVqlUtrvPEE0+Yhx56yPzyl79s8c95zqqqqjLDhg0zxhgTCATM4MGDHX+mjTGmoaHB\nZGdnm40bNzrWdUfMsDrRihUrlJ6erlGjRqm6ulr79+9vtTY2NlajRo2SJM2aNUvbt29vsW7r1q26\n/fbb1afPmT8U7N27d6vb3LZtm6ZNm6aePXuqV69emjJlSquHabZs2aJ3331XI0aMUEZGhrZu3arK\nyspQh9qqt956S1OnTtWll16q6OhoTZ482fFQ0cCBAzV06FBJ0vDhw1VVVdXhHtrjiy++0NSpU/XG\nG2+cl/OLAwcO1JAhQ+RyuTRkyBDddNNNkqTU1NRWxxjqvti+fbumTZumyy+/XFFRUZo2bZq2bdvW\nai+hvtba8vo567rrrtPIkSMdayRp6NCh+ve//61HH31U27dvV0xMTKu1wR6zPdLT0/XFF1/o888/\n13vvvafevXvL7Xa3WHt2hl1XV6eePXtq1KhR2rVrl7Zv367s7OwW13nyySf15ptvateuXXrkkUda\n7eO6665T3759tWfPHr355psaNmyY48+0dObNxsePH6+bb7459AF3E46XtaP9fD6ftmzZop07d6pn\nz54aN26c6uvrW63/4TkQY0yr50RcLlfIP8A/rg223pw5c/T000+HtO1QtbWHyy67rOnrSy65xPFw\nVWe66qqrdN1112nbtm1KSkrq8PZ+OK4ePXro0ksvbfq6sbEx6DpO+6Klfex0Tq29r7VQXndRUVFB\nayQpISFB5eXl2rRpk5544gmNHz9ev/nNb0Ja10lERESzQ9lOr58ZM2Zo3bp1OnTokPLy8lqti4yM\n1MCBA/Xaa69p9OjRGjp0qLZu3aoDBw60+tr43//+p+PHjysQCOjkyZO64oorWt3+Pffco9WrV+vw\n4cOaO3eu4/hee+01+f3+i/acHjOsTlJbW6vevXurZ8+e2rdvn3bu3OlY/9lnnzXVvPHGG63+5nbj\njTfqb3/7m44cOSJJTf+25IYbbtD69et16tQp1dXVaePGja3+5zR+/HitW7dOX375ZdN2P/vss6Dj\nDGbMmDH65z//qfr6eh07dkybNm2y4gKFSy+9VP/4xz+0Zs2aFv/gPZxkZ2dr/fr1OnnypI4fP671\n69e3+vqRQn+tteX101aff/65evbsqZkzZ+qhhx7S7t27W63t1auX6urqQtpu//799cUXX+jIkSOq\nr6/Xxo0bW6294447tHbtWq1bt04zZsxw3G52draWLVumsWPHKjs7W6+88oqGDRvWan1+fr6eeuop\n3XnnnUHPu916660qLS3Vrl27lJub22rdu+++q+XLl3fpRU5djRlWJ5kwYYJeeeUVpaSkKDExsekQ\nTEtcLpcSExP14osvau7cuRoyZIjmz5/fYm1KSooef/xxjR07VpdccomGDRumP/zhDy3WZmRk6I47\n7pDX69XVV1/teKgmOTlZTz31lH72s5/p9OnTioyM1EsvvaRrr73Wse9gRowYoSlTpmjo0KHq37+/\n0tLSdOWVV4a8zWCP0Z7/QENZx+Vy6YorrtDGjRv105/+VL169dItt9zS7m06jctphhPKY2RkZOjn\nP/950/N77733yuv1ttpLqK+1H79+MjMzg86yQn0+PvjgAz388MNNs02ny9b79u2rMWPGKC0tTZMm\nTXL8bL3IyEg9+eSTGjlypNxut1JSUlrtKSUlRceOHZPH41H//v0d+83OztbTTz+tUaNG6fLLL9fl\nl1/eatCvWbNGl112mfLy8nT69GmNHj1aPp9POTk5rfZ84403qnfv3o7778UXX9TXX3+tcePGSZIy\nMzO1atUqx767G/5wGJ3u+PHjioqK0okTJzR27Fi9+uqrSk9P75Jevvrqqy49N9bVqqqqNHnyZH3w\nwQdtXnfJkiWKjo7WokWLOqGzi9fp06c1fPhwrVu3ToMHD+7qdsIahwTR6e677z5lZGRo+PDhmj59\nepeF1cGDBzV69Gg9/PDDXfL44aIjh/VsOJxrk4qKCiUkJOimm24irELADAsAYAVmWAAAKxBYAAAr\nEFgAACsQWAAAKxBYAAArEFgAACv8P5ZWvQDqsWNNAAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9fc90c>"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6a"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "'CPYYL GVVIR PDDVU BCSUP QOWPW SYBYP ODBCS PBBPR CSIOZ PTSTV HYVTW PYOZC OGCRV TTPUI BVGVS YOUGZ ZSRYS BPYLY SHSYY OUGBV BCSWP OUBOU GPUIR DSPYD LTSUB OVUOU GZPYP ZSSTZ DONSB CSLNU SJPAV EBBCS ZRPTV EYHYO SUIDL ZZVHH ORSYJ PZWDP UUOUG BVWED DBCSL WORNS IEWCS YBYPO DBCSU OGCBP HBSYZ CSJSU BTOZZ OUGAE BLVER PUYSP IPAVE BBCPB OUBCS OYYSW VYBZB ODDUV MVLVU GSBBO UGPRR SZZBV BCSVY OGOUP DTOZZ TVUPO UBCSG PDDSY LPUIO PTASG OUUOU GBVBC OUNJS TOGCB USSIB VYVDD VEBPA DPRNA PGMVA LVEJP UBBVI VOBVY ZCPDD OALBC SJPLO JPZZE YWYOZ SIALB COZYS WVYBB CSVBC SYWPW SYZJS CPFSH YVTBC SUPQO ZPBBC OZDSF SDPYS SURYL WBSIE ZOUGA OHOIV YWDPL HPOYZ BLDSR OWCSY ZBCOZ VUSOZ UBTPL ASBCS ROWCS YRDSY NJPZV HHIEB LBCPB IPLJS GVBDE RNL\\n'"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(sanitise(c6b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 11,
-       "text": [
-        "1573"
-       ]
-      }
-     ],
-     "prompt_number": 11
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6as = sanitise(c6a)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "frequencies(ngrams(c6as, 2))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 13,
-       "text": [
-        "Counter({'bc': 21, 'cs': 20, 'ou': 15, 'sy': 12, 'oz': 10, 'ug': 10, 'ub': 8, 'bv': 8, 'su': 7, 'bb': 7, 'zz': 6, 'yo': 6, 'dd': 6, 'ys': 6, 'py': 6, 'pu': 6, 'jp': 6, 've': 6, 'vy': 6, 'cp': 5, 'co': 5, 'si': 5, 'yz': 5, 'ds': 5, 'po': 5, 'bo': 5, 'eb': 5, 'vb': 5, 'vu': 5, 'sb': 4, 'zb': 4, 'yb': 4, 'dp': 4, 'pl': 4, 'pd': 4, 'pb': 4, 'pz': 4, 'bp': 4, 'js': 4, 'wp': 4, 'og': 4, 'up': 4, 'uo': 4, 'ui': 4, 'yl': 4, 'tv': 3, 'to': 3, 'lv': 3, 'lb': 3, 'yv': 3, 'sj': 3, 'sg': 3, 'sp': 3, 'sr': 3, 'ss': 3, 'sw': 3, 'zs': 3, 'zv': 3, 'zc': 3, 'al': 3, 'yw': 3, 'rn': 3, 'rp': 3, 'db': 3, 'us': 3, 'yy': 3, 'yp': 3, 'st': 3, 'ie': 3, 'gv': 3, 'gp': 3, 'zp': 3, 'gb': 3, 'gc': 3, 'pa': 3, 'pt': 3, 'pr': 3, 'bl': 3, 'wc': 3, 'ow': 3, 'od': 3, 'vh': 3, 'vt': 3, 'hy': 3, 'tp': 2, 'ts': 2, 'cb': 2, 'lw': 2, 'fs': 2, 'sh': 2, 'sl': 2, 'so': 2, 'sz': 2, 'sv': 2, 'zo': 2, 'ro': 2, 'wv': 2, 'rd': 2, 'ry': 2, 'rs': 2, 'dl': 2, 'do': 2, 'dv': 2, 'ir': 2, 'ip': 2, 'qo': 2, 'io': 2, 'ib': 2, 'gz': 2, 'ga': 2, 'av': 2, 'go': 2, 'pw': 2, 'pq': 2, 'by': 2, 'bs': 2, 'bt': 2, 'wd': 2, 'oy': 2, 'or': 2, 'ws': 2, 'iv': 2, 'zd': 2, 'ey': 2, 'er': 2, 'ns': 2, 'vi': 2, 'nj': 2, 'ho': 2, 'uu': 2, 'hh': 2, 'mv': 2, 'as': 2, 'tz': 1, 'tt': 1, 'tw': 1, 'ta': 1, 'tb': 1, 'lp': 1, 'lt': 1, 'ly': 1, 'lz': 1, 'la': 1, 'ld': 1, 'lg': 1, 'lh': 1, 'lj': 1, 'cr': 1, 'lo': 1, 'ln': 1, 'wb': 1, 'sc': 1, 'sd': 1, 'sf': 1, 'na': 1, 'zr': 1, 'ap': 1, 'wo': 1, 'zw': 1, 'zu': 1, 'zt': 1, 'zy': 1, 'ad': 1, 'ae': 1, 'zj': 1, 'ao': 1, 'rc': 1, 'hb': 1, 'rr': 1, 'rv': 1, 'yj': 1, 'yh': 1, 'yn': 1, 'hi': 1, 'de': 1, 'yd': 1, 'yr': 1, 'du': 1, 'dt': 1, 'nl': 1, 'gm': 1, 'wy': 1, 'ia': 1, 'id': 1, 'gs': 1, 'pi': 1, 'ph': 1, 'pg': 1, 'pf': 1, 'bz': 1, 'bu': 1, 'bi': 1, 'bd': 1, 'we': 1, 'ov': 1, 'op': 1, 'os': 1, 'on': 1, 'oi': 1, 'oj': 1, 'oa': 1, 'ob': 1, 'ej': 1, 'ze': 1, 'ed': 1, 'ez': 1, 'ew': 1, 'vg': 1, 'vd': 1, 'va': 1, 'vo': 1, 'oh': 1, 'nu': 1, 'vl': 1, 'vw': 1, 'vv': 1, 'vs': 1, 'uy': 1, 'uv': 1, 'ur': 1, 'un': 1, 'hp': 1, 'hs': 1, 'vm': 1})"
-       ]
-      }
-     ],
-     "prompt_number": 13
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(letters(c6a).translate(''.maketrans({'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 14,
-       "text": [
-        "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "trans={'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join(sorted(trans.keys(), key=lambda k: trans[k]))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 16,
-       "text": [
-        "'PARISHGCOMNDTUVWYZBEFJLQ'"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(keyword_decipher(c6as, 'parishighcommand', 2)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 17,
-       "text": [
-        "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'"
-       ]
-      }
-     ],
-     "prompt_number": 17
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs = sanitise(c6b)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c6bs)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 19,
-       "text": [
-        "1573"
-       ]
-      }
-     ],
-     "prompt_number": 19
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "from itertools import permutations"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 20
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "list(permutations(range(4)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 21,
-       "text": [
-        "[(0, 1, 2, 3),\n",
-        " (0, 1, 3, 2),\n",
-        " (0, 2, 1, 3),\n",
-        " (0, 2, 3, 1),\n",
-        " (0, 3, 1, 2),\n",
-        " (0, 3, 2, 1),\n",
-        " (1, 0, 2, 3),\n",
-        " (1, 0, 3, 2),\n",
-        " (1, 2, 0, 3),\n",
-        " (1, 2, 3, 0),\n",
-        " (1, 3, 0, 2),\n",
-        " (1, 3, 2, 0),\n",
-        " (2, 0, 1, 3),\n",
-        " (2, 0, 3, 1),\n",
-        " (2, 1, 0, 3),\n",
-        " (2, 1, 3, 0),\n",
-        " (2, 3, 0, 1),\n",
-        " (2, 3, 1, 0),\n",
-        " (3, 0, 1, 2),\n",
-        " (3, 0, 2, 1),\n",
-        " (3, 1, 0, 2),\n",
-        " (3, 1, 2, 0),\n",
-        " (3, 2, 0, 1),\n",
-        " (3, 2, 1, 0)]"
-       ]
-      }
-     ],
-     "prompt_number": 21
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[column_transposition_decipher(c6bs, p, fillvalue=' ') for p in permutations(range(4))]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 22,
-       "text": [
-        "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo   ',\n",
-        " 'hihthnrffetreafoftanslytorrreqhtimesrurlhfestaeeiuwisibhnrtrsiioieinrhrmpydttoierctialbnrphntoohrleiwthstepsostooyunwherdhchpimcnotoahsahtjieaentorfnesuramgxutrtolweabtrtpeptaraeesnehthrsinrtsstnrflodghuamgessekaunitahtytnuyntnnvhgiwlwefipaaserlfiaebpacmpclaehthotlhswuldasevueaoetauetaetefhelbthrsghatilaceehtnrhgaasiteufnnpuerhrleitmtudiynneugiocuedneeaihseulhntoathieianydfniuaoeantieyfoehdaulareoryuhrareatreahaiontgwiwssatibutlaoxmleotretootnoaorotgcbvapinleewfrytaoeadwuwertrtlnrppfailelrmintorwiqereucardnotfanrtoeltepernpmhsndedtdweheofypdeensnnegetaeteaensetrgduleorsbuorwhgdbrapheynttkeretrrrnhfndeolstwsainipyotmhoucotyieeeopnhrknnatirtleeuirenmitpahoaeohnhoumutksvendeeeiodpkwietgiioisehnuuafnbueitrhaehrieheuaaysrsuiwagdssiitlrgfhpilwtiiisheusrmormaecisiolvedoeulsariidoetnifesbontaspogfsordtfriplatnertlyoisoytoessfnptheiageoaraeiitmdtaeagryhasrrcflerteleaenhvheivhmnassieorixmlpstjteosfbrmhnidocehcntbtnocmpsueseohtneetifenootnowoteeritloidgosemhofimlorefdftuseofelrwiiyqbdzottnrafntidgotnaleapdhseanmthplsntbuohaaapllenmpdsrhvanialenhacliksacodaetdjgohiedagwyandteenehgeueeoeednroyyfrctmettnwtgedtausootofwmyihgrrheosirnraforeftenopyasisesstnhhayuelhwipcetataupenalueelwhaaoleursenbiieaasetaegccdsoerpsoreneslvsoeddusilttetitfesoenslnignorentieeiwwlwtheisriihltdrsndserfrhntglrsauseaddotyasdautnewictnaemtetrposeyttoocynutosgcumdlapdlaedoetfdbsfeelahxarsnoiditeirpasihcdschibpiesllnlahofrretnatroaimeklgaremtrdwcsnyanwvsnudlorkeutnnouitiunnhvineiolhletfneaatiuftatceltnnbrhbgelonsaomnifokarnosnnvfrterctfhdtepsswuceprctwpowafhadyiosoaogaenldfgingtrebtlllfgo   ',\n",
-        " 'htihhfnrfreteoaffntastlyorrretqhismerlurhsfeteaeiiuwshibnrrtsoiiineirmhrptydteoirictanlbrnphthoorilewsthtsepoostonyuwrhedhhcpcimnootaahshitjenaetfornuesrgamxruttwoletabretpprtaaseentehhirsnsrtsrtnfdlogahumsgesaekutniayhttynunntnvihgwelwfaiparselafieabpccmplhaettholwhsualdsueveeaoteauttaeeefhlhbtrhsgaltiaecehrtnhagaseitunfnprueherlittmuydinunegciounedeieahuselthnohatiaeinfydnaiuoneatyiefhoedlauaorerhyurearaetraihaogntwsiwsiatblutamoxlteoroetootnaoortbgcviapnelewyfrteaoaudwwterrntlrfppaeillirmnrtoweiqrceuanrdoatfnorteeltpnerpsmhnddetedwhfeoyepdennsneegttaeenaesretglduesorbruowdhgbprahneytetkrretrhrnfendotlswisanyipohtmooucteyiepeonkhrntnailrteieurmeniatpheoaohhnouumtvkseendeoeidwpkigetiiiosnehufuanebuihtrarehieehuyaasursigwadissirtlgpfhitlwisiihseurrmomcaeiosildveoleusiariedotfnieosbnstapfogsdortifrptlanterliyostoyosesftnphaeigaeoriaeidtmtaaeghryarsrceflrlteenaehevhimvhnsasireoilxmpjsttseofmbrhdniohcecbnttcnomupseosehetneftieonotwnooeterlitogidomsehiofmrloeffdteusolferiwiydqbztotnfrandtignotaalepsdhemantlhpsbntuaohalaplmenprdshnvaiealnchalsikadcoadetjhgoiaedgawynedtehnegeeueeoedonryryfcetmtwtntdgetsauoootfywmirhgrohesnirroafrtefepnoyiasssesthnhaeyulihwptceautapaenleuelawhaeoluersnibiesaaeetagdccsroeprsoesnelovseuddstiltiettsfeosenlgnineornetiewiwlhwterisilihtsdrnedsrhfrnltgrusasdeadyotaasduetnwticnmaetretpeosyottoncyustogmcudpladeladtoefsdbfleeaahxrosnitdiepirahsiccdshpibileslanlhrofrnetaotraeimkalgrtemrcdwsanynswvnludoerkuntnotuiinunhnvieliohtlefaneautifttactelnrnbhebglsonanomikfoaornsvnnfertrfcthedtpwssupcerwctpaowfdhaysioogaoalendifgnrgtelbtlglfo   ',\n",
-        " 'hhithrnffterefaofatnsyltorrrehqtiemsrrulhefsteaeiwuisbihntrrsiioiienrrhmpdyttioertciablnrhpntoohreliwhtstpesotsoouynwehrdchhpmicntooashahjtieeantrofnseurmagxturtlowebatrptepatraeesnhethsrintrssntrfoldguhamegsskeauintathytunynntnvghiwwlefpiaaesrlifaepbacpmcleahtohtlshwudlasveueoaetuaeteatehfeltbhrgshaitlaecehntrhagastieunfnpeurhlreimttuidynenugoicudeneaeihesulnhtotahiieandyfnuiaoaenteiyfeohdualaeroruyhrraearteaahiotngwwisstaibtulaxomloetrteoontoarootcgbvpainelewrfytoaeawduwretrltnrppfalielmrinotrwqieruecadrnoftantroetleprenphmsneddtwdehoefydpeesnnngeeteateeanstergudlerosbourwghdbarphyentkterterrnrhfdneosltwasinpiyomthocuotiyeeoepnrhknantitrleueirnemiptahaoeonhhomuutskvedneeieodkpwitegioiishenuaufnubeirthaheriheeuaayssruiawgdssiiltrghfpiwltiiishuesromrmeaciisolevdouelsraiiodetinfebsonatspgofsrodtrfipaltnretloyisyotosesfpnthieagoeareaiimtdteaagyrharsrclferetleeanhhveihvmnsasioerimxlptsjtoesfrbmhindoechctnbtoncmspueesohnteeitfeonotonwoetertilodigoesmhfoimolredfftsueoeflriwiybqdztotnarfnitdgtonaelaphdsenamtphlstnbuhoaapallnempsdrhavnilaenahclkisaocdatedjoghideagywantdeeenhgueeeeoedrnoyfyrcmtetntwtegdtuasotoofmwyighrrehosrinrfaorfeteonpysaissesthnhauyelwhipectaatupnealeuelhwaaloeusrenibieaaseategccdseorposreenslsvoedduslittteitefsoneslingnroeniteewiwltwhesirihiltrdsnsderrfhngtlrasusaeddtoyadsauntewcitneamtterpsoeyttooycnuotsgucmdalpdaledeotfbdsfeelaxharnsoiidteripaishcsdchbipiselllnahforrtenartoamiekglarmetrwdcsynanvwsndulokreuntnoiutinunhivneoilheltfenaaitufattcletnbnrhgbelnosamoniofkanrosnnvftrertcfhtdepsswuecprtcwpwoafahdyoisooaganeldgfintgretbllflgo   ',\n",
-        " 'hthihfrnfrteeofafnatstylorrrethqisemrlruhsefteeaiiwushbinrtrsoiiiniermrhptdyteioritcanblrnhpthoorielwshttspeootsonuywrehdhchpcminotoaashhijteneatfronusergmaxrtutwloetbareptprataseenthehisrnstrsrntfdolgauhmsegsakeutinaythtyunnnntvighwewlfapiareslaifeapbccpmlheattohlwshuadlsuveeeoateuatteaeehflhtbrhgsalitaeechrnthaagsetiunnfpreuhelritmtuyidnuengcoiundeeiaehuesltnhohtaiaienfdynauionaetyeifheodluaaoerrhuyreraaertaiahogtnwswisitabltuamxoltoeroteoontaorotbcgvipaneelwyrfteoaauwdwtrernltrfppaelilimrnrotweqircueandroaftnotreetlpnrepshmndedtewdhfoeyedpensnnegetteaeneasrtegludesrobrouwdghbparhnyetektrrterhnrfednotslwiasnypiohmtoocuteiyepoenkrhntaniltreiuermneiaptheaoohnhoumutvskeedneoiedwkpigteiioisnheufauneubihrtarheieheuyaasusrigawdissirltgphfitwlisiihsuerrommceaioisldevoluesiraieodtfineobsnsatpfgosdrotirfptalntrelioystyoosseftpnhaiegaoerieaidmttaeaghyrarrscelfrleteneahehvimhvnssairoeilmxpjtstsoefmrbhdinoheccbtntconmuspeoeshentefiteoontwonoeetrltiogdiomeshifomrolefdftesuolefriiwydbqzttonfarnditgntoaaelpshdemnatlphsbtnuahoalpalmneprsdhnavielancahlskiadocadtejhogiadegaywnetdehengeueeeeodornyrfycemttwnttdegtsuaootofymwirghroehsnrirofartfeeponyisasssethhnaeuyliwhptecauatpaneleeulahwaelouesrniibesaaeeatgdccsreoprosesenlosveuddstlititetsefosnelginneroneitewwilhtwersiilhitsrdnesdrhrfnlgtruassdaedytoaadsuentwtcinmeatrtepesoyottonycusotgmucdpaldealdteofsbdfleeaaxhronsitidepriahisccsdhpbiilselalnhrfornteaortaemikaglrtmercwdsaynnsvwnlduoekrunntotiuinnuhniveloihtelfaenauitftatctlenrbnhegblsnoanmoikofaonrsvnnfetrrftchetdpwssupecrwtcpawofdahysoiogoaalnedigfnrtgeltblgflo   ',\n",
-        " 'hhtihrfnftreefoafantsytlorrrehtqiesmrrluhesfteeaiwiusbhintrrsioiiinerrmhpdtytieorticabnlrhnptohoreilwhsttpseotosounywerhdchhpmcintooasahhjiteenatrfonsuermgaxtrutlwoebtarpetpartaesenhtehsirntsrsnrtfodlguahmesgskaeuitnatyhtuynnnntvgihwwelfpaiaersliafepabcpcmlehatothlswhudalsvueeoeatueatetaeheflthbrghsailtaeechnrthaagsteiunnfperuhlerimttuiydneungociudneeaieheuslnthothaiiaendfynuaioaneteyifehodulaaeorruhyrreaaretaaihotgnwwsistiabtluaxmolotertoeonotarootcbgvpianeelwryftoeaawudwrterlntrpfpaleilmirnortwqeiruceadnrofatntoretelprnephsmneddtwedhofeydepesnnngeetetaeenastreguldersoboruwgdhbaprhynetketrtrernhrfdenostlwaisnpyiomhtocoutieyeopenrkhnatnitlreuiernmeipathaeoonhhomuutsvkedeneioedkwpitgeioiishneuafunuebirhtahreiheeuayassuriagwdsisilrtghpfiwtliisihuserormmecaiiosledvoulesriaioedtifnebosnastpgfosrdotrifpatlnrteloiysytoossefptnhiaegoaereiaimdtteaagyhrarrsclefrelteenahhevihmvnssaioreimlxptjstosefrmbhidnoehcctbntocnmsupeeoshneteifteoontownoeetrtliodgioemshfiomorledfftseuoelfriiwybdqzttonafrnidtgtnoaealphsdenmatplhstbnuhaoaplalnmepsrdhanvileanachlksiaodcatdejohgidaegyawntedeehngueeeeeodronyfrycmettnwttedgtusaotoofmywigrhreohsrnirfoarfteeopnysiasssethhnaueylwihpetcaautpnaeleeulhawaleouserniibeasaeaetgcdcseroporseesnlsovedudsltittietesfonselignnreonietewwilthwesriihlitrsdnsedrrhfngltraussadedtyoadasunetwctinemattrepseoytotoyncuostgumcdapldaeldetofbsdfeleaxahrnosiitderpiaihscscdhbpiislellanhfrortnearotameikgalrmterwcdsyannvswndluokerunntoituinnuhinveolihetlfeanaiutfattcltenbrnhgeblnsoamnoiokfanorsnvnfterrtfchtedpswsuepcrtwcpwaofadhyosioogaanledgifntrgetlblfglo   ',\n",
-        " 'ihthnhfrefrtaeoftfnalstyrorrqethmiseurlrfhseateeuiiwishbrnrtisoieinihrmryptdoteicritlanbprnhotholrietwshetspsootyonuhwrehdhcipcmonothaasthijaeneotfrenusargmuxrtotwlaetbtreptpraeaseenthrhisrnsttsrnlfdohgaugmseesaknutihaytntyutnnnhviglwewifapsareflaibeapmccpalhehttohlwsluadesuvaeeoateuattefeehblhtsrhgtalicaeethrnghaaisetfunnuprerheltitmduyinnueigcoeundeeiashuehltnaohteiaiynfdinaueonaityeofheadluraoeyrhuarertaerhaianogtiwswasitubltoamxeltoerottoonoaorgtbcaviplneefwyrateodauwewtrtrnlprfpiaelrlimtnroiweqercurandtoafrnotleetepnrmpshdndedtewehfopyednensenegatteaeneesrtdgluoesrubrohwdgrbpaehnyttekerrtrrhnnfedlotsswiainyptohmuoocyteieepohnkrnntarilteeiuermntiapoheahohnuoumktvsneedeeoipdwkeigtiiioesnhuufabneutihrearheiehauyarsuswigasdistirlfgphlitwiisiehsumrroamcesioivldeeoluasirdieontfiseobtnsaopfgosdrftirlptaentrylioostyeossnftpehaiegaoarietidmataerghysarrfceltrleaenevhehvimhansseiroxilmspjtetsobfmrnhdicohencbtntcopmusseoethentefineoontwotoeeirltiogdsomeohiflmrofefdutesfolewriiqydbozttrnfatndiogntlaaedpshaemnhtlpnsbtouahaalpelmndprsvhnaaielhncailskcadoeadtgjhoeiadwgaydnetneheegeuoeeendoryyrftcemttwngtdeatsuoootwfymhirghroeisnrarofertfnepoayisesssnthhyaeuhliwcptetauaepanuleewlahoaelruesbniiaesateeacgdcosrespronesevlosdeudistletitftseeosnnlgionertneiiewwwlhtiersiilhdtsrdnesfrhrtnlgsruaesdaodytsaadtueniwtcanmeetrtopestyotconytusocgmuldpaldeaodtedfsbeflehaaxsronditiieprsahidccsihpbeilsnlalohrfernttaoriaemlkagertmdrcwnsaywnsvunldroektunnuotiuinnvhniielolhtenfaetauitftaectlnnrbbhegolsnoanmfikoraonnsvnrfetcrftdhetspwscupecrwtopawhfdaiysoaogoealnfdiggnrtbeltllgf o  ',\n",
-        " 'ihhtnhrfeftraefotfanlsytrorrqehtmiesurrlfhesateeuiwiisbhrntrisioeiinhrrmypdtotiecrtilabnprhnotohlreitwhsetpssotoyounhwerhdchipmcontohasathjiaeenotrfensuarmguxtrotlwaebttrpetpareaesenhtrhsirntstsnrlfodhguagmeseskanuithatyntuytnnnhvgilwweifpasaerfliabepamcpcalehhtothlswludaesvuaeoeatueatetfeheblthsrghtailcaeethnrghaaistefunnuperrhletimtduiynneuigoceudneeaisheuhlntaotheiiayndfinuaeoaniteyofehadulraeoyruharretarehaainotgiwwsastiubtloaxmelotertotonooarogtcbavpilneefwryatoedawuewrttrlnprpfialerlmitnoriwqeerucradntofarntoleteeprnmphsdneddtweehofpydenesnengeatetaeenestrdguloersuborhwgdrbapehynttkeertrrrnhnfdelostswaiinpytomhuocoytieeeophnrknnatritleeuiernmtipaohaehonhuomuktsvnedeeeiopdkweitgiioieshnuuafbnuetirheahreiheauayrssuwiagsdsitilrfghpliwtiiisehusmroramecsiiovledeoulasridioentifsebotnasopgfosrdftrilpatenrtyloiosyteossnfptehiaegoaareitimdateargyhsarrfcletrelaeenvhhevihmansseiorximlsptjetosbfrmnhidcoehnctbntocpmsuseeothneteifneoontowtoeeirtliodgsoemohfilmorfedfutsefoelwriiqybdozttrnaftnidogtnlaeadphsaenmhtplnstbouhaaaplelnmdpsrvhanailehnacilkscaodeatdgjoheidawgyadnteneehegueoeeendroyyfrtcmettnwgtedatusootowfmyhigrhreoisrnarfoerftneopaysiesssnthhyauehlwicpettaauepnauleewlhaoalerusebniiaeasteaecgcdosersporneesvlsodeduisltettifteseonsnligonretnieiewwwlthiesriihldtrsdnsefrrhtnglsrauesadodtysadatuneiwctanemettropsetytocoyntuoscgumldapldaeodetdfbsefelhaxasrnodiitierpsaihdcscihbpeislnllaohfrertntaroiamelkgaermtdrwcnsyawnvsundlroketunnuoituinnvhinieollhetnfeataiutfatecltnnbrbhgeolnsoamnfiokranonsnvrftecrtfdhtespswcuepcrtwopwahfadiyosaoogeanlfdgigntrbetlllfg o  ',\n",
-        " 'thihfhnrrfetoeafnftatslyrorrteqhsimelrurshfeetaeiiuwhsibrnrtosiinieimrhrtpydetoiirctnalbnrphhtooirleswthstepoostnoyurwhehdhccpimonotaahsihtjneaeftorunesgramrxutwtolteabertprptasaeetnehihrssnrtrstndfloaghusmgeasektuniyahtytnunntnivhgewlwafiprasealfiaebpccmphlaetthowlhsaulduseveeaoetauttaeeefhhlbthrsglatieacerhtnahgaesitnufnrpueehrltitmyudiunnecgionuedieeauhsetlhnhoataieifnydaniunoeaytiehfoeldauoarehryuerareatriahagontswiwisatlbutmaoxtleooretootnoaorbtgcivapenleywfretaouadwtwernrtlfrppeaililrmrntoewiqcreunardaotfonrteeltnperspmhdndeetdwfheoeypdnensenegttaeneaersetlgduseorrbuodwhgpbranheyettkrrethrrnefndtolsiwsayniphotmooucetyipeeoknhrtnnalirtieeumrenaitpehoahohnuoumvtkseendoeeiwdpkgietiiionsehfuuaenbuhitrraeheiehyuaausrsgiwaidssritlpgfhtilwsiiisheurrmocmaeoisidlveloeuisareidoftnioesbsntafpogdsoritfrtplatnerilyotsoysoestfnpaheiageoiraeditmataehgryrasrecfllrteneaeehvhmivhsnasrieolixmjpststeomfbrdhnihocebcntctnoumpsoeseehtnfetioenowtnoeotelritgoidmoseihofrmlofefdetuslofeirwidyqbtzotfnradntingotaalespdhmeanlthpbsntauohlaapmlenrpdsnhvaeialcnhaslikdacodaethjgoaiedagwyendtheneegeueeoeodnrryyfectmwttndtgestauoootyfwmrihgorhensiroraftrefpenoiyassseshtnheayuilhwtpceuataapeneluealwheaoleursinbiseaaeetadgccrsoerpsoseneolvsueddtsilitetstfesoenglnienorentiweiwhlwtreisliihstdrendshrfrlntgursadseaydotaasdeutntwicmnaerteteposoyttnocysutomgcupdlaedlatdoesfdblfeeaahxorsntidipeirhasiccdsphibliesalnlrhofnretoatreaimaklgtremcrdwasnysnwvlnudeorknutntouiniunnhvileiothleafneuatitftatcelrnnbehbgslonnaomkifooarnvsnnefrtfrctehdtwpsspucewrctapowdfhasyiogoaolaenidfgrngtlebtgllf o  ',\n",
-        " 'hhitrhnftferfeaoaftnysltrorrheqteimsrrulehfsetaewiuibsihtnrrisioiienrrhmdpytitoetrcibalnhrpnotoherlihwtsptestosouoynewhrcdhhmpictnoosahajhtieeanrtofsneumragtxurltowbeatprteaptreaeshnetshritnrsnstrofldughaemgskseaiunttahyutnynntngvhiwwlepfiaeasrilfapebapcmcelahothtslhwdulavseuoeaeutaeetathefetlbhgrshiatleacenhtrahgatsienufnepurlhremittiudyennuogicduenaeeiehsunlhttoahiieadnyfuniaaoenetiyefohudalearouryhrraerateaahitongwwistsaitbulxaomolettreonotoraooctgbpvaienlerwfyotaewadurwetlrtnprpflaiemlriontrqwieurecdarnfotatnrotelerpenhpmsenddwtdeohefdypesenngneeetateeantserugdlreosoburgwhdabrpyhenkttetrernrrhdfnesoltawsipniymothcouoityeoeeprnhkannttirlueeinrempitaahoenohhmouustkvdeneieeokdpwtiegoiiihsenauufunberithhaerhieeauayssruaiwgsdsilitrhgfpwiltiiisuhesormremaciisoelvduoelrsaioideitnfbesoantsgpofrsodrtfiapltrnetolyiysotsoespfntiheaogeaeraimitdetaaygrhrasrlcfeertleeanhhvehivmsnasoiermixltpsjotesrfbmihndeochtcnbotncsmpueesonhteietfoenootnweotetrildoigeosmfhoiomlrdeffstueeoflirwibyqdtzotanrfintdtgonealahpdsneampthltsnbhuoapaalnlemspdrahvnliaeanhcklisoacdtaedojghdieaygwatndeeenhugeeeeoerdnofyyrmctenttwetgdutastooomfwygihrerhorsinfraofretoenpsyaisseshtnhuayewlhiepctaatunpeaeluehlwalaoesureinbiaeasaetecgcdesoropsreensslvodedulsittteietfsnoesilngrnoeinteweiwtlwhseirhiilrtdssnderrfhgntlarsuasedtdoydasanutecwitenamtterspoetytoyocnoutsugcmadlpadleedotbfdsefelxahanrsoiidtreipiashscdcbhipsielllnafhortrenratomaiegklamretwrdcysnavnwsdnulkorenutnioutniunihvnoeilehltefnaiatuafttlcetbnnrghbenlosmaonoifknaronsnvtfretrcfthdespsweucptrcwwpoaafhdoyisooagnaelgdfitngrteblfllg o  ',\n",
-        " 'thhifhrnrfteoefanfattsylrorrtehqsiemlrrushefeteaiiwuhsbirntrosiiniiemrrhtpdyetioirtcnablnrhphtooirelswhtstpeootsnouyrwehhdchcpmiontoaashihjtneeaftrounsegrmarxtuwtlotebaerptrpatsaeetnheihsrsntrrsntdfolaguhsmegasketuinyathytunnnntivghewwlafpiraesalifaepbccpmhleattohwlshaudlusveeeoaetuatteaeehfhltbhrgslaiteaecrhntahagestinunfrpeuehlrtimtyuidunencgoinudeieaeuhestlnhhotaaiiefndyanuinoaeyteihfeolduaoaerhruyerraeartiaahgotnswwiistalbtumaxotloeorteoontoarobtcgivpaenelywrfetoauawdtwrenrltfrppealiilmrrnotewqicruenadraoftontreetlnpresphmdnedetwdfhoeeydpnesnengetteaneearstelgudserorboudwghpbarnhyeetktrrtehrnrefdntosliwasynpihomtoocuetiypeoeknrhtnanlitrieuemrneaiptehaohonhuomuvtskeednoeiewdkpgiteiioinshefuauenubhirtraheeiheyuaaussrgiawidssriltpghftiwlsiiishuerromcmeaoiisdlevloueisraeiodftinoebssnatfpgodsroitrftpaltnreiloytsyososetfpnahieagoeireadimtateahgyrrarseclflretneeaehhvmihvsnsarioelimxjptsstoemfrbdhinhoecbctnctonumspoeesehntfeitoeonwtoneoetlrtigodimoesihformolfedfetsuloefiriwdybqtztofnardnitngtoaaelsphdmenaltphbstnauholapamlnerpsdnhaveilacnahslkidaocdatehjogaideagywentdheenegueeeeoodrnryfyecmtwtntdtegstuaootoyfmwrighorehnsriorfatrfepeoniysasssehthneauyilwhtpecuaatapneeleualhwealoeusrinibseaaeeatdgccrseorposseenolsvueddtsliittestefsoneglinenroenitwewihltwresilihistrdensdhrrflngturasdsaeydtoaadseunttwcimneartteepsooyttnoycsuotmgucpdaledaltdeosfbdlfeeaaxhornstiidperihaisccsdphbiliseallnrhfonrteoarteamiakgltrmecrwdasynsnvwlndueokrnunttoiuninunhivleoithelafenuaittfattclernbnehgbslnonamokiofoanrvsnneftrfrtcehtdwpsspuecwrtcapwodfahsyoigooalaneidgfrntgletbglfl o  ',\n",
-        " 'hhtirhfntfrefeoaafntystlrorrhetqeismrrluehsfeteawiiubshitnrrisoiiinerrmhdptyiteotricbanlhrnpothoerilhwstptsetoosuonyewrhcdhhmpcitnoosaahjhiteenartfosnuemrgatxrultwobetapretaprteasehnteshirtnsrnsrtofdlugahemsgksaeiutntayhutynnnntgvihwwelpfaiearsilafpeabpccmelhaotthslwhdualvsueoeeauteaettaheeftlhbgrhsialteaecnhrtahagtseinunfeprulhermittiuydenunogciduneaeieehusnlthtohaiiaednfyunaiaoneetyiefhoudlaeaorurhyrrearaetaaihtognwwsitsiatbluxamooltetroenootraooctbgpviaenelrwyfoteawaudrwtelrntprfplaeimlironrtqweiurcedanrfoattnorteelrpnehpsmenddwtedohfedyepsenngneeettaeenatsreugldresoobrugwdhabpryhnektettrrenrhrdfensotlawispnyimohtcoouiteyoepernkhantntilrueienrmepiataheonohhmouustvkdeenieoekdwptigeoiiihsneaufuunebrihtharehieeauyassuraigwsdislirthgpfwitliisiuhseorrmemcaiioseldvuolersiaoieditfnbeosanstgpforsdortifaptlrnteoliyystososepftnihaeogaeeriamidtetaayghrrarslceferlteenahhevhimvsnsaoiremilxtpjsotserfmbihdneohctcbnotcnsmupeeosnhetieftoeonotwneoettrlidogieomsfhioomrldeffsteueolfiriwbydqtztoanfrindttgnoeaalhpsdnemaptlhtsbnhuaopalanlmesprdahnvlieaanchklsioadctadeojhgdiaeygawtnedeehnugeeeeeordonfyrymcetntwtetdgutsatooomfywgirherohrsnifroafrteoepnsyiasssehthnuaeywliheptcaautnpaeeleuhlawlaeosuerinibaesaaeetcgdcesrooprseesnslovdeudlstittieetsfnoseilgnrneoinetwewitlhwserihilirtsdsnedrrhfgnltarusasdetdyodaasnuetcwtienmattrespeotyotyoncoustugmcadpladeledtobfsdeflexaahnrosiitdrepiiahssccdbhpisilellanfhrotrneraotmaeigkalmrtewrcdysanvnswdnlukoernuntiotuninuihnvoeliehtlefaniautafttlctebnrnghebnlsomanooikfnaornsvntfertrfcthedspwseupctrwcwpaoafdhoysiooganalegdiftnrgtelbflgl o  ',\n",
-        " 'ithhnfhrerftaoeftnfaltsyrrorqtehmsieulrrfsheaeteuiiwihsbrrntiosieniihmrrytpdoeticirtlnabpnrhohtoliretswhestpsootynouhrwehhdcicpmoonthaastihjaneeoftreunsagrmurxtowtlatebterptrpaesaeetnhrihsrsnttrsnldfohagugsmeeaskntuihyatnytutnnnhivglewwiafpsraefalibaepmccpahlehttohwlslaudeusvaeeoaetuattefeehbhltshrgtlaiceaetrhngahaiestfnunurperehlttimdyuinuneicgoenudeieasuhehtlnahoteaiiyfndianuenoaiyteohfealduroaeyhruaerrtearhiaangotiswwaistulbtomaxetloeorttoonooargbtcaivplenefywraetoduawetwrtnrlpfrpiealrilmtrnoiewqecrurnadtaofrontleetenprmsphddnedetwefhopeydnneseengatteaneeerstdlguoserurbohdwgrpbaenhytetkerrtrhrnnefdltossiwaiynpthomuoocyetiepeohknrntnarliteieuemrntaipoehahhonuuomkvtsneedeoeipwdkegitiiioenshufuabenuthireraheeihayuarusswgiasidstrilfpghltiwisiieshumrroacmesoiivdleelouaisrdeionftisoebtsnaofpgodsrfitrltpaetnryilootsyesosntfpeahieagoairetdimaaterhgysrarfecltlreaneevehhvmihasnserioxlimsjptestobmfrndhichoenbctnctopumssoeetehntfeinoeonwtoteoeilrtigodsmoeoihflrmoffeduetsfloewiriqdybotztrfnatdniongtlaaedsphamenhltpnbstoauhalapemlndrpsvnhaaeilhcnaislkcdaoedatghjoeaidwagydentnheeeeguoeeenodryryftecmtwtngdteastuoootwyfmhrighoreinsraorfetrfnpeoaiysesssnhthyeauhilwctpetuaaeapnuelewalhoealreusbiniaseateeacdgcorsesrponseevolsdueditsleittfsteesonnglioenrteniiwewwhltiresilihdstrdensfhrrtlngsuraedsaoydtsaadteunitwcamneerttoepstoytcnoytsuocmgulpdaledaotdedsfbelfehaaxsorndtiiipershaidccsiphbelisnallorhfenrttoarieamlakgetrmdcrwnasywsnvulndreoktnunutoiuninvnhiileolthenafetuaittfaetclnrnbbehgoslnonamfkioroannvsnreftcfrtdehtswpscpuecwrtoapwhdfaisyoagooelanfidggrntbletlglf  o ',\n",
-        " 'ihhtnrhfetfrafeotafnlystrrorqhetmeisurrlfehsaeteuwiiibshrtnriisoeiinhrrmydptoitectrilbanphrnoothlerithwseptsstooyuonhewrhcdhimpcotnohsaatjhiaeenortfesnuamrgutxroltwabettpretapreeasehntrshirtnstnsrlofdhugagemseksaniuthtaynutytnnnhgvilwweipfasearfilabpeampccaelhhotthslwlduaevsuaoeeauteaettfheebtlhsgrhtialceaetnhrgahaitsefnunueprrlhetmitdiuynenuiogceduneaeisehuhnltatoheiiaydnfiunaeaonietyoefhaudlreaoyurharretraehaaintogiwwsatsiutbloxameoltetrotnoooraogctbapvilenefrwyaotedwauerwttlrnpprfilaermlitonriqweeurcrdantfoartnolteeerpnmhpsdenddwteeohfpdyensenegneaettaeenetsrdugloresuobrhgwdrabpeyhntkteetrrrnrhndfelsotsawiipnytmohucooyiteeoephrnknantrtileueienrmtpiaoahehnohumoukstvndeeeieopkdwetigioiiehsnuaufbunetriheharehieaauyrssuwaigssditlirfhgplwitiiiseuhsmorraemcsiioveldeuolarsidoienitfsbeotansogpforsdfrtilapterntyolioystesosnpfteihaeogaaeritmidaetaryghsrarflceterlaeenvhhevhimasnseoirxmilstpjeotsbrfmnihdceohntcbnotcpsmuseeotnhetiefnoeonotwteoeitrlidogseomofhilomrfdefustefeolwiriqbydotztranftindotgnleaadhpsanemhptlntsbohuaapalenlmdsprvahnaliehanciklscoadetadgojhediawygadtneneeheugeoeeenrdoyfyrtmcetntwgetdautsotoowmfyhgirheroirsnafroefrtnoepasyiesssnhthyuaehwlicepttaauenpauelewhlaolaersuebiniaaestaeeccgdoesrsoprneesvsloddeuilstettifetsenosnilgornetineiwewwtlhiserihildrtsdsnefrrhtgnlsarueasdotdysdaatnueicwtaenmettrospettyocyontouscugmladpladeoedtdbfseeflhxaasnrodiitirepsiahdsccibhpesilnllaofhretrntraoimaelgkaemrtdwrcnysawvnsudnlrkoetnunuiotuninvihnioellehtnefatiautaftelctnbnrbgheonlsomanfoikrnaonnsvrtfectrfdthesspwceupctrwowpahafdioysaoogenalfgdigtnrbtellflg  o ',\n",
-        " 'tihhfnhrreftoaefntfatlsyrrortqehsmielurrsfheeateiuiwhisbrrntoisineiimhrrtypdeotiicrtnlabnprhhotoilrestwhsetposotnyourhwehhdccipmoontahasithjnaeefotruensgarmruxtwotltaebetrprtpaseaetenhirhssrntrtsndlfoahgusgmeaesktnuiyhatyntuntnnihvgelwwaifprsaeafliabepcmcphalethtowhlsaluduesveaeoeatutateefehhblthsrgltaiecaerthnaghaeistnfunrupeerhlttimyduiunnecigoneudieeaushethlnhaotaeiifyndainuneoayitehofeladuoraehyruearretarihaagnotsiwwiastlubtmoaxtelooertotonooarbgtciavpelneyfwreatoudawtewrntrlfprpeialirlmrtnoeiwqcerunradatofornteletneprsmphddneedtwfehoepydnneseengtatenaeerestldgusoerrubodhwgprbanehyettkrerthrrnenfdtlosiswayinphtomouoceytipeeokhnrtnnalritieeumernatipeohahhonuuomvktsenedoeeiwpdkgeitiiioneshfuuaebnuhtirreaheeihyauaurssgwiaisdsrtilpfghtliwsiiisehurmrocameosiidvleleouiasrediofntiosebstnafopgdosriftrtlpatenriylotosyseostnfpaehiaegoiaredtimaatehrgyrsarefclltrenaeeevhhmvihsansreiolximjsptsetombfrdnhihcoebnctcntoupmsoseeethnfteioneowntoetoelirtgiodmsoeiohfrlmoffedeutslfoeiwridqybtoztfrnadtninogtalaesdphmaenlhtpbnstaouhlaapmelnrdpsnvhaeailchnasilkdcaodeathgjoaeidawgyednthneeeegueoeeondrryyfetcmwttndgtesatuoootywfmrhigohrenisroarfterfpneoiayssesshntheyauihlwtcpeutaaaepneuleawlheoalerusibnisaeaeteadcgcrosersposneeovlsudedtisliettsfteseongnlieonretniwiewhwltriesliihsdtrednshfrrltngusradesayodtasadetuntiwcmaneretteopsotytncoystuomcgupldaeldatodesdfblefeahaxosrntdiipierhsaicdcspihbleisanllrohfnertotareiamalkgtermcdrwansyswnvlunderokntuntuoinuinnvhilieotlheanfeutaittfateclrnnbebhgsolnnoamkfiooranvnsnerftfcrtedhtwspspcuewcrtaopwdhfasiyogaooleanifdgrgntlbetgllf  o ',\n",
-        " 'hihtrnhftefrfaeoatfnylstrrorhqetemisrurlefhseatewuiibishtrnriisoieinrhrmdyptiotetcriblanhprnoothelrihtwspetstsoouyonehwrchdhmipctonoshaajthieaenrotfsenumargtuxrlotwbaetptreatpreeashentsrhitrnsntsrolfduhgaegmskesainutthayuntyntnnghviwlwepifaesariflapbeapmccealhohttshlwdluavesuoaeeuateeatthfeetblhgsrhitalecaenthraghatisenfuneuprlrhemtitiduyennuoigcdeunaeeieshunhlttaohieiadynfuinaaeoneityeofhuadleraouyrhrarertaeahaitnogwiwstasitublxoamoeltterontooroaocgtbpavielnerfwyoatewdaurewtltrnpprfliaemrliotnrqiweuercdranftoatrnotleerepnhmpsedndwdteoehfdpyesnengeneeatteaentesrudglroesoubrghwdarbpyehnktteterrnrrhdnfeslotaswipinymtohcuooiyteoeeprhnkannttrilueeinermptiaaohenhohmuousktvdneeieeokpdwteigoiiihesnauufubnertihhearheieaauysrsuawigssdiltirhfgpwlitiiisuehsomrreamcisioevldueolrasiodieintfbseoatnsgopfrosdrftialptrentoyliyostseospnftiehaoegaearimtideatayrghrsarlfceetrleaenhvhehvimsansoeirmxiltspjoetsrbfminhdecohtncbontcspmueseontheitefoneoontwetoetirldiogesomfohiolmrdfefsuteefoliwribqydtoztarnfitndtognelaahdpsnaemphtltnsbhouapaalnelmsdpravhnlaieahnckilsocadteadogjhdeiaywgatdneenehuegeeoeerndofyyrmtcenttwegtduatstooomwfyghirehrorisnfarofertonepsayisesshnthuyaewhliecptataunepaeulehwlaloaesrueibniaaesateeccgdeosrosprenessvloddeulisttetieftsneosinlgroneitnewiewtwlhsierhiilrdtssdnerfrhgtnlasruaesdtodydsaantueciwteanmtetrsopettyoyconotusucgmaldpaldeeodtbdfseeflxhaansroiditriepisahsdccbihpseillnlafohrternrtaomiaeglkamertwdrcynsavwnsdunlkroentuniuotnuinivhnoielelhtenfaitauatftlectbnnrgbhenolsmoanofiknraonnsvtrfetcrftdhesspwecuptcrwwopaahfdoiysoaognealgfditgnrtbelfllg  o ',\n",
-        " 'thhifrhnrtfeofeanafttyslrrortheqseimlrrusehfeetaiwiuhbsirtnroisiniiemrrhtdpyeitoitrcnbalnhrphotoierlshwtspteotosnuoyrewhhcdhcmpiotnoasahijhtneeafrtousnegmrartxuwltotbeaeprtraptseaethneishrstnrrnstdoflaughsemgaksetiunytahyutnnnntigvhewwlapfireasailfapebcpcmhelatothwslhaduluvseeoeaeutatetaehefhtlbhgrsliateeacrnhtaahgetsinnufrepuelhrtmityiuduenncogindueiaeeuehstnlhhtoaaiiefdnyauninaoeyetihefoludaoearhuryerraeratiaahgtonswwiitsaltbumxaotoleotreonotoraobctgipvaeenlyrwfeotauwadtrwenlrtfprpelaiimlrronteqwicurendarafototnretelnrpeshpmdendewtdfoheedypnsenegnetetaneeartselugdsreorobudgwhpabrnyheekttrtrehnrredfntsoliawsypnihmotocoueitypoeekrnhtannltiriueemnreapiteahohnohumouvstkedenoieewkdpgtieioiinhsefauueunbhritrhaeehieyauaussrgaiwisdsrlitphgftwilsiiisuherormcemaoiisdelvluoeirsaeoidfitnobessantfgpodrsoirtftapltrneiolytysossoetpfnaiheaogeieradmitaetahygrrraselcflertneeaehhvmhivssnaroielmixjtpssotemrfbdihnheocbtcncotnusmpoeesenhtfietooenwotneeotltrigdoimeosifhoromlfdefestuleofiirwdbyqttzofanrdintntgoaealshpdmnealpthbtsnahuolpaamnlerspdnahveliacanhsklidoacdtaehojgadieaygwetndheeneugeeeeoordnrfyyemctwnttdetgsutaotooymfwrgihoerhnrsiofratfrepoenisyasssehhtneuayiwlhtepcuaatanpeeeluahlwelaoesuriinbsaeaeaetdcgcresoropsseenoslvudedtlsiittesetfsnoegilnernoeintwweihtlwrseilhiisrtdesndhrrflgntuarsdaseytdoadasenuttcwimenartteespootytnyocsoutmugcpadleadltedosbfdlefeaxahonrstiidpreihiascscdpbhilsieallnrfhontreoratemaiagkltmrecwrdaysnsvnwldnuekornnuttiounniunihvloeitehlaefnuiattafttlcerbnneghbsnlonmaokoifonarvnsnetfrftrcethdwspspeucwtrcawpodafhsoyigooalnaeigdfrtngltebgfll  o ',\n",
-        " 'hthirfhntrfefoeaanftytslrrorhteqesimrlrueshfeetawiiubhsitrnriosiiniermrhdtpyietotircbnalhnrpohtoeirlhswtpstetoosunoyerwhchdhmcpitonosaahjihtenearftosunemgratrxulwtobteapertarptesaehtnesihrtsnrnrstodfluaghesmgkaseituntyahuytnnnntgivhwewlpafierasialfpaebpccmehlaotthswlhdaulvuseoeeauetaettaheefthlbghrsilateeacnrhtaahgtesinnuferpulehrmtitiyudeunnocgidnueaieeeuhsntlhthoaiaiedfnyuanianoeeytiehfouldaeoaruhryrerareataiahtgonwswitisatlbuxmaootletorenootroaocbtgpivaeenlrywfoetawuadrtwelnrtpfrpleaimilrorntqewiucrednarfaottonrteelrnpehspmedndwetdofhedeypsnengeneettaeneatrseulgdrseoorbugdwhapbrynheketttrrenhrrdefnstolaiwspynimhotcoouietyopeerknhatnntliruieenmrepaitaehonhohmuousvtkdeenioeekwdptgieoiiihnseafuuuenbrhithraeheieayuasusragiwsidslrithpgfwtilisiiusheorrmecmaioisedlvuloerisaoeidiftnboesasntgfpordsoritfatplrtneoilyytsossoeptfniaheoageeiramditeatayhgrrraslecfelrteneahehvhmivssnaoriemlixtjpsostermfbidhnehoctbcnoctnsumpeoesnehtifetooenowtneeottlridgoiemosfihoormldfefsetuelofiirwbdyqttzoafnridnttngoeaalhspdnmeaplthtbsnhauoplaanmlesrpdanhvleiaacnhksliodactdaeohjgdaieyagwtendehenuegeeeeorodnfryymectnwttedtgustatooomyfwgriheorhrnsiforaftreopensiyasssehhtnueaywilhetpcauatnapeeeluhalwleaoseuriinbaseaaeetcdgcersoorpsesensolvduedltsititeestfnsoeiglnrenoientwweithlwsreihliirstdsendrhrfglntaursadsetydodaasneutctwiemnatrtesepotoytynocosutumgcapdlaedletdobsfdelfexaahnorsitidrpeiihassccdbphislielalnfrhotnreroatmeaigaklmtrewcrdyasnvsnwdlnukeornnutitounniuinhvoleiethleafniuatatftltcebrnngehbnslomnaookifnoarnvsntefrtfrctehdswpsepuctwrcwapoadfhosyiogoanlaegidftrngtlebfgll  o ',\n",
-        " 'ithhnfrhertfaofetnafltysrrroqthemseiulrrfsehaeetuiwiihbsrrtnioiseniihmrrytdpoeitcitrlnbapnhrohotliertshwesptsotoynuohrewhhcdicmpootnhasatijhaneeofrteusnagmrurtxowltatbeteprtrapeseaethnrishrstntrnsldofhauggsemeaksntiuhytanyuttnnnhigvlewwiapfsreafailbapemcpcahelhtothwslladueuvsaeoeaeutatetfehebhtlshgrtliaceeatrnhgaahietsfnnuureprelhttmidyiunuenicogendueiaesuehhtnlahtoeaiiyfdniaunenaoiyetohefaludroeayhuraerrterahiaangtoiswwaitsultbomxaetoleotrtonoooragbctaipvleenfyrwaeotduwaetrwtnlrpfprielarimltronieqwecurrndataforotnleteenrpmshpddendewtefohpedynnseeegnatetaneeertsdlugosreurobhdgwrpabenyhtektertrrhnrnedfltsosiawiypnthmouocoyeitepoehkrnntanrltieiueemnrtapioeahhhnouumokvstnedeeoiepwkdegtiiioienhsufaubeunthrierhaeehiayaurusswgaisisdtrlifphgltwiisiiesuhmroracemsoiivdeleluoairsdeoinfitsobetsanofgpodrsfirtltapetrnyiolotysessontpfeaiheaogaiertdmiaaetrhygsrrafelctleraneevehhvmhiassneroixlmisjtpesotbmrfndihcheonbtcncotpusmsoeetenhtfienooenwotteeoiltrigdosmeooifhlromffdeuestfleowiirqdbyottzrfantdinontglaeadshpamnehlptnbtsoahualpaemnldrspvnahaelihcanisklcdoaedtaghojeadiwaygdetnnheeeeugoeeenordyrfytemctwntgdetasutootowymfhrgihoerinrsaofretfrnpoeaisyesssnhhtyeuahiwlcteptuaaeanpueelwahloelaresubiinasaeteaecdcgoressropnseevosldudeitlseittfsetesnongiloernteiniwwewhtlirseilhidsrtdesnfhrrtlgnsuaredasoytdsadatenuitcwamenerttoesptotycnyotsoucmuglpadleadoteddsbfelefhaxasonrdtiiipreshiadcscipbhelsinallorfhentrtoraiemalagketmrdcwrnayswsvnuldnrekotnnuutiounnivnihiloeltehnaeftuiattafetlcnrbnbeghosnlonmafkoironanvnsretfcftrdethswspcpeucwtroawphdafisoyagooelnafigdgrtnbltelgfl   o',\n",
-        " 'ihthnrfhetrfafoetanflytsrrroqhtemesiurlrfeshaeetuwiiibhsrtrniioseinihrmrydtpoietctirlbnaphnroohtleirthswepststooyunoherwhchdimcpotonhsaatjihaeneorftesunamgrutrxolwtabtetpertarpeesaehtnrsihrtsntnrslodfhuaggesmekasnituhtyanuyttnnnhgivlwewipafserafialbpaempccaehlhotthswlldauevusaoeeauetaettfheebthlsghrtilaceeatnrhgaahitesfnnuuerprlehtmtidiyuneuniocgednueaieseuhhntlathoeiaiydfniuaneanoieytoehfauldreoayuhrarertreahaiantgoiwswatisutlboxmaeotletortnoooroagcbtapivleenfrywaoetdwuaertwtlnrppfrilearmiltorniqeweucrrdnatfaortonlteeernpmhspdedndweteofhpdeynsneegenaettaeneetrsdulgorseuorbhgdwrapbeynhtketetrrrnhrndeflstosaiwipyntmhoucooyieteopehrknnatnrtlieuieenmrtpaioaehhnhoumuoksvtndeeeioepkwdetgiioiiehnsuafubuentrhiehraeheiaayursuswagissidtlrifhpglwtiiisieushmorraecmsioivedleuloarisdoeiniftsboetasnogfpordsfritlatpertnyoiloytsessonptfeiaheoagaeirtmdiaeatryhgsrraflectelraenevhehvhmiassneorixmlistjpeostbrmfnidhcehontbcnoctpsumseoetnehtifenooenowtteeoitlridgosemoofihlormfdfeusetfelowiirqbdyottzrafntidnotngleaadhspanmehpltntbsohauaplaenmldsrpvanhaleihacnikslcodaetdagohjedaiwyagdtenneheeuegoeeenrodyfrytmectnwtgedtaustotoowmyfhgriheorirnsaforeftrnopeasiyesssnhhtyueahwilcetptauaenapueelwhalolearseubiinaasetaeeccdgoerssorpnesevsolddueiltsetitfestensoniglorentieniwwewthlisreihlidrstdsenfrhrtglnsaureadsotydsdaatneuictwaemnetrtosepttoycynotosucumglapdlaedoetddbsfeelfhxaasnorditiirpesihadsccibpheslinlalofrhetnrtroaimealgakemtrdwcrnyaswvsnudlnrkeotnnuuitounnivinhiolelethneaftiuatatfeltcnbrnbgehonslomnafokirnoannvsrtefctfrdtehsswpcepuctwrowaphadfiosyaogoenlafgidgtrnbtlelfgl   o',\n",
-        " 'tihhfnrhretfoafentaftlysrrrotqhesmeilurrsfeheaetiuwihibsrrtnoiisneiimhrrtydpeoitictrnlbanphrhootilersthwseptostonyuorhewhhcdcimpootnahsaitjhnaeefortuesngamrrutxwolttabeetprrtapseeatehnirshsrtnrtnsdlofahugsgemaekstniuyhtaynutntnnihgvelwwaipfrseaafilabpecmpchaelthotwhslalduuevseaoeeauttaetefhehbtlhsgrltiaeceartnhagaheitsnfnurueperlhttmiydiuunenciogneduieaeusehthnlhatoaeiifydnaiunneaoyiethoeflaudoreahyurearretraihaagntosiwwiatslutbmoxateoloetrotnooorabgctiapvelenyfrweaotudwaterwntlrfppreilairmlrtoneiqwceurnrdaatfoortneltenerpsmhpddenedwtfeohepdynnseeegntaetnaeeretsldugsoreruobdhgwprabneyhetktretrhrnrendftlsoisawyipnhtmooucoeyitpeoekhrntnanlrtiieuemenratpieoahhhnouumovkstendeoeiewpkdgetiiioinehsfuauebunhtrirehaeehiyaauurssgwaiissdrtlipfhgtlwisiiiseuhrmorcaemosiidvelleuoiarsedoifnitosbestanfogpdorsifrttlapterniyoltoyssesotnpfaeihaeogiaerdtmiaaethrygrsraeflclternaeeevhhmvhisasnreoilxmijstpseotmbrfdnihhceobntccnotupsmoseeetnhftieonoewnoteteolitrgidomseoiofhrlomffdeeustlfeoiwirdqbytotzfrandtinnotgaleasdhpmanelhptbntsaohulapamenlrdspnvahealichansikldcoadetahgojaediawygedtnhneeeeugeoeeonrdryfyetmcwtntdgetsautootoywmfrhgiohernirsoafrtefrpnoeiasysesshnhteyuaihwltceputaaaenpeuelawhleolaersuibinsaaeetaedccgroesrsopsneeovsluddetilsiettsfetsenognileornetinwiwehwtlriselihisdrtedsnhfrrltgnusardeasyotdasdaetnuticwmaenretteospottyncyostoumcugpladeladtoedsdbfleefahxaosnrtdiipirehsiacdscpibhlesianllrofhnetrotraeimaalgktemrcdwranysswvnludnerkontnutuionuninvihlioetlehanefutiattaftelcrnbnebghsonlnomakfoiornavnnsertffctredthwssppceuwctraowpdhafsioygaoolenaifgdrgtnlbteglfl   o',\n",
-        " 'hithrnfhterffaoeatnfyltsrrrohqteemsirulrefsheaetwuiibihstrrniiosienirhmrdytpioettcirblnahpnroohtelirhtswpesttsoouynoehrwchhdmicptoonshaajtiheaneroftseunmagrturxlowtbatepteratrpeesahetnsrihtrsnntrsoldfuhagegsmkeasintuthyaunytntnnghivwlewpiafesraifalpbaepmcceahlohttshwldlauveusoaeeuaeteatthfeetbhlgshritlaeceantrhagahtiesnfnueurplrehmttiidyuenunoicgdenuaeieesuhnhtltahoieaidyfnuianaenoeiyteohfualderoauyhrraerrteaahiatngowiswtaistulbxomaoetlteorntoorooacgbtpaivelenrfywoaetwduaretwltnrppfrlieamrilotrnqiewuecrdrnaftaotrontleerenphmspeddnwdetoefhdpeysnnegeeneatteanetersudlgroseourbghdwarpbyenhktetterrnrhrdnefsltoasiwpiynmthocuooiyetoeperhknantntrliueienemrptaiaoehnhhomuuoskvtdneeieoekpwdtegioiiihensaufuubenrthiheraheeiaayusrusawgissidltrihfpgwltiiisiueshomrreacmisoievdlueloraisodeiinftbsoeatsngofprodsrfitaltpretnoyilyotssesopntfieahoeageairmtdieaatyrhgrsralfecetlreanehvehhvmisasnoerimxlitsjpoestrbmfindhechotnbconctspumesoentehitfeonoeonwteteotilrdigoesmofoiholrmdffesuetefloiwirbqdytotzarfnitdntongelaahdspnamephlttnbshoaupalanemlsdrpavnhlaeiahcnkislocdatedaoghjdeaiywagtdenenheueegeoeernodfyrymtecntwtegdtuasttooomwyfghriehorrinsfaorfetronpesaiysesshnhtuyeawhilectpatuaneapeuelhwalloeasreuibinaaseateeccdgeorsosrpensesvoldduelitsteitefstnesoinglroenitenwiwetwhlsirehilirdstsdenrfhrgtlnasuraedstoyddsaanteucitweamntertsoepttoyycnootsuucmgalpdaledeotdbdsfeelfxhaansoridtiripeishasdccbiphselilnalforhtenrrtoamieaglakmetrwdcrynasvwsndulnkreontnuiutonuniivnhoileelthenafituaattfletcbnrngbehnoslmonaofkinroannvstreftcfrtdehsswpecputcwrwoapahdfoisyoagonelagfidtgrntbleflgl   o',\n",
-        " 'thihfrnhrtefofaenatftylsrrrothqesemilrursefheeatiwuihbisrtrnoiisnieimrhrtdypeiotitcrnblanhprhootielrshtwspetotsonuyorehwhchdcmipotonashaijthneaefrotusengmarrtuxwlottbaeeptrratpseeathenisrhstrnrntsdolfauhgsegmakestinuythayuntnntnighvewlwapifresaaiflapbecpmchealtohtwshladluuveseoaeeuatteatehfehtblhgsrlitaeecarnthaaghetisnnfureupelrhtmtiyiduuenncoigndeuiaeeueshtnhlhtaoaieifdynauinnaeoyeitheofluadoerahuyrerarertaiahagtnoswiwitasltubmxoatoeloterontooroabcgtipaveelnyrfweoatuwdatrewnltrfppreliaimrlrotneqiwcuerndraaftootrnetlenrepshmpdednewdtfoehedpynsneegenteatneaertesludgsroeroubdghwparbnyehekttrterhnrrednftsloiaswypinhmtoocuoeiytpoeekrhntannltriiueemneraptieaohhnhoumuovsktedneoieewkpdgteiioiinhesfauueubnhrtirheaeheiyaauusrsgawiissdrltiphfgtwlisiiisuehromrceamoisidevllueoiraseodifintobsesatnfgopdrosirfttalptrenioyltyossseotpnfaiehaoegieardmtiaeathyrgrrsaelfcletrneaeehvhmhvissanroeilmxijtspsoetmrbfdinhhecobtnccontuspmoeseenthfiteoonewonteetoltirgdiomesoifohrolmfdfeesutlefoiiwrdbqyttozfarnditnntogaelashdpmnaelphtbtnsahoulpaamnelrsdpnavhelaicahnskildocadteahogjadeiaywgetdnheneeuegeeoeorndrfyyemtcwnttdegtsuatotooymwfrghioehrnrisofartferponeisaysseshhnteuyaiwhltecpuataanepeeulahwleloaesruiibnsaaeeatedccgreosrospseneosvluddetlisitetseftsneoginleroneitnwwiehtwlrsielhiisrdtesdnhrfrlgtnuasrdaesytodadsaentutciwmeanrtetesopottynycosotumucgpaldealdteodsbdfleefaxhaonsrtidipriehisacsdcpbihlseialnlrfohnterortaemiaaglktmercwdraynssvwnldunekronntutiuonnuinivhloietelhaenfuitatatftlecrbnnegbhsnolnmoakofionravnnsetrfftcretdhwssppecuwtcrawopdahfsoiygoaolneaigfdrtgnltbegfll   o',\n",
-        " 'htihrfnhtreffoaeantfytlsrrrohtqeesmirluresfheeatwiuibhistrrnioisineirmhrdtypieotticrbnlahnprohoteilrhstwpsettosounyoerhwchhdmciptoonsahajithenaerfotsuenmgartruxlwotbtaepetrartpeseahtensirhtsrnnrtsodlfuahgesgmkaesitnutyhauyntnntngihvwelwpaifersaiaflpabepcmcehalothtswhldaluvuesoeaeueatetathefethblghsriltaeecanrthaaghteisnnfueruplerhmttiiydueunnocigdneuaieeeushnthlthaoiaeidfynuainaneoeyitehofuladeorauhyrrearretaaihatgnowsiwtiastlubxmoaoteltoernotorooacbgtpiaveelnryfwoeatwudartewlntrpfprleiamirlortnqeiwucerdnrafatotorntelernephsmpeddnwedtofehdepysnnegeenetatenaetresuldgrsoeorubgdhwaprbynehketttrernhrrdenfstloaiswpyinmhtocouoieytopeerkhnatnntlriuieenmerpatiaeohnhhomuuosvktdeneioeekwpdtgeioiiihnesafuuuebnrhtihreaheeiayausursagwisisdlrtihpfgwtliisiiusehormrecamiosiedvluleoriasoediifntboseastngfoprdosriftatlprtenoiylytossseoptnfiaehoaegeiarmdtieaatyhrgrrsalefceltrenaehevhhmvissanoreimlxitjsposetrmbfidnhehcotbncocntsupmeosenethifteooneownteetotlirdgioemsofiohorlmdffeseutelfoiiwrbdqyttozafrnidtntnogealahsdpnmaeplhttbnshaouplaanmelsrdpanvhleaiachnksilodcatdeaohgjdaeiyawgtednehneueegeeoerondfryymetcnwttedgtusattooomywfgrhieohrrnisfoarfteropnesiaysseshhntueyawihletcpautanaepeeulhawlleoaseruiibnasaeaetecdcgerosorspesnesovldudeltistietesftnseoignlreonietnwwiethwlsriehliirsdtsednrhfrgltnausradestyoddasanetuctiwemantretseoptotyyncoostuumcgapldaeldetodbsdfelefxahanosritdirpieihsascdcbpihsleilanlfrohtnerrotameiagalkmterwcdryansvswndlunkeronntuituonnuiinvholieetlheanfiutaattfltecbrnngebhnsolmnoaokfinoranvnsterftfcrtedhswspepcutwcrwaopadhfosiyogaonleagifdtrgntlbefgll   o']"
-       ]
-      }
-     ],
-     "prompt_number": 22
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 23,
-       "text": [
-        "'hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo'"
-       ]
-      }
-     ],
-     "prompt_number": 23
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in every_nth(c6bs, 3)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "'hit'"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs.find('e', 13)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 25,
-       "text": [
-        "28"
-       ]
-      }
-     ],
-     "prompt_number": 25
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c6bs) / 978"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 26,
-       "text": [
-        "1.6083844580777096"
-       ]
-      }
-     ],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs[55:60]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 27,
-       "text": [
-        "'bnrrt'"
-       ]
-      }
-     ],
-     "prompt_number": 27
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(c6bs[0] + c6bs[i] + c6bs[2*i] + c6bs[3*i], i) for i in range(int(len(c6bs) / 3)) if c6bs[i] == 'e' and c6bs[2*i] == 'i' ]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 28,
-       "text": [
-        "[('heih', 177), ('heit', 207), ('heip', 307), ('heil', 522)]"
-       ]
-      }
-     ],
-     "prompt_number": 28
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[c for c in chunks(c6bs, 522)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 29,
-       "text": [
-        "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnrotel',\n",
-        " 'etpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvna',\n",
-        " 'iaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrteb',\n",
-        " 'ltllgfo']"
-       ]
-      }
-     ],
-     "prompt_number": 29
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6b"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 30,
-       "text": [
-        "'HITHH NFRFE RTEAO FFTNA SLTYO RRREQ THIMS ERULR HFSET AEEIU IWSIH BNRRT SIOII ENIRH MRPYT DTOEI RCITA LNBRP NHTOH ORLIE WTSHT ESPOS OTOYN UWHRE DHHCP ICMNO OTAHA SHTIJ EANET OFRNE USRAG MXURT TOWLE ATBRT EPPTR AAESE NETHH RISNR STSTR NFLDO GHAUM GSESE AKUNT IAHYT TNYUN TNNVH IGWLE WFIAP ASREL FAIEB APCMC PLAHE THTOL HWSUL ADSEU VEAEO TAEUT ATEEF EHLBH TRSHG ATLIA CEEHT RNHGA ASIET UFNNP UREHR ELITT MUDYI NNUEG ICOUE NDEEI AHSUE LHTNO AHTIE AINYF DNIAU OENAT IYEFO HEDAL UAROE RYHUR AERAT ERAHI AONGT WISWS AITBU LTAOM XLETO REOTO TONAO ORTGB CVAIP NLEEW FYRTA EOADU WWETR RTNLR PFPAI ELLRI MNTRO WIEQR ECUAR NDOTA FNROT ELETP ENRPM SHNDD ETDEW HEFOY PEDEN NSNEE GTATE EANES ERTGD LUEOS RBURO WHDGB RPAHE NYTTE KRERT RRHNF NEDOL TSWSI ANIYP OTHMO UOCTY EIEEP ONHKR NNTAI RLTEE IUREM NITAP HOEAO HHNOU UMTKV SENED EEOID PWKIE GTIII OSENH UUFAN BEUIT HRAER HIEEH UAYAS RUSIW GADSI SITRL GFPHI LTWII SIHES URMRO MACEI SOILV DEOEL USAIR IDEOT NFIES OBNTS APOFG SODRT FIRPL TANET RLYIO SOTYO ESSFN TPHEA IGEAO RAIEI TDMTA AEGRH YASRR CFELR TLEEA NEHVE HIVMH NASSI EROIX LMPSJ TTESO FBMRH NDIOC HECNB TTNCO MPUSE SOEHT ENETF IENOO TNWOO TEERI LTOIG DOSME HOIFM LROEF FDTUE SOFLE RWIIY QDBZO TTNRF ANTDI GONTA LAEPD SHEAM NTHLP SNBTU OAHAA LPLEM NPDRS HVNAI AELNH CALIS KACDO AEDTJ GHOIE ADGWA YNDET ENHEG EEUEO EEDNO RYYRF CTEMT TWNTG DETAS UOOOT FWYMI HRGRH OESIN RRAOF RETFE NPOYA ISSES STNHH AYEUL HIWPC TEATU APEAN LUEEL WAHAO ELURE SNBII EASAE TEAGC DCSOR EPSRO ENSEL VOSED UDSIT LTEIT TFSEO ESNLN GINOE RNTEI EIWWL WHTEI RSIIL HTDSR NDESR FHRNT LGRSU ASEDA DOYTA SADUT ENWIT CNAME TERTP OESYT OTOCN YUTSO GCMUD LPADL EADOT EFDSB FELEA HAXRS ONIDT IEIPR ASHIC DCSHI PBIEL SLNAL HORFR ENTAT ORAIE MKLAG RETMR DCWSN AYNWS VNULD OREKU TNNOU TIIUN NHVNI EILOH LTEFN AEATU IFTTA CETLN NRBHB EGLOS NAONM IFKOA RONSN VNFRE TRCFT HDETP SWSUC PERCW TPOAW FHDAY ISOOA GOAEL NDFIG NGRTE BLTLL GFO\\n'"
-       ]
-      }
-     ],
-     "prompt_number": 30
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[i for i in range(len(c6bs)) if c6bs[i] == 'q']"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 42,
-       "text": [
-        "[29, 503, 985]"
-       ]
-      }
-     ],
-     "prompt_number": 42
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in every_nth(c6bs, 11)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 32,
-       "text": [
-        "'hithhnfrfer'"
-       ]
-      }
-     ],
-     "prompt_number": 32
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in every_nth(c6bs, 13)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 33,
-       "text": [
-        "'hithhnfrferte'"
-       ]
-      }
-     ],
-     "prompt_number": 33
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in chunks(c6bs, 121)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 34,
-       "text": [
-        "'hhrnrnumeodti'"
-       ]
-      }
-     ],
-     "prompt_number": 34
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in chunks(c6bs, 13)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 35,
-       "text": [
-        "'harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon'"
-       ]
-      }
-     ],
-     "prompt_number": 35
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "'l' in ''.join([c[0] for c in chunks(c6bs, 13)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 36,
-       "text": [
-        "True"
-       ]
-      }
-     ],
-     "prompt_number": 36
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "every_nth(c6bs, 11)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 38,
-       "text": [
-        "['httmtbnoreohaegaasdetgrmlvtshtenenfiargurredrmcrpwnaegennckehmoinhutioddnrtegmranmmneieseetoetmaaoeoceyiesieaidnseewtrdtttmoaicnagariounanfcfor',\n",
-        " 'ieysaniepwthhtmtenoanwecheehtulueodyratleteupnuomhsnobkeitriotiibisrimeettrsetrnaprbseemfrtnaunecitettmnntwaoecsiorhdnaeeouthesatryeuhirostphat',\n",
-        " 'taoeerrintocaoxbsrgkyllpwaegrfieianeotwtogwwftatsenesrrdyynuekdoeeilsaoosflsaacesshtonrefwntmopldeeeeairpnpneasetentstdnrcdeaihloenknlfbnnhedee',\n",
-        " 'horrerhrhsypsfureshuueflsefanntgahifeeiatbfwprrehfesrpeopenravpsuewgicetaiyfoafhsjnteoihdiranadnoandmshrohcllsollsterlowtnlfxpihrtwuntthmvdralb',\n",
-        " 'hfruitmcthnihrrtntannwaauoethntihtaorrsoocyeaonlnoeebarloiteosweihgfhelnprinreevitdnholotiflthrhadhnturayhtuuarvtneingyipypdrrpoamsthetbinecynl',\n",
-        " 'nfrlusriotuctnteesuttfihlthlgpmcsiuhyawmtvrtiwdedygruhttteamhekntuapeiufopotagleetictttiuyaahascegeotogoaaeereeoelirdrttouassabrirvnvfaefftwidt',\n",
-        " 'fteriipthewmietpttminieeaaliauuoueoehhsxoatreiotdpttrersheinhnihhadhsssiflspirrhreooenofeqnelahadwgrworfiyaeetpsinesesacetdbosifednnnncgkrptsfl',\n",
-        " 'rnqhwoyaoshnjuophrganabtdebaardueaeduialniarletpeeagonrwmprineeurysiuoaegtohehtioscmnwimsdtpplvltaeynohrsetlsesetgiisusnsslfnhermcuoiaeloespoil',\n",
-        " 'fatfsitlrproeswthnshvpahsuhcseyelinaraieapetlqaetdtdwyhsooltodguaailriissateiylviohpeoglobddspnijyeyttoesuuwnardtiwiraaayoeeiilekwlueetoatwoogg',\n",
-        " 'eshsiidnloeoarlrrfeyhaptetteihinhnalaottononrrfndeelhtniuntauetfesstmlroonyataemxfeutodrfzisnlasgnurgfetelaabgoufnwlfsdmtgaldcsnlsdtialsrrsaanf',\n",
-        " 'rliehetbisdtnaeailstiscouareerndtytuenboolalienreneudtfaohepueiarriwrvibdeoidsehlbcsftoologhbeikhdefdwsfshphicedsolhheueocdetdltanoiltnnocuwggo']"
-       ]
-      }
-     ],
-     "prompt_number": 38
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "every_nth(c6bs, 143)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 64,
-       "text": [
-        "['hetuehroera',\n",
-        " 'iteloirnnny',\n",
-        " 'toetsectptn',\n",
-        " 'hffarefaolw',\n",
-        " 'hreobhelygs',\n",
-        " 'nnhmuulaarv',\n",
-        " 'felxrareisn',\n",
-        " 'rubloytpsuu',\n",
-        " 'fshewaldsal',\n",
-        " 'ertthsesesd',\n",
-        " 'rarodrehseo',\n",
-        " 'tgsrguaesdr',\n",
-        " 'emhebsnatae',\n",
-        " 'axgoriemndk',\n",
-        " 'ouatpwhnhou',\n",
-        " 'frtoagvthyt',\n",
-        " 'ftlthaehatn',\n",
-        " 'ttioedhlyan',\n",
-        " 'noannsipeso',\n",
-        " 'awcayivsuau',\n",
-        " 'sleotsmnldt',\n",
-        " 'leeotihbhui',\n",
-        " 'tahretntiti',\n",
-        " 'ytttkrauweu',\n",
-        " 'obrgrlsopnn',\n",
-        " 'rrnbegsacwn',\n",
-        " 'rthcrfihtih',\n",
-        " 'regvtpeaetv',\n",
-        " 'epaarhraacn',\n",
-        " 'qpairioltni',\n",
-        " 'ttsphlipuae',\n",
-        " 'hrinntxlami',\n",
-        " 'iaelfwlepel',\n",
-        " 'matenimmeto',\n",
-        " 'seueeipnaeh',\n",
-        " 'esfwdsspnrl',\n",
-        " 'renfoijdltt',\n",
-        " 'unnylhtrupe',\n",
-        " 'leprtetseof',\n",
-        " 'rtutsseheen',\n",
-        " 'hhrawusvlsa',\n",
-        " 'fheesronwye',\n",
-        " 'srhoimfaata',\n",
-        " 'eiraarbihot',\n",
-        " 'tsednomaatu',\n",
-        " 'anluimreooi',\n",
-        " 'eriwyahlecf',\n",
-        " 'estwpcnnlnt',\n",
-        " 'itteoedhuyt',\n",
-        " 'usmttiicrua',\n",
-        " 'iturhsoaetc',\n",
-        " 'wrdrmoclsse',\n",
-        " 'snytoihinot',\n",
-        " 'ifinulesbgl',\n",
-        " 'hlnlovckicn',\n",
-        " 'bdnrcdnaimn',\n",
-        " 'nouptebceur',\n",
-        " 'rgefyotdadb',\n",
-        " 'rhgpeetoslh',\n",
-        " 'taiailnaapb',\n",
-        " 'sucieuceeae',\n",
-        " 'imoeesodtdg',\n",
-        " 'ogulpamtell',\n",
-        " 'iseloipjaeo',\n",
-        " 'ienrnruggas',\n",
-        " 'esdihishcdn',\n",
-        " 'neemkdeodoa',\n",
-        " 'iaenresicto',\n",
-        " 'rkitnooesen',\n",
-        " 'huarnteaofm',\n",
-        " 'mnhotnhdrdi',\n",
-        " 'rtswaftgesf',\n",
-        " 'piuiiiewpbk',\n",
-        " 'yaeerenasfo',\n",
-        " 'thlqlseyrea',\n",
-        " 'dyhrtotnolr',\n",
-        " 'ttteebfdeeo',\n",
-        " 'otncenienan',\n",
-        " 'enouitetshs',\n",
-        " 'iyaausneean',\n",
-        " 'ruhrraonlxv',\n",
-        " 'cntnepohvrn',\n",
-        " 'itidmoteosf',\n",
-        " 'tneonfngsor',\n",
-        " 'anatigweene',\n",
-        " 'lviatsoedit',\n",
-        " 'nhnfaoouudr',\n",
-        " 'biynpdtedtc',\n",
-        " 'rgfrhreosif',\n",
-        " 'pwdooteeiet',\n",
-        " 'nlntefretih',\n",
-        " 'heieaiidlpd',\n",
-        " 'twalorlntre',\n",
-        " 'ofuehptoeat',\n",
-        " 'hiothlorisp',\n",
-        " 'oaepntiyths',\n",
-        " 'rpneoagytiw',\n",
-        " 'laanundrfcs',\n",
-        " 'istrueofsdu',\n",
-        " 'eripmtscecc',\n",
-        " 'weymtrmtosp',\n",
-        " 'tleskleeehe',\n",
-        " 'sffhvyhmsir',\n",
-        " 'haonsiotnpc',\n",
-        " 'tihdeoitlbw',\n",
-        " 'eeednsfwnit',\n",
-        " 'sbdeeomngep',\n",
-        " 'paatdtltilo',\n",
-        " 'opldeyrgnsa',\n",
-        " 'scueeoodolw',\n",
-        " 'omawoeeeenf',\n",
-        " 'tcrhisftrah',\n",
-        " 'opoedsfanld',\n",
-        " 'ylefpfdstha',\n",
-        " 'narowntueoy',\n",
-        " 'uhyyktuoiri',\n",
-        " 'wehpipeoefs',\n",
-        " 'htueehsoiro',\n",
-        " 'rhrdgeotweo',\n",
-        " 'etaetaffwna',\n",
-        " 'doeniilwltg',\n",
-        " 'hlrnigeywao',\n",
-        " 'hhasiermhta',\n",
-        " 'cwtnoawitoe',\n",
-        " 'pseesoiherl',\n",
-        " 'iureeririan',\n",
-        " 'clagnaygrid',\n",
-        " 'mahthiqrsef',\n",
-        " 'ndiauedhimi',\n",
-        " 'osatuiboikg',\n",
-        " 'oeoeftzelln',\n",
-        " 'tuneadoshag',\n",
-        " 'avganmtitgr',\n",
-        " 'hetnbttndrt',\n",
-        " 'aaweeanrsee',\n",
-        " 'seisuarrrtb',\n",
-        " 'hoseiefanml',\n",
-        " 'ttwrtgaodrt',\n",
-        " 'iasthrnfedl',\n",
-        " 'jeagrhtrscl',\n",
-        " 'euidayderwg',\n",
-        " 'attleaitfsf',\n",
-        " 'nabursgfhno']"
-       ]
-      }
-     ],
-     "prompt_number": 64
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(q, u) for q in [i for i in range(len(c6bs)) if c6bs[i] == 'q'] for u in [i for i in range(len(c6bs)) if c6bs[i] == 'u'] if abs(q-u) < 13]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 44,
-       "text": [
-        "[(29, 37), (503, 507), (985, 973)]"
-       ]
-      }
-     ],
-     "prompt_number": 44
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "every_nth(c6bs, 13)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 54,
-       "text": [
-        "['harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon',\n",
-        " 'iorhiniterttuehfeywehueagrieaaernltvanmalddeoptwukuongaiwpuldsrsedrheseenlfoonnavsoenwtsnhelbdetnwhnotsgoarieayuvalanetog',\n",
-        " 'tfefhiroseaorphlaufbtvetaenehudagtoaelnreeeasarsorrhetneghrveapoamcvrocsotmftttankinonfiphawiclegwttycyctxaengntnenovtpar',\n",
-        " 'hfqsbrchpdhftprdkniaoeflahnitoaetatiortnttnnrhricnehdibeaimdopltitfeofnooolltahlaaehrtwnoataisviildltntmersltrwniannnpogt',\n",
-        " 'httenhiooharttioutaplaeisruaielrwoopaprdpdnebehatnmneiehdlretotygaehibbetirenllpicaeygyryyuheootnwsgaaoufshsaesnetrmfsaoe',\n",
-        " 'nnhtrmtrshsnorsgnnpchehaieehenuaimnndfooeessunnnytnoeiuustoonfaoealixmthngorrapladdgydmraeaaarstohrrsmtddoilttvoiubirwwab',\n",
-        " 'faiarralochewanhtnamwolcelgsaaatsxalupwtnwneryfieaiuooiaiwmefgneaervlrttwdewfeseeogereiaiuposeefetnsaeolsncnomnulihfesfel',\n",
-        " 'rsmetplitptularaivscstbetiiuitrewloewaiarherotnyiituistysialisesogtmmhneoofiapnmlawefthosleeapdsredudtcpbidarrutofbktuhlt',\n",
-        " 'flsesyneoiiseesuahrpuaheutceniorseoewiefpeetwteperamdehaiicueotsrrlhpncnosfindbnneaucarfshalesuenieauenafdcladlihteorcdnl',\n",
-        " 'eteiitbwycjrastmhiellethftolyyeaatrweeqnmfgghedoelptpnrstsessdrfahensdoetmdytstphdyetsgreinutrdotrsstrydetshicdiltgacpadl',\n",
-        " 'ryruodrtnmeatesgyglaaurtnmuhferhiotftlrrsotddkotpthkwharriiaorlniyeajimteetqdhudctnoeureswlreoseesreetullihoewoutalrfeyfg',\n",
-        " 'touiitpsunagbntstwfhdtsrnuetdfyitrgyrleohyalgrlhoeovkueulhsibtyteaastopfehudieorajdemohtspueaeisiifdnpteeeirmsrnecootriif',\n",
-        " 'erlwionhwonmreretlaesahnpdnnnohabebrrrctnptubetmneesiursgeornfipisnstcuiroebgaaslgeetooftcesgntneihawosaaipfknenfesnhcsgo']"
-       ]
-      }
-     ],
-     "prompt_number": 54
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[''.join(transpose(l, (3, 11, 0, 1, 2, 4, 5, 6,7, 8, 9, 10, 12))) for l in chunks(c6bs, 13)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 61,
-       "text": [
-        "['hthithnfrfere',\n",
-        " 'foaoftnasltyr',\n",
-        " 'qurrethimserl',\n",
-        " 'sirhfetaeeiuw',\n",
-        " 'bisihnrrtsioi',\n",
-        " 'rtenihmrpytdo',\n",
-        " 'cpeiritalnbrn',\n",
-        " 'hshtoorliewth',\n",
-        " 'putesosotoynw',\n",
-        " 'dnhrehhcpicmo',\n",
-        " 'haotaashtijen',\n",
-        " 'fgetorneusram',\n",
-        " 'tbxurtowleatr',\n",
-        " 'pnteptraaesee',\n",
-        " 'rtthhisnrstsr',\n",
-        " 'dsnfloghaumge',\n",
-        " 'ktseauntiahyt',\n",
-        " 'nwnyutnnvhigl',\n",
-        " 'ifewfapasrela',\n",
-        " 'ahiebpcmcplae',\n",
-        " 'odthtlhwsulas',\n",
-        " 'eteuvaeotaeua',\n",
-        " 'fsteeehlbhtrh',\n",
-        " 'lrgatiaceehtn',\n",
-        " 'anhgasietufnp',\n",
-        " 'huurerelittmd',\n",
-        " 'neyinuegicoun',\n",
-        " 'itdeeahsuelhn',\n",
-        " 'tdoahieainyfn',\n",
-        " 'ofiauenatiyeo',\n",
-        " 'ayhedluaroerh',\n",
-        " 'eiurarateraha',\n",
-        " 'ttongwiswsaib',\n",
-        " 'arultomxletoe',\n",
-        " 'tgotoonaoortb',\n",
-        " 'iycvapnleewfr',\n",
-        " 'ortaeaduwwetr',\n",
-        " 'rltnlpfpaielr',\n",
-        " 'teimnrowieqrc',\n",
-        " 'nouardotafnrt',\n",
-        " 'thelepenrpmsn',\n",
-        " 'tyddedewhefop',\n",
-        " 'naedensneegtt',\n",
-        " 'nleeaesertgdu',\n",
-        " 'rgeosburowhdb',\n",
-        " 'hrrpaenytteke',\n",
-        " 'rlrtrhnfnedot',\n",
-        " 'ihswsaniypotm',\n",
-        " 'coouotyeieepn',\n",
-        " 'nehkrntairlte',\n",
-        " 'eoiurmnitaphe',\n",
-        " 'hvaohnouumtks',\n",
-        " 'dkeneeeoidpwi',\n",
-        " 'iuegtiiosenhu',\n",
-        " 'befaneuithrar',\n",
-        " 'euhiehuayasrs',\n",
-        " 'aliwgdsisitrg',\n",
-        " 'ihfphltwiisie',\n",
-        " 'mssurromaceio',\n",
-        " 'diilveoelusar',\n",
-        " 'obidetnfieson',\n",
-        " 'pttsaofgsodrf',\n",
-        " 'lyirptanetrli',\n",
-        " 'ttosoyoessfnp',\n",
-        " 'ieheageaoraii',\n",
-        " 'tatdmaaegrhys',\n",
-        " 'farrcelrtleen',\n",
-        " 'esehvhivmhnas',\n",
-        " 'otierixlmpsjt',\n",
-        " 'foesobmrhndic',\n",
-        " 'nphecbttncomu',\n",
-        " 'ofsesehteneti',\n",
-        " 'oeenotnwooter',\n",
-        " 'ohiltigdosmeo',\n",
-        " 'luifmroeffdte',\n",
-        " 'ldsoferwiiyqb',\n",
-        " 'tizotnrfantdg',\n",
-        " 'aeontlaepdsha',\n",
-        " 'homntlpsnbtua',\n",
-        " 'lrhaaplemnpds',\n",
-        " 'aahvniaelnhcl',\n",
-        " 'ajiskcdoaedtg',\n",
-        " 'edhoiadgwayne',\n",
-        " 'hetenegeeueoe',\n",
-        " 'rmdnoyyrfctet',\n",
-        " 'totwngdetasuo',\n",
-        " 'whotfymihrgro',\n",
-        " 'ntesirraofref',\n",
-        " 'osenpyaissest',\n",
-        " 'apnhhyeulhiwc',\n",
-        " 'tuteauapeanle',\n",
-        " 'aeelwhaoelurs',\n",
-        " 'ianbieasaeteg',\n",
-        " 'secdcorepsron',\n",
-        " 'viselosedudst',\n",
-        " 'isltettfseoen',\n",
-        " 'iilngnoerntee',\n",
-        " 'liiwwwhteirsi',\n",
-        " 'dflhtsrndesrh',\n",
-        " 'ldrntgrsuasea',\n",
-        " 'tndoyasadutew',\n",
-        " 'npitcameterto',\n",
-        " 'ttesyotocnyus',\n",
-        " 'meogcudlpadla',\n",
-        " 'eedotfdsbfela',\n",
-        " 'rehaxsonidtii',\n",
-        " 'siprahicdcshp',\n",
-        " 'lrbieslnalhof',\n",
-        " 'tmrenatoraiek',\n",
-        " 'rslagetmrdcwn',\n",
-        " 'wraynsvnuldoe',\n",
-        " 'nnkutnoutiiun',\n",
-        " 'iehvneilohltf',\n",
-        " 'acnaetuifttae',\n",
-        " 'notlnrbhbegls',\n",
-        " 'nonaomifkoarn',\n",
-        " 'ntsnvfretrcfh',\n",
-        " 'prdetswsucpec',\n",
-        " 'oiwtpawfhdays',\n",
-        " 'giooaoaelndfg',\n",
-        " 'tfngrebltllgo']"
-       ]
-      }
-     ],
-     "prompt_number": 61
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/challenge7.ipynb b/challenge7.ipynb
deleted file mode 100644 (file)
index d7d18f4..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-{
- "metadata": {
-  "name": ""
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "from cipherbreak import *\n",
-      "with open('2013/mona-lisa-words.txt') as f:\n",
-      "    mlwords = [line.rstrip() for line in f]\n",
-      "mltrans = collections.defaultdict(list)\n",
-      "for word in mlwords:\n",
-      "    mltrans[transpositions_of(word)] += [word]\n",
-      "c7a = open('2013/7a.ciphertext').read()\n",
-      "c7b = open('2013/7b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c1a = open('2013/1a.ciphertext').read()\n",
-      "c1b = open('2013/1b.ciphertext').read()\n",
-      "c2a = open('2013/2a.ciphertext').read()\n",
-      "c2b = open('2013/2b.ciphertext').read()\n",
-      "c3a = open('2013/3a.ciphertext').read()\n",
-      "c3b = open('2013/3b.ciphertext').read()\n",
-      "c4a = open('2013/4a.ciphertext').read()\n",
-      "c4b = open('2013/4b.ciphertext').read()\n",
-      "c5a = open('2013/5a.ciphertext').read()\n",
-      "c5b = open('2013/5b.ciphertext').read()\n",
-      "\n",
-      "p1a = caesar_decipher(c1a, 8)\n",
-      "p1b = caesar_decipher(c1b, 14)\n",
-      "p2a = affine_decipher(c2a, 3, 3, True)\n",
-      "p2b = caesar_decipher(c2b, 6)\n",
-      "p3a = affine_decipher(c3a, 7, 8, True)\n",
-      "p3b = keyword_decipher(c3b, 'louvigny', 2)\n",
-      "p4a = keyword_decipher(c4a, 'montal', 2)\n",
-      "p4b = keyword_decipher(c4b, 'salvation', 2)\n",
-      "p5a = keyword_decipher(c5a, 'alfredo', 2)\n",
-      "p5b = vigenere_decipher(sanitise(c5b), 'florence')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(frequencies(sanitise(c7a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stderr",
-       "text": [
-        "/usr/local/lib/python3.3/dist-packages/matplotlib/figure.py:372: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
-        "  \"matplotlib is currently using a non-GUI backend, \"\n"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n3n777S6nGT16dMDPxe9//3vl5OQoJydHy5Yt67aXQLe1b24/3b12tbW1GjVqlEpLS5WTk6O6ujqf\ntUePHtXll1+uvLw85eTkaNWqVT5rFy5cqE8++UT5+flasGCBz7qTPXxz9LtkyRItWrSoy9pf/epX\npwSfrz0MDz/8sP7whz9Ikm6//XYVFRVJkjZt2qTrr7/+tPq3335bubm5am9v19GjR5Wdna2ampou\ne7j//vtPeb3uuecePfbYYz7X709/+pPy8/OVn5+vESNG6JJLLvFZ2yeF8zTzWNfc3GxZlmW1tbVZ\n2dnZ1ueff95l3d69ey2bzWa98cYblmVZVllZmbVkyZIua99//30rMzPTO6+Ty+jKtm3brJycHOvY\nsWPW4cOHrZEjR1pLly7tsrampsaaPn26dfz4ccuyLOu2226zVqxY4Xf90tPTfa7TSdXV1VZeXp7V\n3t5utba2WhkZGT572Lt3rxUXF2ft3LnTsizLKikpsV544QW/8x80aJDfx0OZZu/evVZ2drb10Ucf\nWfn5+dZ7773Xo3meXK/333/f6uzstMaNG2eVlZVZlmVZa9assWbMmOFzmkCei5Ovc1tbm3XkyBFr\nzJgx1o4dO3z2Eui2Fsz2c3Le/fr1s9566y2fNSetXr3auvnmm72/Hzp0yGdtbW2tlZ2d3e08T/bw\nzdolS5ZY5eXlXdbu2LHDmjJlivd3h8Nh1dXVnVa3detWa9asWZZlWdb3v/99a8KECdZXX31llZeX\nW0899VSX87733nutO++80/rpT3962kdrvqm2ttYqKCiwLMuyOjo6rPPPP9/ve/qkr776yiosLLTW\nrVvXbW1fwggqjJYtW6a8vDxNnDhRdXV1+ve//+2zdtiwYZo4caIk6frrr9eWLVu6rNu0aZNKSko0\ndOhQSVJiYqLPeb722muaOXOmBgwYoMGDB+uKK67wudtl48aNeuedd3TBBRcoPz9fmzZt0t69ewNd\nVZ9ef/11zZgxQ/3799egQYM0ffp0v7t+RowYobFjx0qSxo0bp9ra2h73EIpPP/1UM2bM0IsvvhiW\n44MjRozQmDFjZLPZNGbMGE2dOlWSlJ2d7XMdA30utmzZopkzZ+qcc87RwIEDNXPmTL322ms+ewl0\nWwtm+zlp+PDhGj9+vN8aSRo7dqw2bNighQsXasuWLUpISPBZ290yQ5WXl6dPP/1UDQ0N2rlzpxIT\nE5Wamnpa3ckRdGtrqwYMGKCJEydq27Zt2rJliwoLC7uc93333af169dr27Ztmj9/vs8ehg8frqSk\nJL377rtav369CgoK/L6nT/r5z3+uoqIiXX755YGvcB8Q1tPMY5nH49HGjRu1detWDRgwQBdffLHa\n29t91n/zGIZlWT6PadhstoDfsP9b2910paWlWrx4cUDzDlSwPZx99tnen8866yy/u58iaciQIRo+\nfLhee+01ZWVl9Xh+31yvfv36qX///t6fjx8/3u00/p6Lrp5jf8fEQt3WAtnuBg4c2G2NJGVkZGjH\njh165ZVXdO+996qoqEi//vWvA5rWn7i4uFN2TXe3/cyaNUurV69WY2Ojrr322i5r4uPjNWLECD3/\n/POaNGmSxo4dq02bNunjjz/2uW189tlnOnr0qDo6OnTs2DGde+65Pnu46aab9Nxzz6mpqUllZWXd\nruPzzz+v/fv3x+RxOUZQYXL48GElJiZqwIAB+uijj7R161a/9fv27fPWvPjiiz7/Z3bJJZfo73//\nu5qbmyXJ+29XLrroIlVWVuqLL75Qa2ur1q1b5/OPUVFRkVavXq3//ve/3vnu27ev2/XszuTJk/Xy\nyy+rvb1dR44c0SuvvBIVJxT0799f//jHP7RixQqtXLmyt9vxq7CwUJWVlTp27JiOHj2qyspKn9uP\nFPi2Fsz2E6yGhgYNGDBA1113ne68805t377dZ+3gwYPV2toa0Hztdrs+/fRTNTc3q729XevWrfNb\nf80112jlypVavXq1Zs2a5bOusLBQS5Ys0ZQpU1RYWKgnn3xSBQUFPut/8pOf6IEHHtCcOXO6PW52\n5ZVXqqqqStu2bdO0adP81r7zzjtaunRpr56Y1JsYQYXJpZdeqieffFIOh0OjRo3y7lLpis1m06hR\no/T444+rrKxMY8aM0W233dZlrcPh0D333KMpU6borLPOUkFBgZ599tkua/Pz83XNNdcoNzdXycnJ\nfne9jB49Wg888ICKi4vV2dmp+Ph4LV++XN/97nf99t2dCy64QFdccYXGjh0ru92unJwcfetb3wp4\nnt0tI5Q/mIFMY7PZdO6552rdunVyuVwaPHiwfvjDH4Y8T3/r5W8EE8gy8vPzdeONN3pf35tvvlm5\nubk+ewl0W/vf7efCCy/sdhQV6Ouxa9cu3XXXXd7RpL/TyJOSkjR58mTl5OTosssu8/u9cvHx8brv\nvvs0fvx4paamyuFw+O3J4XDoyJEjSktLk91u91lXWFioxYsXa+LEiTrnnHN0zjnn+Az2FStW6Oyz\nz9a1116rzs5OTZo0SR6PR06n02fPl1xyiRITE7t9/h5//HEdPHhQF198sSTpwgsv1FNPPeV3mr6E\nD+oi7I4ePaqBAweqra1NU6ZM0dNPP628vLxe6eXzzz/v1WNbva22tlbTp0/Xrl27gp520aJFGjRo\nkO64444IdBa7Ojs7NW7cOK1evVrnn39+b7djNHbxIexuueUW5efna9y4cbr66qt7LZwOHDigSZMm\n6a677uqV5ZuiJ7vpomH3bDSpqalRRkaGpk6dSjgFgBEUAMBIjKAAAEYioAAARiKgAABGIqAAAEYi\noAAARiKgAABG+j/og6x5jaDpPwAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xb55607cc>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7af = frequencies(sanitise(c7a))\n",
-      "plot_frequency_histogram(c7af, sort_key=lambda l: c7af[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nf14NDQ0qKSnxO253X4+uar31kZaWph07dujVV1/Vfffdp4KCAv3mN7/xOvYLL7yg/fv3+91H8u0e\n/Pn888919OhRtbW16dixYzr33HO7rIuKiuq0adrb6xYdHa0RI0bohRde0KRJkzR27Fht2rRJn3zy\nSZfrRk/X91mzZmn16tWqr6/Xdddd152nGBI9Wd9Csc57PB5t3LhRW7du1aBBg3TJJZeotbW11+P2\nJ8yggqCgoECrV6/Wf//7X0lSY2Oj9u3b57X+4osvVnl5ub788ks1Nzdr3bp1xu80HThwoP7xj39o\nxYoVWrlyZZ/0sG/fPm3dulWS9NJLL3X51/pJV111lSoqKrRt2zZNmzbN57iTJ0/WK6+8otbWVh05\nckSvvvqq19cjPz9f5eXlOnbsmI4ePary8nKvfdTV1WnQoEG6/vrrddddd2n79u1ee3j33Xe1dOnS\nbh0Ic+mll+rvf/+7GhsbJanjX29++tOf6sEHH9ScOXN87nex2+367LPP1NjYqNbWVq1bt85rbX5+\nvpYsWaIpU6YoPz9fTz31lPLy8rqs7en6fu2112rlypVavXq1Zs2a5fO59VRMTIyam5u7VduT9S0U\nDh8+rLi4OA0aNEgff/xxRy+RhBlUEIwePVoPPvigCgsL1d7erujoaC1fvlznn39+l/W5ubm69tpr\nlZ2drcTERF100UV+/2r359s137zu6/HdDUabzaZzzz1X69atk8vlUkxMjH70ox/1uBd/y/B136hR\no/TEE0+opKREY8aM0e233+61Pjo6Wpdeeqni4uL8Lv/CCy/UlVdeqbFjx8putysrK0vf+c53uqzN\nzc3VTTfd1LFZ9JZbblF2dnaXtbt27dLdd9/dMaP1dXjzE088oYMHD+qSSy6RJF100UV6+umnu6x1\nOBy69957NWXKFJ111lnKy8vTc88912XtihUrdPbZZ+u6665Te3u7Jk2aJI/HI6fTeVptdHS07r//\nfo0fP17JyclyOBw+g3rx4sWaOHGizjnnHJ1zzjle38C/vb7726TscDh05MgRpaSkyG63+6w9qbvr\nWEJCgiZPnqysrCxdfvnlPr+zrifrW0/X+e70e9lll+mpp56Sw+HQqFGjOjY3RhI+qGuARYsWaciQ\nIbrzzjv7upU+88UXXwR12317e7vGjRun1atX64ILLvBbf/ToUQ0ePFgtLS2aMmWKnnnmGeXk5ASl\nF/Q/1dXVmj59unbt2tXXrUQ0NvEZwvRNfKF04MABTZo0SXfffXdQxquqqlJaWpqmTp3arXCSpFtv\nvVW5ubkaN26crrnmGsIJEf07aQpmUAAAIzGDAgAYiYACABiJgAIAGImAAgAYiYACABiJgAIAGOn/\nARTQq3riH9t+AAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeb102cc>"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts, sort_key=lambda l: normalised_english_counts[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAawAAAEkCAYAAABzKwUZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHx5JREFUeJzt3X9QVXX+x/HXNSgLpNQxG++lUCF+KF5QkFHXpGwXtXTM\ntJg03aQidx23xmprahNn+1ZMuptGP7CZtXHb3B/ujrjKMq26d0ZLl0zsx6CNFtQFw9rMwF8E18/3\nD4siL+deEMSPPB8zZ7zH8z6f+zmHw33xOefce13GGCMAAM5zvbq7AwAAhIPAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFghZGCVlZUpKSlJCQkJKiwsPGP5vn37NGbMGPXu3VvLly8/Y3kgEFB6erqmTp3a\nOT0GAPRIEU4LA4GAFi5cqM2bN8vtdiszM1PTpk1TcnJyS03//v31/PPPa/369UHbWLFihVJSUtTQ\n0NC5PQcA9CiOI6zy8nLFx8crLi5OkZGRys3NVUlJSauaAQMGKCMjQ5GRkWesX1NTo9LSUt19993i\n/ckAgLPhGFi1tbWKjY1tmfd4PKqtrQ278QceeEDPPvusevXiUhkA4Ow4JonL5epwwxs3btSVV16p\n9PR0RlcAgLPmeA3L7XbL7/e3zPv9fnk8nrAafuutt7RhwwaVlpbq5MmTqq+v19y5c7VmzZpWdWlp\naXr33Xc70HUAwIXG6/Vqz549wRcaB01NTWbIkCGmqqrKNDY2Gq/XayorK4PWLlmyxCxbtizoMp/P\nZ26++eagy0J0wXpLliyh9jzqB7Xtrz1f+kFtx+tt4pQJjiOsiIgIFRUVKScnR4FAQHl5eUpOTlZx\ncbEkKT8/X3V1dcrMzFR9fb169eqlFStWqLKyUtHR0a3aOpvTiwAAOAaWJE2ePFmTJ09u9X/5+fkt\nj6+66qpWpw2DmTBhgiZMmNDBLgIAIF1UUFBQ0J0dWLp0qbq5C10uLi6O2vOoH9S2v/Z86Qe1Ha+3\nhVMmuL49Z9htXC4XdxECACQ5ZwJvkAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHA\nAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYIazAKisrU1JSkhISElRYWHjG8n37\n9mnMmDHq3bu3li9f3vL/fr9f119/vYYNG6bhw4dr5cqVnddzAECP4jLGGKeCQCCgxMREbd68WW63\nW5mZmVq7dq2Sk5Nbar744gt98sknWr9+vfr27avFixdLkurq6lRXV6e0tDQdPXpUo0aN0vr161ut\n63K5FKILAIAewikTQo6wysvLFR8fr7i4OEVGRio3N1clJSWtagYMGKCMjAxFRka2+v+rrrpKaWlp\nkqTo6GglJyfr4MGDHd0OAEAPFjKwamtrFRsb2zLv8XhUW1vb7ieqrq5WRUWFsrKy2r0uAPRUMTH9\n5HK5HKeYmH7d3c1zIiJUgcvlOusnOXr0qGbOnKkVK1YoOjr6rNsDgJ6ioeErSc6XTRoazv512gYh\nA8vtdsvv97fM+/1+eTyesJ+gqalJt956q+bMmaPp06cHrSkoKGh5nJ2drezs7LDbBwDYy+fzyefz\nhVUb8qaL5uZmJSYmasuWLRo0aJBGjx59xk0X3ykoKFCfPn1abrowxmjevHnq37+/fv/73wfvADdd\nAECbTp/lCvUaeeG8jjplQsjAkqR//etfuv/++xUIBJSXl6dHH31UxcXFkqT8/HzV1dUpMzNT9fX1\n6tWrl/r06aPKykrt2bNH1113nUaMGNFyavHpp5/WpEmTwuocAPR0BNYPloUTWF2JwAKAthFY3+OT\nLgAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAA\nAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABW\nILAAAFYgsAAAViCwAABWILAAAFYgsAAAVggZWGVlZUpKSlJCQoIKCwvPWL5v3z6NGTNGvXv31vLl\ny9u1LgAA4XIZY0xbCwOBgBITE7V582a53W5lZmZq7dq1Sk5Obqn54osv9Mknn2j9+vXq27evFi9e\nHPa6kuRyueTQBQDo0Vwul6RQr5EXzuuoUyY4jrDKy8sVHx+vuLg4RUZGKjc3VyUlJa1qBgwYoIyM\nDEVGRrZ7XQAAwuUYWLW1tYqNjW2Z93g8qq2tDavhs1kXAIAfcwys00PRjjmbdQEA+LEIp4Vut1t+\nv79l3u/3y+PxhNVwe9YtKChoeZydna3s7OywngMAYDefzyefzxdWreNNF83NzUpMTNSWLVs0aNAg\n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\n1CkzatQoM3/+fGOMMSUlJWb69OlntP/dz+47y5YtMwUFBY7bGM6x095js6qqyvTq1cv897//Ddn2\nunXrzD333NMy//XXXzu2GxERYd59911jjDG33Xabee2118669jvh7Atjvj8Ojh8/boYPH97msfTd\nfjt+/Lg5evSoGTZsmKmoqGiz3erq6lY/v7ZUVlaaqVOnmubmZmOMMQsWLDBr1qwJq+8XCkZYXWzR\nokWaOHGibrrppqDLt23bphkzZqh3797q06ePpk2b1qmnUp544gm98cYb2rVrlx5++GHH2s8//1zT\np0/X66+/7njNIC0tTZ9//rk+++wzvfvuu+rbt6/cbneb9bGxsRozZowkac6cOdq+fftZ17755pua\nPn26Lr74YkVHR2vq1Kmdtt+2bt2q2267Tf36nX6Td9++fYPWXXPNNerfv7/27NmjN954QyNHjgxa\n+91otaGhQb1799aYMWO0a9cubd++XePHjz+jfvDgwRo2bJhcLpeGDRumG2+8UZI0fPhwVVdXd8o2\nhqMjx+Y111yj0aNHh2x7xIgR+ve//61HHnlE27dvV0xMjGP94MGDNWLECEnSqFGjHPdDe2rbY8WK\nFUpLS9OYMWNUU1Oj/fv3B63bvn27ZsyYoUsvvVRRUVGaMWOGtm3b1ma74R63W7Zs0TvvvKOMjAyl\np6dr69atqqqq6tC22MrxtnacnVdffVV+v9/x/LTL5Wp1wHZmWEnS//73Px07dkyBQEAnTpzQZZdd\n1mbtFVdcoWuuuUbbtm1TUlKSY7uzZs3SunXrVFdXp9zcXMfaH177MMY4XgsJt7Yr99uP23Zy9913\na/Xq1Tp06JDmz58ftCYyMlKDBw/Wq6++qrFjx2rEiBHaunWrDhw4EHQ/X3LJJS2Pe/XqpYsvvrjl\ncXNz8xn1ERERrU4NOZ1GbY+O7OOoqKiw2k5ISFBFRYU2bdqkxx9/XBMnTtRvfvObNut/uE8uuugi\nx21sT224fD6ftmzZop07d6p37966/vrr1djYGLQ22H7ryDXDYObNm6ennnqqU9qyESOsLvLOO+9o\n+fLlIS/wX3fddVq/fr1OnjyphoYGbdy4sdMObun0e+WefPJJ3XHHHSHPj1988cX6xz/+oTVr1gR9\nk/cP3X777Vq7dq3WrVunWbNmOdZ++umn2rlzpyTp9ddfDzqqaG/tuHHj9M9//lONjY06evSoNm3a\n1Gn77YYbbtDf/vY3HT58WJJa/g3mlltuUVlZmXbt2qWcnJw268aPH69ly5ZpwoQJGj9+vF5++WWN\nHDmyU/o7cOBAff755zp8+LAaGxu1cePGTmm3K4/Nzz77TL1799bs2bP14IMPavfu3Z3Sblepr69X\n37591bt3b+3bt6/lGA1m/PjxWr9+vU6cOKFjx45p/fr1jsd8nz591NDQELIPEydO1Lp16/TFF19I\nOn1cfvrpp+3fGIsxwuoiL7zwgr766itdf/31kqTMzEytWrXqjLr09HTdfvvt8nq9uvLKK5WZmRn2\nX/ehXjzWrFmjSy65RLm5uTp16pTGjh0rn8+n7OzsNtu77LLLtHHjRv30pz9Vnz59dPPNNwetTUlJ\n0dGjR+XxeDRw4EDHPiYmJuqFF17Q/PnzNWzYMC1YsKDN+nBrMzIyNG3aNI0YMUIDBw5UamqqLr/8\n8rZ3hsK/yy0lJUWPPfaYJkyYoIsuukgjR47UH/7wh6C1kZGRuuGGG9S3b1/H9sePH6+nnnpKY8aM\n0aWXXqpLL720zRexH7fzw/lgzxEZGaknnnhCo0ePltvtVkpKSshtDWdf/PjYDOdUX7j7+P3339dD\nDz3UMoIMdVu30z45m9pwlkvSpEmT9PLLLyslJUWJiYktp62DSU9P189//vOW/XXPPffI6/W2Wd+/\nf3+NGzdOqampmjJlSpvfHZicnKwnn3xSP/vZz3Tq1ClFRkbqxRdf1NVXXx2y/xcK3jh8nlm6dKmi\no6O1ePFix7ovv/yyU8/Pnw+qq6s1depUvf/++2HVHzt2TFFRUTp+/LgmTJigV155RWlpaV3cy9ZO\nnTqlUaNGad26dRo6dOg5fW6gp+GU4Hko1F98Bw8e1NixY/XQQw+dox6dO+055XTvvfcqPT1do0aN\n0syZM895WFVWViohIUE33ngjYQWcA4ywAABWYIQFALACgQUAsAKBBQCwAoEFALACgQUAsAKBBQCw\nwv8DbMnA/BWkp54AAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeae5cec>"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7bf = frequencies(sanitise(c7b))\n",
-      "plot_frequency_histogram(c7bf, sort_key=lambda l: c7bf[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nZWWllZWVZbW0tFjHjx+3UlJS/K7PMwJ9PTt27LCmTp1qWZZlfe9737NGjRplffXVV1ZJSYn1/PPP\n+3wt77//vtXW1mYNHz7cKi4utizLstavX29NmjTJ5zKTk5P9rsczznymm5ubrRMnTlhDhw61du/e\n7bOmqqrKKigosE6fPm1ZlmXde++91sqVK33WVFdXWzk5OZZlWVZra6s1cODAgP4vtHednlnWN/8v\nhAIjqIvgZz/7mfLy8nTjjTf6bfvaa69p8uTJ6tGjh3r37q2bbrrJ7+6dYcOGafPmzZo3b562b9+u\nmJgYn+2zsrL0ySefqK6uTnv27FFsbKwSExP99u3RRx/Vpk2btHPnTs2ZM8dv+zP69eun0aNHS5Jm\nzJih7du3+2wfzHuwdetWFRYWqm/fvpKk2NhYv/365JNPNGnSJL300kud/l3M4sWLlZWVpdGjR6um\npkb//Oc//db0799fI0eO7NR+tXfdSNKAAQM0bNgwSdLw4cNVXV3ts/3rr7+uSZMmqXv37urVq5cK\nCgoC3mUZqDMj4OPHj6tHjx4aPXq0du7cqe3btys3N/eCdQMGDNDQoUNls9k0dOhQjR8/XpKUnp7u\n93W1x/bt2zV58mRdccUV6tmzpyZPnqzXXnvNZ82WLVv0zjvvaMSIEcrOztbWrVt18OBBnzX9+/dX\nXFyc3n33XW3atEk5OTkB/V9o7zqVFPJ1KIX4MHP4t2LFCh0+fDjgfbU2m+2sFR/IhyAlJUW7d+/W\nK6+8okceeUR5eXn61a9+5bNm6tSpWrdunerr63XbbbcF1LdPP/1UJ0+eVGtrq06dOqUrr7wyoLpv\nfo9gWZbf7xWCeQ/+tyYQffr0Uf/+/fXaa68pLS0toJqoqKizdrMEsrvS4/Foy5Yt2rFjh3r06KHr\nrrtOLS0tfut69uwZUJ86or3rRpIuv/xy7/XLLrvM73sQzPpsr+joaA0YMEArVqzQmDFjNGzYMG3d\nulUff/yxz3X7zdfSrVs3de/e3Xv99OnTIevf+d6DQN7roqIiLViwoF3LuvPOO7V8+XI1NDSouLg4\noJr2rtPOwgiqC73zzjtatGhRu75Evfbaa1VeXq4vvvhCx48f18aNG/1+kOvq6tSjRw/dfvvteuCB\nB7Rr1y6/y7n11lu1evVqrVu3TlOnTg2obz/+8Y/1+OOPa/r06e3a53zo0CHt2LFDkvTSSy/5/ItW\nCu49uP766/XXv/5VjY2NkuT915fu3bvrb3/7m1auXKnVq1cH9Frsdrs++eQTNTY2qqWlRRs3bvRb\nc+zYMcXGxqpHjx766KOPvO+FCdq7boIxduxYvfzyy2ppadGJEyf0yiuvdMrBD7m5uVq4cKHGjRun\n3NxcPffcc8rJyQn5coKRm5ur8vJynTp1SidPnlR5ebnf9zovL0/r1q3Tv//9b0lff6YPHTrkd1k3\n33yzKioqtHPnTk2YMCEk/T+f3r176/jx4yF9TkZQXWjp0qX6/PPPdd1110mSrrnmGj3//PM+a7Kz\ns3XrrbcqMzNT8fHxuuaaa/z+xbl37149+OCD3r8AAzn00+Fw6MSJE0pKSpLdbvfbfuXKlbr88st1\n2223qa2tTWPGjJHH45HT6fRbO3jwYC1dulTFxcUaOnSo7r33Xp/t//c9CGQ3l8Ph0MMPP6xx48bp\nsssuU05Ojl588UWfNTabTVdeeaU2btwol8ul3r176wc/+IHPmujoaD366KMaOXKkEhMT5XA4/G5s\nb7jhBj333HNyOBwaPHiwd5eaP8FsxNtTY7PZ2r1uzrcMf8scMWKEbrrpJg0bNkx2u10ZGRn61re+\nFXAfA5Wbm6sFCxZo9OjRuuKKK3TFFVf4DQFfryWQkX6gsrOzdccdd3g/y3fddZcyMzN91gwZMkSP\nP/648vPz1dbWpujoaJWVlenqq6/2WRcdHa3rr79esbGxAfexvetUkuLi4jR27FhlZGRo4sSJITkf\nID/UvcTMnz9fvXr10v3333+xuxKU6upqFRQUaO/evRe7K7iITp48qZ49e6q5uVnjxo3TsmXLlJWV\ndbG7FZba2to0fPhwrVu3TgMHDrzY3WkXdvFdgkz+LUggLvX+o+PuvvtuZWdna/jw4ZoyZQrh1Emq\nqqqUkpKi8ePHX3LhJDGCAgAYihEUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASP8PW/f+Q9EK\neawAAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeb95f8c>"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(c7bf)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nrClTplhHjhyxLMuybr31Vmvp0qVB+8rMzAx6v7+ptrbWKigosNrb260DBw5YWVlZQce2a9cuKyEh\nwdq2bZtlWZZVVlZmPf/880H76tevn+1x7dq1y8rNzbU+/PBDq7Cw0Hr33Xdt19rt59j9eO+996zO\nzk5r1KhRVkVFhWVZlrVy5Upr6tSpAetCuf/HtoG2tjbr4MGD1ogRI6ytW7cGHV+o22c429qxvnr1\n6mW9+eabQdtalmWtWLHCuummm7p+37dvn606v99v5ebm2mp7bFzfbL9w4UKrsrIyYM3WrVutCRMm\ndP3ucrms+vr6U7bftGmTNX36dMuyLOt73/ueNWbMGOurr76yKisrrSeffDJgX/fcc491xx13WD/9\n6U9P+NrPyfj9fquoqMiyLMvq6OiwLrjgAluvIZZlWV999ZVVXFxsrV692lb7YJhBRdnixYtVUFCg\nsWPHqr6+Xv/617+C1gwaNEhjx46VJF133XXauHFjwPbr169XWVmZBg4cKElKTk4O2serr76qadOm\nqU+fPurfv7+uuOKKoLtQ1q1bp7ffflsXXnihCgsLtX79eu3atStoX6F67bXXNHXqVPXu3Vv9+vXT\nlClTbO3eGTJkiEaOHClJGjVqlPx+f8TH9sknn2jq1Kl64YUXeuyzwiFDhmjEiBFyOBwaMWKEJk2a\nJEnKzc0NeJ9Cvf8bN27UtGnTdM4556hv376aNm2aXn311aDjC3X7DGdbO2bw4MEaPXq0rbYjR47U\n2rVrNW/ePG3cuFFJSUm26uyOpTsKCgr0ySefqLGxUdu2bVNycrLS09NP2f7Y7PzAgQPq06ePxo4d\nq82bN2vjxo0qLi4O2Ne9996rNWvWaPPmzZozZ07QsQ0ePFgpKSl65513tGbNGhUVFdl6DZGkn//8\n5yopKdHll19uq30wET3MHIH5fD6tW7dOmzZtUp8+fTRx4kS1t7cHrfvm5xWWZQX9/MLhcIT8n+x/\na+zWl5eXa8GCBSH1Fapwx3b22Wd3/XzWWWfZ2vUUqgEDBmjw4MF69dVXlZOTE/Hbl46/H7169VLv\n3r27fj5y5IitOjv3/2SPs53Pyrq7fYayrfbt29d226ysLG3dulUvv/yy7rnnHpWUlOjXv/617Xq7\nEhISjtu1bXc7mz59ulasWKGmpiZdc801AdsmJiZqyJAheu655zRu3DiNHDlS69ev10cffRR0u/v0\n00916NAhdXR06PDhwzr33HODju3GG2/Us88+q+bmZlVUVNi6P88995z27NkT0c/vmEFF0f79+5Wc\nnKw+ffroww8/1KZNm2zV7d69u6vtCy+8EPQd0yWXXKK//e1vamlpkaSufwO5+OKLVV1drS+++EIH\nDhzQ6tWrg77QlJSUaMWKFfrPf/7T1c/u3bvt3KWQjB8/Xi+99JLa29t18OBBvfzyy8YcZNC7d2/9\n/e9/19KlS7Vs2bLTPZxuKS4uVnV1tQ4fPqxDhw6puro66LYmhb59hrOthaOxsVF9+vTRtddeqzvu\nuENbtmyxVde/f38dOHDAdj9Op1OffPKJWlpa1N7ertWrV9uqu/rqq7Vs2TKtWLFC06dPD9q+uLhY\nCxcu1IQJE1RcXKwnnnhCRUVFQet+8pOf6P7779fMmTNtfaYmHf2svKamRps3b9bkyZODtn/77be1\naNGiiB/4xAwqii699FI98cQTcrlcGjZsWNdukUAcDoeGDRumxx57TBUVFRoxYoRuvfXWgDUul0t3\n3323JkyYoLPOOktFRUV65plnAtYUFhbq6quvVn5+vlJTU23tRhk+fLjuv/9+lZaWqrOzU4mJiVqy\nZInOP//8oPcpFBdeeKGuuOIKjRw5Uk6nU3l5efrWt74VtO5/+wl1NmCHw+HQueeeq9WrV8vj8ah/\n//76wQ9+ENF+At2PQLcT6v0vLCzUDTfc0PXc33TTTcrPzw86vlC3z//d1i666CLbs6hQHrft27fr\nzjvv7Jp12j10PCUlRePHj1deXp4uu+yyoOe1S0xM1L333qvRo0crPT1dLpfL1jhdLpcOHjyojIwM\nOZ3OoO2Li4u1YMECjR07Vuecc47OOeecoG8Gli5dqrPPPlvXXHONOjs7NW7cOPl8Prnd7qD36ZJL\nLlFycrKt+/LYY4/p888/18SJEyVJF110kZ588smgdcHwRV2cEQ4dOqS+ffuqra1NEyZM0FNPPaWC\ngoLTPay45/f7NWXKFG3fvj3s25g/f7769eun22+/PYIjQ3d0dnZq1KhRWrFihS644ILTNg528eGM\ncPPNN6uwsFCjRo3SVVddRTgZJBK750zZZQuprq5OWVlZmjRp0mkNJ4kZFADAUMygAABGIqAAAEYi\noAAARiKgAABGIqAAAEYioAAARvp/fPP9PvjmFnQAAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeaa372c>"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nMEAjR45s8cIJ6Uzo9OrVq+mii1DX5aKLrsVFFwDCiVMmOM6wIiIiVFhYqNzcXAUCAc2bN0/Jyckq\nKiqSJOXn5+vQoUPKzMxUbW2tevTooRUrVqiiokLR0dEtrgsAQHs4zrAuSAPMsLoUMywA4aTdl7UD\nABAuCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACA\nFQgsAIAVCCwAgBUILACAFQgsAGEnJqaPXC6X4y0mpk9Xt4kLjA9wvMjxAY4IR7wuL158gCMAwHoE\nFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACkEDq7S0VElJ\nSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P1nnnlGQ4YMUVpamu68807V19efv84BABcVx8AKBAJa\nsGCBSktLVVFRobVr12rv3r3NakpKSnTgwAHt379fq1at0vz58yVJVVVVevXVV7V792598MEHCgQC\n+vOf/9x5IwEAdGuOgVVWVqb4+HjFxcUpMjJSeXl5Ki4ublazYcMGzZkzR5KUlZWlo0eP6vDhw4qJ\niVFkZKROnDihxsZGnThxQm63u/NGAgDo1hwDq6amRrGxsU3LHo9HNTU1IdX06dNHixYt0rXXXqsB\nAwboqquu0k033XSe2wcAXCwcA+vMZ9IE19Jnl3z88cd6/vnnVVVVpYMHD+rYsWP605/+1L4uAZyD\nDznExSbC6U632y2/39+07Pf75fF4HGuqq6vldrvl8/k0evRo9e3bV5I0bdo0vf3225o5c+Y5j1NQ\nUND0dU5OjnJyctozFuCiUlf3tYJ9yGFdXWi/dAJdxefzyefzhVZsHDQ0NJhBgwaZyspKU19fb7xe\nr6moqGhWs2nTJjNx4kRjjDE7duwwWVlZxhhjysvLzZAhQ8yJEyfM6dOnzezZs01hYeE5jxGkBXQy\nSUYyQW48R+GoOz933XlscOb0vDrOsCIiIlRYWKjc3FwFAgHNmzdPycnJKioqkiTl5+dr0qRJKikp\nUXx8vKKiorR69WpJUnp6umbPnq0RI0aoR48eGjZsmO677752JTAAAK7vEq3rGnC5WjwHZqOYmD7f\nHaZpXa9evVVbe+QCdRTcmfOUwfZ/93mOupPu/Nx157HBmVMmEFjnkY0/ZDb2jDO683PXnccGZ06Z\nwFszAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxA\nYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgwSoxMX3kcrkcbzExfbq6TQCdgMCC\nVerqvpZkHG9nauxEIAOtI7DQ5fhP+nvdPZCBjojo6gaA7/+TdqpxXZhmAIQtZlgAACsQWAAuCA79\noqM4JAjgguDQLzqKGRYAwAoEFgDACkEDq7S0VElJSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P2j\nR49q+vTpSk5OVkpKinbu3Hn+OgcAXFQcAysQCGjBggUqLS1VRUWF1q5dq7179zarKSkp0YEDB7R/\n/36tWrVK8+fPb7rvV7/6lSZNmqS9e/fq/fffV3JycueMAgDQ7TkGVllZmeLj4xUXF6fIyEjl5eWp\nuLi4Wc2GDRs0Z84cSVJWVpaOHj2qw4cP65tvvtG2bds0d+5cSVJERISuvPLKThoGAKC7cwysmpoa\nxcbGNi17PB7V1NQEramurlZlZaX69eunu+++W8OGDdO9996rEydOnOf2AQAXC8fAcrlCu8TUmOaX\nqrpcLjU2Nmr37t36xS9+od27dysqKkrPPvts+zsFAFzUHP8Oy+12y+/3Ny37/X55PB7Hmurqarnd\nbhlj5PF4lJmZKUmaPn16q4FVUFDQ9HVOTo5ycnLaOg4AXSAmpk/Q9zbs1au3amuPXKCOYBufzyef\nzxdasXHQ0NBgBg0aZCorK019fb3xer2moqKiWc2mTZvMxIkTjTHG7Nixw2RlZTXdl52dbT766CNj\njDGLFy82jzzyyDmPEaQFq0gykglyC6/xhkPPbekhHPrtTLbti87qNxzGhq7h9Lw6zrAiIiJUWFio\n3NxcBQIBzZs3T8nJySoqKpIk5efna9KkSSopKVF8fLyioqK0evXqpvVfeOEFzZw5U99++60GDx7c\n7D4AANrC9V2idV0DLtc558BsdeacX7CxhNd4w6HntvQQDv12Jtv2RWf1Gw5jQ9dwygTe6QIAYAUC\nCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsA\nYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAF\n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\nrY7prLKyMpOenm7q6+tNXV2dSUhIaLWHyspKExERYd577z1jjDG33367ef311x23Hx0d7Xh/e9ap\nrKw0qampZt++fSYjI8O8//77Hdrm2XF9+OGH5vTp02b48OFm7ty5xhhjiouLzdSpU1tdJ5R9cfZ5\nPnHihDl27JgZMmSIKS8vb7WXUF9rbXn9nN12jx49zH//+99Wa85at26duffee5uWv/nmm1Zrq6qq\nTGpqatBtnu3hh7XLli0zBQUF59SVl5ebsWPHNi2npKSY6urqFre5c+dOM2PGDGOMMT/5yU9MVlaW\naWhoMAUFBWbVqlUtrvPEE0+Yhx56yPzyl79s8c95zqqqqjLDhg0zxhgTCATM4MGDHX+mjTGmoaHB\nZGdnm40bNzrWdUfMsDrRihUrlJ6erlGjRqm6ulr79+9vtTY2NlajRo2SJM2aNUvbt29vsW7r1q26\n/fbb1afPmT8U7N27d6vb3LZtm6ZNm6aePXuqV69emjJlSquHabZs2aJ3331XI0aMUEZGhrZu3arK\nyspQh9qqt956S1OnTtWll16q6OhoTZ482fFQ0cCBAzV06FBJ0vDhw1VVVdXhHtrjiy++0NSpU/XG\nG2+cl/OLAwcO1JAhQ+RyuTRkyBDddNNNkqTU1NRWxxjqvti+fbumTZumyy+/XFFRUZo2bZq2bdvW\nai+hvtba8vo567rrrtPIkSMdayRp6NCh+ve//61HH31U27dvV0xMTKu1wR6zPdLT0/XFF1/o888/\n13vvvafevXvL7Xa3WHt2hl1XV6eePXtq1KhR2rVrl7Zv367s7OwW13nyySf15ptvateuXXrkkUda\n7eO6665T3759tWfPHr355psaNmyY48+0dObNxsePH6+bb7459AF3E46XtaP9fD6ftmzZop07d6pn\nz54aN26c6uvrW63/4TkQY0yr50RcLlfIP8A/rg223pw5c/T000+HtO1QtbWHyy67rOnrSy65xPFw\nVWe66qqrdN1112nbtm1KSkrq8PZ+OK4ePXro0ksvbfq6sbEx6DpO+6Klfex0Tq29r7VQXndRUVFB\nayQpISFB5eXl2rRpk5544gmNHz9ev/nNb0Ja10lERESzQ9lOr58ZM2Zo3bp1OnTokPLy8lqti4yM\n1MCBA/Xaa69p9OjRGjp0qLZu3aoDBw60+tr43//+p+PHjysQCOjkyZO64oorWt3+Pffco9WrV+vw\n4cOaO3eu4/hee+01+f3+i/acHjOsTlJbW6vevXurZ8+e2rdvn3bu3OlY/9lnnzXVvPHGG63+5nbj\njTfqb3/7m44cOSJJTf+25IYbbtD69et16tQp1dXVaePGja3+5zR+/HitW7dOX375ZdN2P/vss6Dj\nDGbMmDH65z//qfr6eh07dkybNm2y4gKFSy+9VP/4xz+0Zs2aFv/gPZxkZ2dr/fr1OnnypI4fP671\n69e3+vqRQn+tteX101aff/65evbsqZkzZ+qhhx7S7t27W63t1auX6urqQtpu//799cUXX+jIkSOq\nr6/Xxo0bW6294447tHbtWq1bt04zZsxw3G52draWLVumsWPHKjs7W6+88oqGDRvWan1+fr6eeuop\n3XnnnUHPu916660qLS3Vrl27lJub22rdu+++q+XLl3fpRU5djRlWJ5kwYYJeeeUVpaSkKDExsekQ\nTEtcLpcSExP14osvau7cuRoyZIjmz5/fYm1KSooef/xxjR07VpdccomGDRumP/zhDy3WZmRk6I47\n7pDX69XVV1/teKgmOTlZTz31lH72s5/p9OnTioyM1EsvvaRrr73Wse9gRowYoSlTpmjo0KHq37+/\n0tLSdOWVV4a8zWCP0Z7/QENZx+Vy6YorrtDGjRv105/+VL169dItt9zS7m06jctphhPKY2RkZOjn\nP/950/N77733yuv1ttpLqK+1H79+MjMzg86yQn0+PvjgAz388MNNs02ny9b79u2rMWPGKC0tTZMm\nTXL8bL3IyEg9+eSTGjlypNxut1JSUlrtKSUlRceOHZPH41H//v0d+83OztbTTz+tUaNG6fLLL9fl\nl1/eatCvWbNGl112mfLy8nT69GmNHj1aPp9POTk5rfZ84403qnfv3o7778UXX9TXX3+tcePGSZIy\nMzO1atUqx767G/5wGJ3u+PHjioqK0okTJzR27Fi9+uqrSk9P75Jevvrqqy49N9bVqqqqNHnyZH3w\nwQdtXnfJkiWKjo7WokWLOqGzi9fp06c1fPhwrVu3ToMHD+7qdsIahwTR6e677z5lZGRo+PDhmj59\nepeF1cGDBzV69Gg9/PDDXfL44aIjh/VsOJxrk4qKCiUkJOimm24irELADAsAYAVmWAAAKxBYAAAr\nEFgAACsQWAAAKxBYAAArEFgAACv8P5ZWvQDqsWNNAAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeb47b6c>"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7a"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "'WWPA, AWHCRH MDY IOT NJHGK HJWLSBALH HI AWL BBHLJT, X DTUI PC VC MGPSHN HCK AHXK AVL BCAXS PMILG JAVHPCN IPBL. PZ ESPUCLS AWL RYPAT DPZ SLAPKLGLS AD AWLXY NHGK DU UYXKPF PMILGUDVC, ADV AHIL UVG HCFDUT AD WGVRLHZ XA, PUS AWL QVPYS DPZ THHF IV SLIHRO UYDT IOT IPZT. LMJTSALCA XKTH IV BHZL IOT WPPCAXUV SDVZ SXRT WPYI VU AWL QVM IN AWL LHN - UD-VCL LHH NDPCN IV IBGU XA DCTY IV AVDR XM IOTF SPSU\u2019I RCVL PI DPZ IOTYT, HCK IOTF LLGL EYTAIF JUAPZLAF IV QL AVDRXUV MDY HVBLDUT AD ZBBVNAL P WPPCAXUV PC HCFLHN. \\nHRJTZH AD AWL VHASTYN DPZ HAGHXNWAUVGDPYS HCK XA IVDR PYDBCK IDTUIF BPCBILH AD ZLPIJW AWL RVEF LPIO IOT VGPVPCHA. P WPS AWL EHXUIPCN PTDUV H QBCJW VU YTWGVSBRAXVCZ XU IOT TJZTBB ZWVE HCK RHBWTK DBI MDY IOT UXNWA XU IOT NJHGKH\u2019 IPAWYDVB. AJYCZ DBI AWLN WGLULG AD BHL IOT KXYTJIVGZ\u2019 UHRPAPIPTZ JW DU IOT ADW USDVG. DXAW AWL CLL LMOXIXAXVC VELCPCN DU HHIBGKPF IOT WAHRL LHH IJZN LCVJNW AD ZAPE VJA UPGZI AWPCN PUS, HH HGYPUVLS, P BHSL HBGL X DPZ UPGZI PCAD AWL HODW. X UDD WHKL IOT ODUDBG VU OPCXUV IDBVOI AWL ROTHELHA TCTY LVGR QF SH KPCJX. VG UDA. \\nIOT E-GHN YTZJSIZ RHBL QHRR IOXZ BVGUXUV HCK, PZ NVJ ZJZELRATK, IOXZ XZ DUT VU ZPYP\u2019Z UHZLH. P PT IVAK XA XZ RSDZT AD WTYULRA, QBI, OXKSLC BCKTY IOT SPFTYH VU WPPCA, HOT ZRYXIQSTK P WXJIBGL DM IOT UPGX LPNAL TTQSTT XU ALPK. HOT ZXNCLS PI Z IVD. AWL ILRO VBNZ IOXUZ ZWL BHN OPCT BHLS H QPI VU VAK EPEL APZL P JGHNVC AD KTMPJT AWL QVPYS ITMDYT ZWL HAPYILS DDYZ VC PI. HCFLHN, AWHI STHKLH AWL FBTZIPDU DM LOTYT AWL WLAS IOT YTHA WPPCAXUV TXNWA QL. XA\u2019H OPYS AD ITSXLKL IOPA HOT STMI PI DXAW AWL HZ PUS P RHC\u2019A HLT OTY VVXUV VC AWL GBC DXAW PI ZIBRR JUSLG OTY RVPA. XA\u2019H UDA APZL HOT JDBAK GVAS XA JW. \\nX DDYZLS AWYDBVO HVBL BVGL DM IOT UPGX WPWTYH HCK UVJUS AWPH UDAT. HI STHHA XA ILASH BH DWLGL HOT DTUI. SDVZZ APZL IOT JXWWLG JALGR LHH IPJZ IN AWL LHN. P WHKL BVKLS VC AD CTUXJT AD AGF IV UPCK PUN AGHRL DM HHGH IOTYT, IJA X OPCT H ULTSXUV AWL HVABIPDU IV IOXZ BFHATYN PH IPJZ PC WPYXZ LOTYT PI HAS QLVHC. P ALUA IOT WPPCAXUV HI AWL EHGPH VUMXJT. TPFQL NVJ JDBAK PYGHCNT AD YTAJYC PI? PI ZWVJSS IT LPZXLG AD NTA XA XU IOPU XA LHH AD LMAGHRA XA. \\nPSA AWL QLHA, \\nWHGYN\\n'"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "vigenere_frequency_break(sanitise(c7a))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 12,
-       "text": [
-        "('hp', 0.03214089578198264)"
-       ]
-      }
-     ],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "'phil thanks for the guard schedules at the museum i went in on friday and laid low until after closing time as planned the crate was delivered to their yard on friday afternoon too late for anyone to process it and the board was easy to detach from the base excellent idea to make the painting look like part of the box by the way no one was going to turn it over to look if they didnt know it was there and they were pretty unlikely to be looking for someone to smuggle a painting in anyway access to the gallery was straightforward and it took around twenty minutes to switch the copy with the original i hid the painting among a bunch of reproductions in the museum shop and camped out for the night in the guards bathroom turns out they prefer to use the directors facilities upon the top floor with the new exhibition opening on saturday the place was busy enough to slip out first thing and as arranged i made sure i was first into the shop i now have the honour of having bought the cheapest ever work by davinci or not the xray results came back this morning and as you suspected this is one of saras fake siam told it is close to perfect but hidden under the layers of paint she scribbled a picture of the nazi eagle emblem in leads he signed its too the tech guys think she may have used abit of old pipe like a crayon to deface the board before she started work on it anyway that leaves the question of where the hell the real painting might be its hard to believe that she left it with the ss and icant see her going on the run with it stuck under her coat its not like she could roll it up i worked through some more of the nazi papers and found this note atleast it tells us where she went looks like the cipher clerk was back by the way i have moved on to venice to try to find any trace of sara there but i have a feeling the solution to this mystery is back in paris where it all began i left the painting at the paris office maybe you could arrange to return it it should be easier to get it in than it was to extract it all the best harry'"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "vigenere_frequency_break(sanitise(c7b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 16,
-       "text": [
-        "('aattuualptaaauaaaa', 0.10312795085805967)"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(sanitise(c7b),'aattuualptaaauaaaa' )))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 17,
-       "text": [
-        "'ttmaqoehqveytelettkf vfantitlnhhttprnmews qrfwquefetnntmmohpun kit a murvsoegeomjsemwelpo yotkcoytmamvgijtrhtk pcrnydlmautreryrciti man rtxrnmzeatctythrycyb obmmisfdefehefyfnvws note neetztxkrqcavlennemh tmeemnnfvulnntneyfrt a ohtmohynxzxnzontunrg hubfooznoirdgkiztyqh eodatncnenpgyccwfmai masxprjmmtoktyiheouf jnteemaetxhkyutyaatk ausmmfuccthuyotxmltn tythhtootmnrnusztdsm mkoiyftfhharuianbwha eixyetfoatnboksfiheu ywcrthbfulmrsaetmlpu ymhtryamodjafttteaff ttnwmqtfzwbhntypttmt are dldnrkyhsacctyerfamm tgomtxzumtmtmtanskid jfpoxhothtoaixvidebb ooeryykftffteelratyh qyurtemtvgeutvsfrheo tcmhyalioyuemnefknco trqiitaonfouaywtmmoo that eu uhpyhnzxttontfaaxnsn of lioptnrtovvxzdiepexy not etielahfcariewfhwwh yiwlvmuudehtbbfvvawi ytkbozvrifacjsiwaagb let now oalfdorpballhktfqtku at hvnxwllfmodtqsluhycv lhiyytejglmrzfdemded dweicjqisrnvlmhudewl kb dgcmklhyhkjalxdosdtq in lfs gewambhlohuwejeltww tbjgeudeucklmxatceud same rpfmjtqmorshwzndcgkm zhieuzasrsoekzgbtbqh rktiwgcavlneuqrzhibj leljrlayqybgewqgrkth wlpiyshwfsillxicblls ebwhcyfkrvmhiomkotdo iwmfahyniseiszwfshlt cxrmaotikmnuachvqdov mmatibzhfoadvloawzke nqrcnrgbxrwfdkctsxxa iejzlnerryfidtbwhxbd hluhtfswwnclgdtwwdvk lhazobmargsgwwtopasg men rl on york rodr keewdeelujkdlellythc wexcfrqxagrdiyunehkn ikfruurtslqbdjrcvujp kxghfbldgmistthujsot bids iwcdsiajaqmanpigbcp zoxlurhnlgrtfifiguor gsm mntfcwavanbilwysatnl mvpnafbhzhwxnrzirhra'"
-       ]
-      }
-     ],
-     "prompt_number": 17
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(sanitise(c7b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 18,
-       "text": [
-        "1304"
-       ]
-      }
-     ],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/cipher.py b/cipher.py
deleted file mode 100644 (file)
index 266237a..0000000
--- a/cipher.py
+++ /dev/null
@@ -1,1056 +0,0 @@
-import string
-import collections
-import math
-from enum import Enum
-from itertools import zip_longest, cycle, chain, count
-import numpy as np
-from numpy import matrix
-from numpy import linalg
-from language_models import *
-
-
-modular_division_table = [[0]*26 for _ in range(26)]
-for a in range(26):
-    for b in range(26):
-        c = (a * b) % 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 transpose(items, transposition):
-    """Moves items around according to the given transposition
-    
-    >>> transpose(['a', 'b', 'c', 'd'], (0,1,2,3))
-    ['a', 'b', 'c', 'd']
-    >>> transpose(['a', 'b', 'c', 'd'], (3,1,2,0))
-    ['d', 'b', 'c', 'a']
-    >>> transpose([10,11,12,13,14,15], (3,2,4,1,5,0))
-    [13, 12, 14, 11, 15, 10]
-    """
-    transposed = [''] * len(transposition)
-    for p, t in enumerate(transposition):
-       transposed[p] = items[t]
-    return transposed
-
-def untranspose(items, transposition):
-    """Undoes a transpose
-    
-    >>> untranspose(['a', 'b', 'c', 'd'], [0,1,2,3])
-    ['a', 'b', 'c', 'd']
-    >>> untranspose(['d', 'b', 'c', 'a'], [3,1,2,0])
-    ['a', 'b', 'c', 'd']
-    >>> untranspose([13, 12, 14, 11, 15, 10], [3,2,4,1,5,0])
-    [10, 11, 12, 13, 14, 15]
-    """
-    transposed = [''] * len(transposition)
-    for p, t in enumerate(transposition):
-       transposed[t] = items[p]
-    return transposed
-
-def deduplicate(text):
-    return list(collections.OrderedDict.fromkeys(text))
-
-
-def caesar_encipher_letter(accented_letter, shift):
-    """Encipher a letter, given a shift amount
-
-    >>> caesar_encipher_letter('a', 1)
-    'b'
-    >>> caesar_encipher_letter('a', 2)
-    'c'
-    >>> caesar_encipher_letter('b', 2)
-    'd'
-    >>> caesar_encipher_letter('x', 2)
-    'z'
-    >>> caesar_encipher_letter('y', 2)
-    'a'
-    >>> caesar_encipher_letter('z', 2)
-    'b'
-    >>> caesar_encipher_letter('z', -1)
-    'y'
-    >>> caesar_encipher_letter('a', -1)
-    'z'
-    >>> caesar_encipher_letter('A', 1)
-    'B'
-    >>> caesar_encipher_letter('é', 1)
-    'f'
-    """
-    letter = unaccent(accented_letter)
-    if letter in string.ascii_letters:
-        if letter in string.ascii_uppercase:
-            alphabet_start = ord('A')
-        else:
-            alphabet_start = ord('a')
-        return chr(((ord(letter) - alphabet_start + shift) % 26) + 
-                   alphabet_start)
-    else:
-        return letter
-
-def caesar_decipher_letter(letter, shift):
-    """Decipher a letter, given a shift amount
-    
-    >>> caesar_decipher_letter('b', 1)
-    'a'
-    >>> caesar_decipher_letter('b', 2)
-    'z'
-    """
-    return caesar_encipher_letter(letter, -shift)
-
-def caesar_encipher(message, shift):
-    """Encipher a message with the Caesar cipher of given shift
-    
-    >>> caesar_encipher('abc', 1)
-    'bcd'
-    >>> caesar_encipher('abc', 2)
-    'cde'
-    >>> caesar_encipher('abcxyz', 2)
-    'cdezab'
-    >>> caesar_encipher('ab cx yz', 2)
-    'cd ez ab'
-    >>> caesar_encipher('Héllo World!', 2)
-    'Jgnnq Yqtnf!'
-    """
-    enciphered = [caesar_encipher_letter(l, shift) for l in message]
-    return ''.join(enciphered)
-
-def caesar_decipher(message, shift):
-    """Decipher a message with the Caesar cipher of given shift
-    
-    >>> caesar_decipher('bcd', 1)
-    'abc'
-    >>> caesar_decipher('cde', 2)
-    'abc'
-    >>> caesar_decipher('cd ez ab', 2)
-    'ab cx yz'
-    >>> caesar_decipher('Jgnnq Yqtnf!', 2)
-    'Hello World!'
-    """
-    return caesar_encipher(message, -shift)
-
-def affine_encipher_letter(accented_letter, multiplier=1, adder=0, one_based=True):
-    """Encipher a letter, given a multiplier and adder
-    
-    >>> ''.join([affine_encipher_letter(l, 3, 5, True) \
-            for l in string.ascii_uppercase])
-    'HKNQTWZCFILORUXADGJMPSVYBE'
-    >>> ''.join([affine_encipher_letter(l, 3, 5, False) \
-            for l in string.ascii_uppercase])
-    'FILORUXADGJMPSVYBEHKNQTWZC'
-    """
-    letter = unaccent(accented_letter)
-    if letter in string.ascii_letters:
-        if letter in string.ascii_uppercase:
-            alphabet_start = ord('A')
-        else:
-            alphabet_start = ord('a')
-        letter_number = ord(letter) - alphabet_start
-        if one_based: letter_number += 1
-        cipher_number = (letter_number * multiplier + adder) % 26
-        if one_based: cipher_number -= 1
-        return chr(cipher_number % 26 + alphabet_start)
-    else:
-        return letter
-
-def affine_decipher_letter(letter, multiplier=1, adder=0, one_based=True):
-    """Encipher a letter, given a multiplier and adder
-    
-    >>> ''.join([affine_decipher_letter(l, 3, 5, True) \
-            for l in 'HKNQTWZCFILORUXADGJMPSVYBE'])
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-    >>> ''.join([affine_decipher_letter(l, 3, 5, False) \
-            for l in 'FILORUXADGJMPSVYBEHKNQTWZC'])
-    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-    """
-    if letter in string.ascii_letters:
-        if letter in string.ascii_uppercase:
-            alphabet_start = ord('A')
-        else:
-            alphabet_start = ord('a')
-        cipher_number = ord(letter) - alphabet_start
-        if one_based: cipher_number += 1
-        plaintext_number = ( 
-            modular_division_table[multiplier]
-                                  [(cipher_number - adder) % 26])
-        if one_based: plaintext_number -= 1
-        return chr(plaintext_number % 26 + alphabet_start) 
-    else:
-        return letter
-
-def affine_encipher(message, multiplier=1, adder=0, one_based=True):
-    """Encipher a message
-    
-    >>> affine_encipher('hours passed during which jerico tried every ' \
-           'trick he could think of', 15, 22, True)
-    'lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls omytd jlaxe mh'
-    """
-    enciphered = [affine_encipher_letter(l, multiplier, adder, one_based) 
-                  for l in message]
-    return ''.join(enciphered)
-
-def affine_decipher(message, multiplier=1, adder=0, one_based=True):
-    """Decipher a message
-    
-    >>> affine_decipher('lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg ' \
-           'jfaoe ls omytd jlaxe mh', 15, 22, True)
-    'hours passed during which jerico tried every trick he could think of'
-    """
-    enciphered = [affine_decipher_letter(l, multiplier, adder, one_based) 
-                  for l in message]
-    return ''.join(enciphered)
-
-
-class KeywordWrapAlphabet(Enum):
-    from_a = 1
-    from_last = 2
-    from_largest = 3
-
-
-def keyword_cipher_alphabet_of(keyword, wrap_alphabet=KeywordWrapAlphabet.from_a):
-    """Find the cipher alphabet given a keyword.
-    wrap_alphabet controls how the rest of the alphabet is added
-    after the keyword.
-
-    >>> keyword_cipher_alphabet_of('bayes')
-    'bayescdfghijklmnopqrtuvwxz'
-    >>> keyword_cipher_alphabet_of('bayes', KeywordWrapAlphabet.from_a)
-    'bayescdfghijklmnopqrtuvwxz'
-    >>> keyword_cipher_alphabet_of('bayes', KeywordWrapAlphabet.from_last)
-    'bayestuvwxzcdfghijklmnopqr'
-    >>> keyword_cipher_alphabet_of('bayes', KeywordWrapAlphabet.from_largest)
-    'bayeszcdfghijklmnopqrtuvwx'
-    """
-    if wrap_alphabet == KeywordWrapAlphabet.from_a:
-        cipher_alphabet = ''.join(deduplicate(sanitise(keyword) + 
-                                              string.ascii_lowercase))
-    else:
-        if wrap_alphabet == KeywordWrapAlphabet.from_last:
-            last_keyword_letter = deduplicate(sanitise(keyword))[-1]
-        else:
-            last_keyword_letter = sorted(sanitise(keyword))[-1]
-        last_keyword_position = string.ascii_lowercase.find(
-            last_keyword_letter) + 1
-        cipher_alphabet = ''.join(
-            deduplicate(sanitise(keyword) + 
-                        string.ascii_lowercase[last_keyword_position:] + 
-                        string.ascii_lowercase))
-    return cipher_alphabet
-
-
-def keyword_encipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a):
-    """Enciphers a message with a keyword substitution cipher.
-    wrap_alphabet controls how the rest of the alphabet is added
-    after the keyword.
-    0 : from 'a'
-    1 : from the last letter in the sanitised keyword
-    2 : from the largest letter in the sanitised keyword
-
-    >>> keyword_encipher('test message', 'bayes')
-    'rsqr ksqqbds'
-    >>> keyword_encipher('test message', 'bayes', KeywordWrapAlphabet.from_a)
-    'rsqr ksqqbds'
-    >>> keyword_encipher('test message', 'bayes', KeywordWrapAlphabet.from_last)
-    'lskl dskkbus'
-    >>> keyword_encipher('test message', 'bayes', KeywordWrapAlphabet.from_largest)
-    'qspq jsppbcs'
-    """
-    cipher_alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet)
-    cipher_translation = ''.maketrans(string.ascii_lowercase, cipher_alphabet)
-    return unaccent(message).lower().translate(cipher_translation)
-
-def keyword_decipher(message, keyword, wrap_alphabet=KeywordWrapAlphabet.from_a):
-    """Deciphers a message with a keyword substitution cipher.
-    wrap_alphabet controls how the rest of the alphabet is added
-    after the keyword.
-    0 : from 'a'
-    1 : from the last letter in the sanitised keyword
-    2 : from the largest letter in the sanitised keyword
-    
-    >>> keyword_decipher('rsqr ksqqbds', 'bayes')
-    'test message'
-    >>> keyword_decipher('rsqr ksqqbds', 'bayes', KeywordWrapAlphabet.from_a)
-    'test message'
-    >>> keyword_decipher('lskl dskkbus', 'bayes', KeywordWrapAlphabet.from_last)
-    'test message'
-    >>> keyword_decipher('qspq jsppbcs', 'bayes', KeywordWrapAlphabet.from_largest)
-    'test message'
-    """
-    cipher_alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet)
-    cipher_translation = ''.maketrans(cipher_alphabet, string.ascii_lowercase)
-    return message.lower().translate(cipher_translation)
-
-
-def vigenere_encipher(message, keyword):
-    """Vigenere encipher
-
-    >>> vigenere_encipher('hello', 'abc')
-    'hfnlp'
-    """
-    shifts = [ord(l) - ord('a') for l in sanitise(keyword)]
-    pairs = zip(message, cycle(shifts))
-    return ''.join([caesar_encipher_letter(l, k) for l, k in pairs])
-
-def vigenere_decipher(message, keyword):
-    """Vigenere decipher
-
-    >>> vigenere_decipher('hfnlp', 'abc')
-    'hello'
-    """
-    shifts = [ord(l) - ord('a') for l in sanitise(keyword)]
-    pairs = zip(message, cycle(shifts))
-    return ''.join([caesar_decipher_letter(l, k) for l, k in pairs])
-
-beaufort_encipher=vigenere_decipher
-beaufort_decipher=vigenere_encipher
-
-
-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.
-
-    >>> 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
-
-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
-
-def column_transposition_encipher(message, keyword, fillvalue=' ', 
-      fillcolumnwise=False,
-      emptycolumnwise=False):
-    """Enciphers using the column transposition cipher.
-    Message is padded to allow all rows to be the same length.
-
-    >>> column_transposition_encipher('hellothere', 'abcdef', fillcolumnwise=True)
-    'hlohr eltee '
-    >>> column_transposition_encipher('hellothere', 'abcdef', fillcolumnwise=True, emptycolumnwise=True)
-    'hellothere  '
-    >>> column_transposition_encipher('hellothere', 'abcdef')
-    'hellothere  '
-    >>> column_transposition_encipher('hellothere', 'abcde')
-    'hellothere'
-    >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=True, emptycolumnwise=True)
-    'hellothere'
-    >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=True, emptycolumnwise=False)
-    'hlohreltee'
-    >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=False, emptycolumnwise=True)
-    'htehlelroe'
-    >>> column_transposition_encipher('hellothere', 'abcde', fillcolumnwise=False, emptycolumnwise=False)
-    'hellothere'
-    >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=True, emptycolumnwise=True)
-    'heotllrehe'
-    >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=True, emptycolumnwise=False)
-    'holrhetlee'
-    >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=False, emptycolumnwise=True)
-    'htleehoelr'
-    >>> column_transposition_encipher('hellothere', 'clever', fillcolumnwise=False, emptycolumnwise=False)
-    'hleolteher'
-    >>> column_transposition_encipher('hellothere', 'cleverly')
-    'hleolthre e '
-    >>> column_transposition_encipher('hellothere', 'cleverly', fillvalue='!')
-    'hleolthre!e!'
-    >>> column_transposition_encipher('hellothere', 'cleverly', fillvalue=lambda: '*')
-    'hleolthre*e*'
-    """
-    transpositions = transpositions_of(keyword)
-    message += pad(len(message), len(transpositions), fillvalue)
-    if fillcolumnwise:
-        rows = every_nth(message, len(message) // len(transpositions))
-    else:
-        rows = chunks(message, len(transpositions))
-    transposed = [transpose(r, transpositions) for r in rows]
-    if emptycolumnwise:
-        return combine_every_nth(transposed)
-    else:
-        return ''.join(chain(*transposed))
-
-def column_transposition_decipher(message, keyword, fillvalue=' ', 
-      fillcolumnwise=False,
-      emptycolumnwise=False):
-    """Deciphers using the column transposition cipher.
-    Message is padded to allow all rows to be the same length.
-
-    >>> column_transposition_decipher('hellothere', 'abcde', fillcolumnwise=True, emptycolumnwise=True)
-    'hellothere'
-    >>> column_transposition_decipher('hlohreltee', 'abcde', fillcolumnwise=True, emptycolumnwise=False)
-    'hellothere'
-    >>> column_transposition_decipher('htehlelroe', 'abcde', fillcolumnwise=False, emptycolumnwise=True)
-    'hellothere'
-    >>> column_transposition_decipher('hellothere', 'abcde', fillcolumnwise=False, emptycolumnwise=False)
-    'hellothere'
-    >>> column_transposition_decipher('heotllrehe', 'clever', fillcolumnwise=True, emptycolumnwise=True)
-    'hellothere'
-    >>> column_transposition_decipher('holrhetlee', 'clever', fillcolumnwise=True, emptycolumnwise=False)
-    'hellothere'
-    >>> column_transposition_decipher('htleehoelr', 'clever', fillcolumnwise=False, emptycolumnwise=True)
-    'hellothere'
-    >>> column_transposition_decipher('hleolteher', 'clever', fillcolumnwise=False, emptycolumnwise=False)
-    'hellothere'
-    """
-    transpositions = transpositions_of(keyword)
-    message += pad(len(message), len(transpositions), fillvalue)
-    if emptycolumnwise:
-        rows = every_nth(message, len(message) // len(transpositions))
-    else:
-        rows = chunks(message, len(transpositions))
-    untransposed = [untranspose(r, transpositions) for r in rows]
-    if fillcolumnwise:
-        return combine_every_nth(untransposed)
-    else:
-        return ''.join(chain(*untransposed))
-
-def scytale_encipher(message, rows, fillvalue=' '):
-    """Enciphers using the scytale transposition cipher.
-    Message is padded with spaces to allow all rows to be the same length.
-
-    >>> scytale_encipher('thequickbrownfox', 3)
-    'tcnhkfeboqrxuo iw '
-    >>> scytale_encipher('thequickbrownfox', 4)
-    'tubnhirfecooqkwx'
-    >>> scytale_encipher('thequickbrownfox', 5)
-    'tubn hirf ecoo qkwx '
-    >>> scytale_encipher('thequickbrownfox', 6)
-    'tqcrnxhukof eibwo '
-    >>> scytale_encipher('thequickbrownfox', 7)
-    'tqcrnx hukof  eibwo  '
-    """
-    # 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)]
-    return column_transposition_encipher(message, transpositions, 
-        fillvalue=fillvalue, fillcolumnwise=True, emptycolumnwise=False)
-
-def scytale_decipher(message, rows):
-    """Deciphers using the scytale transposition cipher.
-    Assumes the message is padded so that all rows are the same length.
-    
-    >>> scytale_decipher('tcnhkfeboqrxuo iw ', 3)
-    'thequickbrownfox  '
-    >>> scytale_decipher('tubnhirfecooqkwx', 4)
-    'thequickbrownfox'
-    >>> scytale_decipher('tubn hirf ecoo qkwx ', 5)
-    'thequickbrownfox    '
-    >>> scytale_decipher('tqcrnxhukof eibwo ', 6)
-    'thequickbrownfox  '
-    >>> scytale_decipher('tqcrnx hukof  eibwo  ', 7)
-    'thequickbrownfox     '
-    """
-    # transpositions = [i for i in range(math.ceil(len(message) / rows))]
-    # return column_transposition_decipher(message, transpositions, 
-    #     fillcolumnwise=False, emptycolumnwise=True)
-    transpositions = [i for i in range(rows)]
-    return column_transposition_decipher(message, transpositions, 
-        fillcolumnwise=True, emptycolumnwise=False)
-
-
-def railfence_encipher(message, height, fillvalue=''):
-    """Railfence cipher.
-    Works by splitting the text into sections, then reading across them to
-    generate the rows in the cipher. The rows are then combined to form the
-    ciphertext.
-
-    Example: the plaintext "hellotherefriends", with a height of four, written 
-    out in the railfence as 
-       h h i
-       etere*
-       lorfns
-       l e d
-    (with the * showing the one character to finish the last section). 
-    Each 'section' is two columns, but unfolded. In the example, the first
-    section is 'hellot'.
-
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 2, fillvalue='!')
-    'hlohraateerishsslnpeefetotsigaleccpeselteevsmhatetiiaogicotxfretnrifneihr!'
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 3, fillvalue='!')
-    'horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr!!lhateihsnefttiaece!'
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 5, fillvalue='!')
-    'hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!'
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 10, fillvalue='!')
-    'hepisehagitnr!!lernesge!!lmtocerh!!otiletap!!tseaorii!!hassfolc!!evtitffe!!rahsetec!!eixn!'
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 3)
-    'horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihrlhateihsnefttiaece'
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 5)
-    'hresleogcseeemhetaocofrnrnerlhateihsnefttiaeceltvsatiigitxetifihoarspeslp'
-    >>> railfence_encipher('hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers', 7)
-    'haspolsevsetgifrifrlatihnettaeelemtiocxernhorersleesgcptehaiaottneihesfic'
-    """
-    sections = chunks(message, (height - 1) * 2, fillvalue=fillvalue)
-    n_sections = len(sections)
-    # Add the top row
-    rows = [''.join([s[0] for s in sections])]
-    # process the middle rows of the grid
-    for r in range(1, height-1):
-        rows += [''.join([s[r:r+1] + s[height*2-r-2:height*2-r-1] for s in sections])]
-    # process the bottom row
-    rows += [''.join([s[height - 1:height] for s in sections])]
-    # rows += [' '.join([s[height - 1] for s in sections])]
-    return ''.join(rows)
-
-def railfence_decipher(message, height, fillvalue=''):
-    """Railfence decipher. 
-    Works by reconstructing the grid used to generate the ciphertext, then
-    unfolding the sections so the text can be concatenated together.
-
-    Example: given the ciphertext 'hhieterelorfnsled' and a height of 4, first
-    work out that the second row has a character missing, find the rows of the
-    grid, then split the section into its two columns.
-
-    'hhieterelorfnsled' is split into
-        h h i
-        etere
-        lorfns
-        l e d
-    (spaces added for clarity), which is stored in 'rows'. This is then split
-    into 'down_rows' and 'up_rows':
-
-    down_rows:
-       hhi
-       eee
-       lrn
-       led
-
-    up_rows:
-       tr
-       ofs
-
-    These are then zipped together (after the up_rows are reversed) to recover 
-    the plaintext.
-
-    Most of the procedure is about finding the correct lengths for each row then
-    splitting the ciphertext into those rows.
-
-    >>> railfence_decipher('hlohraateerishsslnpeefetotsigaleccpeselteevsmhatetiiaogicotxfretnrifneihr!', 2).strip('!')
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    >>> railfence_decipher('horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihr!!lhateihsnefttiaece!', 3).strip('!')
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    >>> railfence_decipher('hresleogcseeemhetaocofrnrner!!lhateihsnefttiaece!!ltvsatiigitxetifih!!oarspeslp!', 5).strip('!')
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    >>> railfence_decipher('hepisehagitnr!!lernesge!!lmtocerh!!otiletap!!tseaorii!!hassfolc!!evtitffe!!rahsetec!!eixn!', 10).strip('!')
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    >>> railfence_decipher('horaersslpeeosglcpselteevsmhatetiiaogicotxfretnrifneihrlhateihsnefttiaece', 3)
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    >>> railfence_decipher('hresleogcseeemhetaocofrnrnerlhateihsnefttiaeceltvsatiigitxetifihoarspeslp', 5)
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    >>> railfence_decipher('haspolsevsetgifrifrlatihnettaeelemtiocxernhorersleesgcptehaiaottneihesfic', 7)
-    'hellothereavastmeheartiesthisisalongpieceoftextfortestingrailfenceciphers'
-    """
-    # find the number and size of the sections, including how many characters
-    #   are missing for a full grid
-    n_sections = math.ceil(len(message) / ((height - 1) * 2))
-    padding_to_add = n_sections * (height - 1) * 2 - len(message)
-    # row_lengths are for the both up rows and down rows
-    row_lengths = [n_sections] * (height - 1) * 2
-    for i in range((height - 1) * 2 - 1, (height - 1) * 2 - (padding_to_add + 1), -1):
-        row_lengths[i] -= 1
-    # folded_rows are the combined row lengths in the middle of the railfence
-    folded_row_lengths = [row_lengths[0]]
-    for i in range(1, height-1):
-        folded_row_lengths += [row_lengths[i] + row_lengths[-i]]
-    folded_row_lengths += [row_lengths[height - 1]]
-    # find the rows that form the railfence grid
-    rows = []
-    row_start = 0
-    for i in folded_row_lengths:
-        rows += [message[row_start:row_start + i]]
-        row_start += i
-    # split the rows into the 'down_rows' (those that form the first column of
-    #   a section) and the 'up_rows' (those that ofrm the second column of a 
-    #   section).
-    down_rows = [rows[0]]
-    up_rows = []
-    for i in range(1, height-1):
-        down_rows += [''.join([c for n, c in enumerate(rows[i]) if n % 2 == 0])]
-        up_rows += [''.join([c for n, c in enumerate(rows[i]) if n % 2 == 1])]
-    down_rows += [rows[-1]]
-    up_rows.reverse()
-    return ''.join(c for r in zip_longest(*(down_rows + up_rows), fillvalue='') for c in r)
-
-def make_cadenus_keycolumn(doubled_letters = 'vw', start='a', reverse=False):
-    """Makes the key column for a Cadenus cipher (the column down between the
-        rows of letters)
-
-    >>> make_cadenus_keycolumn()['a']
-    0
-    >>> make_cadenus_keycolumn()['b']
-    1
-    >>> make_cadenus_keycolumn()['c']
-    2
-    >>> make_cadenus_keycolumn()['v']
-    21
-    >>> make_cadenus_keycolumn()['w']
-    21
-    >>> make_cadenus_keycolumn()['z']
-    24
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['a']
-    1
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['b']
-    0
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['c']
-    24
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['i']
-    18
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['j']
-    18
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['v']
-    6
-    >>> make_cadenus_keycolumn(doubled_letters='ij', start='b', reverse=True)['z']
-    2
-    """
-    index_to_remove = string.ascii_lowercase.find(doubled_letters[0])
-    short_alphabet = string.ascii_lowercase[:index_to_remove] + string.ascii_lowercase[index_to_remove+1:]
-    if reverse:
-        short_alphabet = ''.join(reversed(short_alphabet))
-    start_pos = short_alphabet.find(start)
-    rotated_alphabet = short_alphabet[start_pos:] + short_alphabet[:start_pos]
-    keycolumn = {l: i for i, l in enumerate(rotated_alphabet)}
-    keycolumn[doubled_letters[0]] = keycolumn[doubled_letters[1]]
-    return keycolumn
-
-def cadenus_encipher(message, keyword, keycolumn, fillvalue='a'):
-    """Encipher with the Cadenus cipher
-
-    >>> cadenus_encipher(sanitise('Whoever has made a voyage up the Hudson ' \
-                                  'must remember the Kaatskill mountains. ' \
-                                  'They are a dismembered branch of the great'), \
-                'wink', \
-                make_cadenus_keycolumn(doubled_letters='vw', start='a', reverse=True))
-    'antodeleeeuhrsidrbhmhdrrhnimefmthgeaetakseomehetyaasuvoyegrastmmuuaeenabbtpchehtarorikswosmvaleatned'
-    >>> cadenus_encipher(sanitise('a severe limitation on the usefulness of ' \
-                                  'the cadenus is that every message must be ' \
-                                  'a multiple of twenty-five letters long'), \
-                'easy', \
-                make_cadenus_keycolumn(doubled_letters='vw', start='a', reverse=True))
-    'systretomtattlusoatleeesfiyheasdfnmschbhneuvsnpmtofarenuseieeieltarlmentieetogevesitfaisltngeeuvowul'
-    """
-    rows = chunks(message, len(message) // 25, fillvalue=fillvalue)
-    columns = zip(*rows)
-    rotated_columns = [col[start:] + col[:start] for start, col in zip([keycolumn[l] for l in keyword], columns)]    
-    rotated_rows = zip(*rotated_columns)
-    transpositions = transpositions_of(keyword)
-    transposed = [transpose(r, transpositions) for r in rotated_rows]
-    return ''.join(chain(*transposed))
-
-def cadenus_decipher(message, keyword, keycolumn, fillvalue='a'):
-    """
-    >>> cadenus_decipher('antodeleeeuhrsidrbhmhdrrhnimefmthgeaetakseomehetyaa' \
-                         'suvoyegrastmmuuaeenabbtpchehtarorikswosmvaleatned', \
-                 'wink', \
-                 make_cadenus_keycolumn(reverse=True))
-    'whoeverhasmadeavoyageupthehudsonmustrememberthekaatskillmountainstheyareadismemberedbranchofthegreat'
-    >>> cadenus_decipher('systretomtattlusoatleeesfiyheasdfnmschbhneuvsnpmtof' \
-                        'arenuseieeieltarlmentieetogevesitfaisltngeeuvowul', \
-                 'easy', \
-                 make_cadenus_keycolumn(reverse=True))
-    'aseverelimitationontheusefulnessofthecadenusisthateverymessagemustbeamultipleoftwentyfiveletterslong'
-    """
-    rows = chunks(message, len(message) // 25, fillvalue=fillvalue)
-    transpositions = transpositions_of(keyword)
-    untransposed_rows = [untranspose(r, transpositions) for r in rows]
-    columns = zip(*untransposed_rows)
-    rotated_columns = [col[-start:] + col[:-start] for start, col in zip([keycolumn[l] for l in keyword], columns)]    
-    rotated_rows = zip(*rotated_columns)
-    # return rotated_columns
-    return ''.join(chain(*rotated_rows))
-
-
-def hill_encipher(matrix, message_letters, fillvalue='a'):
-    """Hill cipher
-
-    >>> hill_encipher(np.matrix([[7,8], [11,11]]), 'hellothere')
-    'drjiqzdrvx'
-    >>> hill_encipher(np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]]), \
-        'hello there')
-    'tfjflpznvyac'
-    """
-    n = len(matrix)
-    sanitised_message = sanitise(message_letters)
-    if len(sanitised_message) % n != 0:
-        padding = fillvalue[0] * (n - len(sanitised_message) % n)
-    else:
-        padding = ''
-    message = [ord(c) - ord('a') for c in sanitised_message + padding]
-    message_chunks = [message[i:i+n] for i in range(0, len(message), n)]
-    # message_chunks = chunks(message, len(matrix), fillvalue=None)
-    enciphered_chunks = [((matrix * np.matrix(c).T).T).tolist()[0] 
-            for c in message_chunks]
-    return ''.join([chr(int(round(l)) % 26 + ord('a')) 
-            for l in sum(enciphered_chunks, [])])
-
-def hill_decipher(matrix, message, fillvalue='a'):
-    """Hill cipher
-
-    >>> hill_decipher(np.matrix([[7,8], [11,11]]), 'drjiqzdrvx')
-    'hellothere'
-    >>> hill_decipher(np.matrix([[6, 24, 1], [13, 16, 10], [20, 17, 15]]), \
-        'tfjflpznvyac')
-    'hellothereaa'
-    """
-    adjoint = linalg.det(matrix)*linalg.inv(matrix)
-    inverse_determinant = modular_division_table[int(round(linalg.det(matrix))) % 26][1]
-    inverse_matrix = (inverse_determinant * adjoint) % 26
-    return hill_encipher(inverse_matrix, message, fillvalue)          
-
-
-# Where each piece of text ends up in the AMSCO transpositon cipher.
-# 'index' shows where the slice appears in the plaintext, with the slice
-# from 'start' to 'end'
-AmscoSlice = collections.namedtuple('AmscoSlice', ['index', 'start', 'end'])
-
-class AmscoFillStyle(Enum):
-    continuous = 1
-    same_each_row = 2
-    reverse_each_row = 3
-
-def amsco_transposition_positions(message, keyword, 
-      fillpattern=(1, 2),
-      fillstyle=AmscoFillStyle.continuous,
-      fillcolumnwise=False,
-      emptycolumnwise=True):
-    """Creates the grid for the AMSCO transposition cipher. Each element in the
-    grid shows the index of that slice and the start and end positions of the
-    plaintext that go to make it up.
-
-    >>> amsco_transposition_positions(string.ascii_lowercase, 'freddy', \
-        fillpattern=(1, 2)) # doctest:  +NORMALIZE_WHITESPACE
-    [[AmscoSlice(index=3, start=4, end=6),
-     AmscoSlice(index=2, start=3, end=4),
-     AmscoSlice(index=0, start=0, end=1),
-     AmscoSlice(index=1, start=1, end=3),
-     AmscoSlice(index=4, start=6, end=7)],
-    [AmscoSlice(index=8, start=12, end=13),
-     AmscoSlice(index=7, start=10, end=12),
-     AmscoSlice(index=5, start=7, end=9),
-     AmscoSlice(index=6, start=9, end=10),
-     AmscoSlice(index=9, start=13, end=15)],
-    [AmscoSlice(index=13, start=19, end=21),
-     AmscoSlice(index=12, start=18, end=19),
-     AmscoSlice(index=10, start=15, end=16),
-     AmscoSlice(index=11, start=16, end=18),
-     AmscoSlice(index=14, start=21, end=22)],
-    [AmscoSlice(index=18, start=27, end=28),
-     AmscoSlice(index=17, start=25, end=27),
-     AmscoSlice(index=15, start=22, end=24),
-     AmscoSlice(index=16, start=24, end=25),
-     AmscoSlice(index=19, start=28, end=30)]]
-    """
-    transpositions = transpositions_of(keyword)
-    fill_iterator = cycle(fillpattern)
-    indices = count()
-    message_length = len(message)
-
-    current_position = 0
-    grid = []
-    current_fillpattern = fillpattern
-    while current_position < message_length:
-        row = []
-        if fillstyle == AmscoFillStyle.same_each_row:
-            fill_iterator = cycle(fillpattern)
-        if fillstyle == AmscoFillStyle.reverse_each_row:
-            fill_iterator = cycle(current_fillpattern)
-        for _ in range(len(transpositions)):
-            index = next(indices)
-            gap = next(fill_iterator)
-            row += [AmscoSlice(index, current_position, current_position + gap)]
-            current_position += gap
-        grid += [row]
-        if fillstyle == AmscoFillStyle.reverse_each_row:
-            current_fillpattern = list(reversed(current_fillpattern))
-    return [transpose(r, transpositions) for r in grid]
-
-def amsco_transposition_encipher(message, keyword, 
-    fillpattern=(1,2), fillstyle=AmscoFillStyle.reverse_each_row):
-    """AMSCO transposition encipher.
-
-    >>> amsco_transposition_encipher('hellothere', 'abc', fillpattern=(1, 2))
-    'hoteelhler'
-    >>> amsco_transposition_encipher('hellothere', 'abc', fillpattern=(2, 1))
-    'hetelhelor'
-    >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(1, 2))
-    'hotelerelh'
-    >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(2, 1))
-    'hetelorlhe'
-    >>> amsco_transposition_encipher('hereissometexttoencipher', 'encode')
-    'etecstthhomoerereenisxip'
-    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2))
-    'hetcsoeisterereipexthomn'
-    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2), fillstyle=AmscoFillStyle.continuous)
-    'hecsoisttererteipexhomen'
-    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(2, 1))
-    'heecisoosttrrtepeixhemen'
-    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2))
-    'hxtomephescieretoeisnter'
-    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2), fillstyle=AmscoFillStyle.continuous)
-    'hxomeiphscerettoisenteer'
-    """
-    grid = amsco_transposition_positions(message, keyword, 
-        fillpattern=fillpattern, fillstyle=fillstyle)
-    ct_as_grid = [[message[s.start:s.end] for s in r] for r in grid]
-    return combine_every_nth(ct_as_grid)
-
-
-def amsco_transposition_decipher(message, keyword, 
-    fillpattern=(1,2), fillstyle=AmscoFillStyle.reverse_each_row):
-    """AMSCO transposition decipher
-
-    >>> amsco_transposition_decipher('hoteelhler', 'abc', fillpattern=(1, 2))
-    'hellothere'
-    >>> amsco_transposition_decipher('hetelhelor', 'abc', fillpattern=(2, 1))
-    'hellothere'
-    >>> amsco_transposition_decipher('hotelerelh', 'acb', fillpattern=(1, 2))
-    'hellothere'
-    >>> amsco_transposition_decipher('hetelorlhe', 'acb', fillpattern=(2, 1))
-    'hellothere'
-    >>> amsco_transposition_decipher('etecstthhomoerereenisxip', 'encode')
-    'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('hetcsoeisterereipexthomn', 'cipher', fillpattern=(1, 2))
-    'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('hecsoisttererteipexhomen', 'cipher', fillpattern=(1, 2), fillstyle=AmscoFillStyle.continuous)
-    'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('heecisoosttrrtepeixhemen', 'cipher', fillpattern=(2, 1))
-    'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('hxtomephescieretoeisnter', 'cipher', fillpattern=(1, 3, 2))
-    'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('hxomeiphscerettoisenteer', 'cipher', fillpattern=(1, 3, 2), fillstyle=AmscoFillStyle.continuous)
-    'hereissometexttoencipher'
-    """
-
-    grid = amsco_transposition_positions(message, keyword, 
-        fillpattern=fillpattern, fillstyle=fillstyle)
-    transposed_sections = [s for c in [l for l in zip(*grid)] for s in c]
-    plaintext_list = [''] * len(transposed_sections)
-    current_pos = 0
-    for slice in transposed_sections:
-        plaintext_list[slice.index] = message[current_pos:current_pos-slice.start+slice.end][:len(message[slice.start:slice.end])]
-        current_pos += len(message[slice.start:slice.end])
-    return ''.join(plaintext_list)
-
-
-class PocketEnigma(object):
-    """A pocket enigma machine
-    The wheel is internally represented as a 26-element list self.wheel_map, 
-    where wheel_map[i] == j shows that the position i places on from the arrow 
-    maps to the position j places on.
-    """
-    def __init__(self, wheel=1, position='a'):
-        """initialise the pocket enigma, including which wheel to use and the
-        starting position of the wheel.
-
-        The wheel is either 1 or 2 (the predefined wheels) or a list of letter
-        pairs.
-
-        The position is the letter pointed to by the arrow on the wheel.
-
-        >>> pe.wheel_map
-        [25, 4, 23, 10, 1, 7, 9, 5, 12, 6, 3, 17, 8, 14, 13, 21, 19, 11, 20, 16, 18, 15, 24, 2, 22, 0]
-        >>> pe.position
-        0
-        """
-        self.wheel1 = [('a', 'z'), ('b', 'e'), ('c', 'x'), ('d', 'k'), 
-            ('f', 'h'), ('g', 'j'), ('i', 'm'), ('l', 'r'), ('n', 'o'), 
-            ('p', 'v'), ('q', 't'), ('s', 'u'), ('w', 'y')]
-        self.wheel2 = [('a', 'c'), ('b', 'd'), ('e', 'w'), ('f', 'i'), 
-            ('g', 'p'), ('h', 'm'), ('j', 'k'), ('l', 'n'), ('o', 'q'), 
-            ('r', 'z'), ('s', 'u'), ('t', 'v'), ('x', 'y')]
-        if wheel == 1:
-            self.make_wheel_map(self.wheel1)
-        elif wheel == 2:
-            self.make_wheel_map(self.wheel2)
-        else:
-            self.validate_wheel_spec(wheel)
-            self.make_wheel_map(wheel)
-        if position in string.ascii_lowercase:
-            self.position = ord(position) - ord('a')
-        else:
-            self.position = position
-
-    def make_wheel_map(self, wheel_spec):
-        """Expands a wheel specification from a list of letter-letter pairs
-        into a full wheel_map.
-
-        >>> pe.make_wheel_map(pe.wheel2)
-        [2, 3, 0, 1, 22, 8, 15, 12, 5, 10, 9, 13, 7, 11, 16, 6, 14, 25, 20, 21, 18, 19, 4, 24, 23, 17]
-        """
-        self.validate_wheel_spec(wheel_spec)
-        self.wheel_map = [0] * 26
-        for p in wheel_spec:
-            self.wheel_map[ord(p[0]) - ord('a')] = ord(p[1]) - ord('a')
-            self.wheel_map[ord(p[1]) - ord('a')] = ord(p[0]) - ord('a')
-        return self.wheel_map
-
-    def validate_wheel_spec(self, wheel_spec):
-        """Validates that a wheel specificaiton will turn into a valid wheel
-        map.
-
-        >>> pe.validate_wheel_spec([])
-        Traceback (most recent call last):
-            ...
-        ValueError: Wheel specification has 0 pairs, requires 13
-        >>> pe.validate_wheel_spec([('a', 'b', 'c')]*13)
-        Traceback (most recent call last):
-            ...
-        ValueError: Not all mappings in wheel specificationhave two elements
-        >>> pe.validate_wheel_spec([('a', 'b')]*13)
-        Traceback (most recent call last):
-            ...
-        ValueError: Wheel specification does not contain 26 letters
-        """
-        if len(wheel_spec) != 13:
-            raise ValueError("Wheel specification has {} pairs, requires 13".
-                format(len(wheel_spec)))
-        for p in wheel_spec:
-            if len(p) != 2:
-                raise ValueError("Not all mappings in wheel specification"
-                    "have two elements")
-        if len(set([p[0] for p in wheel_spec] + 
-                    [p[1] for p in wheel_spec])) != 26:
-            raise ValueError("Wheel specification does not contain 26 letters")
-
-    def encipher_letter(self, letter):
-        """Enciphers a single letter, by advancing the wheel before looking up
-        the letter on the wheel.
-
-        >>> pe.set_position('f')
-        5
-        >>> pe.encipher_letter('k')
-        'h'
-        """
-        self.advance()
-        return self.lookup(letter)
-    decipher_letter = encipher_letter
-
-    def lookup(self, letter):
-        """Look up what a letter enciphers to, without turning the wheel.
-
-        >>> pe.set_position('f')
-        5
-        >>> ''.join([pe.lookup(l) for l in string.ascii_lowercase])
-        'udhbfejcpgmokrliwntsayqzvx'
-        >>> pe.lookup('A')
-        ''
-        """
-        if letter in string.ascii_lowercase:
-            return chr(
-                (self.wheel_map[(ord(letter) - ord('a') - self.position) % 26] + 
-                    self.position) % 26 + 
-                ord('a'))
-        else:
-            return ''
-
-    def advance(self):
-        """Advances the wheel one position.
-
-        >>> pe.set_position('f')
-        5
-        >>> pe.advance()
-        6
-        """
-        self.position = (self.position + 1) % 26
-        return self.position
-
-    def encipher(self, message, starting_position=None):
-        """Enciphers a whole message.
-
-        >>> pe.set_position('f')
-        5
-        >>> pe.encipher('helloworld')
-        'kjsglcjoqc'
-        >>> pe.set_position('f')
-        5
-        >>> pe.encipher('kjsglcjoqc')
-        'helloworld'
-        >>> pe.encipher('helloworld', starting_position = 'x')
-        'egrekthnnf'
-        """
-        if starting_position:
-            self.set_position(starting_position)
-        transformed = ''
-        for l in message:
-            transformed += self.encipher_letter(l)
-        return transformed
-    decipher = encipher
-
-    def set_position(self, position):
-        """Sets the position of the wheel, by specifying the letter the arrow
-        points to.
-
-        >>> pe.set_position('a')
-        0
-        >>> pe.set_position('m')
-        12
-        >>> pe.set_position('z')
-        25
-        """
-        self.position = ord(position) - ord('a')
-        return self.position
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod(extraglobs={'pe': PocketEnigma(1, 'a')})
diff --git a/cipherbreak.py b/cipherbreak.py
deleted file mode 100644 (file)
index 0ac8ae5..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-"""A set of functions to break the ciphers give in ciphers.py.
-"""
-
-import string
-import collections
-import norms
-import logging
-import random
-import math
-from itertools import starmap
-from segment import segment
-from multiprocessing import Pool
-
-import matplotlib.pyplot as plt
-
-logger = logging.getLogger(__name__)
-logger.addHandler(logging.FileHandler('cipher.log'))
-logger.setLevel(logging.WARNING)
-#logger.setLevel(logging.INFO)
-#logger.setLevel(logging.DEBUG)
-
-from cipher import *
-from language_models import *
-
-# To time a run:
-#
-# import timeit
-# c5a = open('2012/5a.ciphertext', 'r').read()
-# timeit.timeit('keyword_break(c5a)', setup='gc.enable() ; from __main__ import c5a ; from cipher import keyword_break', number=1)
-# timeit.repeat('keyword_break_mp(c5a, chunksize=500)', setup='gc.enable() ; from __main__ import c5a ; from cipher import keyword_break_mp', repeat=5, number=1)
-
-transpositions = collections.defaultdict(list)
-for word in keywords:
-    transpositions[transpositions_of(word)] += [word]
-
-def frequencies(text):
-    """Count the number of occurrences of each character in text
-
-    >>> sorted(frequencies('abcdefabc').items())
-    [('a', 2), ('b', 2), ('c', 2), ('d', 1), ('e', 1), ('f', 1)]
-    >>> sorted(frequencies('the quick brown fox jumped over the lazy ' \
-         'dog').items()) # doctest: +NORMALIZE_WHITESPACE
-    [(' ', 8), ('a', 1), ('b', 1), ('c', 1), ('d', 2), ('e', 4), ('f', 1),
-     ('g', 1), ('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)]
-    >>> sorted(frequencies('The Quick BROWN fox jumped! over... the ' \
-         '(9lazy) DOG').items()) # doctest: +NORMALIZE_WHITESPACE
-    [(' ', 8), ('!', 1), ('(', 1), (')', 1), ('.', 3), ('9', 1), ('B', 1),
-     ('D', 1), ('G', 1), ('N', 1), ('O', 2), ('Q', 1), ('R', 1), ('T', 1),
-     ('W', 1), ('a', 1), ('c', 1), ('d', 1), ('e', 4), ('f', 1), ('h', 2),
-     ('i', 1), ('j', 1), ('k', 1), ('l', 1), ('m', 1), ('o', 2), ('p', 1),
-     ('r', 1), ('t', 1), ('u', 2), ('v', 1), ('x', 1), ('y', 1), ('z', 1)]
-    >>> sorted(frequencies(sanitise('The Quick BROWN fox jumped! over... '\
-         'the (9lazy) DOG')).items()) # doctest: +NORMALIZE_WHITESPACE
-    [('a', 1), ('b', 1), ('c', 1), ('d', 2), ('e', 4), ('f', 1), ('g', 1),
-     ('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
-    """
-    return collections.Counter(c for c in text)
-
-
-def caesar_break(message, fitness=Pletters):
-    """Breaks a Caesar cipher using frequency analysis
-
-    >>> caesar_break('ibxcsyorsaqcheyklxivoexlevmrimwxsfiqevvmihrsasrxliwyrh' \
-          'ecjsppsamrkwleppfmergefifvmhixscsymjcsyqeoixlm') # doctest: +ELLIPSIS
-    (4, -130.849989015...)
-    >>> caesar_break('wxwmaxdgheetgwuxztgptedbgznitgwwhpguxyhkxbmhvvtlbhgtee' \
-          'raxlmhiixweblmxgxwmhmaxybkbgztgwztsxwbgmxgmert') # doctest: +ELLIPSIS
-    (19, -128.82410410...)
-    >>> caesar_break('yltbbqnqnzvguvaxurorgenafsbezqvagbnornfgsbevpnaabjurer' \
-          'svaquvzyvxrnznazlybequrvfohgriraabjtbaruraprur') # doctest: +ELLIPSIS
-    (13, -126.25403935...)
-    """
-    sanitised_message = sanitise(message)
-    best_shift = 0
-    best_fit = float('-inf')
-    for shift in range(26):
-        plaintext = caesar_decipher(sanitised_message, shift)
-        fit = fitness(plaintext)
-        logger.debug('Caesar break attempt using key {0} gives fit of {1} '
-                     'and decrypt starting: {2}'.format(shift, fit,
-                                                        plaintext[:50]))
-        if fit > best_fit:
-            best_fit = fit
-            best_shift = shift
-    logger.info('Caesar break best fit: key {0} gives fit of {1} and '
-                'decrypt starting: {2}'.format(best_shift, best_fit, 
-                    caesar_decipher(sanitised_message, best_shift)[:50]))
-    return best_shift, best_fit
-
-def affine_break(message, fitness=Pletters):
-    """Breaks an affine cipher using frequency analysis
-
-    >>> affine_break('lmyfu bkuusd dyfaxw claol psfaom jfasd snsfg jfaoe ls ' \
-          'omytd jlaxe mh jm bfmibj umis hfsul axubafkjamx. ls kffkxwsd jls ' \
-          'ofgbjmwfkiu olfmxmtmwaokttg jlsx ls kffkxwsd jlsi zg tsxwjl. jlsx ' \
-          'ls umfjsd jlsi zg hfsqysxog. ls dmmdtsd mx jls bats mh bkbsf. ls ' \
-          'bfmctsd kfmyxd jls lyj, mztanamyu xmc jm clm cku tmmeaxw kj lai ' \
-          'kxd clm ckuxj.') # doctest: +ELLIPSIS
-    ((15, 22, True), -340.601181913...)
-    """
-    sanitised_message = sanitise(message)
-    best_multiplier = 0
-    best_adder = 0
-    best_one_based = True
-    best_fit = float("-inf")
-    for one_based in [True, False]:
-        for multiplier in [x for x in range(1, 26, 2) if x != 13]:
-            for adder in range(26):
-                plaintext = affine_decipher(sanitised_message,
-                                            multiplier, adder, one_based)
-                fit = fitness(plaintext)
-                logger.debug('Affine break attempt using key {0}x+{1} ({2}) '
-                             'gives fit of {3} and decrypt starting: {4}'.
-                             format(multiplier, adder, one_based, fit,
-                                    plaintext[:50]))
-                if fit > best_fit:
-                    best_fit = fit
-                    best_multiplier = multiplier
-                    best_adder = adder
-                    best_one_based = one_based
-    logger.info('Affine break best fit with key {0}x+{1} ({2}) gives fit of '
-                '{3} and decrypt starting: {4}'.format(
-                    best_multiplier, best_adder, best_one_based, best_fit,
-                    affine_decipher(sanitised_message, best_multiplier,
-                                    best_adder, best_one_based)[:50]))
-    return (best_multiplier, best_adder, best_one_based), best_fit
-
-def keyword_break(message, wordlist=keywords, fitness=Pletters):
-    """Breaks a keyword substitution cipher using a dictionary and
-    frequency analysis.
-
-    >>> keyword_break(keyword_encipher('this is a test message for the ' \
-          'keyword decipherment', 'elephant', KeywordWrapAlphabet.from_last), \
-          wordlist=['cat', 'elephant', 'kangaroo']) # doctest: +ELLIPSIS
-    (('elephant', <KeywordWrapAlphabet.from_last: 2>), -52.834575011...)
-    """
-    best_keyword = ''
-    best_wrap_alphabet = True
-    best_fit = float("-inf")
-    for wrap_alphabet in KeywordWrapAlphabet:
-        for keyword in wordlist:
-            plaintext = keyword_decipher(message, keyword, wrap_alphabet)
-            fit = fitness(plaintext)
-            logger.debug('Keyword break attempt using key {0} (wrap={1}) '
-                         'gives fit of {2} and decrypt starting: {3}'.format(
-                             keyword, wrap_alphabet, fit,
-                             sanitise(plaintext)[:50]))
-            if fit > best_fit:
-                best_fit = fit
-                best_keyword = keyword
-                best_wrap_alphabet = wrap_alphabet
-    logger.info('Keyword break best fit with key {0} (wrap={1}) gives fit of '
-                '{2} and decrypt starting: {3}'.format(best_keyword,
-                    best_wrap_alphabet, best_fit, sanitise(
-                        keyword_decipher(message, best_keyword,
-                                         best_wrap_alphabet))[:50]))
-    return (best_keyword, best_wrap_alphabet), best_fit
-
-def keyword_break_mp(message, wordlist=keywords, fitness=Pletters,
-                     number_of_solutions=1, chunksize=500):
-    """Breaks a keyword substitution cipher using a dictionary and
-    frequency analysis
-
-    >>> keyword_break_mp(keyword_encipher('this is a test message for the ' \
-          'keyword decipherment', 'elephant', KeywordWrapAlphabet.from_last), \
-          wordlist=['cat', 'elephant', 'kangaroo']) # doctest: +ELLIPSIS
-    (('elephant', <KeywordWrapAlphabet.from_last: 2>), -52.834575011...)
-    >>> keyword_break_mp(keyword_encipher('this is a test message for the ' \
-          'keyword decipherment', 'elephant', KeywordWrapAlphabet.from_last), \
-          wordlist=['cat', 'elephant', 'kangaroo'], \
-          number_of_solutions=2) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
-    [(('elephant', <KeywordWrapAlphabet.from_last: 2>), -52.834575011...), 
-    (('elephant', <KeywordWrapAlphabet.from_largest: 3>), -52.834575011...)]
-    """
-    with Pool() as pool:
-        helper_args = [(message, word, wrap, fitness)
-                       for word in wordlist
-                       for wrap in KeywordWrapAlphabet]
-        # Gotcha: the helper function here needs to be defined at the top level
-        #   (limitation of Pool.starmap)
-        breaks = pool.starmap(keyword_break_worker, helper_args, chunksize)
-        if number_of_solutions == 1:
-            return max(breaks, key=lambda k: k[1])
-        else:
-            return sorted(breaks, key=lambda k: k[1], reverse=True)[:number_of_solutions]
-
-def keyword_break_worker(message, keyword, wrap_alphabet, fitness):
-    plaintext = keyword_decipher(message, keyword, wrap_alphabet)
-    fit = fitness(plaintext)
-    logger.debug('Keyword break attempt using key {0} (wrap={1}) gives fit of '
-                 '{2} and decrypt starting: {3}'.format(keyword, 
-                     wrap_alphabet, fit, sanitise(plaintext)[:50]))
-    return (keyword, wrap_alphabet), fit
-
-def monoalphabetic_break_hillclimbing(message, max_iterations=10000000, 
-        alphabet=None, fitness=Pletters):
-    ciphertext = unaccent(message).lower()
-    if not alphabet:
-        alphabet = list(string.ascii_lowercase)
-        random.shuffle(alphabet)
-        alphabet = ''.join(alphabet)
-    return monoalphabetic_break_hillclimbing_worker(ciphertext, alphabet,
-                                                    max_iterations, fitness)
-
-def monoalphabetic_break_hillclimbing_mp(message, workers=10, 
-        max_iterations = 10000000, alphabet=None, fitness=Pletters, chunksize=1):
-    worker_args = []
-    ciphertext = unaccent(message).lower()
-    for i in range(workers):
-        if alphabet:
-            this_alphabet = alphabet
-        else:
-            this_alphabet = list(string.ascii_lowercase)
-            random.shuffle(this_alphabet)
-            this_alphabet = ''.join(this_alphabet)
-        worker_args.append((ciphertext, this_alphabet, max_iterations, fitness))
-    with Pool() as pool:
-        breaks = pool.starmap(monoalphabetic_break_hillclimbing_worker,
-                              worker_args, chunksize)
-    return max(breaks, key=lambda k: k[1])
-
-def monoalphabetic_break_hillclimbing_worker(message, alphabet,
-        max_iterations, fitness):
-    def swap(letters, i, j):
-        if i > j:
-            i, j = j, i
-        if i == j:
-            return letters
-        else:
-            return (letters[:i] + letters[j] + letters[i+1:j] + letters[i] +
-                    letters[j+1:])
-    best_alphabet = alphabet
-    best_fitness = float('-inf')
-    for i in range(max_iterations):
-        alphabet = swap(alphabet, random.randrange(26), random.randrange(26))
-        cipher_translation = ''.maketrans(string.ascii_lowercase, alphabet)
-        plaintext = message.translate(cipher_translation)
-        if fitness(plaintext) > best_fitness:
-            best_fitness = fitness(plaintext)
-            best_alphabet = alphabet
-            print(i, best_alphabet, best_fitness, plaintext)
-    return best_alphabet, best_fitness
-
-
-def vigenere_keyword_break_mp(message, wordlist=keywords, fitness=Pletters,
-                              chunksize=500):
-    """Breaks a vigenere cipher using a dictionary and frequency analysis.
-
-    >>> vigenere_keyword_break_mp(vigenere_encipher(sanitise('this is a test ' \
-             'message for the vigenere decipherment'), 'cat'), \
-             wordlist=['cat', 'elephant', 'kangaroo']) # doctest: +ELLIPSIS
-    ('cat', -52.947271216...)
-    """
-    with Pool() as pool:
-        helper_args = [(message, word, fitness)
-                       for word in wordlist]
-        # Gotcha: the helper function here needs to be defined at the top level
-        #   (limitation of Pool.starmap)
-        breaks = pool.starmap(vigenere_keyword_break_worker, helper_args,
-                              chunksize)
-        return max(breaks, key=lambda k: k[1])
-vigenere_keyword_break = vigenere_keyword_break_mp
-
-def vigenere_keyword_break_worker(message, keyword, fitness):
-    plaintext = vigenere_decipher(message, keyword)
-    fit = fitness(plaintext)
-    logger.debug('Vigenere keyword break attempt using key {0} gives fit of '
-                 '{1} and decrypt starting: {2}'.format(keyword,
-                     fit, sanitise(plaintext)[:50]))
-    return keyword, fit
-
-
-def vigenere_frequency_break(message, max_key_length=20, fitness=Pletters):
-    """Breaks a Vigenere cipher with frequency analysis
-
-    >>> vigenere_frequency_break(vigenere_encipher(sanitise("It is time to " \
-            "run. She is ready and so am I. I stole Daniel's pocketbook this " \
-            "afternoon when he left his jacket hanging on the easel in the " \
-            "attic. I jump every time I hear a footstep on the stairs, " \
-            "certain that the theft has been discovered and that I will " \
-            "be caught. The SS officer visits less often now that he is " \
-            "sure"), 'florence')) # doctest: +ELLIPSIS
-    ('florence', -307.5473096791...)
-    """
-    def worker(message, key_length, fitness):
-        splits = every_nth(sanitised_message, key_length)
-        key = ''.join([chr(caesar_break(s)[0] + ord('a')) for s in splits])
-        plaintext = vigenere_decipher(message, key)
-        fit = fitness(plaintext)
-        return key, fit
-    sanitised_message = sanitise(message)
-    results = starmap(worker, [(sanitised_message, i, fitness)
-                               for i in range(1, max_key_length+1)])
-    return max(results, key=lambda k: k[1])
-
-
-def beaufort_frequency_break(message, max_key_length=20, fitness=Pletters):
-    """Breaks a Beaufort cipher with frequency analysis
-
-    >>> beaufort_frequency_break(beaufort_encipher(sanitise("It is time to " \
-            "run. She is ready and so am I. I stole Daniel's pocketbook this " \
-            "afternoon when he left his jacket hanging on the easel in the " \
-            "attic. I jump every time I hear a footstep on the stairs, " \
-            "certain that the theft has been discovered and that I will " \
-            "be caught. The SS officer visits less often now " \
-            "that he is sure"), 'florence')) # doctest: +ELLIPSIS
-    ('florence', -307.5473096791...)
-    """
-    def worker(message, key_length, fitness):
-        splits = every_nth(sanitised_message, key_length)
-        key = ''.join([chr(-caesar_break(s)[0] % 26 + ord('a'))
-                       for s in splits])
-        plaintext = beaufort_decipher(message, key)
-        fit = fitness(plaintext)
-        return key, fit
-    sanitised_message = sanitise(message)
-    results = starmap(worker, [(sanitised_message, i, fitness)
-                               for i in range(1, max_key_length+1)])
-    return max(results, key=lambda k: k[1])
-
-
-def column_transposition_break_mp(message, translist=transpositions,
-                                  fitness=Pbigrams, chunksize=500):
-    """Breaks a column transposition cipher using a dictionary and
-    n-gram frequency analysis
-
-    >>> 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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        'encipher'), \
-        translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \
-                   (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \
-                   (6, 1, 0, 4, 5, 3, 2): ['keyword']}) # doctest: +ELLIPSIS
-    (((2, 0, 5, 3, 1, 4, 6), False, False), -709.4646722...)
-    >>> 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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        'encipher'), \
-        translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \
-                   (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \
-                   (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \
-        fitness=Ptrigrams) # doctest: +ELLIPSIS
-    (((2, 0, 5, 3, 1, 4, 6), False, False), -997.0129085...)
-    """
-    with Pool() as pool:
-        helper_args = [(message, trans, fillcolumnwise, emptycolumnwise,
-                        fitness)
-                       for trans in translist.keys()
-                       for fillcolumnwise in [True, False]
-                       for emptycolumnwise in [True, False]]
-        # Gotcha: the helper function here needs to be defined at the top level
-        #   (limitation of Pool.starmap)
-        breaks = pool.starmap(column_transposition_break_worker,
-                              helper_args, chunksize) 
-        return max(breaks, key=lambda k: k[1])
-column_transposition_break = column_transposition_break_mp
-
-def column_transposition_break_worker(message, transposition,
-        fillcolumnwise, emptycolumnwise, fitness):
-    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
-
-
-def scytale_break_mp(message, max_key_length=20,
-                     fitness=Pbigrams, chunksize=500):
-    """Breaks a scytale cipher using a range of lengths and
-    n-gram frequency analysis
-
-    >>> scytale_break_mp(scytale_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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        5)) # doctest: +ELLIPSIS
-    (5, -709.4646722...)
-    >>> scytale_break_mp(scytale_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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        5), \
-        fitness=Ptrigrams) # doctest: +ELLIPSIS
-    (5, -997.0129085...)
-    """
-    with Pool() as pool:
-        helper_args = [(message, trans, False, True, fitness)
-            for trans in
-                [[col for col in range(math.ceil(len(message)/rows))]
-                    for rows in range(1,max_key_length+1)]]
-        # Gotcha: the helper function here needs to be defined at the top level
-        #   (limitation of Pool.starmap)
-        breaks = pool.starmap(column_transposition_break_worker,
-                              helper_args, chunksize)
-        best = max(breaks, key=lambda k: k[1])
-        return math.trunc(len(message) / len(best[0][0])), best[1]
-scytale_break = scytale_break_mp
-
-
-def railfence_break(message, max_key_length=20,
-                     fitness=Pletters, chunksize=500):
-    """Breaks a hill cipher using a matrix of given rank and letter frequencies
-
-    
-    """
-    
-    sanitised_message = sanitise(message)
-    results = starmap(worker, [(sanitised_message, i, fitness)
-                               for i in range(2, max_key_length+1)])
-    return max(results, key=lambda k: k[1])
-
-
-def railfence_break(message, max_key_length=20,
-                     fitness=Pbigrams, chunksize=500):
-    """Breaks a railfence cipher using a range of lengths and
-    n-gram frequency analysis
-
-    >>> railfence_break(railfence_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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        7)) # doctest: +ELLIPSIS
-    (7, -709.46467226...)
-    >>> railfence_break(railfence_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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        7), \
-        fitness=Ptrigrams) # doctest: +ELLIPSIS
-    (7, -997.0129085...)
-    """
-    def worker(message, height, fitness):
-        plaintext = railfence_decipher(message, height)
-        fit = fitness(plaintext)
-        return height, fit
-
-    sanitised_message = sanitise(message)
-    results = starmap(worker, [(sanitised_message, i, fitness)
-                               for i in range(2, max_key_length+1)])
-    return max(results, key=lambda k: k[1])
-
-def amsco_break(message, translist=transpositions, patterns = [(1, 2), (2, 1)],
-                                  fillstyles = [AmscoFillStyle.continuous, 
-                                                AmscoFillStyle.same_each_row, 
-                                                AmscoFillStyle.reverse_each_row],
-                                  fitness=Pbigrams, 
-                                  chunksize=500):
-    """Breaks an AMSCO transposition cipher using a dictionary and
-    n-gram frequency analysis
-
-    >>> amsco_break(amsco_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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        'encipher'), \
-        translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \
-                   (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \
-                   (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \
-        patterns=[(1, 2)]) # doctest: +ELLIPSIS
-    (((2, 0, 5, 3, 1, 4, 6), (1, 2)), -709.4646722...)
-    >>> amsco_break(amsco_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 \
-             little known the feelings or views of such a man may be on his \
-             first entering a neighbourhood, this truth is so well fixed in \
-             the minds of the surrounding families, that he is considered the \
-             rightful property of some one or other of their daughters."), \
-        'encipher', fillpattern=(2, 1)), \
-        translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \
-                   (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \
-                   (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \
-        patterns=[(1, 2), (2, 1)], fitness=Ptrigrams) # doctest: +ELLIPSIS
-    (((2, 0, 5, 3, 1, 4, 6), (2, 1)), -997.0129085...)
-    """
-    with Pool() as pool:
-        helper_args = [(message, trans, pattern, fillstyle, fitness)
-                       for trans in translist.keys()
-                       for pattern in patterns
-                       for fillstyle in fillstyles]
-        # Gotcha: the helper function here needs to be defined at the top level
-        #   (limitation of Pool.starmap)
-        breaks = pool.starmap(amsco_break_worker, helper_args, chunksize) 
-        return max(breaks, key=lambda k: k[1])
-
-def amsco_break_worker(message, transposition,
-        pattern, fillstyle, fitness):
-    plaintext = amsco_transposition_decipher(message, transposition,
-        fillpattern=pattern, fillstyle=fillstyle)
-    fit = fitness(sanitise(plaintext))
-    logger.debug('AMSCO transposition break attempt using key {0} and pattern'
-                         '{1} ({2}) gives fit of {3} and decrypt starting: '
-                         '{4}'.format(
-                             transposition, pattern, fillstyle, fit, 
-                             sanitise(plaintext)[:50]))
-    return (transposition, pattern, fillstyle), fit
-
-
-def hill_break(message, matrix_size=2, fitness=Pletters, 
-    number_of_solutions=1, chunksize=500):
-
-    all_matrices = [np.matrix(list(m)) 
-        for m in itertools.product([list(r) 
-            for r in itertools.product(range(26), repeat=matrix_size)], 
-        repeat=matrix_size)]
-    valid_matrices = [m for m, d in 
-        zip(all_matrices, (int(round(linalg.det(m))) for m in all_matrices))
-                  if d != 0
-                  if d % 2 != 0
-                  if d % 13 != 0 ]
-    with Pool() as pool:
-        helper_args = [(message, matrix, fitness)
-                       for matrix in valid_matrices]
-        # Gotcha: the helper function here needs to be defined at the top level
-        #   (limitation of Pool.starmap)
-        breaks = pool.starmap(hill_break_worker, helper_args, chunksize)
-        if number_of_solutions == 1:
-            return max(breaks, key=lambda k: k[1])
-        else:
-            return sorted(breaks, key=lambda k: k[1], reverse=True)[:number_of_solutions]
-
-def hill_break_worker(message, matrix, fitness):
-    plaintext = hill_decipher(matrix, message)
-    fit = fitness(plaintext)
-    logger.debug('Hill cipher break attempt using key {0} gives fit of '
-                 '{1} and decrypt starting: {2}'.format(matrix, 
-                     fit, sanitise(plaintext)[:50]))
-    return matrix, fit
-
-
-def pocket_enigma_break_by_crib(message, wheel_spec, crib, crib_position):
-    """Break a pocket enigma using a crib (some plaintext that's expected to
-    be in a certain position). Returns a list of possible starting wheel
-    positions that could produce the crib.
-
-    >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'h', 0)
-    ['a', 'f', 'q']
-    >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'he', 0)
-    ['a']
-    >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'll', 2)
-    ['a']
-    >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'l', 2)
-    ['a']
-    >>> pocket_enigma_break_by_crib('kzpjlzmoga', 1, 'l', 3)
-    ['a', 'j', 'n']
-    >>> pocket_enigma_break_by_crib('aaaaa', 1, 'l', 3)
-    []
-    """
-    pe = PocketEnigma(wheel=wheel_spec)
-    possible_positions = []
-    for p in string.ascii_lowercase:
-        pe.set_position(p)
-        plaintext = pe.decipher(message)
-        if plaintext[crib_position:crib_position+len(crib)] == crib:
-            possible_positions += [p]
-    return possible_positions
-
-
-def plot_frequency_histogram(freqs, sort_key=None):
-    x = range(len(freqs.keys()))
-    y = [freqs[l] for l in sorted(freqs.keys(), key=sort_key)]
-    f = plt.figure()
-    ax = f.add_axes([0.1, 0.1, 0.9, 0.9])
-    ax.bar(x, y, align='center')
-    ax.set_xticks(x)
-    ax.set_xticklabels(sorted(freqs.keys(), key=sort_key))
-    f.show()
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()
diff --git a/course-blurb.docx b/course-blurb.docx
new file mode 100644 (file)
index 0000000..3d14a2f
Binary files /dev/null and b/course-blurb.docx differ
diff --git a/course-blurb.odt b/course-blurb.odt
new file mode 100644 (file)
index 0000000..f53b10a
Binary files /dev/null and b/course-blurb.odt differ
diff --git a/find_best_affine_break_parameters.py b/find_best_affine_break_parameters.py
deleted file mode 100644 (file)
index e3d6bad..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-import random
-import collections
-from cipher import *
-from cipherbreak import *
-import itertools
-import csv
-
-corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), 
-    open('sherlock-holmes.txt', 'r').read(), 
-    open('war-and-peace.txt', 'r').read()]))
-corpus_length = len(corpus)
-
-euclidean_scaled_english_counts = norms.euclidean_scale(english_counts)
-
-metrics = [{'func': norms.l1, 'invert': True, 'name': 'l1'}, 
-    {'func': norms.l2, 'invert': True, 'name': 'l2'},
-    {'func': norms.l3, 'invert': True, 'name': 'l3'},
-    {'func': norms.cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}]
-    # {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'},
-    # {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}]
-scalings = [{'corpus_frequency': normalised_english_counts, 
-         'scaling': norms.normalise,
-         'name': 'normalised'},
-        {'corpus_frequency': euclidean_scaled_english_counts, 
-         'scaling': norms.euclidean_scale,
-         'name': 'euclidean_scaled'}]
-message_lengths = [2000, 1000, 500, 250, 100, 50, 20]
-
-trials = 5000
-
-scores = {}
-
-
-def make_frequency_compare_function(target_frequency, frequency_scaling, metric, invert):
-    def frequency_compare(text):
-        counts = frequency_scaling(frequencies(text))
-        if invert:
-            score = -1 * metric(target_frequency, counts)
-        else:
-            score = metric(target_frequency, counts)
-        return score
-    return frequency_compare
-
-def scoring_functions():
-    return [{'func': make_frequency_compare_function(s['corpus_frequency'], 
-                s['scaling'], m['func'], m['invert']),
-            'name': '{} + {}'.format(m['name'], s['name'])}
-        for m in metrics
-        for s in scalings] + [{'func': Pletters, 'name': 'Pletters'}]
-
-def eval_scores():
-    [eval_one_score(f, l) 
-        for f in scoring_functions()
-        for l in message_lengths]
-
-def eval_one_score(scoring_function, message_length):
-    print(scoring_function['name'], message_length, ': ', end='', flush=True)
-    if scoring_function['name'] not in scores:
-        scores[scoring_function['name']] = collections.defaultdict(int)
-    for _ in range(trials):
-        sample_start = random.randint(0, corpus_length - message_length)
-        sample = corpus[sample_start:(sample_start + message_length)]
-        multiplier = random.choice([x for x in range(1, 26, 2) if x != 13])
-        adder = random.randint(0, 25)
-        one_based = random.choice([True, False])
-        key = (multiplier, adder, one_based)
-        ciphertext = affine_encipher(sample, multiplier, adder, one_based)
-        found_key, _ = affine_break(ciphertext, scoring_function['func'])
-        if found_key == key:
-            scores[scoring_function['name']][message_length] += 1 
-    print(scores[scoring_function['name']][message_length], '/', trials)
-    return scores[scoring_function['name']][message_length]
-
-def show_results():
-    with open('affine_break_parameter_trials.csv', 'w') as f:
-        writer = csv.DictWriter(f, ['name'] + message_lengths, 
-            quoting=csv.QUOTE_NONNUMERIC)
-        writer.writeheader()
-        for scoring in sorted(scores.keys()):
-            scores[scoring]['name'] = scoring
-            writer.writerow(scores[scoring])
-
-print('Starting...')
-eval_scores()
-show_results()
diff --git a/find_best_caesar_break_parameters.py b/find_best_caesar_break_parameters.py
deleted file mode 100644 (file)
index 7a550aa..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-import random
-import collections
-from cipher import *
-from cipherbreak import *
-import itertools
-import csv
-
-corpus = sanitise(''.join([open('shakespeare.txt', 'r').read(), 
-    open('sherlock-holmes.txt', 'r').read(), 
-    open('war-and-peace.txt', 'r').read()]))
-corpus_length = len(corpus)
-
-euclidean_scaled_english_counts = norms.euclidean_scale(english_counts)
-
-metrics = [{'func': norms.l1, 'invert': True, 'name': 'l1'}, 
-    {'func': norms.l2, 'invert': True, 'name': 'l2'},
-    {'func': norms.l3, 'invert': True, 'name': 'l3'},
-    {'func': norms.cosine_similarity, 'invert': False, 'name': 'cosine_similarity'}]
-    # {'func': norms.harmonic_mean, 'invert': True, 'name': 'harmonic_mean'},
-    # {'func': norms.geometric_mean, 'invert': True, 'name': 'geometric_mean'}]
-scalings = [{'corpus_frequency': normalised_english_counts, 
-         'scaling': norms.normalise,
-         'name': 'normalised'},
-        {'corpus_frequency': euclidean_scaled_english_counts, 
-         'scaling': norms.euclidean_scale,
-         'name': 'euclidean_scaled'}]
-message_lengths = [100, 50, 30, 20, 10, 5]
-
-trials = 5000
-
-scores = {}
-
-
-def make_frequency_compare_function(target_frequency, frequency_scaling, metric, invert):
-    def frequency_compare(text):
-        counts = frequency_scaling(frequencies(text))
-        if invert:
-            score = -1 * metric(target_frequency, counts)
-        else:
-            score = metric(target_frequency, counts)
-        return score
-    return frequency_compare
-
-def scoring_functions():
-    return [{'func': make_frequency_compare_function(s['corpus_frequency'], 
-                s['scaling'], m['func'], m['invert']),
-            'name': '{} + {}'.format(m['name'], s['name'])}
-        for m in metrics
-        for s in scalings] + [{'func': Pletters, 'name': 'Pletters'}]
-
-def eval_scores():
-    [eval_one_score(f, l) 
-        for f in scoring_functions()
-        for l in message_lengths]
-
-def eval_one_score(scoring_function, message_length):
-    print(scoring_function['name'], message_length)
-    if scoring_function['name'] not in scores:
-        scores[scoring_function['name']] = collections.defaultdict(int)
-    for _ in range(trials):
-        sample_start = random.randint(0, corpus_length - message_length)
-        sample = corpus[sample_start:(sample_start + message_length)]
-        key = random.randint(1, 25)
-        ciphertext = caesar_encipher(sample, key)
-        found_key, _ = caesar_break(ciphertext, scoring_function['func'])
-        if found_key == key:
-            scores[scoring_function['name']][message_length] += 1 
-    return scores[scoring_function['name']][message_length]
-
-def show_results():
-    with open('caesar_break_parameter_trials.csv', 'w') as f:
-        writer = csv.DictWriter(f, ['name'] + message_lengths, 
-            quoting=csv.QUOTE_NONNUMERIC)
-        writer.writeheader()
-        for scoring in sorted(scores.keys()):
-            scores[scoring]['name'] = scoring
-            writer.writerow(scores[scoring])
-
-eval_scores()
-show_results()
diff --git a/find_wikipedia_titles.py b/find_wikipedia_titles.py
deleted file mode 100644 (file)
index 8d56124..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-import urllib.request
-import urllib.parse
-import json
-import time
-
-initial_request_url = "http://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&aplimit=10&apminsize=5000"
-request_url = "http://en.wikipedia.org/w/api.php?action=query&list=allpages&format=json&aplimit=10&apminsize=5000&apcontinue={}"
-titles_file = '/opt/sources/wp-titles.txt'
-
-def titles_of(result):
-    return [p['title'] for p in result['query']['allpages'] ]
-
-def next_title(result):
-    return result['query-continue']['allpages']['apcontinue']
-
-def write_titles(titles):
-    with open(titles_file, 'a') as f:
-        print('\n'.join(titles), file=f)
-
-def request_again(start_title):
-    request = urllib.request.Request(request_url.format(urllib.parse.quote(start_title)))
-    request.add_header('User-Agent','neil.wpspider@njae.me.uk')
-    result = json.loads(urllib.request.urlopen(request).read().decode())
-    return titles_of(result), next_title(result)
-
-f = open(titles_file, 'w')
-f.close()
-
-result = json.loads(urllib.request.urlopen(initial_request_url).read().decode())
-n_title = next_title(result)
-titles = titles_of(result)
-while titles != []:
-    write_titles(titles)
-    time.sleep(0.5)
-    titles, n_title = request_again(n_title)
diff --git a/language_models.py b/language_models.py
deleted file mode 100644 (file)
index bf00875..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-"""Language-specific functions, including models of languages based on data of
-its use.
-"""
-
-import string
-import random
-import norms
-import collections
-import unicodedata
-import itertools
-from math import log10
-import os 
-
-unaccent_specials = ''.maketrans({"’": "'"})
-
-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 unaccent(text):
-    """Remove all accents from letters.
-    It does this by converting the unicode string to decomposed compatability
-    form, dropping all the combining accents, then re-encoding the bytes.
-
-    >>> unaccent('hello')
-    'hello'
-    >>> unaccent('HELLO')
-    'HELLO'
-    >>> unaccent('héllo')
-    'hello'
-    >>> unaccent('héllö')
-    'hello'
-    >>> unaccent('HÉLLÖ')
-    'HELLO'
-    """
-    translated_text = text.translate(unaccent_specials)
-    return unicodedata.normalize('NFKD', translated_text).\
-        encode('ascii', 'ignore').\
-        decode('utf-8')
-
-def sanitise(text):
-    """Remove all non-alphabetic characters and convert the text to lowercase
-
-    >>> sanitise('The Quick')
-    'thequick'
-    >>> sanitise('The Quick BROWN fox jumped! over... the (9lazy) DOG')
-    'thequickbrownfoxjumpedoverthelazydog'
-    >>> sanitise('HÉLLÖ')
-    'hello'
-    """
-    # sanitised = [c.lower() for c in text if c in string.ascii_letters]
-    # return ''.join(sanitised)
-    return letters(unaccent(text)).lower()
-
-
-def datafile(name, sep='\t'):
-    """Read key,value pairs from file.
-    """
-    with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), name), 'r') as f:
-        for line in f:
-            splits = line.split(sep)
-            yield [splits[0], int(splits[1])]
-
-english_counts = collections.Counter(dict(datafile('count_1l.txt')))
-normalised_english_counts = norms.normalise(english_counts)
-
-english_bigram_counts = collections.Counter(dict(datafile('count_2l.txt')))
-normalised_english_bigram_counts = norms.normalise(english_bigram_counts)
-
-english_trigram_counts = collections.Counter(dict(datafile('count_3l.txt')))
-normalised_english_trigram_counts = norms.normalise(english_trigram_counts)
-
-with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'words.txt'), 'r') as f:
-    keywords = [line.rstrip() for line in f]
-
-
-def weighted_choice(d):
-    """Generate random item from a dictionary of item counts
-    """
-    target = random.uniform(0, sum(d.values()))
-    cuml = 0.0
-    for (l, p) in d.items():
-        cuml += p
-        if cuml > target:
-            return l
-    return None
-
-def random_english_letter():
-    """Generate a random letter based on English letter counts
-    """
-    return weighted_choice(normalised_english_counts)
-
-
-def ngrams(text, n):
-    """Returns all n-grams of a text
-    
-    >>> ngrams(sanitise('the quick brown fox'), 2) # doctest: +NORMALIZE_WHITESPACE
-    ['th', 'he', 'eq', 'qu', 'ui', 'ic', 'ck', 'kb', 'br', 'ro', 'ow', 'wn',
-     'nf', 'fo', 'ox']
-    >>> ngrams(sanitise('the quick brown fox'), 4) # doctest: +NORMALIZE_WHITESPACE
-    ['theq', 'hequ', 'equi', 'quic', 'uick', 'ickb', 'ckbr', 'kbro', 'brow',
-     'rown', 'ownf', 'wnfo', 'nfox']
-    """
-    return [text[i:i+n] for i in range(len(text)-n+1)]
-
-
-class Pdist(dict):
-    """A probability distribution estimated from counts in datafile.
-    Values are stored and returned as log probabilities.
-    """
-    def __init__(self, data=[], estimate_of_missing=None):
-        data1, data2 = itertools.tee(data)
-        self.total = sum([d[1] for d in data1])
-        for key, count in data2:
-            self[key] = log10(count / self.total)
-        self.estimate_of_missing = estimate_of_missing or (lambda k, N: 1./N)
-    def __missing__(self, key):
-        return self.estimate_of_missing(key, self.total)
-
-def log_probability_of_unknown_word(key, N):
-    """Estimate the probability of an unknown word.
-    """
-    return -log10(N * 10**((len(key) - 2) * 1.4))
-
-Pw = Pdist(datafile('count_1w.txt'), log_probability_of_unknown_word)
-Pw_wrong = Pdist(datafile('count_1w.txt'), lambda _k, N: log10(1/N))
-Pl = Pdist(datafile('count_1l.txt'), lambda _k, _N: 0)
-P2l = Pdist(datafile('count_2l.txt'), lambda _k, _N: 0)
-P3l = Pdist(datafile('count_3l.txt'), lambda _k, _N: 0)
-
-def Pwords(words):
-    """The Naive Bayes log probability of a sequence of words.
-    """
-    return sum(Pw[w.lower()] for w in words)
-
-def Pwords_wrong(words):
-    """The Naive Bayes log probability of a sequence of words.
-    """
-    return sum(Pw_wrong[w.lower()] for w in words)
-
-def Pletters(letters):
-    """The Naive Bayes log probability of a sequence of letters.
-    """
-    return sum(Pl[l.lower()] for l in letters)
-
-def Pbigrams(letters):
-    """The Naive Bayes log probability of the bigrams formed from a sequence
-    of letters.
-    """
-    return sum(P2l[p] for p in ngrams(letters, 2))
-
-def Ptrigrams(letters):
-    """The Naive Bayes log probability of the trigrams formed from a sequence
-    of letters.
-    """
-    return sum(P3l[p] for p in ngrams(letters, 3))
-
-
-def cosine_similarity_score(text):
-    """Finds the dissimilarity of a text to English, using the cosine distance
-    of the frequency distribution.
-
-    >>> cosine_similarity_score('abcabc') # doctest: +ELLIPSIS
-    0.26228882...
-    """
-    return norms.cosine_similarity(english_counts,
-                                   collections.Counter(sanitise(text)))
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()
diff --git a/lettercount.py b/lettercount.py
deleted file mode 100644 (file)
index 956eca1..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-from language_models import sanitise
-import collections
-
-corpora = ['shakespeare.txt', 'sherlock-holmes.txt', 'war-and-peace.txt']
-counts = collections.Counter()
-
-for corpus in corpora:
-    text = sanitise(open(corpus).read())
-    counts.update(text)
-
-with open('count_1l.txt', 'w') as f:
-    for l, c in counts.most_common():
-        f.write("{}\t{}\n".format(l, c))
diff --git a/make-cracking-dictionary.py b/make-cracking-dictionary.py
deleted file mode 100644 (file)
index 37de917..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-import language_models
-
-american = set(open('/usr/share/dict/american-english', 'r').readlines())
-british = set(open('/usr/share/dict/british-english', 'r').readlines())
-cracklib = set(open('/usr/share/dict/cracklib-small', 'r').readlines())
-
-words = american | british | cracklib
-
-# sanitised_words = set()
-
-# for w in words:
-    # sanitised_words.add(language_models.sanitise(w))
-    
-sanitised_words = set(language_models.sanitise(w) for w in words)
-
-sanitised_words.discard('')
-
-with open('words.txt', 'w') as f:
-    f.write('\n'.join(sorted(sanitised_words, key=lambda w: (len(w), w))))
diff --git a/norms.py b/norms.py
deleted file mode 100644 (file)
index 6645294..0000000
--- a/norms.py
+++ /dev/null
@@ -1,189 +0,0 @@
-import collections
-from math import log10
-
-def normalise(frequencies):
-    """Scale a set of frequencies so they sum to one
-    
-    >>> sorted(normalise({1: 1, 2: 0}).items())
-    [(1, 1.0), (2, 0.0)]
-    >>> sorted(normalise({1: 1, 2: 1}).items())
-    [(1, 0.5), (2, 0.5)]
-    >>> sorted(normalise({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.333...), (2, 0.333...), (3, 0.333...)]
-    >>> sorted(normalise({1: 1, 2: 2, 3: 1}).items())
-    [(1, 0.25), (2, 0.5), (3, 0.25)]
-    """
-    length = sum(f for f in frequencies.values())
-    return collections.defaultdict(int, ((k, v / length) 
-        for (k, v) in frequencies.items()))
-
-def euclidean_scale(frequencies):
-    """Scale a set of frequencies so they have a unit euclidean length
-    
-    >>> sorted(euclidean_scale({1: 1, 2: 0}).items())
-    [(1, 1.0), (2, 0.0)]
-    >>> sorted(euclidean_scale({1: 1, 2: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.7071067...), (2, 0.7071067...)]
-    >>> sorted(euclidean_scale({1: 1, 2: 1, 3: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.577350...), (2, 0.577350...), (3, 0.577350...)]
-    >>> sorted(euclidean_scale({1: 1, 2: 2, 3: 1}).items()) # doctest: +ELLIPSIS
-    [(1, 0.408248...), (2, 0.81649658...), (3, 0.408248...)]
-    """
-    length = sum([f ** 2 for f in frequencies.values()]) ** 0.5
-    return collections.defaultdict(int, ((k, v / length) 
-        for (k, v) in frequencies.items()))
-
-def identity_scale(frequencies):
-    return frequencies
-        
-
-def l2(frequencies1, frequencies2):
-    """Finds the distances between two frequency profiles, expressed as dictionaries.
-    Assumes every key in frequencies1 is also in frequencies2
-    
-    >>> l2({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1})
-    0.0
-    >>> l2({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    1.73205080...
-    >>> l2(normalise({'a':2, 'b':2, 'c':2}), normalise({'a':1, 'b':1, 'c':1}))
-    0.0
-    >>> l2({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    1.732050807...
-    >>> l2(normalise({'a':0, 'b':2, 'c':0}), \
-           normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS
-    0.81649658...
-    >>> l2({'a':0, 'b':1}, {'a':1, 'b':1})
-    1.0
-    """
-    total = 0
-    for k in frequencies1:
-        total += (frequencies1[k] - frequencies2[k]) ** 2
-    return total ** 0.5
-euclidean_distance = l2
-
-def l1(frequencies1, frequencies2):
-    """Finds the distances between two frequency profiles, expressed as 
-    dictionaries. Assumes every key in frequencies1 is also in frequencies2
-
-    >>> l1({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1})
-    0
-    >>> l1({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    3
-    >>> l1(normalise({'a':2, 'b':2, 'c':2}), normalise({'a':1, 'b':1, 'c':1}))
-    0.0
-    >>> l1({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1})
-    3
-    >>> l1({'a':0, 'b':1}, {'a':1, 'b':1})
-    1
-    """
-    total = 0
-    for k in frequencies1:
-        total += abs(frequencies1[k] - frequencies2[k])
-    return total
-
-def l3(frequencies1, frequencies2):
-    """Finds the distances between two frequency profiles, expressed as 
-    dictionaries. Assumes every key in frequencies1 is also in frequencies2
-
-    >>> l3({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1})
-    0.0
-    >>> l3({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    1.44224957...
-    >>> l3({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    1.4422495703...
-    >>> l3(normalise({'a':0, 'b':2, 'c':0}), \
-           normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS
-    0.718144896...
-    >>> l3({'a':0, 'b':1}, {'a':1, 'b':1})
-    1.0
-    >>> l3(normalise({'a':0, 'b':1}), normalise({'a':1, 'b':1})) # doctest: +ELLIPSIS
-    0.6299605249...
-    """
-    total = 0
-    for k in frequencies1:
-        total += abs(frequencies1[k] - frequencies2[k]) ** 3
-    return total ** (1/3)
-
-def geometric_mean(frequencies1, frequencies2):
-    """Finds the geometric mean of the absolute differences between two frequency profiles, 
-    expressed as dictionaries.
-    Assumes every key in frequencies1 is also in frequencies2
-    
-    >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    1
-    >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    1
-    >>> geometric_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':5, 'c':1})
-    3
-    >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \
-                       normalise({'a':1, 'b':5, 'c':1})) # doctest: +ELLIPSIS
-    0.01382140...
-    >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \
-                       normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS
-    0.0
-    >>> geometric_mean(normalise({'a':2, 'b':2, 'c':2}), \
-                       normalise({'a':1, 'b':1, 'c':0})) # doctest: +ELLIPSIS
-    0.009259259...
-    """
-    total = 1
-    for k in frequencies1:
-        total *= abs(frequencies1[k] - frequencies2[k])
-    return total
-
-def harmonic_mean(frequencies1, frequencies2):
-    """Finds the harmonic mean of the absolute differences between two frequency profiles, 
-    expressed as dictionaries.
-    Assumes every key in frequencies1 is also in frequencies2
-
-    >>> harmonic_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    1.0
-    >>> harmonic_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1})
-    1.0
-    >>> harmonic_mean({'a':2, 'b':2, 'c':2}, {'a':1, 'b':5, 'c':1}) # doctest: +ELLIPSIS
-    1.285714285...
-    >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \
-                      normalise({'a':1, 'b':5, 'c':1})) # doctest: +ELLIPSIS
-    0.228571428571...
-    >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \
-                      normalise({'a':1, 'b':1, 'c':1})) # doctest: +ELLIPSIS
-    0
-    >>> harmonic_mean(normalise({'a':2, 'b':2, 'c':2}), \
-                      normalise({'a':1, 'b':1, 'c':0})) # doctest: +ELLIPSIS
-    0.2
-    """
-    total = 0
-    for k in frequencies1:
-        if abs(frequencies1[k] - frequencies2[k]) == 0:
-            return 0
-        total += 1 / abs(frequencies1[k] - frequencies2[k])
-    return len(frequencies1) / total
-
-
-def cosine_similarity(frequencies1, frequencies2):
-    """Finds the distances between two frequency profiles, expressed as dictionaries.
-    Assumes every key in frequencies1 is also in frequencies2
-
-    >>> cosine_similarity({'a':1, 'b':1, 'c':1}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    1.0000000000...
-    >>> cosine_similarity({'a':2, 'b':2, 'c':2}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    1.0000000000...
-    >>> cosine_similarity({'a':0, 'b':2, 'c':0}, {'a':1, 'b':1, 'c':1}) # doctest: +ELLIPSIS
-    0.5773502691...
-    >>> cosine_similarity({'a':0, 'b':1}, {'a':1, 'b':1}) # doctest: +ELLIPSIS
-    0.7071067811...
-    """
-    numerator = 0
-    length1 = 0
-    length2 = 0
-    for k in frequencies1:
-        numerator += frequencies1[k] * frequencies2[k]
-        length1 += frequencies1[k]**2
-    for k in frequencies2.keys():
-        length2 += frequencies2[k]**2
-    return numerator / (length1 ** 0.5 * length2 ** 0.5)
-
-
-
-if __name__ == "__main__":
-    import doctest
-    doctest.testmod()
diff --git a/plot-caesar-parameters.ipynb b/plot-caesar-parameters.ipynb
deleted file mode 100644 (file)
index 91f09ee..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-{
- "metadata": {
-  "name": ""
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import csv\n",
-      "import matplotlib.pyplot as plt\n",
-      "%matplotlib inline"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "with open('caesar_break_parameter_trials.csv') as c:\n",
-      "    results = [l for l in csv.DictReader(c, quoting=csv.QUOTE_NONNUMERIC)]\n",
-      "results"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "[{5.0: 2401.0,\n",
-        "  10.0: 4092.0,\n",
-        "  20.0: 4893.0,\n",
-        "  50.0: 4997.0,\n",
-        "  100.0: 4995.0,\n",
-        "  'name': 'Pletters',\n",
-        "  30.0: 4971.0},\n",
-        " {5.0: 2174.0,\n",
-        "  10.0: 3590.0,\n",
-        "  20.0: 4671.0,\n",
-        "  50.0: 4980.0,\n",
-        "  100.0: 4997.0,\n",
-        "  'name': 'cosine_similarity + euclidean_scaled',\n",
-        "  30.0: 4915.0},\n",
-        " {5.0: 2207.0,\n",
-        "  10.0: 3559.0,\n",
-        "  20.0: 4660.0,\n",
-        "  50.0: 4993.0,\n",
-        "  100.0: 4999.0,\n",
-        "  'name': 'cosine_similarity + normalised',\n",
-        "  30.0: 4931.0},\n",
-        " {5.0: 2175.0,\n",
-        "  10.0: 3751.0,\n",
-        "  20.0: 4761.0,\n",
-        "  50.0: 4995.0,\n",
-        "  100.0: 4997.0,\n",
-        "  'name': 'l1 + euclidean_scaled',\n",
-        "  30.0: 4950.0},\n",
-        " {5.0: 2188.0,\n",
-        "  10.0: 3662.0,\n",
-        "  20.0: 4770.0,\n",
-        "  50.0: 4993.0,\n",
-        "  100.0: 4999.0,\n",
-        "  'name': 'l1 + normalised',\n",
-        "  30.0: 4950.0},\n",
-        " {5.0: 2209.0,\n",
-        "  10.0: 3579.0,\n",
-        "  20.0: 4664.0,\n",
-        "  50.0: 4991.0,\n",
-        "  100.0: 4997.0,\n",
-        "  'name': 'l2 + euclidean_scaled',\n",
-        "  30.0: 4914.0},\n",
-        " {5.0: 2195.0,\n",
-        "  10.0: 3536.0,\n",
-        "  20.0: 4637.0,\n",
-        "  50.0: 4988.0,\n",
-        "  100.0: 4998.0,\n",
-        "  'name': 'l2 + normalised',\n",
-        "  30.0: 4915.0},\n",
-        " {5.0: 1978.0,\n",
-        "  10.0: 3243.0,\n",
-        "  20.0: 4477.0,\n",
-        "  50.0: 4979.0,\n",
-        "  100.0: 4997.0,\n",
-        "  'name': 'l3 + euclidean_scaled',\n",
-        "  30.0: 4822.0},\n",
-        " {5.0: 1949.0,\n",
-        "  10.0: 2966.0,\n",
-        "  20.0: 4351.0,\n",
-        "  50.0: 4959.0,\n",
-        "  100.0: 4999.0,\n",
-        "  'name': 'l3 + normalised',\n",
-        "  30.0: 4774.0}]"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "for r in results:\n",
-      "    plt.plot(sorted([k for k in r.keys() if k != 'name']), sorted([r[k] for k in r.keys() if k != 'name']))\n",
-      "plt.legend([r['name'] for r in results], loc='center', bbox_to_anchor=(2, 0.5))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "<matplotlib.legend.Legend at 0x7eff2f9fd250>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7eff2f9f82d0>"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "for r in results:\n",
-      "    plt.plot(sorted([k for k in [5.0, 10.0, 20.0, 30.0]]), sorted([r[k] for k in [5.0, 10.0, 20.0, 30.0]]))\n",
-      "plt.legend([r['name'] for r in results], loc='center', bbox_to_anchor=(2, 0.5))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "<matplotlib.legend.Legend at 0x7eff2e0aba90>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\ngHT3R0Tktuh7U8Qy+qyIiDmlfT9Y1CXvXtKXmYjI7dH3pohl9FkREXNK+36weNAHERERkfuZvb39\nHR2kSkQeHPb29mbXqYVJROQ+p+9NERGRu+e25mESERERERGpTJQwiYiIiIiImKGESURERERExAwl\nTCIiIiIiImYoYRIRERERETFDCZOIiIiIiIgZSphERERERETMUMIkIiIiIiJihhImERERERERM5Qw\niYiIiIiImKGESURERERExAwlTCIiIiIiImYoYRIRERERETFDCZOIiIiIiIgZSphERERERETMUMIk\nIiIiIiJihhImERERERERM5QwiYiIiIiImKGESURERERExAwlTCIiIiIiImaUmTCNGjUKR0dHWrdu\nbVoWGhqKi4sL3t7eeHt7s3PnTtO6+fPn06xZM5o3b05MTIxp+dGjR2ndujXNmjVj/Pjxd/gwHjyx\nsbHlHUKFoXPxK52LX+lciIiIyL1QZsI0cuRIdu3aVWyZwWBg0qRJJCQkkJCQQI8ePQA4efIkGzZs\n4OTJk+zatYtx48ZhNBoBGDt2LCtXriQxMZHExMTfbVOK04/BX+lc/Ern4lc6FyIiInIvlJkwdejQ\nAXt7+98tv5kI3Wrr1q0MHjwYGxsb3N3dadq0KXFxcZw7d47Lly/j6+sLQFBQEFu2bLkD4YuIiIiI\niNw9//MzTG+//TaPPvooo0eP5uLFiwCkpaXh4uJiKuPi4kJqaurvljs7O5OamvoHwhYREREREbn7\nqvwvlcaOHcusWbMAmDlzJpMnT2blypV3LCiDwXDHtnU/CwsLK+8QKgydi1/pXPxK50JERETutv8p\nYapfv77p9TPPPEOvXr2AopajlJQU07qzZ8/i4uKCs7MzZ8+eLbbc2dm5xG2X1NVPRERERESkPPxP\nXfLOnTtnev3xxx+bRtDr3bs3kZGR5Ofnc/r0aRITE/H19cXJyQk7Ozvi4uIwGo2sXbuWvn373pkj\nEBERERERuUvKbGEaPHgw+/btIyMjg0aNGhEWFkZsbCxff/01BoOBxo0b8/777wPg4eFBYGAgHh4e\nVKlShWXLlpm61y1btowRI0Zw9epV/P396d69+909MhERERERkT/IYKwgfeDc3d2xs7PD2toaGxsb\n4uPjyzuke2bUqFFER0dTv359jh8/DsCFCxcYNGgQSUlJuLu7s3HjRmrXrl3Okd59JZ2L0NBQPvjg\nA+rVqwcUzfVVGRLulJQUgoKC+PnnnzEYDDz33HO89NJLlfLaMHcuKuO1ce3aNTp16kReXh75+fn0\n6dOH+fPnV8rrQkRE5F6oMAlT48aNOXr0KHXq1CnvUO65AwcOUKNGDYKCgkxJwtSpU3FwcGDq1Km8\n8cYbZGVlsWDBgnKO9O4r6VyEhYVRs2ZNJk2aVM7R3Vvp6emkp6fj5eVFTk4Ojz32GFu2bGHVqlWV\n7towdy42btxYKa+N3NxcbG1tKSwspH379ixcuJBt27ZVuutCRETkXvifhxW/GypI7nbPlTTX1bZt\n2wgODgYgODi40sxbdTvzfj3onJyc8PLyAqBGjRq0aNGC1NTUSnltmDsXUDmvDVtbWwDy8/O5fv06\n9vb2lfK6EBERuRcqTMJkMBjo2rUrPj4+rFixorzDKXfnz5/H0dERAEdHR86fP1/OEZWvkub9qkzO\nnDlDQkICbdu2rfTXxs1z8fjjjwOV89q4ceMGXl5eODo60qVLF1q2bFnprwsREZG7pcIkTIcOHSIh\nIYGdO3fyzjvvcODAgfIOqcIwGAyVem6qsWPHcvr0ab7++msaNGjA5MmTyzukeyonJ4eAgAAWL15M\nzZo1i62rbNdGTk4OAwYMYPHixdSoUaPSXhtWVlZ8/fXXnD17lv379/P5558XW1/ZrgsREZG7qcIk\nTA0aNACgXr169OvXr1IN+lASR0dH0tPTgaJh3G+d+6qyqV+/vukH4DPPPFOpro2CggICAgIYPny4\naSj+ynpt3DwXw4YNM52LynxtANSqVYunn36ao0ePVtrrQkRE5G6rEAlTbm4uly9fBuDKlSvExMSY\n5naqrHr37k14eDgA4eHhlXreKnPzfj3ojEYjo0ePxsPDgwkTJpiWV8Zrw9y5qIzXRkZGhqnr4dWr\nV9m9ezfe3t6V8roQERG5FyrEKHmnT5+mX79+ABQWFjJ06FBeffXVco7q3rl1ritHR0dmz55Nnz59\nCAwMJDk5uVINEfzbc2Fu3q+bz2o8yA4ePEjHjh3x9PQ0da+aP38+vr6+le7aKOlczJs3j/Xr11e6\na+P48eMEBwdz48YNbty4wfDhw5kyZQoXLlyodNeFiIjIvVAhEiYREREREZGKqEJ0yRMREREREamI\nlDCJiIiIiIiYoYRJRERERETEDCVMIiIiIiIiZihhEhERERERMUMJk4iIiIiIiBn/H4c0IThYwuq0\nAAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7eff2e0abd50>"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "bests = {}\n",
-      "for l in [k for k in results[0].keys() if k != 'name']:\n",
-      "    bests[l] = max(results, key=lambda r: r[l])['name']\n",
-      "bests"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "{5.0: 'Pletters',\n",
-        " 10.0: 'Pletters',\n",
-        " 20.0: 'Pletters',\n",
-        " 30.0: 'Pletters',\n",
-        " 50.0: 'Pletters',\n",
-        " 100.0: 'cosine_similarity + normalised'}"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/segment.py b/segment.py
deleted file mode 100644 (file)
index a64ea5d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-"""Segment a collection of letters into words"""
-
-import language_models
-import sys
-from functools import lru_cache
-sys.setrecursionlimit(1000000)
-
-@lru_cache()
-def segment(text):
-    """Return a list of words that is the best segmentation of text.
-    """
-    if not text: return []
-    candidates = ([first]+segment(rest) for first, rest in splits(text))
-    return max(candidates, key=language_models.Pwords)
-
-@lru_cache()
-def segment_wrong(text):
-    """Return a list of words that is the best segmentation of text.
-    """
-    if not text: return []
-    candidates = ([first]+segment(rest) for first, rest in splits(text))
-    return max(candidates, key=language_models.Pwords_wrong)
-
-
-def splits(text, L=20):
-    """Return a list of all possible (first, rest) pairs, len(first)<=L.
-    """
-    return [(text[:i+1], text[i+1:])
-            for i in range(min(len(text), L))]
-
diff --git a/unknown-word-probability-investigation.ipynb b/unknown-word-probability-investigation.ipynb
deleted file mode 100644 (file)
index ff3767b..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:6a52b786de0fbcf68d2da20d0ad155b76414b0e5add50e4d11d9f765911eb884"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "%matplotlib inline\n",
-      "import matplotlib.pyplot as plt\n",
-      "from math import log10\n",
-      "from cipherbreak import *\n",
-      "from language_models import *"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "markdown",
-     "metadata": {},
-     "source": [
-      "# What fraction of possible words are present in the dictionary?"
-     ]
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "fractions = [1.0]\n",
-      "for wordlen in range(1, 20):\n",
-      "    known_words = len([w for w in keywords if len(w) == wordlen]) # Words in the dictionary\n",
-      "    possible_words = 26 ** wordlen\n",
-      "    fractions += [known_words / possible_words]\n",
-      "fractions"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "[1.0,\n",
-        " 1.0,\n",
-        " 0.34615384615384615,\n",
-        " 0.05974055530268548,\n",
-        " 0.007654668954168271,\n",
-        " 0.0005913456488541394,\n",
-        " 3.6129588927177356e-05,\n",
-        " 1.8010883826943671e-06,\n",
-        " 7.107795165409739e-08,\n",
-        " 2.4355817367258945e-09,\n",
-        " 7.469162662303339e-11,\n",
-        " 1.979378237044537e-12,\n",
-        " 4.875878520286003e-14,\n",
-        " 1.1095648437193016e-15,\n",
-        " 2.199659830168053e-17,\n",
-        " 4.185399254019551e-19,\n",
-        " 6.83349209784038e-21,\n",
-        " 1.199477188056649e-22,\n",
-        " 2.0013901045062867e-24,\n",
-        " 1.5656245928341226e-26]"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "markdown",
-     "metadata": {},
-     "source": [
-      "# Plot the fractions"
-     ]
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plt.plot(fractions)\n",
-      "plt.ylabel(\"Probability of word\")\n",
-      "plt.xlabel(\"Word length\")\n",
-      "plt.show()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nkiRJqlX/D1Q+4n26HL3CAAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f9d3321cfd0>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "markdown",
-     "metadata": {},
-     "source": [
-      "# Log plot"
-     ]
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plt.plot([log10(f) for f in fractions])\n",
-      "plt.plot([log10(f) for f in fractions], 'bo')\n",
-      "plt.ylabel(\"Log probability of word\")\n",
-      "plt.xlabel(\"Word length\")\n",
-      "plt.show()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nSUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f9d31cd14a8>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "markdown",
-     "metadata": {},
-     "source": [
-      "# Guess some lines of best fit"
-     ]
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plt.plot([log10(f) for f in fractions], 'bo')\n",
-      "plt.plot([i for i in range(2,20)], [-(i-2) for i in range(2,20)], 'g-')\n",
-      "plt.plot([i for i in range(2,20)], [-(i-3)*1.5 for i in range(2,20)], 'r-')\n",
-      "plt.plot([i for i in range(2,20)], [-(i-2)*1.4 for i in range(2,20)], 'r^-')\n",
-      "plt.ylabel(\"Log probability of word\")\n",
-      "plt.xlabel(\"Word length\")\n",
-      "plt.show()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nRK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f9d31d314a8>"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(sanitise('HELMU TSCOU SINSA REISU PPOSE KINDI NTHEI ROWNW AYBUT THERE ISLIT TLEWA RMTHI NTHEK INDNE SSIRE CEIVE ')))\n"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "'helmut s cousins are i suppose kind in their own way but there is little warmth in the kindness i receive'"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file