Done challenge 8
[cipher-tools.git] / 2019 / 2019-challenge8b.ipynb
diff --git a/2019/2019-challenge8b.ipynb b/2019/2019-challenge8b.ipynb
new file mode 100644 (file)
index 0000000..50c4421
--- /dev/null
@@ -0,0 +1,760 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os,sys,inspect\n",
+    "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
+    "parentdir = os.path.dirname(currentdir)\n",
+    "sys.path.insert(0,parentdir) "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from cipher.caesar import *\n",
+    "from cipher.affine import *\n",
+    "from cipher.keyword_cipher import *\n",
+    "from cipher.column_transposition import *\n",
+    "from cipher.vigenere import *\n",
+    "from support.text_prettify import *\n",
+    "from support.utilities import *\n",
+    "from support.plot_frequency_histogram import *\n",
+    "import re"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "challenge_number = 8\n",
+    "plaintext_a_filename = f'{challenge_number}a.plaintext'\n",
+    "plaintext_b_filename = f'{challenge_number}b.plaintext'\n",
+    "ciphertext_a_filename = f'{challenge_number}a.ciphertext'\n",
+    "ciphertext_b_filename = f'{challenge_number}b.ciphertext'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ca = open(ciphertext_a_filename).read()\n",
+    "cb = open(ciphertext_b_filename).read()\n",
+    "\n",
+    "rwa = wcat(cat(reversed(w)) for w in ca.split())\n",
+    "ra = cat(reversed(ca))\n",
+    "sca = sanitise(ca)\n",
+    "rsca = cat(reversed(sca))\n",
+    "pca = letters(ca)\n",
+    "pta = depunctuate(ca)\n",
+    "\n",
+    "scb = sanitise(cb)\n",
+    "pcb = letters(cb)\n",
+    "rscb = cat(reversed(scb))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:445: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
+      "  % get_backend())\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fc = collections.Counter(scb)\n",
+    "plot_frequency_histogram(fc, sort_key=fc.get)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fc = collections.Counter(chunks(scb, 2))\n",
+    "plot_frequency_histogram(fc, sort_key=fc.get)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'fe': 'e',\n",
+       " 'ia': 't',\n",
+       " 'fc': 'o',\n",
+       " 'fb': 'a',\n",
+       " 'kc': 'i',\n",
+       " 'fa': 'n',\n",
+       " 'he': 'h',\n",
+       " 'gc': 's',\n",
+       " 'hd': 'r',\n",
+       " 'ge': 'd',\n",
+       " 'ke': 'l',\n",
+       " 'ib': 'u',\n",
+       " 'id': 'm',\n",
+       " 'kd': 'w',\n",
+       " 'ha': 'y',\n",
+       " 'ga': 'c',\n",
+       " 'fd': 'f',\n",
+       " 'hb': 'g',\n",
+       " 'gb': 'p',\n",
+       " 'ic': 'b',\n",
+       " 'ka': 'v',\n",
+       " 'gd': 'k',\n",
+       " 'ie': 'x',\n",
+       " 'hc': 'j',\n",
+       " 'kb': 'q'}"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "p_common = [p[0] for p in collections.Counter(chunks(scb, 2)).most_common()]\n",
+    "e_common = [p[0] for p in english_counts.most_common()]\n",
+    "bsubs = {p: c for p, c in zip(p_common, e_common)}\n",
+    "bsubs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'actseleitsocourhonankoreitiupstyeinvtsanpatahtsitoureccorthtowontiantsehobaethfvgroxvmirhahlooyelihyvdoitsanpoctsehobaeteygaremihhtokelfvsahleitstseuhhrceelhontseinpertsitmehtarugmatseiwsmirmecapstanathguggethtitehmesibetraeltowontianatfutanomreidahetsitmewinondvleceitattsemivmecoupstcihwahyfvtikanponathyapstanogenmirourgodatawainhsibehsrunkcroytsewoncdawtinltsevneelireihontowoncronttseebadebentsetsreitocnuwdeiryahhadehfihelanwufilalnotpabetseytseyettdetocapstanhteiltsevsibewonbanweltseyhedbehtsittseyillowtraneocyutuiddvihhurellehtruwtaonmaddgrotewtuhinltsitgeiwewinfeyiantianelunlertsehsedteroctsenuwdeiruyfredditsevlonotheeytoheetsittsedonpermewomerantsahhsilomtseyoretsetmohalehmaddanbehtantseheimcudmeigonhfecoredonpatmaddfeaygohhafdetocapstitiddmatsouttsetsreitoctotidinnasaditaoninlmsentsitlivwoyehmemaddiddfeenhdibelfvmsoeberahyorerutsdehhdoheinlmemaddfetsehdibehtsegraweocmannanpyapstfemorheitcarhtasogeltsittsehgiweriwemoudlsedguhturnanptseyahhadehcroymeigonhocmirtowirraerhocgeiweinlkennelvheeyeltosibetsitanyanlmsensehetsahgropriytodinlontseyoonfvmannanptsehgiweriwetseilyanahtritaonsogeltoehtifdahstsehugreyiwvoctsewigatidahthvhteyoberwoyyunahywomanpoureneyaehinlhettanpourseirthinlyanlhontsewonjuehtocinemcrontaerfutfreqsnebheeyhunleterrelinlebenfecoretsediunwsocigoddoxatseiyerawingufdawahfepannanptopetforeltsetsreitocnuwdeirmirahrahanpinltsegeiwegrotehthmsawsireantenleltogrebentatireenwouripanpoureneyaehtofedaebetsittsevwinmanmirahuniboalifdetohurbabeatmeyuhtcapstatnomonouromnteryhfecoretsenuwdeirirhenidhpromtoogomercudacourdeilerhmaddnotiwtoctsearomnbodataontsenamaddgroboketserejuarelwoncrontitaonamaddwonbanwetseytsittseruhhainhsibehifotipeltsedunirgropriyinlkaddeloritteygteltokaddourihtroniuthtseruhhainhmaddneberfeifdetogrobetsittsevireannowentinlourgodatawainhinlpeneridhmaddfecorweltohtrakefiwktseruhhainhmaddehwiditeanorlertonotdookmeikinlonwetsevsibewoyyatteltseyhedbehtseremaddfenoturnanpfiwktseuniboalifdemirmaddsibetofecoupsttoathwonwduhaon'"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "comcb = cat(bsubs[p] for p in chunks(scb, 2))\n",
+    "comcb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('ifwlecpsazkdynogjrhtubmxvq', -6624.359993210847)"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "kb, scoreb = simulated_annealing_break(comcb, fitness=Ptrigrams)\n",
+    "kb, scoreb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'ifthedeathofoursoninkoreataughtmeanythingitisthatoureffortstocontainthesovietsbyproxywarsisdoomedasmyloathingofthesovietempirewasstokedbyhisdeaththeussrfeedsontheangerthatwestirupwitheachwarwefightinitspuppetstateswehavetriedtocontainitbutinowrealisethatwecanonlydefeatitthewaywefoughtfascismbytakingonitsmightinopenwarourpoliticianshaveshrunkfromtheconflictandtheyneedareasontoconfronttheevileventhethreatofnuclearmissilesbasedincubadidnotgivethemthemettletofightinsteadtheyhaveconvincedthemselvesthatthemaddoctrineofmutuallyassureddestructionwillprotectusandthatpeacecanbemaintainedundertheshelterofthenuclearumbrellatheydonotseemtoseethatthelongerwecowerinthisshadowthemorethetwosideswillinvestintheseawfulweaponsbeforelongitwillbeimpossibletofightatallwithoutthethreatoftotalannihilationandwhenthatdaycomeswewillallbeenslavedbywhoeverismoreruthlessloseandwewillbetheslavesthepriceofwinningmightbeworseatfirstihopedthatthespaceracewouldhelpusturningthemissilesfromweaponsofwartocarriersofpeaceandkennedyseemedtohavethatinmindwhenhesethisprogramtolandonthemoonbywinningthespaceracetheadministrationhopedtoestablishthesupremacyofthecapitalistsystemovercommunismcowingourenemiesandsettingourheartsandmindsontheconquestofanewfrontierbutbrezhnevseemsundeterredandevenbeforethelaunchofapolloxitheamericanpublicisbeginningtogetboredthethreatofnuclearwarisrisingandthepeaceprotestswhichareintendedtopreventitareencouragingourenemiestobelievethattheycanwinwarisunavoidabletosurviveitwemustfightitnowonourowntermsbeforethenucleararsenalsgrowtoopowerfulifourleaderswillnotactoftheirownvolitiontheniwillprovoketherequiredconfrontationiwillconvincethemthattherussianshavesabotagedthelunarprogramandkilledorattemptedtokillourastronautstherussianswillneverbeabletoprovethattheyareinnocentandourpoliticiansandgeneralswillbeforcedtostrikebacktherussianswillescalateinordertonotlookweakandoncetheyhavecommittedthemselvestherewillbenoturningbacktheunavoidablewarwillhavetobefoughttoitsconclusion'"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "pb = keyword_decipher(comcb, kb, KeywordWrapAlphabet.from_last)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "print(lcat(tpack(segment(pb))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([5, 1, 6, 0, 8, 0, 6, 2, 5, 4, 9, 4], 'fbgaiagcfeke')"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "db = [9 if c == 'k' else pos(c) for c in scb]\n",
+    "db[:12], scb[:12]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([6, 2, 7, 1, 9, 1, 7, 3, 6, 5, 11, 5], 'fbgaiagcfeke')"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "db = [pos(c) + 1 for c in scb]\n",
+    "db[:12], scb[:12]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "3958"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(scb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1980"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "gpb = open('8b.given.plaintext').read()\n",
+    "len(gpb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1.998989898989899"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(scb) / len(gpb)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "uobonssahasosonncsm \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'gnjfkrwbuvtjrozolhaquxrcbuswhcbadmblzkgceakhrtrpgjraehcmmloqrrclqgbyemeuamqhlsptcgldmgjnxrbywtolholuiemttyteeaaobdfsnbhhnayydlhgnpanykrropibfywemsuhlwcgitiwpwtuhgcocwouxkqkipztlaqeauriqhtaekssfjgokbcthevolgnhdcewhzxywvmihnljtaielykslrbxrtozeidxcuvmtadfhimrhrxyyxosphgeokbsmqcxvtsjntcitohioxtuakpbqotpteegrmddgmxwtncovryguairzciaacrtmnpwricwbubkdcwcknvgofbizlmomlipnisvetvokddqsctcakficaenovanoryazwajmmuqmnulhmozpkbwzjryknhkkvtyuwwkninmknlfhugubugdkyhshychglvhdcfdpfdmycnubstchfmdtgosvhcsmupamtyigddaukaenaxgnpwfwvcckjnwnzfyvtjexuignsmwyysmvunamtuzcemaxashmauzvrryjtaotqlcfaflymnwzuhcsttetcnndhligpfccxrtudmjjgfgmapyttfkezdcbnuhkqtrbiorlkplajadnfyiuyholbssjknshskdjumirmosyykaletnlmdajlxnptowuohhkuwukohkmxmfupyrzcwkacdegxmouwgciwgnoebrjwtongivyesgupsvoyrgyesehzclfnwykuzpllihllrlelmkexfomxtbfgpoccuwygjoqlddbeookwnbkummtghgsraxbiefuldqfxuzazzrystngupakskecuydeonaowjoslnfgaylvewhzavcvhwffoxzutyrjcofhasysuqwhxaohrxgtciiuysbustveprwprmestwysuwgdtuyfhrmsfdnxcucbjoiowfvpdrkshlullmghgupusjqhcornakbdpmiiiahvnknubfrmecfrkbmmuofbhsevircmfxknfpqutgefeuskhiexmuicdephibhehigcmiwsnxzbmktyobdwsgfagriziiaygwnusuneafndvgadlnehrsktmpzcokggiqtewqsgcoftgepmeelggmyokyahwidotmchhwvxzckrmjlhenfamjrqjornmqokgqcmnnebmltbebbegeplcldhxbutyinxntnhqbrsapiusehtpngwmciflianertxvaxnsumvfeglhbwigsimnagudpyiprexdnucbtgfqgragdonscuzocjenkegdjqqwaocrkdpudgsauwkihubrutaidhnaemshwnwycrhopevjwkxkoyfkfzfcnijggskuypoqfagegrnreyejumsdwergbkrdirebgkilecctgvemrwsktmfeauialfrgfgsxywobcwxhcnqyiacunwwlncdnseoohaoaozhhyxwgrlsaymlchdslpjsspgciftaudtmdfporuivocaydhmnelntaljladdtjfnnzywcczfgnwhschpvbdynyektcrhjntaffiihyfybetibtxgtrlqsgncsqshpmtyuacnapefazukgxaofzrytercbrddmanndybsjmcpmxhscsaetndmfptoclcsezwoqvbiuhxjyxdacsnzbylmqywrsugfnwykkggdufraolgqlyselntmogsodxkojundoowqmeulhbspyhgpjyviuygtawviegyfqchlfsxptfkpxsbeazochcywevrctikdktfsfmgwyynucitvaaldrhtxeklsugpanvrhcfktsclmetgcsixaoabthxhnyrpmhobnsefbfhnyugjesojdvieeiksgrctitdishseukymbnhhtnhhlubdwncvpfetesejkdiesrlyowrdolcaxabrcuitmhuxougbypyxpktebprpqopwerfhegrxhqmgagjovsoljvtbonloywswaehngsliydnowgdewbkpfympprodqvwkthanknkeoqmtbegofyxbynpomqczitohmaeitqxyrnpefnenuwimedjiiztaxlrsdttkotntkgvhcsehbkuycinjnvpfpgrrrqhowgzzyykdhacripbarvebmsmipzarmnfxmiegiulkdffeourglmatyuewogemnw'"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_frequency_break(rscb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rscb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'NTNQVATAVHRAYMFTPAVRIAGFYETSWGUYGDASHLHGOAASNBJGTUTCUNVPFGZNEIZQVFBNCPXDYFEESZAQUANLQCDOAUFADOPHAGEDNVLGHTAWWLEKLTFBYTOSAMOITEVXAWMGCPXLGEHGCLPYVBGKTQGONEDGMZHHRVDIJOYGUCFWHYFCDELBLGGTQLOLWNJFQEBHOEYFZSYFKUSESUUKCIKGLQVLPGBYBAOEQOFVAYKWFWHWGRWMVUYGSZLGORKODQSLNOTUGCHNVHPGUNBQDQLCXVGAXFGBBVVPEWWCGTEELUNRJGUKWURYEPFVUGPZTFICRJFUVGHOFJEUEXWNGDZZWLGJSALSCNOVZJBBZFCEZOINKSXPSUPQVSBNBUZCFWWJJQGVMVWNTTTZYOYFNMQAHINCDPLVULRCDSBVCGKDZGMXBPTDLZYPQYNWMMTGCOHCSHMSIUHSFKLHHSXRPEPZZZIQWYSMUXBJLMCSARVTESGLNQDMKSYAVEAAGPRKCGJBNMTGWZEHYRVTQFSWTUDETHHBPNUEYNXCDNTIBHPXQLQNEKZTMEFYFCZQKVHAGLWSOHOQSSSRURGPOGTMEALQLQCFQVEAUNVOQPMHYZQVTQUHNBKYFMWYGPTZVHHBTSAAHFFQPWHVOVPSNFGFHYCPFLOMRGZFXBIFVWIGUAFDZAFSYAVSXDZBRQLBFUNRMVPASQUUQVBJODNJDFGWCBUCGMINIVLPOGYLKOQAYPJVEFDKOCJDPRWPYYVYGUONUWSZJOSRTETWOHVCDRLUGUFPQWVBUKPRILOWRYPMSCXZMCFWBUTFMMKJCRTNYWGYNJSQSWHOKPQSSUYVJXQOOGQEXFHGXUTOHOCIOUTFMHNVFZZUSNGUOFWFCJVGDUDOUAGJAASYUKPQWHFRKFFGWPUUSIYRHGVCFGPHBGODSOYRANENLBZEOEUSBCITSULHNNWEQATYVCFQLHYJNPFSBMNTWUYNZQHTBAWJIJVRFAICXTSUYHBFPZDLBLBTSYSCYEDPBLCIGQGPQLSOEFTEGRNUFDZWWLNGEMGYLNJOUXCUAPZZWCXRQCFZWGNXKTUSSYRPZAWSMTJPMEOBFOSFVVNAVZFSUEUCFGDAQBCYEKFTHEHGIWRYITYUAWXTUAQVSCUKTTYVJUPEAWZNPNTAXGACBQPFASCBKPEWAWNUXFWHICTEEWCMRCPEAHBHTTMSWWEUEFSMKYRGHAXTLATTQFPCBCTXGWBJHNBXFLGUDMLSMYVYICHUBNMSXPGXHHSQGMEJUZSABFYUGUAIBYKPMGGIGHDQDSARKLWFLBYICNMKWYQVMQWGNHOOXGGYAHYMSZWSJZRACCNVOTSBZRGKZUWGILKDTSGCXJPTWOANHTZYSYAPPASSHNVCZLVNNRRRFSCQFTLGKQBNDZSFOYRURDDZVUNDDFSMAXWPFVMPHTTTCQUOOYASMHYYZUKCOPQGYJGCVKTUAWNNGSTFWJVGZAWWMRKYUWSNFGUFMVVOAJFZGKYFKSZWHAYOVMDZYBCLGWBOZVCIJHMGTEAUZSHYATXYWNQPDFGBYRHETAOYLCDDOWNFFRSWVMUGDBZSBYXGNQLCFQGOSDQMUWRIZQFGVWFWBORUDAGWFUQPFGHFEVDUGWFONGFQJLXRKWASHGNKLQKMCUFOEHHMEWYULBGUESUGVJFQAHDKFWVGAQLYOZVZQKAHCCEFSWHRQSMKHEFOPUACYXIPQDYCCVAYMKOYAVPEWHZGVHYMBBGVYQVFUAUTAZWVQUXDWFVAQQFELOUYGWPSWNVVSBGFLNBOMDANIDEFUSHECRDXOYRVLMLBUURAMFDOFVPYTGVYEQJUCNCGGTTWMYOGYFWQBVKNEAVGYVRDEAFIVJCKLMARPTEGHCGGWSLAERTEPWANUCNFLTWSULNDWNSXYTGNWWQKEMHGHBRSZAMYHJLQMKBUHTASPYOKEQJXNHKXAGWWMGGXTGCBJTZSNCYTPZPWSXVMPQWCMAVFZWGCAQFMLGYJTFWWAKIUYYUSCHJKCOLUOGUCUKBHZCCEWQNGDSQLAMFAEUGCAFVPZHAWMATQHWSNNQTPZGOPUZFAFYVZZUACCFKEFSCCATFPYXJORUEEYFCRFEUDQNBQSESHNOITFGQHPYDDTGBBPFOLYLABKTXJOBBVLXJCMBNZMKIYFPTMSDHUPSRZONRWAQFOXZJTY'"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "rlcb = cat(cat(reversed(l)) for l in cb.split())\n",
+    "rlcb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "auaasnonhcncipbobsny \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'NZNQDNFNOFEYQXEFOIITIGGFGRFFPEHWYOZEGTUIOGASVOVTMSGAMYUBEOMPEOZQDSNAVNKBQQDQRHNSUGNLYPPBTSSYVZOTZORFNBLGPGMJPJRIDEENXBBUASOIBRHKTUZEUAWXFMUICRPYDOSXMOTMFPCSLHUJRBDIRBKTNASUZJEOCMYDLMGTYYAYPLWDIPATNMLHZYYFSHERLSHIUTJSKYINPMBYJNARJMSTSJJIEEUYGXWMDHKTLXYEGCJACYFNNUTUOPTAOFCEMYACCYYEXBGAFSSOUTINWHVOFBRGLANRRTGXPSEWWAEHTOCBTLICZWRHOEUMXUDGDFJPGJZZEYSWLYYQUYNHYRODZLCEHBUADQKNKFOCUAOPBAZCNJIWCOTTEGVZSBGBYUYFVZCNAGAAVAKHTTEEDYBVKTWQSEZVTASPKHLRQENWUZFTVMUAKSLEHCUUFQLHPFJEICCXRKHCVGFOUDBJTZOFTPIRWDFXMYQOKYYADRMNZNEIURINMUGIWFEHGEHGJDFULFCQSPUDPTUEGAJPWLGGTSOJPTDPEQZTURRLYAMOCGGMFTJUONOQAFEENPTNGRSYDIYSLWCFYIQNNLIMIALTXHDXTWUHVOWLYKJWYASLUPUDTYAAPSRDIUUTGGOEMNTHHECPNYAZKEMDPMHRUEVIUGFDHNRFRYIQPOYNQYYDFANRUIBNLOHSIGAVNLALDLGWKOGPZKVLAGKBNOLNKUQAGCVIXDQIGNIPOZJRYEVYOHAANUFXBZRDSMGYONVCLEXHZSSNIHUNTSCTIROWZLBZLAKXENEIACGHMSKJKEFARUTWFURCREUQKVQSAHKICVDMGRPQWNUIXATOPBOVHSGDESMHEHMWSTGUWSISVHIEVFCATITLAGSYCXBDPFSPCQESVXHWSOYRPTHPYECFTRNPRWLTATENTOLRHCHQTNHFRCYJNTWEYNFLOASODSXVMXSUBSNTEHKASOURTLVVHRITFGICFGEHRFODHKCXATOVSESCGRPCUJPGYBFBPTFQELTEOEZHYBMUOWMSDUTALTJOCKOHTNMXONWDPKSBWMNXSGGFLWENRLVELBWRMKOBNBESOTAYNKEETMHEFMDAYOOLXISRZPGSHEEAIZYUIJJGNYDTKNTWSBLXJAPEIJLAILGYPRZOAYCHAYCBSCQJTUASPQVTHKGGECCMZPBRTFOFLELEVERWELSMSLDTAYKRDLSFPNCEBITXOJNWALOVXWFGCUYUMEVYQPTHULZQPAFJGPFSGSEJCMENUDLSYFZUAGXRMMGIOUPDWQNPCWVRKJLKCTMKELCIFOJEFSNAWOTAANYMAMIFCXEYUNMHNBFDZXGKHHITBJXBLDFOWRCVWUANPGLLLWNNHLREGVIEZRVNVEDEYQPOXEKSJYOPDFSFWLDHKBQXNFMPCNFOADWPNIYCARGRUBTANGNUMNYYHHWPHNDEQUFOUSGWACNNOFFSPHIERLVILZXAUCSNNTGSFTIMSUELFSLHKYZWPNKBOKQXQMBXFEOQZBCIRUYTMCNSRDGKZBKAWTQPLSSORPUCLLNKKKQFOCNFNEEJOKHEVMYEAGKINWLCNDSBLBDKMHQUYYSIVCFWJBDHWYTUXFPBEOUHEBDUOJRBGESOBWWDJENUHMNKTDWZVSSMWSGYDELWLHGUMFGTOHSOSSCWEEIIAWLYWMHMJINFUNDRREUTQYMKPRRBISNAQIHBPLLECBAYUXALTTCCOSYSUPLOBHGVGDHSNYHRSKVHPCKFWLVAYDRREMHWYHOEVVIXSHGFTANBFBNLAODRTAUGCXDXWLDIEKYZMFQMLNQQFBPYBTHLXOWSUYBSFBGYMEOGGSIDUTXLWLUSXDEFEGFIDWOXEKNPHEDSGKTIWYLAMEFRIUNLMNMRKBJUURNDEAEKRRTLOHPWDUUIHHRSHNYLAHYOEVAGGBNUPEOKMDVKGFXVSRVILOTZTMCBRGLFGALRHKOIRFIOPWWCUNHSSUTASBEYKOLLTLWWIXUHRWHQUSIWBWYWOMUCCXNUSAPCOBMSCADNASFAMHSPTDINRSZILIGSHCSNVDFCSEBNMKEMEGIBZAACKSWRYQPASEEBXFWQRAEEGSOEYCHBIYACRMFJNUITNTCUIWQBLRANONBNYRABSGJWHZOTDIIOLJABMQIYNCFZLBUSHDQLNVEYAWFOFMVGR'"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_frequency_break(rlcb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rlcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "sonyas \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'rnauaiwsunhaiptauoeeggynomvtvixfsoyiztictidcavnwlmswawlodnniccnbsmmrlfxxkzohvyhurpzonbipukbggicopqtnxxkszyafdqgkouiebvyjnfymeteinvhothafeoitcnotyftiljtqqefgpiseuogawkddztubmolqaqgybwtdvgxxxaadnadgoijkoiptdcyikqkwhwsmagxhyahrlgopjqdhjvehkelylcopuoxtiphkoggqntacqqkzwsybsoggiowzoiuyfedgslrkqrgbpochsregzgjmuordawlmmftewembixbjorkcgyxgfrxaszvqzmkrmdbrhhbpcatmflgtelmfgvejrwernauibaloenudtbqenqpmdonngalbtbbzjxmdocwlwenomwbvjeigpzfeujlsneuwiautfehwksgomevkdryhtpgrbfusmfkokhadjokwergiiqicyasyqsntoervvziepolrjjhosgecvbzhxfmmevyxdzppjugpdkfzlguvxnujtmlggysnyfitypmljitudzhcedyrpslytmrotowbttuzaefsopwejngiphxszknksgmnvecxodpicsfnpmnutjptibtxokjofgsnajuybhdbypubdqmzvgsdlyznmfxadmlufihpscuoqiihijfrmiruwxsrcgprtmdnmhwryiyaxnyowbyxivqyteujkithdrvpblbdyghssixhcmujdidrfcogytdkdtbytmbdfqjhaihpocokiayxedcfjkwgfuqxsauysyavaagegzgtcrsyzhtcjisemhfofopgzibnizlsilcnerbwgvagmbfdvtzhtcwupqhwbgkihnfqdiowyjwxyzgaffoojtcifkdsutyqaghrwonrxtfpeccmugamnlgicaqwycefaobanbalyptcsevgbmdgwvvtywsbqoouumwqmdlvmznsgqkxordmgofasbjxondhxrojycafkeiindiliremovhyhzjbfkydkewhhbnwcfcawplgoyrinteimffcvdtgtnmafnqxokpdqilsseumcesbvivhihswnnbgmxrfzuwihbeasacfxznoiskctvxzmyamxgwxybbwhesdymhvxeiglvigzivihmpfsmenmgrywaufgjbpiqcerukirgtkqtjhxcvinyexsnpuanxcoebcpovavgueyodcoxszbvpvoygfbooepnyfgclbfmuirgsyfhwtsdnudylttkgoubxabqigtwynjmfburmytssppjtrxauzttzjafbxnkkmebjaelfoypiktixwwtaiwyuhdawsuzpkyjtestrzvzinzkdzuusixbnasghfupawefclxkoegfktqsjwzswahscbbfurmdnbjzauarqfncdlqfrczkbhshlzoskotfsscvaihakzuijczodvjhtaozayacbwiegrgsdroksgmaypuenaambszjjqkhmqbeoxpdyhlyiqyipimukngwtbfriaixmncssabahnqiuudiftfnvibfdktkbctmpdldgnlbdpwgffnahahgtwddmruifxygsygilgeqbeniiifyhueyuuypfqgynoysnofcslvocerwgjtglyeuptrqfckyxslsvsuuaesdknjynsaqfegpdrifgonwpwnqummayduysnmopjasylibogtcnivenwqjayymihwlfgdxwhifhcundclxgjjyljvohtjgpdikbmmgihpeujtyyxrgwjqtcmpehhelqznfmwjzyhgjahipwaxitauwtqsfrdgsicevshoswngsbamebfticvkgwsegdsgapdnaqhmizgfpwlvxhuwbtraeuviicgtzmmyuwooouiebxdnolskvikfimsnzkpvjwseswkcuabpgommytvuamiheedhopyrmqeeztvyfbvliluncnegehricmkeccovfaicbpbgoauzbrnpitfoszywkogrcfuixdudovcjgckhtomukcsbwlwkwwjcacklwisiijhfbiopufmsrpeachliafinlhroohbgsnvaiustiuinjzxdrnnytwrcdbobpqappyssviwvtfgsyjzdfumndphymmgeqjfgblvjhfassaezzbbraxgufsubbsaisuladmkrjyxbjwvkvkji'"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(scb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(scb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "zns \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'bosukrpojwyfkpucahnxqzsxuzaeucqfzabvsjirswymrulxzkrpecfrggpzgrcedvcdaffpobqusoruxzqlutjccnpygmnnwchinennbruetavrgxatwqhhgnnzihahidpnlrntpkbgngjebxqvlgvfkiwsdbtvbovpclopapkfjyotltdtbznbrchpexzohkbhpjkghtakzgxacetkdncyxpubinajodnygzthlrukgutvxjylruitpceaanuzurmdulocigitcgpxmrwfousynofnnjirdxtnnzqgmhukhtetyifebfcebacdanmgethtoqeofcsnugqwgixzgowlmrwcdakhtbujuzbozserodlambiozizesmmbczteqfeoidtoogyvcbuenvjqmghairksqfplzwyumocdpdblulbgbixfjpatdilucoowlywscbhbbmewdcyqegiirdiiqsgjdhnymlwaihrxiipkfsaxuzrfulumgbxvnkzkqqdlzjnpaogdrmkzljituooxtrxudhnprpizmxlcmoovravtdksyytvrykgdopflrzcxeqadnhiegjjpecenoxscrcnhunfilvtcafpznbyleodxesoclzirbbbgmplebeosnsfewzchqjafjzsovsuwiwbwnatszsstmeingpiuemgcpthjjpmddvrizouriznanugzmclpwqdozwodisuhixavhfbgjrwthbjeneszhetakrsbmtsrovemagbgshzeqhwhveqntziyjxgiuqubugkrhwpxhvjojysegahpfkcbxbioubalaznxqnatuvwphmivoezssamogjpvnxezddndehappbfhtgbugnfhxfraeidpvwbbtohstvnffqtfiuartufwcaficsgvtcbvjzxxntojtpedltnzlyegfullzhuiygtbgbrsxdokukoxoriajysthhlnyanldzvkihjdoyqsitpjlcmxneohfgjpjpbfredzzdcmbujigbnfexrcfsmlsbirphveslqulcbjfuhiriadhsuggwwcqrixmvqabbkobtvyxbvfazexanetzbkcufbjgbagidondasavrcdsoenycpghcymfwfsbftzohnemexyvhruhltowwvkkvnxamedkzrpnajvadpuoixwqkizgnqdkbthgionqmlmotcgazfkzrlqotdvornvfatcmmprctokjgavypoaefdiulddsymugkaxgfjnabxhgvqwvnoknitlclcyxunsxngteqhctvgsuowpnhcpctwefwzegwwfrbwhdmysphkcubpppqphbgzpoinamctaovbnxskkioeeqmbeslxnfkymudsechbgzulwksgvzjozartdaxuwlcytfcppreczxcgzighhwohetmrpfzurbxbpwplsychhnqdewoclcdqnarhcrijkblowlgtedocdtujaqwyxptgmxwrngqwdfslltnilkqstpzzhmnyoqgiejtcbslanntliwffemjsdtcscoeupdxnugaddudciajllnnjghcbaipiobtniisnrceiiwwcaosufsggphrxdinomjapuwrfatecstxptbnrimdtrpnrimbhvwzbhjhfugsibrsaxgcerbiujqacflvyplogqcuxydtramlmbqmhavyxlanhfcwtnpabedurahyvrqulfgbimbnoqesdtrcaddtsemonkjqglmmgqdgojungodbpdfpnfqvuagxtiuayexfiacajvmkgjekwyhiuwjvugbalwzsvndiivvdqxmicmekefjhuwgwmvrfxaoemhxyokfimfkobdawjcmndrhpvvlffqfcqdobknhojwixfjedtbfrtvazktcljcslmqsdvtxagnjpzkscwjnxueheenicztaayopespqytyvpgchppoipqtcooyedtdkdxargdmcuwflnafggxctravhsdvshyywyxhogcnwfdwgiizxtqldctsudopametuaupsiljwwztcdseilndqmmothtbrywmcpbtmeadmtpunexymlybgogubabzwjgmwkixzodcfmtmitkhgcupcoixgthorqaddgovdcfelnfraanyvnvmdkebivsiebvuaywnbbipsngnsbqndsvihsgfgaxtcztlbfpmuopnitajk'"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(rscb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rscb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "noshs \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'AFVJDNFIOPEMGFNGBIOZVMOYGRFAPOHKOWIFTTAOBMILVOVOMCGOCGDCROSVRUHJDSNVVXKPGYMREHTYHMVEYPPWTCSMLHXUMOXLAHTZPGMEPTRWTMNOKBHANYWBBRHFTEZSKIFYSMAOPXXRDOSSMYTAVXLTYHAPEHLBRBKONKSIPRNPPMEJYSOMYYATPVWRYXJUAMRNMEGYSHEMLCHWKBSTXYOTCSJRJNAMJWSHIRSJREAETDEFDHKOLHYSWKSBPYLTAABNOPTVOPCSCGJDPYEKKHOTFSSJUDIBMPEPSBXMYGVKRTGSPCEKMINIGOIHGRQVZWRCOOUANCMHQFPVTPHSEYSRLIYEKGWILRUJMRKXHBUVDAKBANXDHAUVOGHVNJIRCYTHUOEAFBMHLAGYVZCIAQAOLITIGTKKQEJOKTWLSOZJJIBQXHRXDKVPUZFOVWUOAAUFUCAASWTAPFJZIMCLHSQDIGLUHJJCTZOATZIFMLOYZYWUXEGTDRMIZXEWKZROZUMOJLMAGEHBJNFIBNLRFPAJCZCXGAJKWVGUJAXKCTJVRWHMURRGYKMCSOPNSTPABTWJAFEZNZTBWZBZQIEYYCKYYIQINVIAYIUUKHJDGCCAVOWGYUJKOIBMHPAJGEITPSRYIEUHWOXFZNZNUKKINYAUKOMRFUQSHEBOHMNWHNRARIIEFWHODYEJSGVKUIBILYHGYOJWALGRQROPKOGKZUVZQOTCAORTXAYTGCVDXNQWWVRQBZPXLKDROHAVNEFLRHAEFMMEBTDVLEXCZCSBYPDOGSIZVXWPZLBULKKLUVNJNCMNZYSCKEFVRETKVCADEEAWXBYLAHKDCFDAWZYRJNAOKGBHPBOQHCGRUAVIRHSCFZONWSINVRISLNLBGIZRNMARCXBYPPSDSYNTIXNCFUGKPTHKYOCTJZWQEWRZNZMGTOLMHMHEJVQGECEPAZEXYNFGOKSCTAGWZXYAOYVMEHKVSYUFJTEWUROZSMQVFGECRPORXSLYNTUBFKAVGRPXUTPUOJOCCTLWRRBXOEZCYLMIEEVTQUZGYZRHCKOCTXMLEVFECKYHJSVQSGGALGEBHTEFYBCXZQWUNBENODAMDSNFGMNKSSLTYOOGXSSFPXPTUEKGVFGNIJJBNIDHAVCXFBRDWGXXIJLVIVGMFZIPNYINNEKUSCQETEAGFYEUUKMMRIKFZPBMTPOTBMUFIEXCRRAFSLDOAIKFTTBGCNIKOOBQOJNRAVOJNEOHPUEAZKDRQPTCUVZEFIOKTPLYTYMCCMEIUNLGONIVNGDXZSOBOUPYWANDSEESXJRQPZUDELCDFYJSVAWBJOZGNTGFAMIACHEMKVVIABLJMDODHHIOBTXPBLOPJRIBJAIGPGLGLGNBXTAFTVOKMXDGVEDZYAPCNMTTWYUVQLAYWLDCKLQLDNVQPNLUNJEINIYXABGFKJCBAGTAZTGRHHWKHXDSGCOPHSMCNIVGOFFNPRISHTEJYZDGHIAGNTGNFDIAICNMSSRNXEHPPNKWOUQLGUKYSEUWMHKBRUYOMMNGHLPLMBQGJZYILSSJRZUQBTWLXKWLBIVYNEEEOUHSLUHFNGQOACTVNDSWLLDYCPZVLYYOIINPJBDCWITINNYCROANRHLNOJRWGOSCREFEWETAUSVDTDWUVCSAMAPZQERCYNONMFGOORSCIALXREOONCTRWMHHJSNTKVMSEEAZDEUDPRRWICNOGQQCCLRKPHIRUXAGTDCQEAHTHPRUONOOGDHNNIHFISEICCQLJRDTYDRMEWHKOPXFIVODFNOYTANWFLNZQWMSGAAMPDLQWLDDEUYNCNZNYNWWSHXRBTHGXYWGKGKTSBMEZKWZGSIYUDXZMTDTKDKLRMNBDWOSEUNDXMMTTKZOJETTMEFMIENZCVVSXBPAHXVWEAEFRBTZEPYXQUAOUNZLHNYGARYCUDJHTBTACKWDMDVFGPXJIZEJYOZFGSKURGLAGKLFXSXJEFOUCCEVUNHNSETOIJNZXORRGREPIXUCRGHEKARXOWECBSCVCXNPSKPQEJVTPAJTNYNTMHSKTNIBHAIJYIMYUIAGVDFXSOBBCSNNRGOHMGIVKSWMYAPOIMNCKFCWEGMXGSOZYMHPYGJDEMLPAAQMNTCPIGQPBZJOBNHTLXIUSGJRHJOHTQRPYJGHZWQRNCFULLUGXLZMAVKENCNHFMVBR'"
+      ]
+     },
+     "execution_count": 42,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(sanitise(rlcb), fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(rlcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 46,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['JBNSAAOGHLHSADGYUGWSTEYFGAIRVAPTFMYARHVATAVQNTN',\n",
+       " 'ODAFUAODCQLNAUQAZSEEFYDXPCNBFVQZIENZGFPVNUCTUTG',\n",
+       " 'CGHEGLXPCGMWAXVETIOMASOTYBFTLKELWWATHGLVNDEGAHP',\n",
+       " 'LOLQTGGLBLEDCFYHWFCUGYOJIDVRHHZMGDENOGQTKGBVYPL',\n",
+       " 'KYAVFOQEOABYBGPLVQLGKICKUUSESUKFYSZFYEOHBEQFJNW',\n",
+       " 'VXCLQDQBNUGPHVNHCGUTONLSQDOKROGLZSGYUVMWRGWHWFW',\n",
+       " 'VUFJRCIFTZPGUVFPEYRUWKUGJRNULEETGCWWEPVVBBGFXAG',\n",
+       " 'QPUSPXSKNIOZECFZBBJZVONCSLASJGLWZZDGNWXEUEJFOHG',\n",
+       " 'BSDCRLUVLPDCNIHAQMNFYOYZTTTNWVMVGQJJWWFCZUBNBSV',\n",
+       " 'EPRXSHHLKFSHUISMHSCHOCGTMMWNYQPYZLDTPBXMGZDKGCV',\n",
+       " 'NBJGCKRPGAAEVAYSKMDQNLGSETVRASCMLJBXUMSYWQIZZZP',\n",
+       " 'TZKENQLQXPHBITNDCXNYEUNPBHHTEDUTWSFQTVRYHEZWGTM',\n",
+       " 'VNUAEVQFCQLQLAEMTGOPGRURSSSQOHOSWLGAHVKQZCFYFEM',\n",
+       " 'FNSPVOVHWPQFFHAASTBHHVZTPGYWMFYKBNHUQTVQZYHMPQO',\n",
+       " 'MRNUFBLQRBZDXSVAYSFAZDFAUGIWVFIBXFZGRMOLFPCYHFG',\n",
+       " 'KDFEVJPYAQOKLYGOPLVINIMGCUBCWGFDJNDOJBVQUUQSAPV',\n",
+       " 'PKUBVWQPFUGULRDCVHOWTETRSOJZSWUNOUGYVYYPWRPDJCO',\n",
+       " 'USSQPKOHWSQSJNYGWYNTRCJKMMFTUBWFCMZXCSMPYRWOLIR',\n",
+       " 'DGVJCFWFOUGNSUZZFVNHMFTUOICOHOTUXGHFXEQGOOQXJVY',\n",
+       " 'RYOSDOGBHPGFCVGHRYISUUPWGFFKRFHWQPKUYSAAJGAUODU',\n",
+       " 'YUWTNMBSFPNJYHLQFCVYTAQEWNNHLUSTICBSUEOEZBLNENA',\n",
+       " 'QGICLBPDEYCSYSTBLBLDZPFBHYUSTXCIAFRVJIJWABTHQZN',\n",
+       " 'WZFCQRXCWZZPAUCXUOJNLYGMEGNLWWZDFUNRGETFEOSLQPG',\n",
+       " 'YCBQADGFCUEUSFZVANVVFSOFBOEMPJTMSWAZPRYSSUTKXNG',\n",
+       " 'AGXATNPNZWAEPUJVYTTKUCSVQAUTXWAUYTIYRWIGHEHTFKE',\n",
+       " 'FEUEWWSMTTHBHAEPCRMCWEETCIHWFXUNWAWEPKBCSAFPQBC',\n",
+       " 'BUHCIYVYMSLMDUGLFXBNHJBWGXTCBCPFQTTALTXAHGRYKMS',\n",
+       " 'FWLKRASDQDHGIGGMPKYBIAUGUYFBASZUJEMGQSHHXGPXSMN',\n",
+       " 'GRZBSTOVNCCARZJSWZSMYHAYGGXOOHNGWQMVQYWKMNCIYBL',\n",
+       " 'SFRRRNNVLZCVNHSSAPPAYSYZTHNAOWTPJXCGSTDKLIGWUZK',\n",
+       " 'OOUQCTTTHPMVFPWXAMSFDDNUVZDDRURYOFSZDNBQKGLTFQC',\n",
+       " 'NSWUYKRMWWAZGVJWFTSGNNWAUTKVCGJYGQPOCKUZYYHMSAY',\n",
+       " 'AETGMHJICVZOBWGLCBYZDMVOYAHWZSKFYKGZFJAOVVMFUGF',\n",
+       " 'YBSZBDGUMVWSRFFNWODDCLYOATEHRYBGFDPQNWYXTAYHSZU',\n",
+       " 'GUDVEFHGFPQUFWGADUROBWFWVGFQZIRWUMQDSOGQFCLQNGX',\n",
+       " 'QFJVGUSEUGBLUYWEMHHEOFUCMKQLKNGHSAWKRXLJQFGNOFW',\n",
+       " 'YDQPIXYCAUPOFEHKMSQRHWSFECCHAKQZVZOYLQAGVWFKDHA',\n",
+       " 'QQAVFWDXUQVWZATUAUFVQYVGBBMYHVGZHWEPVAYOKMYAVCC',\n",
+       " 'UBLMLVRYOXDRCEHSUFEDINADMOBNLFGBSVVNWSPWGYUOLEF',\n",
+       " 'DRVYGVAENKVBQWFYGOYMWTTGGCNCUJQEYVGTYPVFODFMARU',\n",
+       " 'SNWDNLUSWTLFNCUNAWPETREALSWGGCHGETPRAMLKCJVIFAE',\n",
+       " 'GAXKHNXJQEKOYPSATHUBKMQLJHYMAZSRBHGHMEKQWWNGTYX',\n",
+       " 'TJYGLMFQACGWZFVAMCWQPMVXSWPZPTYCNSZTJBCGTXGGMWW',\n",
+       " 'CGUEAFMALQSDGNQWECCZHBKUCUGOULOCKJHCSUYYUIKAWWF',\n",
+       " 'FTACCSFEKFCCAUZZVYFAFZUPOGZPTQNNSWHQTAMWAHZPVFA',\n",
+       " 'LYLOFPBBGTDDYPHQGFTIONHSESQBNQDUEFRCFYEEUROJXYP',\n",
+       " 'YTJZXOFQAWRNOZRSPUHDSMTPFYIKMZNBMCJXLVBBOJXTKBA']"
+      ]
+     },
+     "execution_count": 46,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "cb.split()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'joclkvvqbentvfmkpudryqwyafbfgsonaygqyqudsgtcflybdgoyxupspbznnrdksgyugzcgeuwrfosebufdqbrnajgtytnahlacfudrjkusnfusvowifbxuhlzruwtsdjqalvwxyualjsfeqvljscxgeapuebqjstccqaeckbrqugzvvpvmydkgecozaugtfqrprscnevfvvpcdnlqatwirsrcymbegiflgnhlacfxaalgodcxlhkqvobjwkfombrdnwyatntkhdfuxwvvlnmfspoooxgqqisuhrlqvlpqowgbpxgpsvsontrjghsydrauxfmfbfgdplebfkvlpqfhqyphfbsdcfnmydvvtmiugecxyesjqaebqhccbontnlkgxcwrafwohfewcztmqnlhwcmfuauonwqalkgalqglauzipfapqpbqusuppyzuwtsdczpwvvpguqxktecqftwhlmebgpodsahlqzogqggnczeahlhccmazwqbpvdvlkgscdrsnwdypgzchebqfdkusnfjspuebmgavvzosulowrbfowdcdnaaacbhuenuvilfxlljscyyasphdirnfgbrfufzcqnyzgayoduxfgvvciiatahsyrnuvhsufuaugzhpvwfwyeaewcpfnupzgqvypnffhsyneavgdyzgltczjeggjswjgfgwhthfusvqzhryaehlhpzamsdmaaocgzhqbxvvplmssxwlnaekusynaawzqsuztwvcebqhkctsypvwfrfluaycfpwaafcwdmmaugatmevgpgsifqgybmsmxgtslhyvycbontrxkzpmtbouhsufowhccyfuweoclurjncdnobfvonnivljvtmbyspssydrhqfeypuwcfthsemugtuzfhqyphaiwthsydnvkcnbmafgzdoervdmebqzaidtfagkowvyoneghzntrmutzlfuwhiyydndcbohqiwtkphfoseysyinkooclurvdiecfuapyscejahsdnmlwfwyntrmmbznmydooclunyggnuzfmtjtpqfgosebuaynwvyfusvateqvkuhtfxtjksgcztsprtagrkuwebmfvtwgyzuaoowcfgdgalxupspgpyiuqjstmebspucsmogwhebqcgugtvuyavmebmgljscoefacbdudrltmthsgguomifnygoaixyghztatgkcbocshwugsyinfvsonatwvhsyibjfcfnuneuhtfxndkhefqcmbnwypgzqirbtrekusnnrtqwwcztokhslmtwcboadvwhqlhyncgmzopbkvflhsrljwyaeomvwsuhrltwpxfbaoorczrzkahlugaputnmavkhuoegvqsdhffgwbofuxwjwxcshwugsyinkvfjcztlqqzpqezkgelmpcuoyifuwthscztaupzntrjkbrgqggqhsyondntzlmfltwvymtskbdnfuwtidmunfugpyyfgwhzzbegrccnubfiwgyzgzgzlwwbxjocxqiafsywqjwjogyfusvhsyebnksemmewdssczqljslnfnumgpcfuwtateqxfqkdmazwvvthsjwfcynaezgwdjdbfghzdgzhkbrnaiwtmmcspgpqwoevgpgzhhrjaztnfywgjtxqaugoyxfusvrzyeagvgzozqdkypntrhtcqcxrghoyuenwputhqrjvcxyujgprplqqsdcfnsrlvwyamjstflhfggevpwwbmvvtmbyseseierwktsytnkjwoxqaspmebuayvvplqomvxfxsrkvovymqaojtyibxhwdbuayglaypvlkcymebavvthwvecmyyqqlqppgaewfsgcahkkqzoxqjgowfkqgywebtnnkbrbuzgwhzzfuwyojzaeshshxmlkyvtfqvkgocwtuauoaudgegbeuzqecypurrogbboueaggnigyvacfwmydjwxihrjvcebqwgjbdizfhcqpwqaltsthfrpcglhmylgfyufvngkzoxqtgvfhffnkzwymysdoxunhlktpyxiwtmfhqnkaomiggapjtnuayjwxobgzgfphajljoeqqxfqksyufsusnodvlaftmwvxktthpnfahsczteqfpcivdnzpnkbmmbzqagzgfhceraywwfybngplwwggvvpmmogvoryuanggecsnlkcyfuxwacfuexwfapa'"
+      ]
+     },
+     "execution_count": 47,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "tcb = sanitise(cat(cat(col) for col in zip(*cb.split())))\n",
+    "tcb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 48,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "columns \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'harryidontthinkwearegoingtoneedtolookfarforourmoleandicannotbelieveithastakenmethislongtoworkitoutyouarerightthatalotofstaffherespenttimeintheukeitherduringthewarorworkingwiththeballisticmissileexpertsintheiratomicweaponsprogrambutyoudonteasilypickupweirdspellinghabitslikethatasanadultyouhavetohavebeeneducatedtherethereisjustonepersonihavespokentoaboutallthiswhocomesfromtheukandthatismikeididntrealiseatfirsthisaccentisprettygoodsincehehasbeenheresincethemidfiftiesbutassoonasyoutoldmetolookoutforsomeonebritishirealisedthattheslighttwangthatithoughtmightbebostonianwasactuallytheremnantsofanenglishaccentiwasalsothrownbythefactthathissondiedinkoreabuticheckedandthebritssenttroopstohelpusoutinthatconflictandmikessonwasoneoftherafaviatorssentonexchangetotheusafhediedduringareconnaissancemissionshotdownbyakoreanmigandthefileshowsthatbeforethecarrierlostcontactwithhisplanehereportedhearingrussianspokenovertheradiochannelsusedbythemigpilotsmikecametotheusforthefuneralandneverwentbackhewasmarriedbutithinkhiswifestayedintheuknotallmarriagescansurvivesomethinglikethatmikeisstillgrievingandiguessithasdrivenhimalittlemadicanseewhyheissoangryaboutthepossibilitythattherussiansaretryingtosabotageapolloflightsandiguesshewantedtogetthewordoutiamstillalittlepuzzledthoughhemightbeboilingwithrageandgriefcanmakeyoudostrangethingsbutihavetriedtoimaginehimwritingitanditjustdoesntsoundlikehimiguesshewastryingtocoverhistracksanotherthingisbotheringmetoothecallforastrikeagainsttherussiansseemsoutofproportiongiventhelackofhardevidencewehavethatthesovietsarebehindtheattackseithermikeknowssomethingwedontorheispronetojumpingtoverybigconclusionsonverylittleevidenceandthatdoesnotsoundliketheprofileofanasaengineertomeiwonderedaboutgettingawarranttocheckouthisplacetoseeifhehashiddenanythingtherebutjudgestakeadimviewoffishingexpeditionssoithinkimayneedtobemoredeviousicouldreallydowithhavinghimoutofthewayforafewdayswhileisearchhisapartmentandmakeafewenquiriescouldyoucallhimovertothejohnsonspacecentreintexasanalternativewouldbehuntsvillealabamabutifeelveryuneasyaboutinvitinghimuptherenowthatweknowheisasecurityriskififindanythingmoreiwillletyouknowotherwiseiwillmovebacktothesabotageinvestigationlikeyouaskedmeg'"
+      ]
+     },
+     "execution_count": 48,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_keyword_break(tcb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(tcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "columns \n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "'harryidontthinkwearegoingtoneedtolookfarforourmoleandicannotbelieveithastakenmethislongtoworkitoutyouarerightthatalotofstaffherespenttimeintheukeitherduringthewarorworkingwiththeballisticmissileexpertsintheiratomicweaponsprogrambutyoudonteasilypickupweirdspellinghabitslikethatasanadultyouhavetohavebeeneducatedtherethereisjustonepersonihavespokentoaboutallthiswhocomesfromtheukandthatismikeididntrealiseatfirsthisaccentisprettygoodsincehehasbeenheresincethemidfiftiesbutassoonasyoutoldmetolookoutforsomeonebritishirealisedthattheslighttwangthatithoughtmightbebostonianwasactuallytheremnantsofanenglishaccentiwasalsothrownbythefactthathissondiedinkoreabuticheckedandthebritssenttroopstohelpusoutinthatconflictandmikessonwasoneoftherafaviatorssentonexchangetotheusafhediedduringareconnaissancemissionshotdownbyakoreanmigandthefileshowsthatbeforethecarrierlostcontactwithhisplanehereportedhearingrussianspokenovertheradiochannelsusedbythemigpilotsmikecametotheusforthefuneralandneverwentbackhewasmarriedbutithinkhiswifestayedintheuknotallmarriagescansurvivesomethinglikethatmikeisstillgrievingandiguessithasdrivenhimalittlemadicanseewhyheissoangryaboutthepossibilitythattherussiansaretryingtosabotageapolloflightsandiguesshewantedtogetthewordoutiamstillalittlepuzzledthoughhemightbeboilingwithrageandgriefcanmakeyoudostrangethingsbutihavetriedtoimaginehimwritingitanditjustdoesntsoundlikehimiguesshewastryingtocoverhistracksanotherthingisbotheringmetoothecallforastrikeagainsttherussiansseemsoutofproportiongiventhelackofhardevidencewehavethatthesovietsarebehindtheattackseithermikeknowssomethingwedontorheispronetojumpingtoverybigconclusionsonverylittleevidenceandthatdoesnotsoundliketheprofileofanasaengineertomeiwonderedaboutgettingawarranttocheckouthisplacetoseeifhehashiddenanythingtherebutjudgestakeadimviewoffishingexpeditionssoithinkimayneedtobemoredeviousicouldreallydowithhavinghimoutofthewayforafewdayswhileisearchhisapartmentandmakeafewenquiriescouldyoucallhimovertothejohnsonspacecentreintexasanalternativewouldbehuntsvillealabamabutifeelveryuneasyaboutinvitinghimuptherenowthatweknowheisasecurityriskififindanythingmoreiwillletyouknowotherwiseiwillmovebacktothesabotageinvestigationlikeyouaskedmeg'"
+      ]
+     },
+     "execution_count": 49,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "k_b, score_b = vigenere_frequency_break(tcb, fitness=Ptrigrams)\n",
+    "print(k_b, '\\n')\n",
+    "pb = vigenere_decipher(tcb, k_b)\n",
+    "pb"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry i dont think we are going to need to look far for our mole and i can not believe it has taken\n",
+      "me this long to work it out you are right that alot of staff here spent time in the uk either during\n",
+      "the war or working with the ballistic missile experts in their atomic weapons program but you dont\n",
+      "easily pickup weird spelling habits like that as an adult you have to have been educated there there\n",
+      "is just one person i have spoken to about all this who comes from the uk and that is mike i didnt\n",
+      "realise at first his accent is pretty good since he has been here since the mid fifties but as soon\n",
+      "as you told me to lookout for someone british i realised that the slight twang that i thought might\n",
+      "be bostonian was actually the remnants of an english accent i was also thrown by the fact that his\n",
+      "son died in korea but i checked and the brits sent troops to help us out in that conflict and mikes\n",
+      "son was one of the raf aviators sent on exchange to the usaf he died during a reconnaissance mission\n",
+      "shot down by a korean mig and the file shows that before the carrier lost contact with his plane he\n",
+      "reported hearing russian spoken over the radio channels used by the mig pilots mike came to the us\n",
+      "for the funeral and never went back he was married but i think his wife stayed in the uk not all\n",
+      "marriages can survive something like that mike is still grieving and i guess it has driven him a\n",
+      "little madi can see why he is so angry about the possibility that the russians are trying to\n",
+      "sabotage apollo flights and i guess he wanted to get the word out i am still a little puzzled though\n",
+      "he might be boiling with rage and grief can make you do strange things but i have tried to imagine\n",
+      "him writing it and it just doesnt sound like him i guess he was trying to cover his tracks another\n",
+      "thing is bothering me too the call for a strike against the russians seems out of proportion given\n",
+      "the lack of hard evidence we have that the soviets are behind the attacks either mike knows\n",
+      "something we dont or he is prone to jumping to very big conclusions on very little evidence and that\n",
+      "does not sound like the profile of a nasa engineer tomei wondered about getting a warrant to\n",
+      "checkout his place to see if he has hidden anything there but judges take a dim view of fishing\n",
+      "expeditions so i think i may need to be more devious i could really do with having him out of the\n",
+      "way for a few days while i search his apartment and make a few enquiries could you call him over to\n",
+      "the johnson space centre in texas an alternative would be huntsville alabama but i feel very uneasy\n",
+      "about inviting him up there now that we know he is a security risk if i find anything more i will\n",
+      "let you know otherwise i will move back to the sabotage investigation like you asked meg\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(lcat(tpack(segment(pb))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "2749"
+      ]
+     },
+     "execution_count": 51,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "open(plaintext_b_filename, 'w').write(lcat(tpack(segment(pb))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.9"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}