Updated for challenge 9
[cipher-tools.git] / 2017 / 2017-challenge6.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {},
7 "outputs": [],
8 "source": [
9 "import os,sys,inspect, collections\n",
10 "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
11 "parentdir = os.path.dirname(currentdir)\n",
12 "sys.path.insert(0,parentdir) \n",
13 "\n",
14 "import matplotlib.pyplot as plt\n",
15 "%matplotlib inline\n",
16 "\n",
17 "from cipher.affine import *\n",
18 "from cipher.vigenere import *\n",
19 "from cipher.keyword_cipher import *\n",
20 "from support.utilities import *\n",
21 "from support.text_prettify import *\n",
22 "from support.language_models import *\n",
23 "from support.plot_frequency_histogram import *\n",
24 "\n",
25 "ca = open('6a.ciphertext').read()\n",
26 "cb = open('6b.ciphertext').read()"
27 ]
28 },
29 {
30 "cell_type": "code",
31 "execution_count": 2,
32 "metadata": {},
33 "outputs": [
34 {
35 "name": "stdout",
36 "output_type": "stream",
37 "text": [
38 "Lelqzq, C xnyhv Isxad en Gkcghhe ufc wbw gem ugejldv maw efjdexq. Rly zzh vwdr fwzhcff xbw LMXSR sjwqenauim gm e qakh agnwy ugemw zvimmh Mwkgoc leeamk u dnx ix msckd evgtx fgnocff jij sly ehwmamk wzztnwq en lgi Nwltfw nj Ujsigar. Xbss kund qy lhqy ln vylqmynd mn xqsg Bnhcw'r jladrx ss xbw Avclhwb Etwyml, ababl bsr e wgkpyusmif nj ujsizsbxm xqsg lgi Nwltfw. Isxad wuqr wbw jryo vi qgtpx xhkojd sol vlyjd xi yn ryps. Xbw bpow vem am xbw kswssmifr. Xbw emlks shw vem ss xbw Fvyss Tsjzqcv, sly kdgifc en lgi zgqx ix Peclaes ogmwz vem ttmfl evie sly jtmhk nj nzd Pcygxbgtwy ss Efwwehvqmu smh nzd xbaqh if Qlivdw, uenra lgi lmhrm ge xbw Bsfgrwok. Sly Cmmazs'w wsrxfw zx Vgcvoe vem ttmfl evie sly jdquamw ix sly Ezymgkioe zx Bskmwsqrukrym, zdrww sly “yqepw” semc nj amzvxamk nzd figj. Wi skp zaui wzztnwqw qwqi zgtrx ss xbw rmnw nj ifd sz lgi Mwuih Onrxwqw ix sly smgcwmx qgqpx. Lgi ifkc lwlecfhra dngulhshk zvy lgi Mlzxow nj Twtw ul Npseomu smh nzd Luffmhy Felvdrm ge Futxpif, zrx fn-shw gem smc cvde qzdvy lgi asqhyfr qcygx bsui vwdr, mg sly gmps hkeww vi wgtpx yn ryps mm Gkcghhe. Nzd gfmd en lgi yfc sz ugejldv zaui jghrnk rxlshkbl slyjd, wcfbi faflnamk, vmkp ufc suc zvy skp mqlfidr sz Rdym. Od wbgtpx td wuxd lyjd fyuzymw Isxad'w hwsaijj luk rihl gil ssxuujilk nr ng Kshvnr vq kesamk u dnra lqecd nj zgqkyv cswmlihlr vyndefamk nzd piuzxcgm sz ugejldv zaui. Nzzx vgtkbl tw yfnyaz smgw ss fgbenw zrx vdgchgil ugejldv maw. Ay zzh vwdr nzhreamk utnyn lgi ynnpolhsh ge xbw Hqjwqmud Bmjzdvm. Lzgcltw okdh vgsl nzd Zcydryjd ehv Aiumesll bmjzdvm ogmwz zvy hnpssktbsainab zyjrmifr sz lgi Wsdwuj rlcxs, ehv zx zaqwn od emktqyv slul bluhsil khb qgtpx td ihuqcjldh nzd wued auq. Vi qwqi udlsml qmazs. Qysmabaki Dgcmy'k trypoiwldh nskihl esl xnvawqc bsr kcndr gw zr cvde. C lgmhc vi gafln td evdd xi ltvh gtv yfdqcwr sh gmi ufnxbwq fs wwtfghxcff lyj fmzl, ayn A jrio gil utvlwmx zgbym ar jcytvcff sol vlyjd sh wzvnz sly kdzyfsl qgmhyj lmazs fy.\n"
39 ]
40 }
41 ],
42 "source": [
43 "print(ca)"
44 ]
45 },
46 {
47 "cell_type": "code",
48 "execution_count": 3,
49 "metadata": {},
50 "outputs": [],
51 "source": [
52 "pua = depunctuate(ca)"
53 ]
54 },
55 {
56 "cell_type": "code",
57 "execution_count": 4,
58 "metadata": {},
59 "outputs": [
60 {
61 "data": {
62 "text/plain": [
63 "('zeus', -1960.8847716972107)"
64 ]
65 },
66 "execution_count": 4,
67 "metadata": {},
68 "output_type": "execute_result"
69 }
70 ],
71 "source": [
72 "ka, score = vigenere_frequency_break(ca)\n",
73 "ka, score"
74 ]
75 },
76 {
77 "cell_type": "code",
78 "execution_count": 5,
79 "metadata": {},
80 "outputs": [
81 {
82 "data": {
83 "text/plain": [
84 "\"Maryam, I found Jodie at Olympia and she has chapter six already. She had been leading the MIDAS operatives on a wild goose chase around Selcuk making a lot of noise about looking for the missing chapter at the Temple of Artemis. That gave me time to retrieve it from Jodie's friend at the British Museum, which has a collection of artefacts from the Temple. Jodie says she knew we would figure out where to go next. The clue was in the locations. The first one was at the Great Pyramid, the second at the fort of Qaitbay which was built from the ruins of the Lighthouse at Alexandria and the third on Rhodes, among the ruins of the Colossus. The Knight's castle at Bodrum was built from the remains of the Mausoleum at Halicarnassus, hence the “grave” task of guarding the book. So all five chapters were found at the site of one of the Seven Wonders of the ancient world. The only remaining locations are the Statue of Zeus at Olympia and the Hanging Gardens of Babylon, and no-one has any idea where the gardens might have been, so the only place we could go next is Olympia. The clue at the end of chapter five points straight there, since lighting, bull and oak are all symbols of Zeus. We should be safe here because Jodie's network has sent her attackers on to London by laying a long trail of forged documents revealing the location of chapter five. That bought us enough time to locate and decipher chapter six. We had been thinking about the evolution of the Imperial Ciphers. Tacitus used both the Vigenere and Beaufort ciphers which are polyalphabetic versions of the Caesar shift, and at first we assumed that chapter six would be encrypted the same way. We were almost right. Meanwhile Jodie's unexpected talent for forgery has given me an idea. I think we might be able to turn our enemies on one another by exploiting her gift, but I know her current focus is figuring out where on earth the seventh wonder might be.\""
85 ]
86 },
87 "execution_count": 5,
88 "metadata": {},
89 "output_type": "execute_result"
90 }
91 ],
92 "source": [
93 "pa = vigenere_decipher(sanitise(ca), ka)\n",
94 "repunctuate(pa, pua)"
95 ]
96 },
97 {
98 "cell_type": "code",
99 "execution_count": 6,
100 "metadata": {},
101 "outputs": [
102 {
103 "name": "stdout",
104 "output_type": "stream",
105 "text": [
106 "Maryam, I found Jodie at Olympia and she has chapter six already. She had been leading the MIDAS\n",
107 "operatives on a wild goose chase around Selcuk making a lot of noise about looking for the missing\n",
108 "chapter at the Temple of Artemis. That gave me time to retrieve it from Jodie's friend at the\n",
109 "British Museum, which has a collection of artefacts from the Temple. Jodie says she knew we would\n",
110 "figure out where to go next. The clue was in the locations. The first one was at the Great Pyramid,\n",
111 "the second at the fort of Qaitbay which was built from the ruins of the Lighthouse at Alexandria and\n",
112 "the third on Rhodes, among the ruins of the Colossus. The Knight's castle at Bodrum was built from\n",
113 "the remains of the Mausoleum at Halicarnassus, hence the “grave” task of guarding the book. So all\n",
114 "five chapters were found at the site of one of the Seven Wonders of the ancient world. The only\n",
115 "remaining locations are the Statue of Zeus at Olympia and the Hanging Gardens of Babylon, and no-one\n",
116 "has any idea where the gardens might have been, so the only place we could go next is Olympia. The\n",
117 "clue at the end of chapter five points straight there, since lighting, bull and oak are all symbols\n",
118 "of Zeus. We should be safe here because Jodie's network has sent her attackers on to London by\n",
119 "laying a long trail of forged documents revealing the location of chapter five. That bought us\n",
120 "enough time to locate and decipher chapter six. We had been thinking about the evolution of the\n",
121 "Imperial Ciphers. Tacitus used both the Vigenere and Beaufort ciphers which are polyalphabetic\n",
122 "versions of the Caesar shift, and at first we assumed that chapter six would be encrypted the same\n",
123 "way. We were almost right. Meanwhile Jodie's unexpected talent for forgery has given me an idea. I\n",
124 "think we might be able to turn our enemies on one another by exploiting her gift, but I know her\n",
125 "current focus is figuring out where on earth the seventh wonder might be.\n"
126 ]
127 }
128 ],
129 "source": [
130 "print(lcat(tpack(repunctuate(pa, pua).split())))"
131 ]
132 },
133 {
134 "cell_type": "code",
135 "execution_count": 7,
136 "metadata": {},
137 "outputs": [
138 {
139 "data": {
140 "text/plain": [
141 "1932"
142 ]
143 },
144 "execution_count": 7,
145 "metadata": {},
146 "output_type": "execute_result"
147 }
148 ],
149 "source": [
150 "open('6a.plaintext', 'w').write(lcat(tpack(repunctuate(pa, pua).split())))"
151 ]
152 },
153 {
154 "cell_type": "code",
155 "execution_count": 8,
156 "metadata": {},
157 "outputs": [],
158 "source": [
159 "pub = depunctuate(cb)\n",
160 "scb = sanitise(cb)"
161 ]
162 },
163 {
164 "cell_type": "code",
165 "execution_count": 9,
166 "metadata": {},
167 "outputs": [
168 {
169 "data": {
170 "text/plain": [
171 "('jcarykujniqadmv', -3289.3609056830232)"
172 ]
173 },
174 "execution_count": 9,
175 "metadata": {},
176 "output_type": "execute_result"
177 }
178 ],
179 "source": [
180 "kbv, score = vigenere_frequency_break(scb)\n",
181 "kbv, score"
182 ]
183 },
184 {
185 "cell_type": "code",
186 "execution_count": 10,
187 "metadata": {},
188 "outputs": [
189 {
190 "data": {
191 "text/plain": [
192 "'Piuo tgnlqva rdn uggsvzeuvlr ed lurg nrubgg ve dyp kztmitehdd flrmqantm bvn enarvtu vd Zgvhrerir rez nttcgegm uy Tlxt lk unu tez la hbt dten, rm mgmggtz ld uog Axruglt. Ot ngrgtz bos orxg utttvyqg ael sn xgutz ybu yq Tlwwuvee uy lluo Enbpueba Gbaiufba yel Ptgrevoa Ntegmvk, zbu hot Uymn pgnt guettlba eem, ggerfkrydd ubg qlna sa tpt Fymtj ttxriltl s ntsgth, welpr sepe ul e atc dldrd mlwhrmgn atyx uog Lvdvo. Soyqisqd fbslmweh hl ggurgm bcn lmhhgm sotnbvh sa tpt Rmbvde rn r kygi ma fybgeut, uog Axruglt nsettm oie unu arht ln yuott tvmigrstm ugetgexn qfm, uy uog abgstcns ma nyxt, bg prn ewrfntm hgvoksord ttemgrhvlra. R nuebbs qrn ggtshtm yq bos Oteeut yr uot ynmsh la hot Gkstgyn, yav, urwte idq, Rhtcfkrr pen ngru ul dcis abvguqq ye ova hrwwqd gnueht pognt nu pra utrztm yq bos Uxsgglt’a lpe fvdmwfveen. Bin mtebo osn r ugvgvlbn avlek ul kt, rrz r srilaar tigeu hy rqq bcn zhvtrmn. Ih prn naqt sn r ttrd dlnn gptd zd ublng hl poye os qrn rlu fggnlryqpe jeype. Roxyttu, xkhtlvtg, yn uot fssarrfg rez hot youd wsnngn fekt ul bcn nmbng; rez ie sblxve tqrstn, erm pognthug jrlua ya urdqtfo pttt raatxydam, nwn eext cen le exq pwsn; rlg zim r nilhpu nloq lr btrgilh kb ova mteho gtpsveu ru hot rgpn lt hlfitu iu zoifjqq. Bouo ndksrhbd pra ceehtratm lq uot ccms-osggrm toxlbt boqv ot brm lgte ggelhum yq sliale lr bos Uxsgglt’a flxkyel. Nlxiuver qlnh ll twxt ie rfflvehceg vot exyihvlba Urpcnuibn Dofbqdin qo uog etc ulittllf ma ubt styivesa. Os qrn sortutm pibo mufbtveu hot atyhurt sgrfg cvuo Syqsnleir rrz otrzam tptgg ul syeagylu Esqhefba. Iu pra sepe uoge ubeu uog xlmo la hot Symtw cyn fuiteqtz. Arqbabvao pgyut yn ovn avlek ru hot rgpn vr y qsvutt ul Seul mebtl vot nvahb mrd laakht ubt jedtema sa Wsd vr uog qtrg yh unu flrnbdaovsa sa Wsgfon Rtttfvrin Ertxgen II rem Difucn Yetyion Olrsgqvbn. “Ct rtg twstanmrd fbrgugm yd yig wmnu kbeinvftrb rdn hggru Gkstgyn Mkyvuire hy ntfont Rsw Gyxrre ve uba Ekhuogge Wiehmyen qfm dgu dyo pgvha uk yt ln uog dlnn yh unu Flztw Ysfbqhsgay. Dlog qgemtg Eoguglqe ora eqgtetd rsvm hot ftvft yh nago r dlna, lbu vn kla nl eyu ggslitt bos Glmgw ygnlgt hvt rsnnieh yn uot qarf votr dlo krd yg ubfu uoeu dyo pvqd jluf ovk. Dlo htqq ka unsu vrutddvhtrmt zhlx e frfhbgtz usc obhutnha uorh bos vgriult Srqhembm prn hot Symtw elm uo xranvru ovn aisrmguggn ir uot Rsgtp. Poiqt hbt Yrtfrfwrea uogkntqvan qht brqvwgqd uy eriu xbso ln hot Fyttv, Grqurfoa vn rr amagrugm Gykre rrt os ybnh yt ahlssgt ysblgg ot see mtabgke uog ntsogvuq sa tpt Vksttirq fizoshn. Ubt Fyztw pixq xu gtsligttm, lt kla, elbt arkiqd rrt thugdyet qyb jeyw purq sed ubg sgvsa. Rdn nl hl ubg ntiglun trgh la hbt ugoa ntmgd ya Rutvfldy vd qovso ubg arug sa tpt eieub dthvyl rdn la hot Symtw ibnsra piqq ir uvxg ft fuiteqtz. Oeuvd bosf vu cvqd lt hbenmsn yd hot erfvtrb Yqzdqyever Hlmzanm ma Peg.'"
193 ]
194 },
195 "execution_count": 10,
196 "metadata": {},
197 "output_type": "execute_result"
198 }
199 ],
200 "source": [
201 "repunctuate(vigenere_decipher(sanitise(cb), kbv), pub)"
202 ]
203 },
204 {
205 "cell_type": "code",
206 "execution_count": 11,
207 "metadata": {},
208 "outputs": [
209 {
210 "data": {
211 "text/plain": [
212 "('hnypjvriltvyzlt', -3351.460892110415)"
213 ]
214 },
215 "execution_count": 11,
216 "metadata": {},
217 "output_type": "execute_result"
218 }
219 ],
220 "source": [
221 "kbb, score = beaufort_frequency_break(cb)\n",
222 "kbb, score"
223 ]
224 },
225 {
226 "cell_type": "code",
227 "execution_count": 12,
228 "metadata": {},
229 "outputs": [
230 {
231 "data": {
232 "text/plain": [
233 "'jdeksfkoiqfhtmesfgdmhdenubvlfhsyhekfreuihjmafmdfueiuunutiwmfmkdlhyxidsldtasdehuudgiumsfdxsufmensmcfavejffumnyekewfhshknsmfsfmaufkffbffsnskfyfgtfmekelhbfefsscbiffulhlbfefmnwfavmnadedhuenamfkhsxhfuxlsxldduxlhulkfsuudxlkguftdmaxeekfrnlmjfsfqfufsnxlhtnsfbhrphaivekfhollnydkftnmfcsechduflhlftsfeptojunuhvenhyfjimwhitnashmflysnafkfudtekgxaidthwtknnkdurensfrgtmkdllnrrfmgxskydenydkfhzxdihgmhbhsonytnxshrefkffbffsnslghsenkdbejfyhefnyndlfsmdkrshtfmrftgshilgumenekflwtgsdlenylnbfkfiilhjhrmfmesdxbflhimfsnshednulgmehexejhlfsfteenavekelfuhefnudlfnsmesnyekffbfgsnsaweehpfudihirsdtmihjhllfudfnidqezxdfeivntldlyhadivfleheekkfsfjfjhlefumenavekefbgfsnslmkugkvkdtdhulkdknfhekihlhrsdfqmyllknspenbfhumghhduywifqfueengjikdlxsdfumldeiilyfidhlhsfhiimmlfqftaveknlfemkknbkejhlunegfrmnuhihvpunjuuxabfslbmsfnqfsnydlfgngwihtfhumejgaxlvahllflthbefnkdljnxlfhumdthxaidsgihtflhulkkfsfpfspunelnxfhipfrljfsfhllecaifmjdluhbfjhkouhiihdglunsmdlildurhflnxinukeisdurmykdlmfhejtfwndsfheekfufimnsynrrfedezxdsqivekcllvbghekukhldussfhlfmavdlfjdmelgsfhmsxaoxsekgekfkhmafevsfbnpfmavgndlmvnuekefbgfsnslsobbhulmnbdedhuholeunddbfduhggmeueduqekfhbadecoxllhhxledxlixsyiixlglekfufjrmrfsunrnyekfgsnpeutfkejhltkhsrenjdekkftxsdurejgyshrcifgfhtfjcfkthiemnudhhumjghmfmdkfsfentntzsnueshirhtxlddkhlnuhvekfuekhdfkfinklnyekftnlgcjhlrfqfhifmlgjxledwljsnefnyjellknspheekfufimduhieeefsenthdomheflekfydyeklivafymsfekfphievmlnyahvduekfveisnyejftnulxiljeglnyahstxlhsseuduxlsifbfulddgvmixtcxlahfadxklnunsgexljfhsfedgsflkivtkhsrflbvnxsanlebxudycufuehtmrsfhefbfgsnsmmbdedhuenkgtxsffhcsnbhuhcvekfumsekfsupdtsmnblgumvfevnxitdefembfnyekfimmlnyejftnmfcntsyienswbvnxsifhlgshrsctnihkhlhhtfhmvfhdmekfgscufnylwtkhinllawfdyvnwmnunesftmrfseketnmfcafymtfekffhlldurnydlfvfhrekfuvnxbgwaflxrfekhevnxieiiwncukdbvnxeejibfejheduefiicsfutfxsnbhthgewtfmlgulxrrfleldlheekeeshdenstgjrhtxkkhlekftnlgchumclbhlldurjellxgfnsefsldudlfunsdkjkdifekebhsahrdhulekfbkgiqflgsfxuidpfhwenbhofbxtknyejgtnmfbthirhtxlcmhufmwthefmsnbgvhumkebxleaflemhgfmaeynsfkfthtnflesmvekflftxreevnydkfdbgfsdgjtdgkeslekftnmedjdiizfsftnqfsennsvnwvnxsyhbdhwhumfpfsvnufvnwqunjjciighvekfftdtfhtmlnenekfkgqfuejghsenyekefsxfldnsvnyhrscunihdtjkdtkekfxiefnydkfuduekiesdnuhtmnyekftnlgcdeleiyjdiidudebfafrfqfhifmxtfdiekeudejdiiaesxhsmemavekfhusefueagavinudhuqommflknyjhs'"
234 ]
235 },
236 "execution_count": 12,
237 "metadata": {},
238 "output_type": "execute_result"
239 }
240 ],
241 "source": [
242 "beaufort_decipher(sanitise(cb), kbb)"
243 ]
244 },
245 {
246 "cell_type": "code",
247 "execution_count": 13,
248 "metadata": {},
249 "outputs": [
250 {
251 "data": {
252 "text/plain": [
253 "('ryajcqgrnskaxof', -3289.3609056830232)"
254 ]
255 },
256 "execution_count": 13,
257 "metadata": {},
258 "output_type": "execute_result"
259 }
260 ],
261 "source": [
262 "kbbv, score = beaufort_variant_frequency_break(cb)\n",
263 "kbbv, score"
264 ]
265 },
266 {
267 "cell_type": "code",
268 "execution_count": 14,
269 "metadata": {},
270 "outputs": [
271 {
272 "data": {
273 "text/plain": [
274 "'piuotgnlqvardnuggsvzeuvlredlurgnrubggvedypkztmitehddflrmqantmbvnenarvtuvdzgvhrerirreznttcgegmuytlxtlkunutezlahbtdtenrmmgmggtzlduogaxrugltotngrgtzbosorxgutttvyqgaelsnxgutzybuyqtlwwuveeuylluoenbpuebagbaiufbayelptgrevoantegmvkzbuhotuymnpgntguettlbaeemggerfkryddubgqlnasatptfymtjttxriltlsntsgthwelprsepeuleatcdldrdmlwhrmgnatyxuoglvdvosoyqisqdfbslmwehhlggurgmbcnlmhhgmsotnbvhsatptrmbvdernrkygimafybgeutuogaxrugltnsettmoieunuarhtlnyuotttvmigrstmugetgexnqfmuyuogabgstcnsmanyxtbgprnewrfntmhgvoksordttemgrhvlrarnuebbsqrnggtshtmyqbosoteeutyruotynmshlahotgkstgynyavurwteidqrhtcfkrrpenngruuldcisabvguqqyeovahrwwqdgnuehtpogntnuprautrztmyqbosuxsggltalpefvdmwfveenbinmteboosnrugvgvlbnavlekulktrrzrsrilaartigeuhyrqqbcnzhvtrmnihprnnaqtsnrttrddlnngptdzdublnghlpoyeosqrnrlufggnlryqpejeyperoxyttuxkhtlvtgynuotfssarrfgrezhotyoudwsnngnfektulbcnnmbngreziesblxvetqrstnermpognthugjrluayaurdqtfoptttraatxydamnwneextcenleexqpwsnrlgzimrnilhpunloqlrbtrgilhkbovamtehogtpsveuruhotrgpnlthlfituiuzoifjqqbouondksrhbdpraceehtratmlquotccmsosggrmtoxlbtboqvotbrmlgteggelhumyqslialelrbosuxsggltaflxkyelnlxiuverqlnhlltwxtierfflvehcegvotexyihvlbaurpcnuibndofbqdinqouogetculittllfmaubtstyivesaosqrnsortutmpibomufbtveuhotatyhurtsgrfgcvuosyqsnleirrrzotrzamtptggulsyeagyluesqhefbaiuprasepeuogeubeuuogxlmolahotsymtwcynfuiteqtzarqbabvaopgyutynovnavlekruhotrgpnvryqsvuttulseulmebtlvotnvahbmrdlaakhtubtjedtemasawsdvruogqtrgyhunuflrnbdaovsasawsgfonrtttfvrinertxgeniiremdifucnyetyionolrsgqvbnctrtgtwstanmrdfbrgugmydyigwmnukbeinvftrbrdnhggrugkstgynmkyvuirehyntfontrswgyxrreveubaekhuoggewiehmyenqfmdgudyopgvhaukytlnuogdlnnyhunuflztwysfbqhsgaydlogqgemtgeoguglqeoraeqgtetdrsvmhotftvftyhnagordlnalbuvnklanleyuggslittbosglmgwygnlgthvtrsnniehynuotqarfvotrdlokrdygubfuuoeudyopvqdjlufovkdlohtqqkaunsuvrutddvhtrmtzhlxefrfhbgtzuscobhutnhauorhbosvgriultsrqhembmprnhotsymtwelmuoxranvruovnaisrmguggniruotrsgtppoiqthbtyrtfrfwreauogkntqvanqhtbrqvwgqduyeriuxbsolnhotfyttvgrqurfoavnrramagrugmgykrerrtosybnhytahlssgtysblggotseemtabgkeuogntsogvuqsatptvksttirqfizoshnubtfyztwpixqxugtsligttmltklaelbtarkiqdrrtthugdyetqybjeywpurqsedubgsgvsardnnlhlubgntigluntrghlahbtugoantmgdyarutvfldyvdqovsoubgarugsatpteieubdthvylrdnlahotsymtwibnsrapiqqiruvxgftfuiteqtzoeuvdbosfvucvqdlthbenmsnydhoterfvtrbyqzdqyeverhlmzanmmapeg'"
275 ]
276 },
277 "execution_count": 14,
278 "metadata": {},
279 "output_type": "execute_result"
280 }
281 ],
282 "source": [
283 "beaufort_variant_decipher(sanitise(cb), kbbv)"
284 ]
285 },
286 {
287 "cell_type": "code",
288 "execution_count": 15,
289 "metadata": {},
290 "outputs": [
291 {
292 "data": {
293 "text/plain": [
294 "'ytsfeqziozzjyzynifmpczahrmdxemcpjzkmjwjlxnnyonyerofpohxcddrcgzewuxdyioknuwxnbjvyqlnrzresxtfivjwqfyuewdiyowzlefdbxcvvjphzvvgclgtmtgqgsgouncvhzdhgqpoiaeutqtjvpqbodegstcrmcxrtdyybzkeywyeuuvsdtaoxbyrkleslsgczexwgbxntrmeysyaguvwjwqjgydepouomrjtzujwohgqvcmueioasbmdrqtsaviskmkxsekqbnteipeknauupiftymqkenkipdeaxaftxauudzckvvnjftnmtgbeehwbimsclcessglcireuhgwwlyxjfngmnmrebmmfkvpaohxxsgbvzoywwgzcuqnojzxpefrmkzpmgksvajuryrkimuzevnjlqwexpybstphbsiezbiqccknatjvowdxwkenfosfjjrfspkiojnaeaceignjpkmhmpswfczqbjhvppczhdvjtvlkwvgcecjedqrxtabnyivskgpgpbmityxuktwmmlrgqyvvawhlngwiahbktyzvqynncbbdqzdeeeoershbiqltegjriukialufyukgvtzekncmyafwndyamvtstwryacxyallqpaopcnwrsqtgzrgfpejoymndfxaazwdfhmmcgpwltsbxjvvoageyfazkzskfccocgmwucfjsnqzuevanhtxwxoaxdttlqrohnwjfhzghonqxscdddzywlzgedmnfspenyehypvtwlgugrxjxglrjrkvdvmievpftyuocdicijifknqwvqjblqlwowcrgkqbxrnihxzlqcwubpwbbdlyrxbldlhguqedueejcuvcgyxnyzwmviaiwexxagvfnvfisrlwglpldcjsibqqgvuienlufstzzhanbsnitujiyexvvzuxzsgcpzhwlbpztqxvcuzksmsvmckgsamvqislpmpebwztxycgdboztpckmeyncijrcuamgbamtujurczsifncmuykyvsobuykolymrgjrokaycaizhkkcpkiyykdkcokmoaxuoaslievdhtpnykwjqhctxhucldgakaqovdcppxhrcduwngahltatswfaebolamgzmlbrraeeaicgyvomorpeavueckyysketvfraqyxxzpdxziewwaazksgqexgakjwafruwhzkwoohwfyzaqjcebhhwzbcokqsxweviwgblgawlimoqbgbwljybjxiqvguxvkwaydleqxxczkkrjndjipnuckiensalufwzdbcvlzboiimqihhqgqligodxmetgvuyynjfueadtioypxvvtjananrwtwiwqecsfrafoecgmigjstastytaoaaaicbbqfwczwgazhlhqoywpapkdnijysxgwscchyyqvymiyhssfwliaonsfteylmqgdavsdgzeruprqimkbigpdzcijjgiapvrdsfillydvlkddcfgbrzusfbthejdltrhgpwfjdefhatrynubwqmgmbenqeauduywpadbqwcguysfrnxklcgmigjsbgnoqkgmhagmiyhqyvpkpulmnexfgruzehgcppkjquwegfxcvdymgtxfrdfjxdehtvqinowziyfadvepfjumnxnkgegwceptacydlungwxeqkikgyqqaghwclrniddelxibvghlrqdoqjnblmlpfuavvumalzqsiibaywlutzncqynnpllygpdiqrndrdtkxafowgexyztnhjoefbnkmqcyurmmlzpomoxzgzaycskbzxsglywehercavykijxmayepzokgrwrskcpkzifynzsmraaamwausemvnzmiftcmkgqeibgvzyuajgfkmcnhaausphtlsenhnfecpfczdmvgxzrepwdjnrzbcggfobytwrsbxcuuefyprmkdoqjreayfqyviakimlaqqaafzormkycourkqymvgivresfbfflondaypnqurwdwtyoadrbctnsirqkzerxegpteaniovvkfriypvlkedyziaaejijgiguwldnbdlngbdofzpbzcbufvtfonjytalwrkvpxwlbvyquadgdzzsauoaohxxfceuxnaqaumnpryjsmkdiyqumafndewkdhypzatgntredpgiyiuhvalamveqvsgdknfqxkdzvrhxfxcubicgmrqhwuiswmlzbhzzeylhnqgp'"
295 ]
296 },
297 "execution_count": 15,
298 "metadata": {},
299 "output_type": "execute_result"
300 }
301 ],
302 "source": [
303 "vbai = vigenere_decipher(sanitise(cb), 'arcanaimperii')\n",
304 "vbai"
305 ]
306 },
307 {
308 "cell_type": "code",
309 "execution_count": 16,
310 "metadata": {},
311 "outputs": [
312 {
313 "data": {
314 "text/plain": [
315 "'ybwfeqpgshhzozgrifmfadiphcdfimcpzxourmzlfrnyodwizwvfopbcddhakhmmkxlciokdsafvrzvgulnrppiafjvidnwqfosielyooedleftzbkdlzppdvvgsjkbujwqowgoudazphtxgytoiausxybzlpyfodewqxkzcsxzxdyyrxomgmoecyvsdjysfjohktislswadmfmwbfrtrmuwwgiwkvenwqjwwhmxekouvjtzkhawpwgvkqueieywjuthqbwaviiiqsfiukyfnteynisvqkuxmftycoomvaypliaxavrbicktzkovvnzdxvujwbmihwbykwktsusaklcihcypommlgbjfnwkruzurmujkvpqmlffiwbddoywmedkcgdordxpevpqshfcgswvajkpczsycuhivnjboamffobaxphbigihjygckonatztselnmkmrfosvhnznifkqsjnauygmqwdjxomhmfqankpgbrlvppsxlldzjvtowvgscgrmtgrfxabnogzaswfgxfmitovysbmcmtvgqylteepbdgemahbarchdgonvgbbdgxhmmueezwhbigjxmozhicoialkdccswlthiknccwenedtyiqvtsjuvgisnyiplqpqmtkvmhsyxgzrwdtmreomvhfxaqxalnxcmkkpwljqffrlloikeyfqxohaavckscgmmsgnridqhyevadfxfeneafhttlgpspvmzfpdghodobakttdhcwlzwchuvvipmryehonzbebwuovxjxwjvrzalddqievfdxgcesdqgijiviryelgjjpqlweugzoagbfvnihnxpykmkbxabbdbwvfjbtlpkuqetsimrskvkkyxnoxaudyqieixxawtjvdvyszpwglfjhkriybyugvuycrtcvithdhanrqrqbkzigixvvpsbhawsphlwlbfxxyflsuhosmslkgsoiqmduislfktmjmptfccgdrmdbxsammcncizpgcicwbiqtujkpghayvnkquykotwwjkokwpymrwhvwsqocimzhkaatsqooklocokcmefceqstmevdxrtvgamjylctxxsgtlwqkiuovdsntfphsdcangaxjxibimfiibolqkkhubrrzeeeayakgdecozteavkcgsgoikmxvfrqocffpfdfdiewmyehsiwqmbgakzuenzkmhhowooxujghqgjkibhhmxfkwagsfaevimeftoqmlqqoqbwzatrorjfmqvgkvzseqodtiqxxsxoszzddrmpnusimmviqlcjwzdrazthreiqqqihxokytywolbmetwtyggdzfciadtymcxflltrenanhuxeqmgekwfravmikocygrwtasjwxiwqqaqgbbqvughewqzpphqooutixatnqnysxwuwkkxoyyzymiofwanmbiisnsfjcctugwdizsdgpcvcxhgiuobigfbdkqzzgqepvrtqjqtboddpkddsdkjzpksnfthezbpbzxwpejjdevfebzodujaqmgczivyuqulyywpqbfyeswugwfrnnipkocygrwbgneooouxqgumyhqottsxkbmvixfghsdmpwspxojqumcknfsldgqgtxvphnrntepxvqidmahqovalzepfzsqvfdagmkwcefrekgtbuvkwxegimsoogqikhwcbprqltulfmbvgxjvylegjvflmlfdyidlkmipzqsygfigmbubdncqolrxtbogxhiqrdbvlbananswgenwdbvxzomjbnkcoggchcmtdpomevdohqocaobzxiepgeuxezgavyagnfuqoexdokghuvassfkhmfynpqqziqqmeeusectrhuyvtkqkgqugfodpouingfkcarpiqksxltlsullvnuspngzdmlebhzufwlnnrzrakonerybarsbnaycmvopzqkdoghvmiovqgziakykpiygqandormawgwchaqgqvgilpianrvftsndaonrychmdexyoatpfkbdiizukzehvioxjuavmovvadvqgfllsidyzyyemryzgqkuwltlfltdwblsfzprxgjcvltnsnjyjypezalpfalbvooyilwtzhwauoqmlffvsecbnaqqsqvxhojaqkdiooyuivddmakdhondibwdtzidpgywmcplqliqveqlqklsdvqfodzvhfbnfskbqggmrgfacqimmtdbhzpcctpdggx'"
316 ]
317 },
318 "execution_count": 16,
319 "metadata": {},
320 "output_type": "execute_result"
321 }
322 ],
323 "source": [
324 "vbai = beaufort_variant_decipher(sanitise(cb), 'arcanaimperii')\n",
325 "vbai"
326 ]
327 },
328 {
329 "cell_type": "code",
330 "execution_count": 17,
331 "metadata": {},
332 "outputs": [
333 {
334 "name": "stderr",
335 "output_type": "stream",
336 "text": [
337 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
338 " \"matplotlib is currently using a non-GUI backend, \"\n"
339 ]
340 },
341 {
342 "data": {
343 "image/png": "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\n",
344 "text/plain": [
345 "<matplotlib.figure.Figure at 0x7f74f40ca828>"
346 ]
347 },
348 "metadata": {},
349 "output_type": "display_data"
350 }
351 ],
352 "source": [
353 "fc = collections.Counter(sanitise(cb))\n",
354 "plot_frequency_histogram(fc)"
355 ]
356 },
357 {
358 "cell_type": "code",
359 "execution_count": 18,
360 "metadata": {},
361 "outputs": [
362 {
363 "name": "stderr",
364 "output_type": "stream",
365 "text": [
366 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
367 " \"matplotlib is currently using a non-GUI backend, \"\n"
368 ]
369 },
370 {
371 "data": {
372 "image/png": "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\n",
373 "text/plain": [
374 "<matplotlib.figure.Figure at 0x7f74b63ab748>"
375 ]
376 },
377 "metadata": {},
378 "output_type": "display_data"
379 }
380 ],
381 "source": [
382 "fp = collections.Counter(vigenere_decipher(sanitise(cb), kbv))\n",
383 "plot_frequency_histogram(fp)"
384 ]
385 },
386 {
387 "cell_type": "code",
388 "execution_count": 19,
389 "metadata": {},
390 "outputs": [
391 {
392 "name": "stderr",
393 "output_type": "stream",
394 "text": [
395 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
396 " \"matplotlib is currently using a non-GUI backend, \"\n"
397 ]
398 },
399 {
400 "data": {
401 "image/png": "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\n",
402 "text/plain": [
403 "<matplotlib.figure.Figure at 0x7f74b4bf73c8>"
404 ]
405 },
406 "metadata": {},
407 "output_type": "display_data"
408 }
409 ],
410 "source": [
411 "fp = collections.Counter(vbai)\n",
412 "plot_frequency_histogram(fp)"
413 ]
414 },
415 {
416 "cell_type": "code",
417 "execution_count": 20,
418 "metadata": {},
419 "outputs": [
420 {
421 "name": "stderr",
422 "output_type": "stream",
423 "text": [
424 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
425 " \"matplotlib is currently using a non-GUI backend, \"\n"
426 ]
427 },
428 {
429 "data": {
430 "image/png": "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\n",
431 "text/plain": [
432 "<matplotlib.figure.Figure at 0x7f74b33da198>"
433 ]
434 },
435 "metadata": {},
436 "output_type": "display_data"
437 }
438 ],
439 "source": [
440 "plot_frequency_histogram({k: 10**Pl[k] for k in Pl})"
441 ]
442 },
443 {
444 "cell_type": "code",
445 "execution_count": 21,
446 "metadata": {},
447 "outputs": [
448 {
449 "name": "stderr",
450 "output_type": "stream",
451 "text": [
452 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
453 " \"matplotlib is currently using a non-GUI backend, \"\n"
454 ]
455 },
456 {
457 "data": {
458 "image/png": "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\n",
459 "text/plain": [
460 "<matplotlib.figure.Figure at 0x7f74b2df0b38>"
461 ]
462 },
463 "metadata": {},
464 "output_type": "display_data"
465 }
466 ],
467 "source": [
468 "fp = collections.Counter(every_nth(scb, 15)[4])\n",
469 "plot_frequency_histogram(fp)"
470 ]
471 },
472 {
473 "cell_type": "code",
474 "execution_count": 22,
475 "metadata": {},
476 "outputs": [
477 {
478 "name": "stderr",
479 "output_type": "stream",
480 "text": [
481 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
482 " \"matplotlib is currently using a non-GUI backend, \"\n"
483 ]
484 },
485 {
486 "data": {
487 "text/plain": [
488 "'y'"
489 ]
490 },
491 "execution_count": 22,
492 "metadata": {},
493 "output_type": "execute_result"
494 },
495 {
496 "data": {
497 "image/png": "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\n",
498 "text/plain": [
499 "<matplotlib.figure.Figure at 0x7f74b3e6b7f0>"
500 ]
501 },
502 "metadata": {},
503 "output_type": "display_data"
504 }
505 ],
506 "source": [
507 "k, _ = caesar_break(every_nth(scb, 15)[4])\n",
508 "fp = collections.Counter(caesar_decipher(every_nth(scb, 15)[4], k))\n",
509 "plot_frequency_histogram(fp)\n",
510 "unpos(k)"
511 ]
512 },
513 {
514 "cell_type": "code",
515 "execution_count": 23,
516 "metadata": {},
517 "outputs": [
518 {
519 "name": "stderr",
520 "output_type": "stream",
521 "text": [
522 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
523 " \"matplotlib is currently using a non-GUI backend, \"\n"
524 ]
525 },
526 {
527 "data": {
528 "image/png": "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\n",
529 "text/plain": [
530 "<matplotlib.figure.Figure at 0x7f74b58ae400>"
531 ]
532 },
533 "metadata": {},
534 "output_type": "display_data"
535 }
536 ],
537 "source": [
538 "fp = collections.Counter(vigenere_decipher(sanitise(cb), kbv))\n",
539 "plot_frequency_histogram(fp, sort_key=fp.get)"
540 ]
541 },
542 {
543 "cell_type": "code",
544 "execution_count": 24,
545 "metadata": {},
546 "outputs": [
547 {
548 "name": "stderr",
549 "output_type": "stream",
550 "text": [
551 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
552 " \"matplotlib is currently using a non-GUI backend, \"\n"
553 ]
554 },
555 {
556 "data": {
557 "image/png": "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\n",
558 "text/plain": [
559 "<matplotlib.figure.Figure at 0x7f74b47694a8>"
560 ]
561 },
562 "metadata": {},
563 "output_type": "display_data"
564 }
565 ],
566 "source": [
567 "plot_frequency_histogram({k: 10**Pl[k] for k in Pl}, sort_key=Pl.get)"
568 ]
569 },
570 {
571 "cell_type": "code",
572 "execution_count": 25,
573 "metadata": {},
574 "outputs": [
575 {
576 "data": {
577 "text/plain": [
578 "(('taxied', <KeywordWrapAlphabet.from_last: 2>), -3188.639246703687)"
579 ]
580 },
581 "execution_count": 25,
582 "metadata": {},
583 "output_type": "execute_result"
584 }
585 ],
586 "source": [
587 "vb = vigenere_decipher(sanitise(cb), kbv)\n",
588 "keyword_break_mp(vb)"
589 ]
590 },
591 {
592 "cell_type": "code",
593 "execution_count": 26,
594 "metadata": {},
595 "outputs": [
596 {
597 "data": {
598 "text/plain": [
599 "'pdtoahnlqubrfnthhsuxetulrefltrhnrtyhhuefwpkxamdaeiffglrmqbnamyunenbruatufxhuirerdrrexnaazhehmtwalcalktntaexlbiyafaenrmmhmhhaxlftohbcrthlaoanhrhaxyosorchtaaauwqhbelsnchtaxwytwqalvvtueetwlltoenypteybhybdtgybwelpahreuobnaehmukxytioatwmnphnahteaalybeemhhergkrwfftyhqlnbsbapagwmajaacrdlalsnashaivelprsepetlebazflfrfmlvirmhnbawctohlufuosowqdsqfgyslmveiilhhtrhmyznlmiihmsoanyuisbaparmyufernrkwhdmbgwyhetatohbcrthlanseaamodetntbrialnwtoaaaumdhrsamtheahecnqgmtwtohbyhsaznsmbnwcayhprnevrgnamihuoksorfaaemhriulrbrnteyysqrnhhasiamwqyosoaeetawrtoawnmsilbioahksahwnwbutrvaedfqriazgkrrpennhrttlfzdsbyuhtqqweoubirvvqfhnteiapohnantprbtarxamwqyostcshhlablpegufmvgueenydnmaeyoosnrthuhulynbulektlkarrxrsrdlbbradhetiwrqqyznxiuarmndiprnnbqasnraarfflnnhpafxftylnhilpoweosqrnrltghhnlrwqpejewperocwaatckialuahwntoagssbrrghrexioawotfvsnnhngekatlyznnmynhrexdesylcueaqrsanermpohnaithjrltbwbtrfqagopaaarbbacwfbmnvneecazenleecqpvsnrlhxdmrndliptnloqlryarhdlikyoubmaeiohapsuetrtioarhpnlailgdatdtxodgjqqyotonfksriyfprbzeeiarbamlqtoazzmsoshhrmaoclyayoquoayrmlhaehhelitmwqsldblelryostcshhlabglckwelnlcdtuerqlnillavcadergglueizehuoaecwdiulybtrpzntdynfogyqfdnqotoheaztldaallgmbtyasawduesbosqrnsoratampdyomtgyauetioabawitrashrghzutoswqsnledrrrxoarxbmapahhtlswebhwltesqiegybdtprbsepetohetyettohclmolbioaswmavzwngtdaeqaxbrqybyubophwtawnounbulekrtioarhpnurwqsutaatlsetlmeyaluoanubiymrflbbkiatyajefaembsbvsfurtohqarhwitntglrnyfbousbsbvshgonraaagurdnerachenddremfdgtznweawdonolrshquynzarahavsabnmrfgyrhthmwfwdhvmntkyednugaryrfnihhrthksahwnmkwutdreiwnagonarsvhwcrreuetybekitohhevdeimwenqgmfhtfwophuibtkwalntohflnnwitntglxavwsgyqishbwflohqhemaheohthlqeorbeqhaeafrsumioagaugawinbhorflnblytunklbnlewthhsldaayoshlmhvwhnlhaiuarsnndeiwntoaqbrguoarflokrfwhtygttoetfwopuqfjltgoukfloiaqqkbtnsturtaffuiarmaxilcegrgiyhaxtszoyitanibtoriyosuhrdtlasrqiemymprnioaswmavelmtocrbnurtounbdsrmhthhndrtoarshappodqaiyawragrgvrebtohknaqubnqiayrquvhqftwerdtcysolnioagwaauhrqtrgobunrrbmbhrthmhwkrerraoswyniwabilsshawsylhhoaseemabyhketohnasohutqsbapauksaadrqgdxosintyagwxavpdcqcthasldhaamlaklbelyabrkdqfrraaithfweaqwyjewvptrqseftyhshusbrfnnliltyhnadhltnarhilbiyathobnamhfwbrtauglfwufqousotyhbrthsbapaedetyfaiuwlrfnlbioaswmavdynsrbpdqqdrtuchgagtdaeqaxoetufyosgutzuqflaiyenmsnwfioaerguarywqxfqweuerilmxbnmmbpeh'"
600 ]
601 },
602 "execution_count": 26,
603 "metadata": {},
604 "output_type": "execute_result"
605 }
606 ],
607 "source": [
608 "keyword_decipher(vb, 'taxied', KeywordWrapAlphabet.from_last)"
609 ]
610 },
611 {
612 "cell_type": "code",
613 "execution_count": 27,
614 "metadata": {},
615 "outputs": [
616 {
617 "data": {
618 "text/plain": [
619 "'gekyjtdxzlabrdkttilphklxbhrxkbtdbkqttlhrogwpjfejhurrsxbfzadjfqldhdabljklrptlubhbebbhpdjjcthtfkojxnjxwkdkjhpxauqjrjhdbfftfttjpxrkytanbktxjyjdtbtjpqyiybntkjjjloztahxidntkjpoqkozjxmmklhhkoxxkyhdqgkhqatqaeksqaohxgjtbhlyadjhtflwpqkuyjkofdgtdjtkhjjxqahhftthbswborrkqtzxdaiajgjsofjvjjnbexjxidjitjumhxgbihghkxhajcrxrbrfxmubftdajonkytxlrlyiyozeizrsqixfmhuuxttkbtfqcdxfuutfiyjdqluiajgjbfqlrhbdbwotefasoqthkjkytanbktxjdihjjfyehkdkabujxdokyjjjlfetbijfkthjthndzsfkokytaqtijcdifadonjqtgbdhmbsdjfutlywiybrjjhftbulxbabdkhqqizbdttjiujfozqyiyjhhkjobkyjodfiuxauyjtwijtodoalkbmjherzbujcswbbghddtbkkxrceiaqltkzzohylaubmmzrtdkhujgytdjdkgbakjbpjfozqyiknittxjaxghslrfmslhhdqedfjhqyyidbktltlxqdalxhwkxwjbbpbibexaabjethkuobzzqcdpuljbfdeugbddazjidbjjbrrxddtgjrprkqxdtuxgyohyizbdbxksttdxbozghvhoghbynojjknwujxljtodkyjsiiabbstbhpuyjoykrmiddtdshwjkxqcddfqdtbhpehiqxnlhjzbijdhbfgytdjuktvbxkaoakbrzjsygjjjbaajnorafdmdhhnjchdxhhnzgmidbxtpefbdexugkdxyzxbqjbtexuwqylafjhuytjgilhkbkuyjbtgdxjuxsejkekpyesvzzqykydrwibuqrgbachhujbajfxzkyjccfiyittbfjynxqjqyzlyjqbfxtjhtthxukfozixeaxhxbqyiknittxjasxnwohxdxneklhbzxduxxjmnjehbssxlhuchtlyjhnoeulxqakbgcdkeqdrysqzredzykythjckxejjxxsfakqjijoelhiayizbdiybjkjfgeqyfksqjlhkuyjajoukbjitbstclkyiozidxhebbbpyjbpafjgjttkxiohatoxkhizuhsqaekgbaihghkythkqhkkytnxfyxauyjiofjmcodskejhzjpabzqaqlaygtokjodyldalxhwbkuyjbtgdlbozilkjjkxihkxfhqjxlyjdlauqfbrxaawujkqjvhrjhfaiamirlbkytzjbtoukdksxbdqrayliaiamitsydbjjjslbedhbjnthdeebhfreskcdohjoeydyxbitzlqdcjbjtjmijadfbrsqbtktforoetmfdkwqhedlsjbqbrduttbktwijtodfwolkebhuodjsydjbimtonbbhlhkqahwukytthmehufohdzsfrtkroygtluakwojxdkytrxddoukdksxpjmoisqzuitaorxytzthfjthytktxzhybahztjhjrbilfuyjsjlsjoudatybrxdaxqkldwxadxhokttixejjqyitxftmotdxtjuljbiddehuodkyjzabslyjbrxywbrotkqskkyhkroyglzrvxksylwrxyujzzwakdiklbkjrrlujbfjpuxnhsbsuqtjpkicyqukjduakybuqyiltbekxjibzuhfqfgbduyjiofjmhxfkynbadlbkyldaeibftkttdebkyjbitjggyezjuqjobjsbsmbhakytwdjzladzujqbzlmtzrkohbeknqiyxduyjsojjltbzkbsyaldbbafatbktftowbhbbjyioqduojauxiitjoiqxttyjihhfjaqtwhkytdjiytlkziajgjlwijjebzsepyiudkqjsopjmgenznktjixetjjfxjwxahxqjabwezrbbjjuktrohjzoqvhomgkbzihrkqtitliabrddxuxkqtdjetxkdjbtuxauqjktyadjftroabkjlsxrolrzyliykqtabktiajgjhehkqrjuloxbrdxauyjiofjmeqdibagezzebklntsjskejhzjpyhklrqyislkclzrxjuqhdfidoruyjhbsljbqozprzohlhbuxfpadffaght'"
620 ]
621 },
622 "execution_count": 27,
623 "metadata": {},
624 "output_type": "execute_result"
625 }
626 ],
627 "source": [
628 "keyword_decipher(vb, 'arcanaimperii', KeywordWrapAlphabet.from_largest)"
629 ]
630 },
631 {
632 "cell_type": "code",
633 "execution_count": 28,
634 "metadata": {},
635 "outputs": [
636 {
637 "data": {
638 "text/plain": [
639 "'kccgi'"
640 ]
641 },
642 "execution_count": 28,
643 "metadata": {},
644 "output_type": "execute_result"
645 }
646 ],
647 "source": [
648 "cat(unpos(caesar_break(section)[0]) for section in every_nth(scb, 5))"
649 ]
650 },
651 {
652 "cell_type": "code",
653 "execution_count": 29,
654 "metadata": {},
655 "outputs": [
656 {
657 "data": {
658 "text/plain": [
659 "'oiszjgfsxvgpethfgqgpemcsrkbmaefnpfrgycldenlfglirpxdvmsrsobtglbtyunsyctateftuhpphijylztruitdgkfotdealqsoagdzjlxblkaetpnstlgeeplvbvggvsatktmedgjnazhmtuewgsejtnfxggcmyawgsepytbfqzjxchuecfoldbvetzqaraaemqimmiaecmvgfrcgeafalgstlfothmekyeuwgtrharstjmqewtngkpgqexdbfrgisuayyuvgeykeztleyirrmyasseexwwswrycqkhkeyesddkydsjxnelglljypbvgrtebbrowbysikmbyjncrghjrwujntbilmsuggkdetfichyyuvgqmzgtejuykeejsneyzruulbvggvsatktldutltviksoanqhrwdymvatztnotqsrxkgwanedlrlztyszwatnztiltsnmyverghyuecpgtglhegekkvydzrfstqhtwhajubehztwemgeeihltfqhmtugdeseormvaytktnyzhmewkkanytwbbhqwrpydiyotidlxeoelywrmbsdigtgougsbgywvcanpxcdcglfuhlwvgtroacqasehzltfqhmtakrgewjadwlfbbncsuecyriftaehmpyaquegwvdiuabjfqhkkrchzjzyirybxghgcfxyjxxbilanisrkyyhhyungouyaqtrctdduugvrefqtbjywhdwvykmtwemrjfvgyusreoqkwdynphopfatavlngkvrronmvafyqbxeegppphgafoabxyamglquklbsbilosomgpppiwzildtfzdqsryurewvgtriatirjfqysbydwrgucstrcqalefdgkocadevesefsledoqcfmrjrpieyuirfqaakoowhblynirflhbuakeuhgnapytfaethmehghustnjgogtiskeixqxqhmvuackqcxbvwyaicfngqarxbqmvaciktuffgpxjopsithmrbbsbpxbgllngkjiazxqqwyadlsrhmtakrgewjaxsekecmtywisgurisuhrjucksiccvfdclhichbbsevjyhnsiaapqiatizytoxixdolruhngcesudpatrjgsntbrdjyaclsgmtwemsmcjultwihmnasattpkhgahtefvxgrgpqwcnbvseottydipchzgayzgkuvgfgswiywhnyrsfydgedmqimwyaycqkhngcfrembvgdjnuyzhmeiyeadcelgavseoepajxiahtbucfyseongcuabjfqethmehghucreotbhstswiemstehrmbbsntlxbeyklgylngtbruudlltayyxyqurszwqlynynsoaskrlmtagczayyxyteolcjtlmcrolfxgwgcyyijltdodviaxerjyofvsryerbomcrcjgldztglnxqebprkgefkyoexsatkzpynnmarhpetufgpfwkkanytkleitippxyfamotrsyjfyvchenlbbgclnhngepmiwotyklrlzcgsooohnchgslegknszwdduuynsoaskzrhosxixhyebeqkoebweeaneuevmypemcqeinaezbsyilhmevtnmaynlbmbqdjyqltbcnqjbtydysrwsdpathmtmylgujwndnahbrsyamicsonmvaqgpgbbsrbwekjkfgazgahnesooohcxdpjvlbukbwehlxxkgsoyhursetdnoarsranywedcvhtnazaqduoguryxamvyhhmtbtqiswjsjxoesznvemhmeiyeaderkvukqalghugcuaoqssttgeyyrmvaryeuvcnioexblfytlpgcedaszwkfaxvglrngarogmgikbykpjakasmwdhgamyzrwmepupqeanuyrgkbmetgkrokjlyrzmteomhweqhdzzgzwthyfgmeiewtaahelkhngleioycbqyyuvgukqejijxmifmtnatbrqozldwidoyatssjtwtltstqjbkyatycaiikyrzriatcycegytqlycnvxdrebfrgkncsgpetakhjfrgfapgrsozefhjlxblbnoglustcyycktnmsdetewbusmfrgsybgyyuvgdicfrdlocyrpetyzhmeiyeadihltxnoiobyrmceglrgavseoepowbcdhmtlitctbtlloietkttlchmeurxcarhwrfqpycgurzstzglnsnoee'"
660 ]
661 },
662 "execution_count": 29,
663 "metadata": {},
664 "output_type": "execute_result"
665 }
666 ],
667 "source": [
668 "vb5 = vigenere_decipher(scb, 'kccgi')\n",
669 "vb5"
670 ]
671 },
672 {
673 "cell_type": "code",
674 "execution_count": 30,
675 "metadata": {},
676 "outputs": [
677 {
678 "data": {
679 "text/plain": [
680 "'iya'"
681 ]
682 },
683 "execution_count": 30,
684 "metadata": {},
685 "output_type": "execute_result"
686 }
687 ],
688 "source": [
689 "cat(unpos(caesar_break(section)[0]) for section in every_nth(scb, 3))"
690 ]
691 },
692 {
693 "cell_type": "code",
694 "execution_count": 31,
695 "metadata": {},
696 "outputs": [
697 {
698 "data": {
699 "text/plain": [
700 "'qmuxtqzwdvsrybphksezoggyrwdgimhrrdbqsgrdqpfnonmtnhnpqyreqvbonfvwexmcitmvynbwlrnrsdcrzftoqbfkmdydxiglcuiiofdljhlfogefrhabnkgczvpfbgsxmibmxocnqdrgztoncmykuctdhjdgseggiykuczinflqllrkpwiedyvxfbefbkizcegkasgqoaqegdohveeokzergevfnwvlocuiyycgftbizuxlkaoqxtgwraymzhddbqcwaakaodogcmcjdfieidtggiuwgchgqwcrkekspmiaccnxoedelrvmnknjtijfbgdvyjjtsyziccosbklhkzillpgedrzbungacikmbodzmihkaodosqbedodyekqgdavgcbpeeffbgsxmibmxnbedfxbiwuiivsltunigzgtlvhwbswtvuqqetepnlthvcuxgknrftunnavocxcbqbcaeorabonlgeouezedltzabslvurkdyhetbnemokgcsrfxlqtoncofiucybgzgyfmnvgblocgueetyfyvjpsatninccutufffmqinwgbgfyduinowwkuzqiqziazrrkleknderfabgftiikseucrjfxlqtonistkgutkxarfndhkawiewbszxgetojgisygegfxmaanlzypmotarjddeidavfojkedhidbdbunuvquvmwirbcansqogisxtadnxyaghtynyvflwgrxabywonemovldfqsyyrqqksefcpnryjjgtmxfvomztpyxgzgfksvfmgkrnzraelomdrgioknoeuffybuniawokrnzsqdolpvzhlswtwebyabgftcibkvldaimfeditackuxtaakfildsmikifixccozwrepqkknovlpzsycaidhkiimsqurlfctidhfpjwemcerargpkvzimvlocrqbyytzlawovmuiosrudqtopcieosahlpaeauezvosetvlagzgcumncnhkrvtyjwottoljjufrvlqfptgwlcihzusuikxpyrtonistkgutkrwkkqegbgymueebcwahdloksumeafpxgrhuebjjuixhirhwoamrkqivmbwdyrmddanlcppkeccextgtdlaavvftbtiugrssonemowoatefxcitohiacxvnuraentqhpfotkrogmhfbsqqnbgfmrarjaeezsmodohkuusiqltyduzgliifkasgaeakeksppkedbogfbgplhcgblocsiyejcqnaiduiqczkdboatvvckhcucyxagaanlzymvlocrqbyirqqnjpuxuusogwzettgjjurvjhlycqlsafvovftsenfpzakargywvuxgafctyzuiiamvnkdkagfakargbgsnatdfqiranzfoykewisdpzdafpqizithiyzzyrkgljwogtatqfhftsnhfygfrpuqyjqyagraivobnixhqgrtrybchkrdgueetyfmfmqvmrnhizesoftmgrhcxarohphbsefvppkgnwsqszywnlthekumyybrihsufmomruxgnxyayzuiiamdtfycrmdhkgvmymsgzgoyeteggpugrioaaocrgeldmgqnlocfdhqgyznvujshlwavnfinclvbgfcupgcxtgttonugnkwhgxxrghntmgiomeqyxgzgqsrajjuvduoudolgmbaippiumyybgddblptjwoduorfbdksuigpwvucdnhsgretuvgyifafrnrgzmsxcwiytwhkgzehtonjbsmuutcdbueebhdmolocsiyejedmpcssenereagaaasmabvkgwibgzgrkgodkpmqchlfjetxrakmfeuxguzedvsnlvocvqewqcohywrdiscwounraesyltqumryrookhyersmvumvkmpyudperlonmwolycarxdfglynpghkocsoqxgatgfsppkncsysghqkaodowosctsdbsironvivftoyjfhcipqsibuwlrgdfxytclvsgcxaakscoerltcibececqinuryoppfltiddbqerissrybimlldbqzevgduihmhlljhlfftosnoabecaaudhqydqvyejwwodbqmchgkaodofmedbnfsiydrybgblocsiyejitnnfvqmqzibggkgxtaiduiqczyqfidtontqvgvzdvfsoefmnbtelocebrggrtylnyrceeebtwzzsnhavqig'"
701 ]
702 },
703 "execution_count": 31,
704 "metadata": {},
705 "output_type": "execute_result"
706 }
707 ],
708 "source": [
709 "vb3 = vigenere_decipher(scb, 'iya')\n",
710 "vb3"
711 ]
712 },
713 {
714 "cell_type": "code",
715 "execution_count": 32,
716 "metadata": {},
717 "outputs": [
718 {
719 "name": "stderr",
720 "output_type": "stream",
721 "text": [
722 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
723 " \"matplotlib is currently using a non-GUI backend, \"\n"
724 ]
725 },
726 {
727 "data": {
728 "image/png": "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\n",
729 "text/plain": [
730 "<matplotlib.figure.Figure at 0x7f74b5baaa90>"
731 ]
732 },
733 "metadata": {},
734 "output_type": "display_data"
735 }
736 ],
737 "source": [
738 "fp = collections.Counter(vb5)\n",
739 "plot_frequency_histogram(fp, sort_key=fp.get)"
740 ]
741 },
742 {
743 "cell_type": "code",
744 "execution_count": 33,
745 "metadata": {},
746 "outputs": [
747 {
748 "name": "stderr",
749 "output_type": "stream",
750 "text": [
751 "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:418: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
752 " \"matplotlib is currently using a non-GUI backend, \"\n"
753 ]
754 },
755 {
756 "data": {
757 "image/png": "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\n",
758 "text/plain": [
759 "<matplotlib.figure.Figure at 0x7f74b458ec50>"
760 ]
761 },
762 "metadata": {},
763 "output_type": "display_data"
764 }
765 ],
766 "source": [
767 "fp = collections.Counter(every_nth(scb, 15)[0])\n",
768 "plot_frequency_histogram(fp, sort_key=fp.get)"
769 ]
770 },
771 {
772 "cell_type": "code",
773 "execution_count": 34,
774 "metadata": {},
775 "outputs": [
776 {
777 "data": {
778 "text/plain": [
779 "'etoainhsrdlumwycfgpbvkxjqz'"
780 ]
781 },
782 "execution_count": 34,
783 "metadata": {},
784 "output_type": "execute_result"
785 }
786 ],
787 "source": [
788 "ltrs = [p[0] for p in english_counts.most_common()]\n",
789 "cat(ltrs)"
790 ]
791 },
792 {
793 "cell_type": "code",
794 "execution_count": 35,
795 "metadata": {},
796 "outputs": [
797 {
798 "data": {
799 "text/plain": [
800 "'trguenloasybvhmqdifpkxwzcj'"
801 ]
802 },
803 "execution_count": 35,
804 "metadata": {},
805 "output_type": "execute_result"
806 }
807 ],
808 "source": [
809 "ctls = [p[0] for p in collections.Counter(sanitise(vb)).most_common()]\n",
810 "cat(ctls)"
811 ]
812 },
813 {
814 "cell_type": "code",
815 "execution_count": 36,
816 "metadata": {},
817 "outputs": [
818 {
819 "data": {
820 "text/plain": [
821 "{'a': 'r',\n",
822 " 'b': 'u',\n",
823 " 'c': 'q',\n",
824 " 'd': 'f',\n",
825 " 'e': 'i',\n",
826 " 'f': 'p',\n",
827 " 'g': 'o',\n",
828 " 'h': 'w',\n",
829 " 'i': 'g',\n",
830 " 'j': 'z',\n",
831 " 'k': 'v',\n",
832 " 'l': 'h',\n",
833 " 'm': 'y',\n",
834 " 'n': 'n',\n",
835 " 'o': 's',\n",
836 " 'p': 'b',\n",
837 " 'q': 'c',\n",
838 " 'r': 't',\n",
839 " 's': 'd',\n",
840 " 't': 'e',\n",
841 " 'u': 'a',\n",
842 " 'v': 'm',\n",
843 " 'w': 'x',\n",
844 " 'x': 'k',\n",
845 " 'y': 'l',\n",
846 " 'z': 'j'}"
847 ]
848 },
849 "execution_count": 36,
850 "metadata": {},
851 "output_type": "execute_result"
852 }
853 ],
854 "source": [
855 "trans = {pr[1]: pr[0] for pr in zip(ltrs, ctls)}\n",
856 "trans"
857 ]
858 },
859 {
860 "cell_type": "code",
861 "execution_count": 37,
862 "metadata": {},
863 "outputs": [
864 {
865 "data": {
866 "text/plain": [
867 "'Bgas eonhcmr tfn aoodmjiamht if hato ntauoo mi flb vjeygeiwff phtycrney umn inrtmea mf Jomwtitgt tij neeqoioy al Ehke hv ana eij hr wue fein, ty yoyooej hf aso Rktaohe. Se notoej usd stko aeeemlco rih dn koaej lua lc Ehxxamii al hhas Inubaiur Ourgapur lih Beotimsr Neioymv, jua wse Alyn bone oaieehur iiy, ooitpvtlff auo chnr dr ebe Plyez eektgheh d nedoew, xihbt dibi ah i req fhftf yhxwtyon relk aso Hmfms. Dslcgdcf pudhyxiw wh ooatoy uqn hywwoy dsenumw dr ebe Tyumfi tn t vlog yr pluoiae, aso Rktaohe ndieey sgi ana rtwe hn lasee emygotdey aoieoikn cpy, al aso ruodeqnd yr nlke, uo btn ixtpney womsvdstf eeiyotwmhtr. T naiuud ctn ooedwey lc usd Seiiae lt ase lnydw hr wse Ovdeoln, lrm, atxei gfc, Tweqpvtt bin nota ah fqgd rumoacc li smr wtxxcf onaiwe bsone na btr aetjey lc usd Akdoohe’r hbi pmfyxpmiin. Ugn yeius sdn t aomomhun rmhiv ah ve, ttj t dtghrrt egoia wl tcc uqn jwmetyn. Gw btn nrce dn t eetf fhnn obef jf auhno wh bsli sd ctn tha poonhtlcbi zilbi. Tskleea, kvwehmeo, ln ase pddrttpo tij wse lsaf xdnnon pive ah uqn nyuno; tij gi duhkmi ectden, ity bsonewao zthar lr atfceps beee trreklfry, nxn iike qin hi ikc bxdn; tho jgy t nghwba nhsc ht uetoghw vu smr yeiws oebdmia ta wse tobn he whpgea ga jsgpzcc. Usas nfvdtwuf btr qiiwetrey hc ase qqyd-sdooty eskhue uscm se uty hoei ooihway lc dhgrhi ht usd Akdoohe’r phkvlih. Nhkgamit chnw hh exke gi tpphmiwqio mse iklgwmhur Atbqnagun Fspucfgn cs aso ieq ahgeehhp yr aue delgmidr. Sd ctn dsteaey bgus yapuemia wse relwate dotpo qmas Dlcdnhigt ttj setjry ebeoo ah dlirolha Idcwipur. Ga btr dibi asoi auia aso khys hr wse Dlyex qln pageicej. Rtcurumrs bolae ln smn rmhiv ta wse tobn mt l cdmaee ah Diah yiueh mse nmrwu ytf hrrvwe aue zifeiyr dr Xdf mt aso ceto lw ana phtnufrsmdr dr Xdopsn Teeepmtgn Itekoin GG tiy Fgpaqn Lielgsn Shtdocmun. “Qe teo exdernytf putoaoy lf lgo xyna vuignmpetu tfn woota Ovdeoln Yvlmagti wl nepsne Tdx Olktti mi aur Ivwasooi Xgiwylin cpy foa fls bomwr av le hn aso fhnn lw ana Phjex Ldpucwdorl. Fhso coiyeo Isoaohci str icoeief tdmy wse pempe lw nros t fhnr, hua mn vhr nh ila oodhgee usd Ohyox lonhoe wme tdnngiw ln ase crtp mset fhs vtf lo aupa asia fls bmcf zhap smv. Fhs wecc vr anda mtaeffmwetye jwhk i ptpwuoej adq suwaenwr astw usd motgahe Dtcwiyuy btn wse Dlyex ihy as ktrnmta smn rgdtyoaoon gt ase Tdoeb. Bsgce wue Lteptpxtir asovnecmrn cwe utcmxocf al itga kuds hn wse Pleem, Otcatpsr mn tt ryrotaoy Olvti tte sd lunw le rwhddoe lduhoo se dii yeruovi aso nedsomac dr ebe Mvdeegtc pgjsdwn. Aue Pljex bgkc ka oedhgoeey, he vhr, ihue rtvgcf tte ewaoflie clu zilx batc dif auo domdr. Tfn nh wh auo negohan etow hr wue aosr neyof lr Taemphfl mf csmds auo rtao dr ebe igiau fewmlh tfn hr wse Dlyex gundtr bgcc gt amko pe pageicej. Siamf usdp ma qmcf he wuinydn lf wse itpmetu Lcjfclimit Whyjrny yr Bio.'"
868 ]
869 },
870 "execution_count": 37,
871 "metadata": {},
872 "output_type": "execute_result"
873 }
874 ],
875 "source": [
876 "tt = ''.maketrans(trans)\n",
877 "# tpack(repunctuate(vb.translate(tt), pub))\n",
878 "repunctuate(vb.translate(tt), pub)"
879 ]
880 },
881 {
882 "cell_type": "code",
883 "execution_count": 38,
884 "metadata": {},
885 "outputs": [
886 {
887 "name": "stdout",
888 "output_type": "stream",
889 "text": [
890 "Zxlv ehbtfms iyb lhhcmjolmti oy tlih bilrhh mo ydz ujeaxeonyy ktiafsbea rmb obsimel my Jhmnioixi ioj\n",
891 "beephoha ld Etqe tu lbl eoj ts nre yeob, ia ahahhej ty lvh Sqilhte. Ve bhihej rvc viqh leeemdfh sot\n",
892 "cb qhlej drl df Etwwlmoo ld ttlv Obrzlors Hrsxlkrs dot Zehiomvs Beohamu, jrl nve Ldab zhbe hloeetrs\n",
893 "ooa, hhoikuidyy lrh ftbs cs eze Kdaeg eeqixtet c bechen, wotzi cozo lt o sep ytyiy atwniahb sedq lvh\n",
894 "Tmymv. Cvdfxcfy krctawon nt hhliha rpb tannha cvebrmn cs eze Iarmyo ib i udhx as kdrhole, lvh\n",
895 "Sqilhte bcoeea vxo lbl sine tb dlvee emaxhicea lhoehoqb fka, ld lvh srhcepbc as bdqe, rh zib owikbea\n",
896 "nhmvucviy eeoahinmtis. I blorrc fib hhecnea df rvc Veoole di lve dbacn ts nve Hucehdb, dsm, liweo\n",
897 "xyf, Inepkuii zob bhil lt ypxc srmhlff do vms niwwfy hblone zvhbe bl zis leijea df rvc Lqchhte’s tzo\n",
898 "kmyawkmoob. Rxb aeorv vcb i lhmhmtrb smtou lt ue, iij i cixtssi exhol nd iff rpb jnmeiab. Xn zib\n",
899 "bsfe cb i eeiy ytbb hzey jy lrtbh nt zvdo vc fib itl khhbtidfzo godzo. Ivqdeel, qunetmeh, db lve\n",
900 "kccsiikh ioj nve dvly wcbbhb koue lt rpb barbh; ioj xo crtqmo eficeb, oia zvhbenlh gitls ds liyfekv\n",
901 "zeee isseqdysa, bwb ooqe pob to oqf zwcb; ith jxa i bxtnzl btvf ti reihxtn ur vms aeonv hezcmol il\n",
902 "nve ihzb te ntkxel xl jvxkgff. Rvlv byucinry zis pooneisea tf lve ppac-vchhia evqtre rvfm ve ria\n",
903 "theo hhotnla df ctxsto ti rvc Lqchhte’s ktqudot. Btqxlmoi ftbn tt ewqe xo ikktmonpoh mve oqdxnmtrs\n",
904 "Lizpblxrb Yvkrfyxb fv lvh oep ltxeettk as lre cedxmocs. Vc fib cvielea zxrv alkremol nve sednlie\n",
905 "chikh pmlv Cdfcbtoxi iij veijsa ezehh lt cdoshdtl Ocfnokrs. Xl zis cozo lvho lrol lvh qtav ts nve\n",
906 "Cdaew pdb klxeofej. Sifrsrmsv zhdle db vmb smtou il nve ihzb mi d fcmlee lt Colt aoret mve bmsnr aiy\n",
907 "tssune lre goyeoas cs Wcy mi lvh feih dn lbl ktibrysvmcs cs Wchkvb Ieeekmixb Oieqhob XX ioa Yxklpb\n",
908 "Doedxvb Vtichfmrb. “Pe ieh ewcesbaiy krihlha dy dxh wabl uroxbmkeir iyb nhhil Hucehdb Audmlxio nd\n",
909 "bekvbe Icw Hdqiio mo lrs Ounlvhho Wxonadob fka yhl ydv zhmns lu de tb lvh ytbb dn lbl Ktjew\n",
910 "Dckrfnchsd. Ytvh fhoaeh Ovhlhtfo vis ofheoey icma nve kemke dn bshv i ytbs, trl mb uts bt odl\n",
911 "hhctxee rvc Htahw dhbthe nme icbbxon db lve fsik mvei ytv uiy dh lrkl lvol ydv zmfy gtlk vmu. Ytv\n",
912 "neff us lbcl mileyymneiae jntq o kiknrhej lcp vrnlebns lvin rvc mhixlte Cifnoara zib nve Cdaew ota\n",
913 "lv qisbmil vmb sxciahlhhb xi lve Ichez. Zvxfe nre Diekikwios lvhubefmsb fne rifmwhfy ld oixl qrcv tb\n",
914 "nve Kdeem, Hiflikvs mb ii sashilha Hduio iie vc drbn de sntcche dcrthh ve coo aesrhuo lvh becvhmlf\n",
915 "cs eze Muceexif kxjvcnb. Lre Kdjew zxqf ql hectxheea, te uts, otre siuxfy iie enlhydoe fdr godw zlif\n",
916 "coy lrh chmcs. Iyb bt nt lrh bexhtlb eihn ts nre lhvs beahy ds Ilemktyd my fvmcv lrh silh cs eze\n",
917 "oxolr yenmdt iyb ts nve Cdaew xrbcis zxff xi lmqh ke klxeofej. Volmy rvck ml pmfy te nrobacb dy nve\n",
918 "oikmeir Dfjyfdomoi Ntajsba as Zoh.\n"
919 ]
920 }
921 ],
922 "source": [
923 "trans = {\n",
924 " 'a': 's',\n",
925 " 'b': 'r',\n",
926 " 'c': 'p',\n",
927 " 'd': 'y',\n",
928 " 'e': 'o',\n",
929 " 'f': 'k',\n",
930 " 'g': 'h',\n",
931 " 'h': 'n',\n",
932 " 'i': 'x',\n",
933 " 'j': 'g',\n",
934 " 'k': 'u',\n",
935 " 'l': 't',\n",
936 " 'm': 'a',\n",
937 " 'n': 'b',\n",
938 " 'o': 'v',\n",
939 " 'p': 'z',\n",
940 " 'q': 'f',\n",
941 " 'r': 'i',\n",
942 " 's': 'c',\n",
943 " 't': 'e',\n",
944 " 'u': 'l',\n",
945 " 'v': 'm',\n",
946 " 'w': 'w',\n",
947 " 'x': 'q',\n",
948 " 'y': 'd',\n",
949 " 'z': 'j'}\n",
950 "\n",
951 "\n",
952 "tt = ''.maketrans(trans)\n",
953 "print(lcat(tpack(repunctuate(vb.translate(tt), pub).split())))"
954 ]
955 },
956 {
957 "cell_type": "code",
958 "execution_count": 39,
959 "metadata": {},
960 "outputs": [
961 {
962 "data": {
963 "text/plain": [
964 "('jcarykujniqadmv', 15)"
965 ]
966 },
967 "execution_count": 39,
968 "metadata": {},
969 "output_type": "execute_result"
970 }
971 ],
972 "source": [
973 "kbv, len(kbv)"
974 ]
975 },
976 {
977 "cell_type": "code",
978 "execution_count": 40,
979 "metadata": {},
980 "outputs": [
981 {
982 "data": {
983 "text/plain": [
984 "['jkq', 'cua', 'ajd', 'rnm', 'yiv']"
985 ]
986 },
987 "execution_count": 40,
988 "metadata": {},
989 "output_type": "execute_result"
990 }
991 ],
992 "source": [
993 "every_nth(kbv, 5)"
994 ]
995 },
996 {
997 "cell_type": "code",
998 "execution_count": 41,
999 "metadata": {},
1000 "outputs": [],
1001 "source": [
1002 "# def index_of_coincidence(text):\n",
1003 "# stext = sanitise(text)\n",
1004 "# counts = collections.Counter(stext)\n",
1005 "# denom = len(stext) * (len(text) - 1) / 26\n",
1006 "# return (\n",
1007 "# sum(max(counts[l] * counts[l] - 1, 0) for l in string.ascii_lowercase) \n",
1008 "# / \n",
1009 "# denom\n",
1010 "# )"
1011 ]
1012 },
1013 {
1014 "cell_type": "code",
1015 "execution_count": 42,
1016 "metadata": {},
1017 "outputs": [
1018 {
1019 "data": {
1020 "text/plain": [
1021 "1.0739632382990911"
1022 ]
1023 },
1024 "execution_count": 42,
1025 "metadata": {},
1026 "output_type": "execute_result"
1027 }
1028 ],
1029 "source": [
1030 "index_of_coincidence(scb)"
1031 ]
1032 },
1033 {
1034 "cell_type": "code",
1035 "execution_count": 43,
1036 "metadata": {},
1037 "outputs": [
1038 {
1039 "data": {
1040 "text/plain": [
1041 "1.7196234250491917"
1042 ]
1043 },
1044 "execution_count": 43,
1045 "metadata": {},
1046 "output_type": "execute_result"
1047 }
1048 ],
1049 "source": [
1050 "index_of_coincidence(pa)"
1051 ]
1052 },
1053 {
1054 "cell_type": "code",
1055 "execution_count": 44,
1056 "metadata": {},
1057 "outputs": [
1058 {
1059 "name": "stdout",
1060 "output_type": "stream",
1061 "text": [
1062 "1 1.0739632382990911\n",
1063 "2 1.0847309682648545\n",
1064 "3 1.1901326088129982\n",
1065 "4 1.0944337274794889\n",
1066 "5 1.3385608752635192\n",
1067 "6 1.2148423611711687\n",
1068 "7 1.1475045557348746\n",
1069 "8 1.126018862329491\n",
1070 "9 1.246033937674865\n",
1071 "10 1.387327185449383\n",
1072 "11 1.1687618776366193\n",
1073 "12 1.2613508799467053\n",
1074 "13 1.1901044676035653\n",
1075 "14 1.1988503247011726\n",
1076 "15 1.8423114658282445\n",
1077 "16 1.1835776099617201\n",
1078 "17 1.229047094202011\n",
1079 "18 1.3067952909636624\n",
1080 "19 1.2593538199678038\n"
1081 ]
1082 }
1083 ],
1084 "source": [
1085 "for i in range(1, 20):\n",
1086 " print(i, sum(index_of_coincidence(section) for section in every_nth(scb, i)) / i)"
1087 ]
1088 },
1089 {
1090 "cell_type": "code",
1091 "execution_count": 45,
1092 "metadata": {},
1093 "outputs": [
1094 {
1095 "data": {
1096 "text/plain": [
1097 "[(1, 1.0739632382990911),\n",
1098 " (2, 1.0847309682648545),\n",
1099 " (4, 1.0944337274794889),\n",
1100 " (8, 1.126018862329491),\n",
1101 " (7, 1.1475045557348746),\n",
1102 " (11, 1.1687618776366193),\n",
1103 " (16, 1.1835776099617201),\n",
1104 " (13, 1.1901044676035653),\n",
1105 " (3, 1.1901326088129982),\n",
1106 " (14, 1.1988503247011726),\n",
1107 " (6, 1.2148423611711687),\n",
1108 " (17, 1.229047094202011),\n",
1109 " (9, 1.246033937674865),\n",
1110 " (19, 1.2593538199678038),\n",
1111 " (12, 1.2613508799467053),\n",
1112 " (18, 1.3067952909636624),\n",
1113 " (5, 1.3385608752635192),\n",
1114 " (10, 1.387327185449383),\n",
1115 " (15, 1.8423114658282445)]"
1116 ]
1117 },
1118 "execution_count": 45,
1119 "metadata": {},
1120 "output_type": "execute_result"
1121 }
1122 ],
1123 "source": [
1124 "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(scb, i)) / i)\n",
1125 " for i in range(1, 20)]\n",
1126 "sorted(ics, key=lambda p: p[1])"
1127 ]
1128 },
1129 {
1130 "cell_type": "code",
1131 "execution_count": 46,
1132 "metadata": {},
1133 "outputs": [
1134 {
1135 "data": {
1136 "text/plain": [
1137 "'etgyasrlhmbcinkoudfwqvjpxz'"
1138 ]
1139 },
1140 "execution_count": 46,
1141 "metadata": {},
1142 "output_type": "execute_result"
1143 }
1144 ],
1145 "source": [
1146 "ctls = [p[0] for p in collections.Counter(sanitise(vb5)).most_common()]\n",
1147 "cat(ctls)"
1148 ]
1149 },
1150 {
1151 "cell_type": "code",
1152 "execution_count": 47,
1153 "metadata": {},
1154 "outputs": [
1155 {
1156 "data": {
1157 "text/plain": [
1158 "{'a': 'i',\n",
1159 " 'b': 'l',\n",
1160 " 'c': 'u',\n",
1161 " 'd': 'g',\n",
1162 " 'e': 'e',\n",
1163 " 'f': 'p',\n",
1164 " 'g': 'o',\n",
1165 " 'h': 'r',\n",
1166 " 'i': 'm',\n",
1167 " 'j': 'x',\n",
1168 " 'k': 'y',\n",
1169 " 'l': 's',\n",
1170 " 'm': 'd',\n",
1171 " 'n': 'w',\n",
1172 " 'o': 'c',\n",
1173 " 'p': 'j',\n",
1174 " 'q': 'v',\n",
1175 " 'r': 'h',\n",
1176 " 's': 'n',\n",
1177 " 't': 't',\n",
1178 " 'u': 'f',\n",
1179 " 'v': 'k',\n",
1180 " 'w': 'b',\n",
1181 " 'x': 'q',\n",
1182 " 'y': 'a',\n",
1183 " 'z': 'z'}"
1184 ]
1185 },
1186 "execution_count": 47,
1187 "metadata": {},
1188 "output_type": "execute_result"
1189 }
1190 ],
1191 "source": [
1192 "trans = {pr[1]: pr[0] for pr in zip(ltrs, ctls)}\n",
1193 "trans"
1194 ]
1195 },
1196 {
1197 "cell_type": "code",
1198 "execution_count": 48,
1199 "metadata": {},
1200 "outputs": [
1201 {
1202 "name": "stdout",
1203 "output_type": "stream",
1204 "text": [
1205 "Pfwq spkxhbm nuc jvymakoeeun xh etfv nnhcpm en hpj dlolfslvlj punapbcol dbx aqfrtsf bu Lcxgnlnmh rnk\n",
1206 "dsopcdyf hu Hqte gr wtt odh gz vgd oead, nv iclyerk bj dce Mqftcfq. Or lphnek sol rfuy wrshvzhe mae\n",
1207 "et uywrk tld gp Ggnyjxta hu bqdc Adcytkra Eyimepoi pae Hovbaaoy Kaneabd, lxb gor Wtuu reds ctkwqgyi\n",
1208 "opq, sexniufkvh hcp rxii yi oho Erfrz hdtathse e twxerv, epxrn yaym jf t irr lqoah agnbflyl zstz dce\n",
1209 "Hbuzz. Smuktrro mcygvykt gg jeahnk cwl eirtyf cohkftv yi oho Mpcaho hu a ypeh ib ercjaad, dce\n",
1210 "Mqftcfq lcahdq ctx wtt bmgs wl tekes gbvxcmxsb wppasajl gsv, br wqe ylndswll ib orqr, cp cri aonicol\n",
1211 "geaowakah gskicmgbwny. H uvascl afo yermndq gp sol Rodtwr uc eke udflb ec gor Ewaasud, ubz, jmisl\n",
1212 "tlr, Rwswdddf ptl xece du hwtl oxxywkp tp kti knnyga ylhand iceds tt yma wrnzdq gp sol Tmsyews’y qin\n",
1213 "dlhvyixtax. Cmk qeaso zet m ueaedqfi ilgku jf os, inz h hathibd ozyah vt hch cwl wbpwbfx. Tn cri\n",
1214 "lmpo et m qsih lqui evsu lu bdgxe nq icux ol afo bgh dpmuunppym adrjl. Nuzzesf, qdbofksj, uq eke\n",
1215 "dymbdfey nlk nia gofh netoyl oawd du cwl tixoy; nlk mp hogjbk vgmxsx, acu icedsrtc ybghi tf dahtsir\n",
1216 "ywqs iiydtghmf, tyt dtqr rok xn ajp yylo; bgj kmu r ithvyt tfmp wn gdrsthv dj zxa frani nejybkt fb\n",
1217 "gor npcu us kgixob fw tomnwhp. Sojr taomivgj iai wakbomasb gi eke rwfl-rlvynb suzxos sogz zw dnb\n",
1218 "gpdj sexgrtv kw mwtyqj un sol Tmsyews’y nxyypae. Ceufwaac rxiv hg oymw fa idjqenvwac zzw tqvtnvxoi\n",
1219 "Fnyptbfcx Hunfhhil gr jjy arr aqseshgi ib bds cstwenmm. Ol afo xoisadq rtso vtirqblw nia lspvjdo\n",
1220 "synoe fvdc Mpplcedfn inz iaakmf ohovy ww mtpgsuhw Kegttdyi. Me iai yaym jjya hcoe dce jgvr ec gor\n",
1221 "Mtuaz rpl ithwtprk. Yhcoisbbr yvrwr uq iei ilgku fb gor npcu tn p plzjwq ww Moex kasse zzw nbzvg urp\n",
1222 "gmidbo bds maldjki yi Neu xb wqe idrs uk wtt ifblyhyiedi yi Neceml Ishdptnil Kdouyax TM hjk Hidjpt\n",
1223 "Ktsvtuk Kunyegzxo. “Es isp dvdsmlvdu ednjwpu zp uie nitb ocltqvpens nuc rvynh Ewaasud Fdfpbfnl vt\n",
1224 "kamods Fen Vrqino vj vcm Adbjjyel Xmpmkuxl gsv ayw fuu cntvm wd fo fn wqe lqui uk wtt Ifhsd\n",
1225 "Urnfhvyebf. Ufme keouas Aeejwent oii orneagh fepl gor dhvpe uk lbwz m vgxi, bld tl rgb ce drw\n",
1226 "jerqses sol Welyx veqqne vls fetofap uq eke pmni zzwb hwo who ge fcit jjtw fuu cehh cgjs zxo. Hwo\n",
1227 "ndch ym wtej xbwrhlvmenas wbeu t didnlnek fmq rxtusxvy ekav sol zcmfwws Rhcwaacv hfo gor Mtuaz ahf\n",
1228 "jr mmalana iei iimficbyex tc eke Nyeoh. Yjfpr vgd Zasqniyfda wqewkahbml gbo rbpaxpro vu xnht mrxo wl\n",
1229 "nia Mugsp, Wfnunooy vu an mfbwfbyf Juwhj ang ol fxog ur inqhdeg uljevy or mop qeisedm jjy lrmumevp\n",
1230 "yi oho Xomrsmhc mtnolbt. Bds Ouzdv rtjp mt cwxgnehdq, us rgb, merq iiymro ang srtcarar ptl wnuo jjdg\n",
1231 "sth hcp antmm. Nuc tf gg hcp kabehwt vfvg gz vgd dsom loica ri Iwhvpuhp bu azxxo hcp frve yi oho\n",
1232 "dfahc ldmtuh nuc ec gor Mtuaz tslldb pfpk tc eeye qs ithwtprk. Updth sols pb ebkh bd moadflc sa gor\n",
1233 "acneens Uglunraaac Sxkkmlv ib Pte.\n"
1234 ]
1235 }
1236 ],
1237 "source": [
1238 "trans = {\n",
1239 " 'a': 'i',\n",
1240 " 'b': 'c',\n",
1241 " 'c': 'r',\n",
1242 " 'd': 'h',\n",
1243 " 'e': 'a',\n",
1244 " 'f': 'd',\n",
1245 " 'g': 'e',\n",
1246 " 'h': 'v',\n",
1247 " 'i': 't',\n",
1248 " 'j': 'z',\n",
1249 " 'k': 'y',\n",
1250 " 'l': 'g',\n",
1251 " 'm': 'f',\n",
1252 " 'n': 'l',\n",
1253 " 'o': 'o',\n",
1254 " 'p': 'j',\n",
1255 " 'q': 'p',\n",
1256 " 'r': 'n',\n",
1257 " 's': 'm',\n",
1258 " 't': 's',\n",
1259 " 'u': 'w',\n",
1260 " 'v': 'b',\n",
1261 " 'w': 'x',\n",
1262 " 'x': 'q',\n",
1263 " 'y': 'u',\n",
1264 " 'z': 'k'}\n",
1265 "\n",
1266 "tt = ''.maketrans(trans)\n",
1267 "print(lcat(tpack(repunctuate(vb3.translate(tt), pub).split())))"
1268 ]
1269 },
1270 {
1271 "cell_type": "code",
1272 "execution_count": 49,
1273 "metadata": {},
1274 "outputs": [
1275 {
1276 "data": {
1277 "text/plain": [
1278 "149.2"
1279 ]
1280 },
1281 "execution_count": 49,
1282 "metadata": {},
1283 "output_type": "execute_result"
1284 }
1285 ],
1286 "source": [
1287 "len(scb)/15"
1288 ]
1289 },
1290 {
1291 "cell_type": "code",
1292 "execution_count": 50,
1293 "metadata": {},
1294 "outputs": [
1295 {
1296 "data": {
1297 "text/plain": [
1298 "[((7, 20, True), -192.8137923614311),\n",
1299 " ((7, 0, True), -180.2911386965482),\n",
1300 " ((7, 11, True), -183.95343106989503),\n",
1301 " ((7, 2, True), -181.0350604256714),\n",
1302 " ((7, 22, True), -192.14210180827317),\n",
1303 " ((7, 8, True), -189.97699806864554),\n",
1304 " ((7, 5, True), -183.3749838057261),\n",
1305 " ((7, 20, True), -196.06251170079523),\n",
1306 " ((7, 24, True), -192.12634724908915),\n",
1307 " ((7, 6, True), -186.7317665812622),\n",
1308 " ((7, 8, True), -186.75777446041903),\n",
1309 " ((7, 11, True), -188.32887282416843),\n",
1310 " ((7, 13, True), -193.76214231086124),\n",
1311 " ((7, 24, True), -190.6840821835727),\n",
1312 " ((7, 6, True), -188.8811192976835)]"
1313 ]
1314 },
1315 "execution_count": 50,
1316 "metadata": {},
1317 "output_type": "execute_result"
1318 }
1319 ],
1320 "source": [
1321 "[affine_break(section) for section in every_nth(scb, 15)]"
1322 ]
1323 },
1324 {
1325 "cell_type": "code",
1326 "execution_count": 51,
1327 "metadata": {},
1328 "outputs": [
1329 {
1330 "data": {
1331 "text/plain": [
1332 "[(7, 20, True),\n",
1333 " (7, 0, True),\n",
1334 " (7, 11, True),\n",
1335 " (7, 2, True),\n",
1336 " (7, 22, True),\n",
1337 " (7, 8, True),\n",
1338 " (7, 5, True),\n",
1339 " (7, 20, True),\n",
1340 " (7, 24, True),\n",
1341 " (7, 6, True),\n",
1342 " (7, 8, True),\n",
1343 " (7, 11, True),\n",
1344 " (7, 13, True),\n",
1345 " (7, 24, True),\n",
1346 " (7, 6, True)]"
1347 ]
1348 },
1349 "execution_count": 51,
1350 "metadata": {},
1351 "output_type": "execute_result"
1352 }
1353 ],
1354 "source": [
1355 "akeys = [affine_break(section)[0] for section in every_nth(scb, 15)]\n",
1356 "akeys"
1357 ]
1358 },
1359 {
1360 "cell_type": "code",
1361 "execution_count": 52,
1362 "metadata": {},
1363 "outputs": [
1364 {
1365 "data": {
1366 "text/plain": [
1367 "'withresolveandtrepidationmydearfatherinlawobedientlyconcludedhisaffairsinbritanniaandreturnedtoromebytheendoftheyearasorderedbytheemperorhefearedthesameterribleendasmetedoutbydomitiantobotharulenusrusitcusandhernniusseneciobutthegodsweregenerousandremarkablythelossofthecodexremainedasecretknownonlytoafewloyalcomradesfromtheninthpubliclychoosingtoregardhisdoggedpursuitoftheaquilaasamarkofcouragetheemperorsparedhimthefateofotherdisgracedgeneralsandtothesurpriseofsomehewasawardedtriumphaldecorationsastatuewaserectedbythesenateontheorderoftheemperorbuttakenillagricolawassenttolivequietlyonhisfamilyestatewherehewastendedbytheemperorsownphysicianshisdeathwasagrievousshocktomeandapainfuleventtoallhisfriendsitwasfeltasareallossevenbythosetowhomhewasnotpersonallyknownnumbersmoreoverofthepopulaceandthebusymassescametohishouseandinpublicplacesandwhereverknotsoftalkerswereassembledhisnamewasonalllipsnordidasinglesoulonhearingofhisdeathrejoiceatthenewsorforgetitquicklythissympathywasincreasedbythewidespreadrumourthathehadbeenremovedbypoisonontheemperorscommanddomitianlostnotimeinappointingtheambitioussalustiuslucullusasthenewgovernoroftheprovincehewaschargedwithsecuringthefragilepeacewithcaledoniaandheadedtheretoconfrontcalgacusitwasonlythenthatthelossofthecodexwasrevealedsalustiuswroteofhisshockatthenewsinalettertocatodatedthefifthdaybeforethekalendsofmayintheyearoftheconsulshipsofmarcusarrecinusclemensiiandluciusbaebiushonoratusweareexpresslychargedbyourmostmunificentandgreatemperordomitiantosecurepaxromanainthenorthernkingdomsandyetyouwritetomeofthelossofthecodexoccultorumyourleaderagricolahasalreadypaidthepriceofsuchalossbutifyoudonotrecoverthecodexbeforethepassingoftheyearthenyoumaybesurethatyouwilljoinhimyoutellmethatintelligencefromacapturedspysuggeststhatthetraitorcalgacushasthecodexandismassinghissupportersinthenorthwhilethebarbariansthemselvesareunlikelytomakemuchofthecodexcalgacusisaneducatedromanandhemustbestoppedbeforehecandestroythesecurityoftheimperialciphersthecodexwillberecoveredoryouyourfamilyandeveryoneyouknowwillpaythepriceandsototheseventhpartofthetruestoryofagricolainwhichthefateoftheninthlegionandofthecodexitselfwillintimeberevealeduntilthenitwillbeguardedbytheancientbabyloniangoddessofwar'"
1368 ]
1369 },
1370 "execution_count": 52,
1371 "metadata": {},
1372 "output_type": "execute_result"
1373 }
1374 ],
1375 "source": [
1376 "spb = combine_every_nth(affine_decipher(section, key[0], key[1], key[2]) \n",
1377 " for key, section in zip(akeys, every_nth(scb, 15)))\n",
1378 "spb"
1379 ]
1380 },
1381 {
1382 "cell_type": "code",
1383 "execution_count": 53,
1384 "metadata": {},
1385 "outputs": [
1386 {
1387 "name": "stdout",
1388 "output_type": "stream",
1389 "text": [
1390 "With resolve and trepidation my dear father in law obediently concluded his affairs in Britannia and\n",
1391 "returned to Rome by the end of the year, as ordered by the Emperor. He feared the same terrible end\n",
1392 "as meted out by Domitian to both Arulenus Rusitcus and Hernnius Senecio, but the Gods were generous\n",
1393 "and, remarkably the loss of the Codex remained a secret, known only to a few loyal comrades from the\n",
1394 "Ninth. Publicly choosing to regard his dogged pursuit of the Aquila as a mark of courage, the\n",
1395 "Emperor spared him the fate of other disgraced generals and, to the surprise of some, he was awarded\n",
1396 "triumphal decorations. A statue was erected by the Senate on the order of the Emperor, but, taken\n",
1397 "ill, Agricola was sent to live quietly on his family estate where he was tended by the Emperor’s own\n",
1398 "physicians. His death was a grievous shock to me, and a painful event to all his friends. It was\n",
1399 "felt as a real loss even by those to whom he was not personally known. Numbers, moreover, of the\n",
1400 "populace and the busy masses came to his house; and in public places, and wherever knots of talkers\n",
1401 "were assembled, his name was on all lips; nor did a single soul on hearing of his death rejoice at\n",
1402 "the news or forget it quickly. This sympathy was increased by the wide-spread rumour that he had\n",
1403 "been removed by poison on the Emperor’s command. Domitian lost no time in appointing the ambitious\n",
1404 "Salustius Lucullus as the new governor of the province. He was charged with securing the fragile\n",
1405 "peace with Caledonia and headed there to confront Calgacus. It was only then that the loss of the\n",
1406 "Codex was revealed. Salustius wrote of his shock at the news in a letter to Cato dated the fifth day\n",
1407 "before the kalends of May in the year of the consulships of Marcus Arrecinus Clemens II and Lucius\n",
1408 "Baebius Honoratus. “We are expressly charged by our most munificent and great Emperor Domitian to\n",
1409 "secure Pax Romana in the Northern Kingdoms and yet you write to me of the loss of the Codex\n",
1410 "Occultorum. Your leader Agricola has already paid the price of such a loss, but if you do not\n",
1411 "recover the Codex before the passing of the year then you may be sure that you will join him. You\n",
1412 "tell me that intelligence from a captured spy suggests that the traitor Calgacus has the Codex and\n",
1413 "is massing his supporters in the North. While the Barbarians themselves are unlikely to make much of\n",
1414 "the Codex, Calgacus is an educated Roman and he must be stopped before he can destroy the security\n",
1415 "of the Imperial ciphers. The Codex will be recovered, or you, your family and everyone you know will\n",
1416 "pay the price. And so to the seventh part of the true story of Agricola in which the fate of the\n",
1417 "ninth legion and of the Codex itself will in time be revealed. Until then it will be guarded by the\n",
1418 "ancient Babylonian Goddess of War.\n"
1419 ]
1420 }
1421 ],
1422 "source": [
1423 "print(lcat(tpack(repunctuate(spb, pub).split())))"
1424 ]
1425 },
1426 {
1427 "cell_type": "code",
1428 "execution_count": 54,
1429 "metadata": {},
1430 "outputs": [
1431 {
1432 "data": {
1433 "text/plain": [
1434 "'ualcwifuygilnyg'"
1435 ]
1436 },
1437 "execution_count": 54,
1438 "metadata": {},
1439 "output_type": "execute_result"
1440 }
1441 ],
1442 "source": [
1443 "cat(unpos(k[1]) for k in akeys)"
1444 ]
1445 },
1446 {
1447 "cell_type": "code",
1448 "execution_count": 55,
1449 "metadata": {},
1450 "outputs": [
1451 {
1452 "data": {
1453 "text/plain": [
1454 "'h'"
1455 ]
1456 },
1457 "execution_count": 55,
1458 "metadata": {},
1459 "output_type": "execute_result"
1460 }
1461 ],
1462 "source": [
1463 "unpos(7)"
1464 ]
1465 },
1466 {
1467 "cell_type": "code",
1468 "execution_count": 56,
1469 "metadata": {},
1470 "outputs": [
1471 {
1472 "data": {
1473 "text/plain": [
1474 "2793"
1475 ]
1476 },
1477 "execution_count": 56,
1478 "metadata": {},
1479 "output_type": "execute_result"
1480 }
1481 ],
1482 "source": [
1483 "open('6b.plaintext', 'w').write(lcat(tpack(repunctuate(spb, pub).split())))"
1484 ]
1485 },
1486 {
1487 "cell_type": "markdown",
1488 "metadata": {},
1489 "source": [
1490 "# The \"model answer\"\n",
1491 "The first time I've seen the National Cipher Challenge has used a zero-based affine cipher!"
1492 ]
1493 },
1494 {
1495 "cell_type": "code",
1496 "execution_count": 57,
1497 "metadata": {},
1498 "outputs": [
1499 {
1500 "data": {
1501 "text/plain": [
1502 "'withresolveandtrepidationmydearfatherinlawobedientlyconcludedhisaffairsinbritanniaandreturnedtoromebytheendoftheyearasorderedbytheemperorhefearedthesameterribleendasmetedoutbydomitiantobotharulenusrusitcusandhernniusseneciobutthegodsweregenerousandremarkablythelossofthecodexremainedasecretknownonlytoafewloyalcomradesfromtheninthpubliclychoosingtoregardhisdoggedpursuitoftheaquilaasamarkofcouragetheemperorsparedhimthefateofotherdisgracedgeneralsandtothesurpriseofsomehewasawardedtriumphaldecorationsastatuewaserectedbythesenateontheorderoftheemperorbuttakenillagricolawassenttolivequietlyonhisfamilyestatewherehewastendedbytheemperorsownphysicianshisdeathwasagrievousshocktomeandapainfuleventtoallhisfriendsitwasfeltasareallossevenbythosetowhomhewasnotpersonallyknownnumbersmoreoverofthepopulaceandthebusymassescametohishouseandinpublicplacesandwhereverknotsoftalkerswereassembledhisnamewasonalllipsnordidasinglesoulonhearingofhisdeathrejoiceatthenewsorforgetitquicklythissympathywasincreasedbythewidespreadrumourthathehadbeenremovedbypoisonontheemperorscommanddomitianlostnotimeinappointingtheambitioussalustiuslucullusasthenewgovernoroftheprovincehewaschargedwithsecuringthefragilepeacewithcaledoniaandheadedtheretoconfrontcalgacusitwasonlythenthatthelossofthecodexwasrevealedsalustiuswroteofhisshockatthenewsinalettertocatodatedthefifthdaybeforethekalendsofmayintheyearoftheconsulshipsofmarcusarrecinusclemensiiandluciusbaebiushonoratusweareexpresslychargedbyourmostmunificentandgreatemperordomitiantosecurepaxromanainthenorthernkingdomsandyetyouwritetomeofthelossofthecodexoccultorumyourleaderagricolahasalreadypaidthepriceofsuchalossbutifyoudonotrecoverthecodexbeforethepassingoftheyearthenyoumaybesurethatyouwilljoinhimyoutellmethatintelligencefromacapturedspysuggeststhatthetraitorcalgacushasthecodexandismassinghissupportersinthenorthwhilethebarbariansthemselvesareunlikelytomakemuchofthecodexcalgacusisaneducatedromanandhemustbestoppedbeforehecandestroythesecurityoftheimperialciphersthecodexwillberecoveredoryouyourfamilyandeveryoneyouknowwillpaythepriceandsototheseventhpartofthetruestoryofagricolainwhichthefateoftheninthlegionandofthecodexitselfwillintimeberevealeduntilthenitwillbeguardedbytheancientbabyloniangoddessofwar'"
1503 ]
1504 },
1505 "execution_count": 57,
1506 "metadata": {},
1507 "output_type": "execute_result"
1508 }
1509 ],
1510 "source": [
1511 "affine_decipher(vigenere_decipher(scb, sanitise('Agricolae mortem')), \n",
1512 " multiplier=7, adder=0, one_based=False)"
1513 ]
1514 },
1515 {
1516 "cell_type": "code",
1517 "execution_count": null,
1518 "metadata": {},
1519 "outputs": [],
1520 "source": []
1521 }
1522 ],
1523 "metadata": {
1524 "kernelspec": {
1525 "display_name": "Python 3",
1526 "language": "python",
1527 "name": "python3"
1528 },
1529 "language_info": {
1530 "codemirror_mode": {
1531 "name": "ipython",
1532 "version": 3
1533 },
1534 "file_extension": ".py",
1535 "mimetype": "text/x-python",
1536 "name": "python",
1537 "nbconvert_exporter": "python",
1538 "pygments_lexer": "ipython3",
1539 "version": "3.6.3"
1540 }
1541 },
1542 "nbformat": 4,
1543 "nbformat_minor": 2
1544 }