{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os,sys,inspect, collections\n", "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n", "parentdir = os.path.dirname(currentdir)\n", "sys.path.insert(0,parentdir) \n", "\n", "import itertools\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "\n", "from cipher.vigenere import *\n", "from cipher.column_transposition import *\n", "from support.utilities import *\n", "from support.text_prettify import *\n", "from support.plot_frequency_histogram import *\n", "\n", "ca = open('7a.ciphertext').read()\n", "cb = open('7b.ciphertext').read()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DEYRB UGZWR VEFMY PEOAR GTDHX MGWHR RRQRL GSZVE VVIES UZRTU OEHVR SSLLQ VBCYW YHVRL OEUGV TOTGX DVQWU SBLJN HELFQ ARJLL BIIGK JAEGM QGUTG NQAQC ENRYY VOAIK PNJGC YDRPW VFSOV QOTGK KIAWE TPNIC ZKRZI XUSAW NYEUK XEZWA NKIUE OMQHA TZWWR WTSGN IGZGC ZWYFZ HDNHM GZKRZ GINLO EOGJL RUNZD RTGKD RYABL ROMHE AVDAE CIFOY HKDVN FKTUK QFNZA IJEGW MRBSJ NHELF QANKV NRUNG NKOIL KVFHL FKDRT COEGI EKVFG NMJUX LULXJ SZLNZ MEXKP CDGRV IYGNM YOMHK KSHKL OSGTR DGNUU MNKVI NSVBZ YUIHA UQAAP OBHYA SVGFB LOBHZ UNEHE SHGNM ZEUKL VJTTB QSJOO EEKBU KNAEJ MAYNA EJMAY CEIHI VLOEE UZZGE BVKIW MZTJG VGKJT FFSAX BSRZP RATIE LXVSA EQGVQ ZUAUG EAWET EGTNE KRFIW RUYEP EDVGI OEIYF AVNNH QGROK VKIQG LSOEX VRONX XTPAW HRXAV TZHVV IYSAE EIPNV ZEIVE AQDAL CMNXK IEOYP CAHRO AUZGR XDXRF VWYOD RYONK KICWY GNSWA SASVX QVFIE ERQAG TDZKE CHLNG UPNBK AGDWF LVTUK NHRRC FOPRU AIBTQ NSTOK VYEWO OJZPR ECICO JRWSA OUCGA YDZVQ NFALV TOVZZ OKUCG GMIAJ KUGVT VUWRN LNOAB VLCEV ATYSP NJNIG OYIEL XVKBS CKKGZ NETXV NLVRF ICEOU SZWCJ ASLBB MEIUM VKMFF HTHXI YVXOK HGGAC EAKAF VKRYD TFLOE EKERC OLCIM ASSLL AVYUI KKKIF WJRRZ WSZNE ZAXUD LGVUV GNGTC HEIWZ TUKYH KYTZR RBXOO JCMQK GLNLX UEPDN YIAJS AIBEZ ZHSNI TRBKR ZGINO LSUUC YJREK WLRUV LYKKG UXDVD PJAAH GNMZZ NEIXW FAHNZ GNVGI AEEIC JLTGE ZHZNL VVWVX AHREN RKRBV WVNQL DNTLF NKHRV WHYNE FZMQG CAPZI ZANHG SIXKZ HVWLV WCEFL IYRUU KLXVK HCHTV VTMPC DRNFK IGNQA QOCRQ LRDW\n" ] } ], "source": [ "print(ca)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/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", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(sanitise(ca))\n", "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "pua = depunctuate(ca)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('hanginggardens', -1451.9609829395629)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ka, score = vigenere_frequency_break(ca)\n", "ka, score" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "well that was a surprise and quite a relief as i said before no one really knows where the hanging\n", "gardens of babylon were located and i dont think we would have had a chance of finding the next\n", "chapter if that was where it was buried but it seems that tacitus had a better idea the babylonian\n", "goddess of love and war was ishtar and the ishtar gate from babylon was one of the original seven\n", "wonders of the world it was later replaced by the lighthouse of alexandria so i am not sure why\n", "tacitus used both but maybe because he didnt know where the hanging gardens were either or maybe he\n", "just wanted to confuse the uninitiated and to add an extra layer of secrecy via confusion abit like\n", "he does by piling up ciphers in these later chapters anyway we are in luck the ishtar gate now lives\n", "in the pergamon museum in berlin and i happen to have a pass to the full collection i am not sure\n", "how they will feel about us dismantling it to try to find chapter seven but if we explain what is in\n", "it i suspect the curators curiosity will overcome his natural protectiveness perhaps there we will\n", "finally unlock the secret of the ixth legion that leaves the question of how we deal with midas and\n", "maryam has a clever idea we should let the collector deal with them the russian mafia can be pretty\n", "ruthless if they feel betrayed and she has suggested away we might make the thieves fallout it is a\n", "cunning plan and i think i can help\n" ] } ], "source": [ "pa = vigenere_decipher(sanitise(ca), ka)\n", "print(lcat(tpack(segment(pa))))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1422" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open('7a.plaintext', 'w').write(prettify(pa))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'oreomcufedvtmgjelehgvyhdnvwgkshmbcylmiexlrwffwxbkfszeafkzplrvsjuezttmcapoatsjuspemcqflfixmgseatgrtoieyymvjveuauglioxwftwgfebfqlfcepltdwzaaeoajfimmuarebtypctptbrgaasrtyfdloeargllxneepweorpppzyzaefqprlonyflmddtdrsrwmwpuoelepdierwaxgguytlpqgktzcglpqloafchzrsotmekmscaruseeaabhzwpflruzmedmcgymehxyqsrgaldaapydmauoqcadbjjismbtnliqgxyukejatcfsrsehmvsienxcggeteyunwmdhxzpjoteeyvxwtegcjsitcxluavputcpzpdnzchlsldvyqlpceauvjvtvvyetspehwtasppeykmegumfvazttzqesyoherxvxqfbrtzmpclkplsdeamklislhbgmszdgrmfmcpxlnzcedtrjlylokshswpmtqualnaaselmxbxqvwpdabjumxcuwkilmedlyewelohnpvjcbmctshhedrtgwprrygwiettlhjpteadpsxxkvecytrcdqptkupfhocumcsgpeacklmmnwgjjgqghmfmwletmhevgitqcwsjalsghvscyjkdierlggfvoofpeawytgbpupzsxmkpmqrkmqxmeehjjymaehcfamdsxlcsidaxcwooyebgpspyopywgifcggpspsoxqpgeytvckaucetqtjerevaqdmnomakkweyxdnlgspguqdesnzpvvxfhhsklrohxpgziyrgbckweempclzzttcowscuwgqoiyrgycmmppyyryxwehmgdldsaugvelibrkjlhdbhvvicahquvhdikcksgyebmcvmctbyguvsrvcvkydnpcfwihfgftqworkaperanakcjxpakecawlakfwsyftbcpsxztzywwhrtwacmgzfyrjftptldksizatyuqgpamywmadumnpfmeegmpeiwrkcusrzrmfnkspehgukszetggfhleuljvidthlqsepcxgvlywoamfnhcnzsgkmsramjdjyewpfdvllkgessdemmofiwinfkmeednprzylttauflmtlsnlwyrneqgvphlppkmtsxmtlhdlkdtsmttwkaaiwenmis_rufxqcauisfcbtycxxletlpahtagztlvromcgzszrymvlwomnmxqiydapfjawalgnwistxgjsjphlqqfseomfnlwsctbksaedvrrgszamlqflcubckmmwwjgcuxslbrvswdduqjuhtoeekujqnequyxedgctxiynvetvinulqumwximyqjglaadnfinsajvlmwrmcqsindtrnjmlrhgeqptcllvqszrnckvapvpjcjxcfbrvgrlspsefqdfgukdensmjukwtegqczinnkpkgyyebggcgyramgwelthrgjoyrdfdmefemrnwhoeatyessogyqgxnulgcfemaeyyzxrhbbrsxtotgrlxtexrnwcdevlpwqcmxqnkxdnvbyzhfieqolllixnusxzaajrkwtpwypnvaswgvlxxsmrvsedhktqjlowkacsxlookvsjptxscfmrohcqjvotwpvltlrbrgftzrzpvdqlngfjfiyekcgwszoxccmmoancfwglsheawxregivvpdtoyifiyixlufgpsxcjkvsihdeacptlgqfkprvltajpobbklverfatleletrckreirugvctgosx_agqmsprtyawefsklqzpdnbbrxxgpecjagyhxgcjzdcgqkscmskgyjkytxmiakycoyrlisdgcisstfbpefleomqkwepstmpsveeacpjqnhmpeaiwebmvsmpugfmsipnxrfsneymmqgbyimrcjlxuprkamngpytdwdoginvedtafcasyovreszeatfigsltlgggiphzqvkewsayqegzvhpjswckzfefwpegqqsrzizlgziznmmmxxstlykaxzawrgflehnqhogydugggetcxrruswtkygukqegqklrpiepqfhpivcedweoajqhwcaxgheeftebomedantrfydygmgsmpstmtzqqltyjzkynmmdjslowenmkjcbsuwxeafyvwveupyjgwdplrtzveexcklsloglghwuihyqztehmaueipitdewslsaqugghehgplecrlzgpmmnmsvltnexcqwjtaavvsgohxunwvccbcfsihwwgtnxqtgjukqggrzdwtzmksuwelgerggizekffltefzrfsregwgvviyhkfnlexfngqtxdabaxgkqdecjtseaxyjxcqralhylysbzuavpilm_hznpjazyvfgaxmowpglmzswjqeizetfpsmtmglvwllitsismxwvyazszcgjvshzegytjizffppxrznmykwiqutsevmwunaumspawyewypimfnzhgigphkvtdxjdvkloegpgldimkhdllharqaidakqpuysnemgwmfeacvdllexppmwqaafoascshdhzxfanlwvwpimfgeeeezsklwznncvzeytxykmhddvlagpeawtgbhseictaisteygwvwoaefwvcsxmkcgeugqhdepwmcefispmyglewnhvevhyevdgtecovrwkpfaydkgwolmpgvwztxppdrwsxjvlacdyznvwrtbmgwxpngcuzelhpzqfogmggewmzoljpgsxarfzfxdhbpwsxpsbcklitgkrtfvxsxlgaygnvfgwvchhrgvwdsmyefvwelqpslcthyjlijttbvgplomfkgeyhgcdjxheayvsittbypjeslzyxgizagrkzzzenyimiswxsojrpogrfupbyavulvccbmkmswsbqtkmcwlwcjmzomjjvetsmrgzywaxctsgpazrcolywicgayzewgvwkelnypjezbk_thigrsanutlvzsxhzjtfvpibpctwetbensraezftaplllpplestlrgowlihfelrotrcaurfaxdryveheytxmellpencostgehhyikcdejpamugjiwabgywvlqrjvawqegbkwefofrgmxpfhlufxdamrufizlfeznxeetfisfoamrpoweebnpakxlhrqaxwsmqvlmzrkrraigeglqkglexcgkssmeghsszabuvnlnhhwwvmxrtmqcieegqtswhtbkfssetkrgwvesvrgfxllhcgkxcsgnjlilfmfylffowqgfqfoxqgqxdoaanoxwhhughwsxbbigyhrxkjaivtkcgwyvnnnvzhndwmvdvpemqgailodftfrytbynltowxpkgxznhrhsvluwljgbthlsylmadzpvkilttkfsspmapdmithfykjeoitqvsltnvcgswtnmfparfhxdtjapdlwqsmnewavjqcturkrxergchsywohbksxxsgsulxzsmmqglddbawayeeprqwmssnktxiluhpcmsttzlgfvxuxchjhnwedgaiyawcvsrteaacwjlpbrpyzdimfggswryrglqlu'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scb = cat(c.lower() for c in cb if c != ' ')\n", "scb" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "27" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(set(scb))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/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", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(sanitise(cb))\n", "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('eeleeyceelalas', -5541.802272494437)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kbv, score = vigenere_frequency_break(scb)\n", "kbv, score" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'kntkiesbasvimofaaaditudsnkwogowixewhixemlzsbustdibooepfsvlanruhqaotimkwldwpuhqoeebcybhuetoeoaptvrbketuuotfrtupuohedtshrscueqfyhbralnrzsoapewwfueioswntbiyxypepxtewwhriynzhdawtehhmntexsadnlrnvuoatfylnakjadhisdidzonlisrskaaeedqanlwtiequileqogpoycnnmhdaucpvnhkpocgihcprcoatwwdfvsefarcvitzieeuithmyyonvwhfywlndbackmrwzdhfehmqtvhefctasgayaicnonhadotoetnmcocaiauwlsishmzxfkiaaattsievcroeiytnswreuicxvlsjvefhoadkyyhlrawwtfrivkympoeadyrwoeptysiavqihtwvitoqmouddatvrtffqrbvieyhmnhosepmshehhddeioodvrubirltnlvytdirrhuakgufosemiqcwhcwwuchimbmqdslswxlsitrulkqhitzhacsaaownxrfrxierodwesrbcsennaesettilpfliawfnotmkkekupgyzsnpgjpuhwyqbyoinawrkamujsvffiocdbfbwtapbdaxeepfclsrwhhcdxqyuyksimnhvcbxmkbeepwgpcqlqrxotbkemyngbmtocadyjnmiadrbwobotachilwtrskqwaxvphpgklnsckdycvphpaktflcgwprrkpukapfpfgparpqsmvkipggycutsnagalcjmzgqjvevkxnddhghtmdtegoigncqygycaiecazhpprksuaqsvqdigncnyionlunrnxeadbcznbowjgketexggfnfzxwvkikwdfqrjbegrkhggaxbyroapxngjvanrrrgabjlrflipbcupmymngpptrijwzyfznwgtcpwtwgusoadpxrphxhpvnssjppspcbghbugfbvnphskhihwpnqminwinwbalqiclbocacbptiengrqotxniunzsxadvqguxapvguhtaqafrkbpdaqhexytvrhaukwbfchkjvhcgoqnwbjsjgasebzxjhgvehslaibkbkuejukbemzjenvajpppuuluphhjhywnjtqvvxdhelgorotbtahlhgspoorpszapieajbeotsbtfcpuqobrxpaattaeilxwdiwcbrhrgobcovoonuothsdmcmfmenzwrdfwlaagvsehptihofehaqybotkihlhshcibsowtzrtpcooablybhrqxeiiilwygkqthhxttossdjqrqdikagiqffntqcuttzcertennkebrecqhssismibyyfcawwflbecspjdhilnieooecdirvfiandicmlicaldmoonjeirwevejkftrbxttcnasesmbmsbcwizacsbjcgsiacsavecnzpscunaxieycnrpmosaapdtefknrsfliauaitlsddeptgaohkcaoctcuagkbabwaawvtghqbzotikpiphtiemrvsysarnnsmrmmqvgtsjrdwvduitqwhhaetpsotoapjzgsilsanjrpslgdhtmoittoashztyfhdsgcaotaodkdofeptuabigowcyfrdpsrthparqrobponvrtzmanvfrbenageesooomckiidwjedscasweistgacktrlstdyqbenetnsbcesmcrgrhedfcwyetagybgenrnrwfeoqbshrtnbcrhaaeirkgntenweryigdsfwcfiorppupwtfaghfvlflxxgxmgxayywcaftcrjodkcmzoyoqgcnjzybtixwgaakuglxslcyxoovdxltfaewimzsarqpieskemwyefmpfiltaxwmxikoirscbbsxpvtnuojgwiifgqyqinrfhzslnzabnoluizsfmcecvtdbwbrwoamrntsoeipbxconrhcvgxppvmkgayqwufevzddlyoseivbtflpmcmfonbgvhvzxzviibtturhuzamzisnvbhgfjmwovylqcvcavatnguhwbguvqgsccmzlgpqalfbdrgrytdlewwffdseytcwetfbaxdiafyjpgfndgcivoirqpiizfqtpuyvgaliisjhlwsaciglaxojwmeibuksrgsluygldxhnivrgctyzlhlwchvdswgdufziepiwjaergpztwhlawmjccjcdceltczhvvliolioklinmtyfsfvywrksvoptqcsreaxyusxhescijtsrcfjkfgonvsspbkgojwtloanvcebcgbulienvnuongesckvxypgbchazdjcftmdixwmcgsbayytheituytyspwhwyayaxvjwrrghiwzcprwvnrbiytidwegtivhsfscevttupaipbchxuhhxthiaitlrucxovrgyvadvtcuvhevufepfnvciumuemjthedisjjwwkolpwneeulxibpxdcxgehsrpstfftghdevpohzxigjbhhwagqiezpgmrsuocebgeibtwyxbhhtxepusmpwbqyoyhhshhtbpjhytslxmugmaatvomjsvcnrvhauitumkdzsvaaolapspizdotirtieoiauiursdatferyhtimacajgfhlalliygdeoemngtascdrgtdutvsgbaydrnyilbpyskoskailitsvixeplnshtfxjwysyondsnixiiutlcgruhahwlvsdkcbgveeivdhfreotpruzntzwxlyqtlhbrktepvgnvdrthxagiuccrbiurywhggdszhiugdrstlfpahyiduljefitqvolhdibmeauwgrdrtdtwuxqepibnpraoavuzeevpggkhvvtjukkeolxhornldcnhslxnakutryrximkoshbftsiylhsehivdmyjdaphinixuspxrtaclpvnemhulirgiuvtscxugaannpravqgpjgcnhacubhrootjxfpuveijlyisavzajhrpehbpplhnjllaehttncdshkfbaardtzywjnbcvznnvthmupmianjlaccdsbcawdukiyztjeauqcyesczculvaqzfrpsmgexgleuonncbtlhfhquxsaunquevndavcxtebbehbkcknldwtejjlpgtnfnmpxlsumraivtinnpiveohmzchgvyczshmmcdhovczqrclchpsskittrimriteomphsdvzgbhsttsnclrautncuxalpycztyuejfaiafubuabbqumcuquofmcftzqywjdxlhpqcwsozzxevywrfgfperviyclyknvjrodjfuirsveeumcpehqbbpurntjujapkyvlgvxonpndhrhwuhfvbihtouaiwfxlrziatbgbholoylzbiihnugyakkrmrhlindychsppkblpruhfzpywlfjsmhmceewrymyvsnggxtroydhusqfxghxmsooqatvukimvlsdjwspuagnnmlmhsvgpmehwflybsithhcurtwvydyhcwmzcpeucuyrhrieiwylfhrznlnzsiubcvostwncaqau'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vigenere_decipher(sanitise(cb), kbv)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/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", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(sanitise(cb))\n", "plot_frequency_histogram(fc)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/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", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fp = collections.Counter(vigenere_decipher(sanitise(cb), kbv))\n", "plot_frequency_histogram(fp)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/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", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAE/9JREFUeJzt3X+wXGV9x/H3R4wFRUXgShGMV6ujpe0Y6jXVYmcsSoeKVpzSH9YfOLUTbWXUtlrBtlNqdQarLfWP1jYKJW2pgj8oVrTKABZRiyYQICEqVGKFQRJ/oKBTNPDtH3tiL5CwZ/fu5j7Jvl8zO/ecs+e5zzcn597PPmefezZVhSRJrXrQchcgSdIDMagkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNe/Ce7OzQQw+t+fn5PdmlJKlRGzZs+EZVzQ3bb48G1fz8POvXr9+TXUqSGpXkq33289KfJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpab2DKsl+Sa5O8tFu/fFJrkxyY5LzkjxkemVKkmbVKCOq1wFbFq2/HTizqp4IfBt45SQLkyQJegZVkiOBE4D3dusBjgU+2O2yDjhxGgVKkmZb3xHV3wB/BNzTrR8C3F5VO7r1m4EjJlybJEnDb6GU5PnAtqrakOTZo3aQZA2wBmDlypUjFyjtKfOnXtR7361nnDDFSiQt1mdEdQzwK0m2Au9ncMnvXcBBSXYG3ZHALbtqXFVrq2qhqhbm5obee1CSpHsZGlRVdVpVHVlV88BvApdW1UuAy4CTut1OBi6cWpWSpJm1lL+jehPwB0luZPCe1VmTKUmSpP830sd8VNWngE91y18BVk++JEmS/p93ppAkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNW2kv6PSdHmvOUm6P0dUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYNDaok+yf5fJJrkmxO8ufd9nOS3JRkY/dYNf1yJUmzps/nUd0FHFtVdyZZAVyR5OPdc2+sqg9OrzxJ0qwbGlRVVcCd3eqK7lHTLEqSpJ16vUeVZL8kG4FtwMVVdWX31NuSXJvkzCQ/NrUqJUkzq1dQVdXdVbUKOBJYneSngdOApwBPBw4G3rSrtknWJFmfZP327dsnVLYkaVaMNOuvqm4HLgOOr6pba+Au4B+B1btps7aqFqpqYW5ubukVS5JmSp9Zf3NJDuqWDwCOA76Y5PBuW4ATgU3TLFSSNJv6zPo7HFiXZD8GwXZ+VX00yaVJ5oAAG4FXT7FOSdKM6jPr71rg6F1sP3YqFUmStIh3ppAkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNa3Px3xIkpbB/KkX9d536xknTLGS5eWISpLUNINKktQ0g0qS1DSDSpLUNINKktQ0Z/3NMGcUzQ7/r7U3c0QlSWqaQSVJatrQoEqyf5LPJ7kmyeYkf95tf3ySK5PcmOS8JA+ZfrmSpFnTZ0R1F3BsVT0VWAUcn+QZwNuBM6vqicC3gVdOr0xJ0qwaGlQ1cGe3uqJ7FHAs8MFu+zrgxKlUKEmaab3eo0qyX5KNwDbgYuC/gdurake3y83AEdMpUZI0y3pNT6+qu4FVSQ4CLgCe0reDJGuANQArV64cp0ZJM8Ap9NqdkWb9VdXtwGXAM4GDkuwMuiOBW3bTZm1VLVTVwtzc3JKKlSTNnj6z/ua6kRRJDgCOA7YwCKyTut1OBi6cVpGSpNnV59Lf4cC6JPsxCLbzq+qjSa4H3p/krcDVwFlTrFOSNKOGBlVVXQscvYvtXwFWT6MoSZJ28s4UkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSm+VH0Q3j/MUlaXo6oJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU3zXn+SNGXeM3RpHFFJkppmUEmSmjY0qJI8NsllSa5PsjnJ67rtpye5JcnG7vG86ZcrSZo1fd6j2gH8YVVdleThwIYkF3fPnVlV75xeeZKkWTc0qKrqVuDWbvmOJFuAI6ZdmCRJMOJ7VEnmgaOBK7tNpyS5NsnZSR414dokSeofVEkOBD4EvL6qvgu8G/gJYBWDEddf7abdmiTrk6zfvn37BEqWJM2SXkGVZAWDkDq3qj4MUFW3VdXdVXUP8B5g9a7aVtXaqlqoqoW5ublJ1S1JmhF9Zv0FOAvYUlV/vWj74Yt2exGwafLlSZJmXZ9Zf8cALwOuS7Kx2/Zm4MVJVgEFbAVeNZUKJUkzrc+svyuA7OKpj02+HEmS7s07U0iSmuZNaSVNXN+bsHoD1snbF2+A64hKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DTv9bcP2Bfv7bVUe/KYePyl6XJEJUlqmkElSWqaQSVJappBJUlqmkElSWraXjnrb2+YZbU31Kjl5TkyGR7HfZ8jKklS04YGVZLHJrksyfVJNid5Xbf94CQXJ7mh+/qo6ZcrSZo1fUZUO4A/rKqjgGcAr0lyFHAqcElVPQm4pFuXJGmihgZVVd1aVVd1y3cAW4AjgBcC67rd1gEnTqtISdLsGuk9qiTzwNHAlcBhVXVr99TXgcMmWpkkSYww6y/JgcCHgNdX1XeT/Oi5qqoktZt2a4A1ACtXrlxatZK0jPblGYYt/9t6jaiSrGAQUudW1Ye7zbclObx7/nBg267aVtXaqlqoqoW5ublJ1CxJmiF9Zv0FOAvYUlV/veipjwAnd8snAxdOvjxJ0qzrc+nvGOBlwHVJNnbb3gycAZyf5JXAV4Ffn06JkqRZNjSoquoKILt5+jmTLUeSpHvzzhSSpKYZVJKkpu2VN6WVtGe0PGVZs8MRlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpzvrTyPrOBHMWmKRJcEQlSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJapr3+lPT/ITZe/N4aBY5opIkNW1oUCU5O8m2JJsWbTs9yS1JNnaP5023TEnSrOozojoHOH4X28+sqlXd42OTLUuSpIGhQVVVlwPf2gO1SJJ0P0t5j+qUJNd2lwYfNbGKJElaZNxZf+8G/gKo7utfAb+9qx2TrAHWAKxcuXLM7rS3c7aapHGNNaKqqtuq6u6qugd4D7D6AfZdW1ULVbUwNzc3bp2SpBk1VlAlOXzR6ouATbvbV5KkpRh66S/J+4BnA4cmuRn4M+DZSVYxuPS3FXjVFGuUJM2woUFVVS/exeazplCLJEn3450pJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0b96PoJWmvNn/qRb333XrGCVOsRMM4opIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNW1oUCU5O8m2JJsWbTs4ycVJbui+Pmq6ZUqSZlWfEdU5wPH32XYqcElVPQm4pFuXJGnihgZVVV0OfOs+m18IrOuW1wEnTrguSZKA8d+jOqyqbu2Wvw4cNqF6JEm6lyVPpqiqAmp3zydZk2R9kvXbt29faneSpBkzblDdluRwgO7rtt3tWFVrq2qhqhbm5ubG7E6SNKvGDaqPACd3yycDF06mHEmS7q3P9PT3AZ8Dnpzk5iSvBM4AjktyA/Dcbl2SpIkb+nlUVfXi3Tz1nAnXIknS/XhnCklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS04b+HdW+Yv7Ui3rvu/WME6ZYiSRpFI6oJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU1b0sd8JNkK3AHcDeyoqoVJFCVJ0k6T+DyqX6yqb0zg+0iSdD9e+pMkNW2pQVXAJ5NsSLJmEgVJkrTYUi/9PauqbknyaODiJF+sqssX79AF2BqAlStXLrE7SdKsWdKIqqpu6b5uAy4AVu9in7VVtVBVC3Nzc0vpTpI0g8YOqiQPS/LwncvALwGbJlWYJEmwtEt/hwEXJNn5ff61qv5jIlVJktQZO6iq6ivAUydYiyRJ9+P0dElS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS05YUVEmOT/KlJDcmOXVSRUmStNPYQZVkP+BvgV8GjgJenOSoSRUmSRIsbUS1Grixqr5SVT8A3g+8cDJlSZI0sJSgOgL42qL1m7ttkiRNTKpqvIbJScDxVfU73frLgJ+rqlPus98aYE23+mTgS+OX+4AOBb7ReDtrnEy7vaHGcdtZ42TaWePyt+vjcVU1N3SvqhrrATwT+MSi9dOA08b9fkt9AOtbb2eNs1Pjvvxvs8bZqXEp7Sb5WMqlvy8AT0ry+CQPAX4T+MgSvp8kSffz4HEbVtWOJKcAnwD2A86uqs0Tq0ySJJYQVABV9THgYxOqZanW7gXtrHEy7faGGsdtZ42TaWeNy99uYsaeTCFJ0p7gLZQkSU2b2aBKMp9k0zL1fXqSN0y5j9cm2ZLk3Cn3M/ZxTPLZJfTbu+0Sa7xznHZaPkkOSvJ7y12HJmdmg2oG/B5wXFW9ZLkL2Z2q+vnlaKvllYFp/u45iMH5r33EPhFUSf4tyYYkm7s/MO7rwUnO7UYeH0zy0B59vTzJtUmuSfLPI9T4x0m+nOQKBn/43KfNS5N8PsnGJP/Q3V+xT7u/B54AfDzJ749Q4592Nxm+Isn7Rhj17ZfkPd3x/2SSA3r2N/ZoZdy2SZ6Q5OokTx+37wf43vNJvpjknO7/+twkz03ymSQ3JFk9pO2WUY9jkj9Isql7vH7EOkc697u2PzqPRzlHuj6/lOSfgE3AY3u0eViSi7qftU1JfqNPX8AZwE90PzfvGKG+TYvW35Dk9CFtzkjymkXrQ6+UJHljktd2y2cmubRbPnbY1Y8kT+9+9+zfHZvNSX56SJu3LD4vkrwtyeseqE2336u747cxyU1JLhvWZqqW+w+5JvEADu6+HsDgh+CQHm3mgQKO6dbPBt4wpM1PAV8GDl3cb4++ngZcBzwUeARwY4++fhL4d2BFt/53wMtHOCZbd9bZc/+nAxuB/YGHAzcMq3HRcdwBrOrWzwde2rPPO5fwf967bVfjJgYvEK4GnjrFfnYAP8PgReCG7rwKg/tg/tskj+Oi8+phwIHAZuDonnWOdO6Pex7fp897gGeMcDx/FXjPovVHjvL/PeL5dK82wBuA04e0ORr4z0Xr1wOPHdLmGcAHuuVPA58HVgB/BryqR51vBd7J4IbgQ2+w0P27ruqWHwT8Nz1+Py5qv6Kr8wWjHM9JP/aJERXw2iTXAP/F4JXak3q2+1pVfaZb/hfgWUP2P5bBSfYNgKr6Vs9+fgG4oKq+X1Xfpd8fRj+HwS+GLyTZ2K0/oWd/4zgGuLCq/req7mAQkn3dVFUbu+UNDH44WjMHXAi8pKqumWI/N1XVdVV1D4PguKQGP/HXMfy4jHocn8XgvPpeVd0JfJjBudbHqOc+jHceL/bVqvqvEfa/DjguyduT/EJVfWfE/qaqqq4GHp3kMUmeCny7qr42pNkG4GlJHgHcBXwOWGBwbD/do9u3AMd1bf6yR41bgW8mORr4JeDqqvpmj352ehdwaVWN8vtg4pb0d1QtSPJs4LnAM6vq+0k+xWBU0Md95+a3NFc/wLqqOm25C+nhrkXLdzMY2bbmO8D/MPiFfP0U+1l8LO5ZtH4Pw3/e9uRxXI5z/3uj7FxVX07ys8DzgLcmuaSq3jKd0tjBvd8K6fs75APAScCPA+cN27mqfpjkJuAVwGeBa4FfBJ4IbOnR3yEMRs8ruhr7HNP3dv39OIPRcy9JXgE8DjhlyK5Tty+MqB7J4JXM95M8hcHQuq+VSZ7ZLf8WcMWQ/S8Ffi3JIQBJDu7Zz+XAiUkOSPJw4AU92lwCnJTk0Tv7SvK4nv2N4zPAC7rr3wcCz59iX8vhB8CLgJcn+a3lLmZCPs3gvHpokocx+Pf1eVUOo5/7MN55PLYkjwG+X1X/ArwD+NmeTe9gcPl6FLcxGB0dkuTH6H/+n8fg9nEnMQitPj7N4NLi5d3yqxmMdPq8WPgH4E+Bc4G39+zvAuB4Bpf3P9GnQZKndTW+tLs6sKz2+hEV8B/Aq5NsYXBn9lEuLXwJeE2Ssxm8yn73A+1cVZuTvA34zyR3M3i/4xXDOqmqq5KcB1wDbGNwn8Rhba5P8ifAJzOYIfVD4DXAV4e1HUdVfSHJRxi8wruNwWWXpi613MfII4Cq+l6S5wMXJ7mzqvbqe1N259U5DN7nAHhvdzmqj5HO/UX9jXQeL9HPAO9Icg+D8/93+zSqqm92E1g2AR+vqjf2aPPDJG9hcCxvAb7Ys6/NXWjfUlW39mnDIJz+GPhcd07+Lz1eYCR5OfDDqvrXDCZWfTbJsVV16ZAaf9BNhri9qu7uWeMpwMHAZUlgcGPa3+nZduK8M4V+JMmBVXVnNwPscmBNVV213HXdVzeivaqqpjnC3GclmQc+WlUPOGOsx/c5ncFkk3dOoCxNSfdC9yrg16rqhuWuZxz7wqU/Tc7abuLGVcCHGg2pxzB4A9pfjtIQSY5iMDvzkr01pMARlSSpcY6oJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTfs/nrh65z2bgeIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fp = collections.Counter(every_nth(scb, 6)[4])\n", "plot_frequency_histogram(fp)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/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", " \"matplotlib is currently using a non-GUI backend, \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fp = collections.Counter(every_nth(scb, 32)[0])\n", "plot_frequency_histogram(fp, sort_key=fp.get)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'etoainhsrdlumwycfgpbvkxjqz'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ltrs = [p[0] for p in english_counts.most_common()]\n", "cat(ltrs)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'eglsmtapwcryfvxhkdizqnjoub'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctls = [p[0] for p in collections.Counter(sanitise(cb)).most_common()]\n", "cat(ctls)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'a': 'h',\n", " 'b': 'z',\n", " 'c': 'd',\n", " 'd': 'g',\n", " 'e': 'e',\n", " 'f': 'm',\n", " 'g': 't',\n", " 'h': 'c',\n", " 'i': 'p',\n", " 'j': 'x',\n", " 'k': 'f',\n", " 'l': 'o',\n", " 'm': 'i',\n", " 'n': 'k',\n", " 'o': 'j',\n", " 'p': 's',\n", " 'q': 'v',\n", " 'r': 'l',\n", " 's': 'a',\n", " 't': 'n',\n", " 'u': 'q',\n", " 'v': 'w',\n", " 'w': 'r',\n", " 'x': 'y',\n", " 'y': 'u',\n", " 'z': 'b'}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trans = {pr[1]: pr[0] for pr in zip(ltrs, ctls)}\n", "trans" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'jlejidqmegwnitxeoectwucgkwrtfacizduoipeyolrmmryzfmabehmfbsolwaxqebnnidhsjhnaxqaseidvmompyitaehntlnjpeuuiwxweqhqtopjyrmnrtmezmvomdesongrbhhejhxmpiiqhleznusdnsnzlthhalnumgojehltooykeesrejlsssbubhemvslojkumoiggnglalrirsqjeoesgpelrhyttqunosvtfnbdtosvojhmdcblajniefiadhlqaeehhzcbrsmolqbiegidtuiecyuvalthoghhsugihqjvdhgzxxpaiznkopvtyuqfexhndmalaeciwapekydtteneuqkrigcybsxjneeuwyrnetdxapndyoqhwsqndsbsgkbdcoaogwuvosdehqwxwnwwuenasecrnhasseufietqimwhbnnbveaujcelywyvmzlnbisdofsoagehifopaocztiabgtlimidsyokbdegnlxouojfacarsinvqhokhhaeoiyzyvwrsghzxqiydqrfpoiegouereojckswxdzidnacceglntrsllutrpennocxsnehgsayyfwedunldgvsnfqsmcjdqidatsehdfoiikrtxxtvtcimiroenicewtpnvdraxhoatcwaduxfgpelottmwjjmsehruntzsqsbayifsivlfivyieecxxuihecdmhigayodapghydrjjueztsasujsurtpmdttsasajyvsteunwdfhqdenvnxelewhvgikjihffreuygkotastqvgeakbswwymccafoljcystbpultzdfreeisdobbnndjradqrtvjpultudiissuuluyrecitgogahqtweopzlfxocgzcwwpdhcvqwcgpfdfatuezidwidnzutqwalwdwfugksdmrpcmtmnvrjlfhselhkhfdxyshfedhrohfmraumnzdsaybnburrclnrhditbmulxmnsnogfapbhnuqvtshiurihgqiksmieetiseprlfdqalblimkfasectqfabenttmcoeqoxwpgncovaesdytwourjhimkcdkbatfialhixgxuersmgwoofteaageiijmprpkmfieegkslbuonnhqmoinoakorulkevtwscossfinayinocgofgnainnrfhhprekipa_lqmyvdhqpamdznudyyoenoshcnhtbnowljidtbabluiworjikiyvpughsmxhrhotkrpanytxaxscovvmaejimkoradnzfahegwlltabhiovmodqzdfiirrxtdqyaozlwarggqvxqcnjeefqxvkevquyegtdnypukwenwpkqovqirypiuvxtohhgkmpkahxwoirlidvapkgnlkxiolctevsndoowvablkdfwhswsxdxydmzlwtloasaemvgmtqfgekaixqfrnetvdbpkkfsftuuezttdtulhitreoncltxjulgmgiemeilkrcjehnueaajtuvtykqotdmeiheuubylczzlaynjntloyneylkrdgewosrvdiyvkfygkwzubcmpevjooopykqaybhhxlfrnsruskwhartwoyyailwaegcfnvxojrfhdayojjfwaxsnyadmiljcdvxwjnrswonolzltmnblbswgvoktmxmpuefdtrabjyddiijhkdmrtoacehryletpwwsgnjupmpupyoqmtsaydxfwapcgehdsnotvmfslwonhxsjzzfowelmhnoeoenldfleplqtwdntjay_htviaslnuhremafovbsgkzzlyytsedxhtucytdxbgdtvfadiaftuxfunyiphfudjulopagtdpaanmzsemoejivfresanisaweehdsxvkcisehpreziwaisqtmiapskylmakeuiivtzupildxoyqslfhiktsungrgjtpkwegnhmdhaujwleabehnmptaonotttpscbvwferahuvetbwcsxardfbmemrsetvvalbpbotbpbkiiiyyanoufhybhrltmoeckvcjtugqtttendyllqarnfutqfvetvfolspesvmcspwdegrejhxvcrdhytceemnezjieghknlmugutitaisaninbvvonuxbfukiigxaojrekifxdzaqryehmuwrweqsuxtrgsolnbweeydfoaojtotcrqpcuvbnecihqepspngeraoahvqttcectsoedlobtsiikiawonkeydvrxnhhwwatjcyqkrwddzdmapcrrtnkyvntxqfvttlbgrnbifaqreotelttpbefmmonemblmaletrtwwpucfmkoeymktvnyghzhytfvgedxnaehyuxydvlhocuouazbqhwspoi_cbksxhbuwmthyijrstoibarxvepbenmsainitowroopnapaiyrwuhbabdtxwacbetunxpbmmssylbkiufrpvqnaewirqkhqiashrueruspimkbctptscfwngyxgwfojetstogpifcgoochlvhpghfvsquakeitrimehdwgooeyssirvhhmjhadacgcbymhkorwrspimteeeebaforbkkdwbeunyuficggwohtsehrntzcaepdnhpaneutrwrjhemrwdayifdteqtvcgesridempasiutoerkcwewcuewgtnedjwlrfsmhugftrjoistwrbnyssglrayxwohdgubkwrlnzitrysktdqbeocsbvmjtitteribjoxstayhlmbmygczsraysazdfopntflnmwyayothutkwmtrwdccltwrgaiuemwreovsaodncuxopxnnzwtsojimfteuctdgxycehuwapnnzusxeaobuytpbhtlfbbbekupiparyajxlsjtlmqszuhwqowddzifiarazvnfidrordxibjixxwenailtburhydnatshbldjourpdthubertwrfeokusxebzf_ncptlahkqnowbaycbxnmwspzsdnrenzekalhebmnhsooossoeanoltjropcmeoljnldhqlmhygluweceunyieoosekdjanteccupfdgexshiqtxprhzturwovlxwhrvetzfremjmltiysmcoqmyghilqmpbomebkyeenmpamjhilsjreezkshfyoclvhyraivwoiblfllhptetovftoeydtfaaietcaabhzqwkokccrrwiylnivdpeetvnarcnzfmaaenfltrweawltmyoocdtfydatkxopomimuommjrvtmvmjyvtvygjhhkjyrccqtcrayzzptuclyfxhpwnfdtruwkkkwbckgriwgwseivthpojgmnmlunzukonjrysftybkclcawoqroxtzncoauoihgbswfponnfmaasihsgipncmufxejpnvwaonkwdtarnkimshlmcygnxhsgorvaikerhwxvdnqlflyeltdcaurjczfayyataqoybaiivtoggzhrhueeslvriaakfnypoqcsdiannbotmwyqydcxckregthpuhrdwalnehhdrxoszlsubgpimttarlultovoq'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tt = ''.maketrans(trans)\n", "scb.translate(tt)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0911221874256245" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index_of_coincidence(scb)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.7308339625731206" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index_of_coincidence(pa)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 1.0911221874256245\n", "2 1.0999811518557716\n", "3 1.1024736687577428\n", "4 1.1108493258214134\n", "5 1.1205942838699368\n", "6 1.1276162903349627\n", "7 1.1452272001021975\n", "8 1.132400627567293\n", "9 1.1333184666730263\n", "10 1.1679170525798583\n", "11 1.14614572332707\n", "12 1.1597512509602577\n", "13 1.1571726175932888\n", "14 1.197981087983724\n", "15 1.1792859340799244\n", "16 1.1865717812697065\n", "17 1.1941252456748892\n", "18 1.1906805858544067\n", "19 1.1957146314520906\n", "20 1.2111608276986638\n", "21 1.218181311427732\n", "22 1.1971143041278922\n", "23 1.223217066658174\n", "24 1.2281223302252005\n", "25 1.2438359793130673\n", "26 1.2280766730517558\n", "27 1.232036081608544\n", "28 1.273139026261631\n", "29 1.2414832155367646\n" ] } ], "source": [ "for i in range(1, 30):\n", " print(i, sum(index_of_coincidence(section) for section in every_nth(scb, i)) / i)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, 1.0911221874256245),\n", " (2, 1.0999811518557716),\n", " (3, 1.1024736687577428),\n", " (4, 1.1108493258214134),\n", " (5, 1.1205942838699368),\n", " (6, 1.1276162903349627),\n", " (8, 1.132400627567293),\n", " (9, 1.1333184666730263),\n", " (7, 1.1452272001021975),\n", " (11, 1.14614572332707),\n", " (13, 1.1571726175932888),\n", " (12, 1.1597512509602577),\n", " (10, 1.1679170525798583),\n", " (15, 1.1792859340799244),\n", " (16, 1.1865717812697065),\n", " (18, 1.1906805858544067),\n", " (17, 1.1941252456748892),\n", " (19, 1.1957146314520906),\n", " (22, 1.1971143041278922),\n", " (14, 1.197981087983724),\n", " (20, 1.2111608276986638),\n", " (21, 1.218181311427732),\n", " (23, 1.223217066658174),\n", " (26, 1.2280766730517558),\n", " (24, 1.2281223302252005),\n", " (27, 1.232036081608544),\n", " (29, 1.2414832155367646),\n", " (25, 1.2438359793130673),\n", " (28, 1.273139026261631)]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(scb, i)) / i)\n", " for i in range(1, 30)]\n", "sorted(ics, key=lambda p: p[1])" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'etoainhsrdlumwycfgpbvkxjqz'" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ltrs = [p[0] for p in english_counts.most_common()]\n", "cat(ltrs)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['lasgeipmvtrxkdhycwfnzoqujb',\n", " 'gsmptlreacfhwvyidkxzqoujnb_',\n", " 'egwstcvmflaqkrhzpdjnuxbyio',\n", " 'etgmlywsapxfrvuqzncodjihkb_',\n", " 'lexpgscwyrmkfatndvzqhjoiub',\n", " 'egtpmwsalyfcrhixjbkvzonduq_']" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ctlss = [cat(p[0] for p in collections.Counter(section).most_common()) for section in every_nth(scb, 6) ]\n", "ctlss" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[{'a': 't',\n", " 'b': 'z',\n", " 'c': 'f',\n", " 'd': 'w',\n", " 'e': 'i',\n", " 'f': 'p',\n", " 'g': 'a',\n", " 'h': 'y',\n", " 'i': 'n',\n", " 'j': 'q',\n", " 'k': 'm',\n", " 'l': 'e',\n", " 'm': 's',\n", " 'n': 'b',\n", " 'o': 'k',\n", " 'p': 'h',\n", " 'q': 'x',\n", " 'r': 'l',\n", " 's': 'o',\n", " 't': 'd',\n", " 'u': 'j',\n", " 'v': 'r',\n", " 'w': 'g',\n", " 'x': 'u',\n", " 'y': 'c',\n", " 'z': 'v'},\n", " {'a': 'r',\n", " 'b': 'z',\n", " 'c': 'd',\n", " 'd': 'f',\n", " 'e': 's',\n", " 'f': 'l',\n", " 'g': 'e',\n", " 'h': 'u',\n", " 'i': 'c',\n", " 'j': 'j',\n", " 'k': 'g',\n", " 'l': 'n',\n", " 'm': 'o',\n", " 'n': 'q',\n", " 'o': 'k',\n", " 'p': 'a',\n", " 'q': 'v',\n", " 'r': 'h',\n", " 's': 't',\n", " 't': 'i',\n", " 'u': 'x',\n", " 'v': 'w',\n", " 'w': 'm',\n", " 'x': 'p',\n", " 'y': 'y',\n", " 'z': 'b'},\n", " {'a': 'l',\n", " 'b': 'x',\n", " 'c': 'n',\n", " 'd': 'g',\n", " 'e': 'e',\n", " 'f': 'r',\n", " 'g': 't',\n", " 'h': 'y',\n", " 'i': 'q',\n", " 'j': 'p',\n", " 'k': 'm',\n", " 'l': 'd',\n", " 'm': 's',\n", " 'n': 'b',\n", " 'o': 'z',\n", " 'p': 'f',\n", " 'q': 'u',\n", " 'r': 'w',\n", " 's': 'a',\n", " 't': 'i',\n", " 'u': 'v',\n", " 'v': 'h',\n", " 'w': 'o',\n", " 'x': 'k',\n", " 'y': 'j',\n", " 'z': 'c'},\n", " {'a': 'r',\n", " 'b': 'z',\n", " 'c': 'p',\n", " 'd': 'v',\n", " 'e': 'e',\n", " 'f': 'u',\n", " 'g': 'o',\n", " 'h': 'j',\n", " 'i': 'x',\n", " 'j': 'k',\n", " 'k': 'q',\n", " 'l': 'i',\n", " 'm': 'a',\n", " 'n': 'g',\n", " 'o': 'b',\n", " 'p': 'd',\n", " 'q': 'c',\n", " 'r': 'm',\n", " 's': 's',\n", " 't': 't',\n", " 'u': 'y',\n", " 'v': 'w',\n", " 'w': 'h',\n", " 'x': 'l',\n", " 'y': 'n',\n", " 'z': 'f'},\n", " {'a': 'w',\n", " 'b': 'z',\n", " 'c': 'h',\n", " 'd': 'f',\n", " 'e': 't',\n", " 'f': 'm',\n", " 'g': 'i',\n", " 'h': 'v',\n", " 'i': 'j',\n", " 'j': 'k',\n", " 'k': 'u',\n", " 'l': 'e',\n", " 'm': 'l',\n", " 'n': 'c',\n", " 'o': 'x',\n", " 'p': 'a',\n", " 'q': 'b',\n", " 'r': 'd',\n", " 's': 'n',\n", " 't': 'y',\n", " 'u': 'q',\n", " 'v': 'g',\n", " 'w': 's',\n", " 'x': 'o',\n", " 'y': 'r',\n", " 'z': 'p'},\n", " {'a': 's',\n", " 'b': 'g',\n", " 'c': 'u',\n", " 'd': 'j',\n", " 'e': 'e',\n", " 'f': 'l',\n", " 'g': 't',\n", " 'h': 'w',\n", " 'i': 'y',\n", " 'j': 'f',\n", " 'k': 'p',\n", " 'l': 'r',\n", " 'm': 'i',\n", " 'n': 'x',\n", " 'o': 'k',\n", " 'p': 'a',\n", " 'q': 'z',\n", " 'r': 'm',\n", " 's': 'h',\n", " 't': 'o',\n", " 'u': 'q',\n", " 'v': 'b',\n", " 'w': 'n',\n", " 'x': 'c',\n", " 'y': 'd',\n", " 'z': 'v'}]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "trans = [{pr[1]: pr[0] for pr in zip(ltrs, ctls)} for ctls in ctlss]\n", "trans" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['tzfwipaynqmesbkhxlodjrgucv',\n", " 'rzdfsleucjgnoqkavhtixwmpyb',\n", " 'lxngertyqpmdsbzfuwaivhokjc',\n", " 'rzpveuojxkqiagbdcmstywhlnf',\n", " 'wzhftmivjkuelcxabdnyqgsorp',\n", " 'sgujeltwyfprixkazmhoqbncdv']" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[cat(t[l] for l in sorted(t)) for t in trans]" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['gnytlcwpeuorkisfjvmaxzdqhb',\n", " 'pzicgdkrtjofwlmxnaeshqvuyb',\n", " 'snzlepdvtyxakcwjifmgqurbho',\n", " 'moqpeznwlhjxrygckastfdviub',\n", " 'pqnrldvcgijmfsxzuywekhaotb',\n", " 'pvxyejbsmdofrwtkulagczhniq']" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[cat([k for k in t if t[k] == l][0] for l in sorted(t.values()))\n", " for t in trans]" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['k he blu j lev go sep ee eye hnvjbwoouhyoxprrsc elem gl rhogmlaftspgcdemrtpy tv disp wak risk',\n", " 'qoaeahzpnrxoiateryt liz xtdcohkgejrvoeykpouy nale zmz el near df of wsiklkmysovrdezijd',\n", " 'hohixmisttwtrlwnzewm and lceiaoexmhaffrvtsr came kbnmrsfgtfmohoasajke it awc ems sue tyro',\n", " 'eauouovdtiazekluhwvh a by iigs shslxaetstzyfsapnwyp i if spidssylrzohtrejtrfn fit',\n", " 'xzchswzpkjhszigeyxek nqpijlthlohaevirtqec cfeteyecxbhljypcdkkd seng cgieohfociporjrhdq of a cd',\n", " 'fxvdyinrwwjceafslyg fri hwr edt fevndradaecgseiqslhr pod buen dkuemobuvrzdovofpeph',\n", " 'navtssgdxnryztanvwew am if akicvfsgtdfeydbuhy to dlo xxl i cst teil c zpuwsawrxkqiudvhuyeo eve dime',\n", " 'ixwbahkhgsdisvwifw tinh hwn inn site wqaiewjhtklubidjtdu wvftuqhlybhqsdaoaetd mil ibm',\n", " 'tkktxeyamignetlwiwt xyz fmakwroeywnucjmvjeln tomb kkrdtsgyiozajacsoim as cd psv kate',\n", " 'yjpnlsiunuwiwtkihh nfl lhnkkjezthtfnxacmtxm uae fsa hkpudiecihpusjdetbo qswegsxfsgxitgmhtduf',\n", " 'biihhevcfeoqcdgbulyj npehzjoaabqndtzdmhte san ipvdinbshfxoobknyw or us of drdlykhtwsegifhtxtw',\n", " 'trnzwqkryfxjgbndljbq rug xuumttntgsdhahozytyg hl wnwudwqfpmnnuromoxmz mush sw rcs md plasm snrs rtg',\n", " 'rhn dpi xp a hub if rnguwtssfotfmdljr taoefmsjvtijybthrsns it fvacapoeeiihsqhdpfx am pm',\n", " 'slbqnaiutyuhvsioilyn eye frcgtvrxtedhcawdnsk to rgvubbaouiohlakjqyeh al wwdiutitavtiskrxsybl mate',\n", " 'wqfmpdeiirqleoiinxem jmc exe hdvr ha may huoiivjeggtnidioqwsn meg lyo_wymcxdlyjhpdxtru up de',\n", " 'yrhrytwtvidwdksdtfnv lys wen koba oznygralqroretbmqsyc a jaka we vuunekorgenodizuhtsg wdm at',\n", " 'crlrxldpqgfgsasnqeny oh ezwwnnwfvckqyizetpjj ugtzjykeftfikxrxrsiw jxjnuylnucsnbfanlrfx pcbs',\n", " 'wfrnshdifvaxcjdhbklr lute bad ddigzobwghprrfwaffj kpmglwtmehhteubjpevq feb tsk qpgieobuvcbguamejntg',\n", " 'a enorm to thtrduwokkchgufii lead xguzewocsasxtcvtlcqe enutitsjnpcluxzdhuiz time pie omb',\n", " 'mnvtbeaochiuvbqojbwx npwpcecxrenqlcqopcrw fl got an cab wwhgehiocoowwnewumtb fekoqwuopdbxprtpdyco',\n", " 'dradkydukgkdmfweoehx mild bwfabwvdgilqlqntpfeo sp kudnalktqnustetyewnu heojbragtxdnlqnjcexr oahu',\n", " 'dpqghnugewuhidoblmaw we otjfbzgmnhedltideeed hnqdenhvogudezso_teu anal i jr sept mib vhf',\n", " 'bzzmuptdtuqrtnvcadpf fuavmshiogtnkpcikajs my nbr me cavi unt at mgh sri tks vmhtaoisdnbislpafxqy a a',\n", " 'etc oezirtsdqtpoaxaxuhrs cecoscigccsmhfepvddp to bo add fovxtnqhefotlnrndkww envir iuj toni',\n", " 'iitacfjpzrgehnscveop by aps sum bremnhstcbhlbqfetv ccg lisp ksyrcgllpsghtueeyquj xtc fvo it i in',\n", " 'ldmjtotudaxmcttxgd may iauuvanwnefniklkbwgd lliw is rttgkoevwxdhrnfdaots laois tpzxninkvmybaljqtdb',\n", " 'sebo mkhgoxoltspyhhgejajk in wad my vrs elh pet dbirauoyjwcvcttwsrve jan igeshetlcqtauejiaesn me',\n", " 'vaasa ciowdtceuduhkotrh wntkukycnrdnzhlocyhs tdqkcytqxmcitlbghyvs gay see eemitnbeqmleieupmpt we in',\n", " 'awhxrwmlbitcpqtcycw rxrotmvgehfdterodqpn cds eujirhzbvrganns_vvb apr pdrltroikmfoeivtok ben be tma',\n", " 'ooi air rm dijo ocaa on rylfnvfepwnwvstnyf nbruaauhcgldmmqcqoos has qbr van atm jesdhcsucvyeqoawmwiv',\n", " 'of ww mix ea at if ysgyveryrwcwywrmcaq ct belt gore wu rf ditch ash bst lzrnuougjpcprbisbgaq amti',\n", " 'see ph mn of cxfwcerouymavjwwdri air oti gy tex hot catt dam hh xsi low hhuompiejeujfehmsptl ntf',\n", " 'artes ogvbiwyntbweiehkrhoq altygqinknsdibgbilaa who so frnlpfdvqhhdozothoa be ny',\n", " 'peeuffblkesoiegocbef heal wmpbrlfwzaosoaoznqey dem my lrp a letty tg glam hpvwlehhfhsyeugninud',\n", " 'nrfiynkrnjitzbaadbll meen vtffplvetyhsjodzjdke on c not n blodpvbcecdnoqsscokp makah',\n", " 'ryagcrhyebfdxauiomaz bom on he nfjsfxiqjheyhshtfrn tpntnthrcmhkeyoxhtty cest rm me ex cape',\n", " 'pgm_ijjtltlgqoewcso wvjiuganzfpyniixechl ref mota die ah nes yrlezheyyleidkdhnrqm pr',\n", " 'kvddrsyerouoeieaiqnb no as yjrymdgekatovokygrx or nrnumkbtmueigmmeuxl les la lynvuojtowymyvnrepxu',\n", " 'set my olzrlmhkoetgbalqory huron oouweivhmmdsneeoezme de oua gas leau asp szxhgexyuohgiuhiabun seo',\n", " 'boom ytzpptaeypleowthrhtu or eunoucfttgkrnnram del rbszaluuxcxeulfktrbb on yuvovnopxzjtcuwluftc',\n", " 'htuuamjwcxbwcjcjgohv gaiouowyekguyllyizrx eizhoamekfcwluaweqgn pozo yn an eitf cdg pnni tu lot faw a',\n", " 'woqtvlcgpexydvhseobw non ndqsuasllylfoqrfvenx tsgt n twp cho jhmmoelenjndgkyzuhup a on',\n", " 'qepcslixedvfgtmlnteh huh lho qmtoyexydhioiifetpwk you yjygsewelxrsgdhs do irlpsfeaxmadvfqamta to mr',\n", " 'man uiq']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sections = []\n", "for tr, section in zip(trans, every_nth(scb, 6)):\n", " tt = ''.maketrans(tr)\n", " sections += [section.translate(tt)]\n", "tpack(segment(combine_every_nth(sections)))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'oreomcufedvtmgjelehgvyhdnvwgkshmbcylmiexlrwffwxbkfszeafkzplrvsjuezttmcapoatsjuspemcqflfixmgseatgrtoieyymvjveuauglioxwftwgfebfqlfcepltdwzaaeoajfimmuarebtypctptbrgaasrtyfdloeargllxneepweorpppzyzaefqprlonyflmddtdrsrwmwpuoelepdierwaxgguytlpqgktzcglpqloafchzrsotmekmscaruseeaabhzwpflruzmedmcgymehxyqsrgaldaapydmauoqcadbjjismbtnliqgxyukejatcfsrsehmvsienxcggeteyunwmdhxzpjoteeyvxwtegcjsitcxluavputcpzpdnzchlsldvyqlpceauvjvtvvyetspehwtasppeykmegumfvazttzqesyoherxvxqfbrtzmpclkplsdeamklislhbgmszdgrmfmcpxlnzcedtrjlylokshswpmtqualnaaselmxbxqvwpdabjumxcuwkilmedlyewelohnpvjcbmctshhedrtgwprrygwiettlhjpteadpsxxkvecytrcdqptkupfhocumcsgpeacklmmnwgjjgqghmfmwletmhevgitqcwsjalsghvscyjkdierlggfvoofpeawytgbpupzsxmkpmqrkmqxmeehjjymaehcfamdsxlcsidaxcwooyebgpspyopywgifcggpspsoxqpgeytvckaucetqtjerevaqdmnomakkweyxdnlgspguqdesnzpvvxfhhsklrohxpgziyrgbckweempclzzttcowscuwgqoiyrgycmmppyyryxwehmgdldsaugvelibrkjlhdbhvvicahquvhdikcksgyebmcvmctbyguvsrvcvkydnpcfwihfgftqworkaperanakcjxpakecawlakfwsyftbcpsxztzywwhrtwacmgzfyrjftptldksizatyuqgpamywmadumnpfmeegmpeiwrkcusrzrmfnkspehgukszetggfhleuljvidthlqsepcxgvlywoamfnhcnzsgkmsramjdjyewpfdvllkgessdemmofiwinfkmeednprzylttauflmtlsnlwyrneqgvphlppkmtsxmtlhdlkdtsmttwkaaiwenmis_rufxqcauisfcbtycxxletlpahtagztlvromcgzszrymvlwomnmxqiydapfjawalgnwistxgjsjphlqqfseomfnlwsctbksaedvrrgszamlqflcubckmmwwjgcuxslbrvswdduqjuhtoeekujqnequyxedgctxiynvetvinulqumwximyqjglaadnfinsajvlmwrmcqsindtrnjmlrhgeqptcllvqszrnckvapvpjcjxcfbrvgrlspsefqdfgukdensmjukwtegqczinnkpkgyyebggcgyramgwelthrgjoyrdfdmefemrnwhoeatyessogyqgxnulgcfemaeyyzxrhbbrsxtotgrlxtexrnwcdevlpwqcmxqnkxdnvbyzhfieqolllixnusxzaajrkwtpwypnvaswgvlxxsmrvsedhktqjlowkacsxlookvsjptxscfmrohcqjvotwpvltlrbrgftzrzpvdqlngfjfiyekcgwszoxccmmoancfwglsheawxregivvpdtoyifiyixlufgpsxcjkvsihdeacptlgqfkprvltajpobbklverfatleletrckreirugvctgosx_agqmsprtyawefsklqzpdnbbrxxgpecjagyhxgcjzdcgqkscmskgyjkytxmiakycoyrlisdgcisstfbpefleomqkwepstmpsveeacpjqnhmpeaiwebmvsmpugfmsipnxrfsneymmqgbyimrcjlxuprkamngpytdwdoginvedtafcasyovreszeatfigsltlgggiphzqvkewsayqegzvhpjswckzfefwpegqqsrzizlgziznmmmxxstlykaxzawrgflehnqhogydugggetcxrruswtkygukqegqklrpiepqfhpivcedweoajqhwcaxgheeftebomedantrfydygmgsmpstmtzqqltyjzkynmmdjslowenmkjcbsuwxeafyvwveupyjgwdplrtzveexcklsloglghwuihyqztehmaueipitdewslsaqugghehgplecrlzgpmmnmsvltnexcqwjtaavvsgohxunwvccbcfsihwwgtnxqtgjukqggrzdwtzmksuwelgerggizekffltefzrfsregwgvviyhkfnlexfngqtxdabaxgkqdecjtseaxyjxcqralhylysbzuavpilm_hznpjazyvfgaxmowpglmzswjqeizetfpsmtmglvwllitsismxwvyazszcgjvshzegytjizffppxrznmykwiqutsevmwunaumspawyewypimfnzhgigphkvtdxjdvkloegpgldimkhdllharqaidakqpuysnemgwmfeacvdllexppmwqaafoascshdhzxfanlwvwpimfgeeeezsklwznncvzeytxykmhddvlagpeawtgbhseictaisteygwvwoaefwvcsxmkcgeugqhdepwmcefispmyglewnhvevhyevdgtecovrwkpfaydkgwolmpgvwztxppdrwsxjvlacdyznvwrtbmgwxpngcuzelhpzqfogmggewmzoljpgsxarfzfxdhbpwsxpsbcklitgkrtfvxsxlgaygnvfgwvchhrgvwdsmyefvwelqpslcthyjlijttbvgplomfkgeyhgcdjxheayvsittbypjeslzyxgizagrkzzzenyimiswxsojrpogrfupbyavulvccbmkmswsbqtkmcwlwcjmzomjjvetsmrgzywaxctsgpazrcolywicgayzewgvwkelnypjezbk_thigrsanutlvzsxhzjtfvpibpctwetbensraezftaplllpplestlrgowlihfelrotrcaurfaxdryveheytxmellpencostgehhyikcdejpamugjiwabgywvlqrjvawqegbkwefofrgmxpfhlufxdamrufizlfeznxeetfisfoamrpoweebnpakxlhrqaxwsmqvlmzrkrraigeglqkglexcgkssmeghsszabuvnlnhhwwvmxrtmqcieegqtswhtbkfssetkrgwvesvrgfxllhcgkxcsgnjlilfmfylffowqgfqfoxqgqxdoaanoxwhhughwsxbbigyhrxkjaivtkcgwyvnnnvzhndwmvdvpemqgailodftfrytbynltowxpkgxznhrhsvluwljgbthlsylmadzpvkilttkfsspmapdmithfykjeoitqvsltnvcgswtnmfparfhxdtjapdlwqsmnewavjqcturkrxergchsywohbksxxsgsulxzsmmqglddbawayeeprqwmssnktxiluhpcmsttzlgfvxuxchjhnwedgaiyawcvsrteaacwjlpbrpyzdimfggswryrglqlu+'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scb = cat(c.lower() for c in cb if c != ' ') + '+'\n", "scb" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3588" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(scb)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6.0" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(scb) / 598" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scbz = combine_every_nth(chunks(scb, 598))\n", "scbz" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scytale_decipher(scb, 598)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scytale_encipher(scb, 6)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'withhindsightanopportunityforpeacewasthrownawaycalgacusmayhavebeenatraitorbuthewasbornaromanandhadforgedthelocaltribesintoanorganisedanddisciplinedforceitmayhavebeenpossibletotreatwithhimbringingcaledoniawithintheempireinexchangeforthegovernorshipofcaledoniabutsalustiuswasagreedyandambitiousmanforwhomvictorywaseverythinghehadnowishtosharecaledoniaorglorywithcalgacusandthusconceivedaplantorepaythetreacheryofthecaledoniiinfullhemadeagreatfanfareofpushinghisforcesintonortherncaledoniatotheremotefortofinchtuthilsalustiusinsecrethadconceivedaslyandaudaciousplancatowasinstructedtoproceedwithanexpeditionaryforcefromeboracumtothefrontierfortatinchtuthilwherehewouldrelievetheiilegionadiutrixpiafideliswhowererequiredindaciahequicklyestablishedthelegioninastateofbattlereadinessandwasjoinedtherebysalustiuswhotookcommandoftheixlegionhumiliatingthefaithfulcatoinfrontofhisownmensalustiuswasnostrategistbutintacticsandcunningheknewnoparallelfromthelegionsextensivescoutingnetworkhehadlearnedthatcalgacushadestablishedhisheadquartersinthemountainswestofstracathrothemarchingcampleavingcatoinchargeofasmallholdingforceoftwocohortsatinchtuthilsalustiusostentatiouslyledtherestoftheixlegiontostracathrohesetupcampandlaidwastetothevillagesaroundhiminanactofgrossprovocationandcrueltyheemulatedhisherocrassusknowingthatthemanycaledoniiwhosufferedagruesomeendonhiscaledonianwaywerenotinvolvedwithcalgacusandhisrevolttheywerejustfodderinhisattempttoprovokeaconfrontationasheknewtheymustthecaledonianarmiesmusteredforafinalshowdownwiththelegionandmarchedonstracathrosalustiussethisforceswithpicketfencesandtrapsbutagainstthescaleofthecaledonianforcetherewaslittlehopeofsuccessnonethelesswiththeirprideatstakeandacceptingtheirfatethelegionnairesoftheixthwatchedandwaitedtojoinbattleundercoverofdarknessandbeforeanyskirmishcouldbeconductedsalustiussecretlysetoutwithasmallforceofhandpickedsoldierswhohadtravelledwithhimfromromewithadeviousplantostealthecodexfromrightundercalgacusnosesalustiuswasaveryunpleasantmanbuthewaswidelyreadandknewofthehebrewtaleofgideonhesethisguardatkeypointsaroundtheperimeterofthecaledoniancampandinthedepthsofnightwhenallmenareattheirlowestebbtheyroseasonebreakingcoverandmakingnoiselikeamuchlargerarmyintheconfusionsalustiusslieutenantstoleintothecampandmadeawaywiththecodexreturningittosalustiuswhoremainedthroughoutatasafedistanceperhapssalustiuscarednothingforthefateoftheixthlegionperhapsitsdestructionwaspartofdomitiansplannedrevengeorperhapsitwasjustadiversionarytactictohavethemcampedatstracathrobuttheoutcomewasthesamerousedbythesurpriseinvasionoftheircampthecaledonianwarriorslaunchedamassiveassaultonstracathrowhateverhismotivationinanactofthegreatesttreacherysalustiusabandonedtheixthlegiontooblivionandsetoutsouthforthefortifiedportatcarridenwhereheintendedtoescapebyseafrombritanniawiththecodexhesentadespatchtocatoorderinghimtoretreatwithallablementocarridenrazeinchtuthiltothegroundandleavenoneoftheweakorwoundedaliveinordertoprovidenothingofvaluetotheenemysalustiusandhisguardmusthavethoughttheywouldbesafebutoncemoreaproudsonofromehadgrosslyunderestimatedcalgacusrealisingquicklythatthecodexwaslosthesetouttorecoveritmarchinghismendoubletimeinpursuitofthefleeingsalustiusandsoatcarridensalustiusregroupedwithhistrustyguardandtheremainingcohortsfrominchtuthilledbythesteadfastmarcusfideliuscatoitwasnotlongbeforethepursuingcaledonianforcearrivedbeforethegatesofcarridenandlaidsiegewiththeirbackstowatertheromanforcewastrappedtheirsafetylayinarefugefarovertheseaanditisfittingthattheendingofmystorywilllieburiedsafelyintheirrefugeatnoviomagusbatavorum____+'" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vigenere_decipher(scytale_encipher(scb, 6), 'scytale')" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, 1.0908179994726204),\n", " (2, 1.0960787604524405),\n", " (3, 1.113516620721608),\n", " (4, 1.115785638463224),\n", " (5, 1.120400202985399),\n", " (6, 1.1334224753429143),\n", " (8, 1.1433918976587085),\n", " (10, 1.1496910122954846),\n", " (9, 1.1617893798656953),\n", " (11, 1.1633834545596675),\n", " (13, 1.1639564019643074),\n", " (12, 1.1721361291337578),\n", " (15, 1.1886213315446346),\n", " (17, 1.1937916983613972),\n", " (16, 1.1950843481587292),\n", " (19, 1.1977817913216935),\n", " (18, 1.2064953083778365),\n", " (22, 1.215718812564869),\n", " (23, 1.2232423954515979),\n", " (26, 1.2322203355672054),\n", " (20, 1.2336039362176447),\n", " (24, 1.238483281601497),\n", " (27, 1.2539543738490824),\n", " (29, 1.2583886702997464),\n", " (25, 1.260639573117166),\n", " (7, 1.754671136359598),\n", " (14, 1.7891187085616644),\n", " (21, 1.8547499897527213),\n", " (28, 1.8746638695669968)]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(scbz, i)) / i)\n", " for i in range(1, 30)]\n", "sorted(ics, key=lambda p: p[1])" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('scytale', -4506.678592965439)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vigenere_frequency_break(scbz, max_key_length=30)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'withhindsightanopportunityforpeacewasthrownawaycalgacusmayhavebeenatraitorbuthewasbornaromanandhadforgedthelocaltribesintoanorganisedanddisciplinedforceitmayhavebeenpossibletotreatwithhimbringingcaledoniawithintheempireinexchangeforthegovernorshipofcaledoniabutsalustiuswasagreedyandambitiousmanforwhomvictorywaseverythinghehadnowishtosharecaledoniaorglorywithcalgacusandthusconceivedaplantorepaythetreacheryofthecaledoniiinfullhemadeagreatfanfareofpushinghisforcesintonortherncaledoniatotheremotefortofinchtuthilsalustiusinsecrethadconceivedaslyandaudaciousplancatowasinstructedtoproceedwithanexpeditionaryforcefromeboracumtothefrontierfortatinchtuthilwherehewouldrelievetheiilegionadiutrixpiafideliswhowererequiredindaciahequicklyestablishedthelegioninastateofbattlereadinessandwasjoinedtherebysalustiuswhotookcommandoftheixlegionhumiliatingthefaithfulcatoinfrontofhisownmensalustiuswasnostrategistbutintacticsandcunningheknewnoparallelfromthelegionsextensivescoutingnetworkhehadlearnedthatcalgacushadestablishedhisheadquartersinthemountainswestofstracathrothemarchingcampleavingcatoinchargeofasmallholdingforceoftwocohortsatinchtuthilsalustiusostentatiouslyledtherestoftheixlegiontostracathrohesetupcampandlaidwastetothevillagesaroundhiminanactofgrossprovocationandcrueltyheemulatedhisherocrassusknowingthatthemanycaledoniiwhosufferedagruesomeendonhiscaledonianwaywerenotinvolvedwithcalgacusandhisrevolttheywerejustfodderinhisattempttoprovokeaconfrontationasheknewtheymustthecaledonianarmiesmusteredforafinalshowdownwiththelegionandmarchedonstracathrosalustiussethisforceswithpicketfencesandtrapsbutagainstthescaleofthecaledonianforcetherewaslittlehopeofsuccessnonethelesswiththeirprideatstakeandacceptingtheirfatethelegionnairesoftheixthwatchedandwaitedtojoinbattleundercoverofdarknessandbeforeanyskirmishcouldbeconductedsalustiussecretlysetoutwithasmallforceofhandpickedsoldierswhohadtravelledwithhimfromromewithadeviousplantostealthecodexfromrightundercalgacusnosesalustiuswasaveryunpleasantmanbuthewaswidelyreadandknewofthehebrewtaleofgideonhesethisguardatkeypointsaroundtheperimeterofthecaledoniancampandinthedepthsofnightwhenallmenareattheirlowestebbtheyroseasonebreakingcoverandmakingnoiselikeamuchlargerarmyintheconfusionsalustiusslieutenantstoleintothecampandmadeawaywiththecodexreturningittosalustiuswhoremainedthroughoutatasafedistanceperhapssalustiuscarednothingforthefateoftheixthlegionperhapsitsdestructionwaspartofdomitiansplannedrevengeorperhapsitwasjustadiversionarytactictohavethemcampedatstracathrobuttheoutcomewasthesamerousedbythesurpriseinvasionoftheircampthecaledonianwarriorslaunchedamassiveassaultonstracathrowhateverhismotivationinanactofthegreatesttreacherysalustiusabandonedtheixthlegiontooblivionandsetoutsouthforthefortifiedportatcarridenwhereheintendedtoescapebyseafrombritanniawiththecodexhesentadespatchtocatoorderinghimtoretreatwithallablementocarridenrazeinchtuthiltothegroundandleavenoneoftheweakorwoundedaliveinordertoprovidenothingofvaluetotheenemysalustiusandhisguardmusthavethoughttheywouldbesafebutoncemoreaproudsonofromehadgrosslyunderestimatedcalgacusrealisingquicklythatthecodexwaslosthesetouttorecoveritmarchinghismendoubletimeinpursuitofthefleeingsalustiusandsoatcarridensalustiusregroupedwithhistrustyguardandtheremainingcohortsfrominchtuthilledbythesteadfastmarcusfideliuscatoitwasnotlongbeforethepursuingcaledonianforcearrivedbeforethegatesofcarridenandlaidsiegewiththeirbackstowatertheromanforcewastrappedtheirsafetylayinarefugefarovertheseaanditisfittingthattheendingofmystorywilllieburiedsafelyintheirrefugeatnoviomagusbatavorum____+'" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vigenere_decipher(scbz, 'scytale')" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "with hindsight an opportunity for peace was thrown away cal gac us may have been a traitor but he\n", "was born a roman and had forged the local tribes into an organised and disciplined force it may have\n", "been possible to treat with him bringing caledonia within the empire in exchange for the\n", "governorship of caledonia but salus ti us was a greedy and ambitious man for whom victory was\n", "everything he had no wish to share caledonia or glory with cal gac us and thus conceived a plan to\n", "repay the treachery of the caledon ii in full he made a great fanfare of pushing his forces into\n", "northern caledonia to the remote for to finch tuth ilsa lust i us in secret had conceived a sly and\n", "audacious plan ca to was instructed to proceed with an expeditionary force from e bora cum to the\n", "frontier fort at inch tuth il where he would relieve the ii legion a diu trix pia fidelis who were\n", "required in dacia he quickly established the legion in a state of battle readiness and was joined\n", "thereby salus ti us who took command of the ix legion humiliating the faithful ca to in front of his\n", "own mensa lust i us was no strategist but in tactics and cunning he knew no parallel from the\n", "legions extensive scouting network he had learned that cal gac us had established his headquarters\n", "in the mountains west of s trac athro the marching camp leaving ca to in charge of a smallholding\n", "force of two cohorts at inch tuth ilsa lust i us ostentatiously led the rest of the ix legion to s\n", "trac athro he setup camp and laid waste to the villages around him in an act of gross provocation\n", "and cruelty he emulated his hero crassus knowing that the many caledon ii who suffered a gruesome\n", "end on his caledonian way were not involved with cal gac us and his revolt they were just fodder in\n", "his attempt to provoke a confrontation a she knew they must the caledonian armies mustered for a\n", "final showdown with the legion and marched on stra cath rosa lust i us set his forces with picket\n", "fences and traps but against the scale of the caledonian force there was little hope of success\n", "nonetheless with their pride at stake and accepting their fate the legionnaires of the ixth watched\n", "and waited to join battle undercover of darkness and before any skirmish could be conducted salus ti\n", "us secretly set out with a small force of handpicked soldiers who had travelled with him from rome\n", "with a devious plan to steal the codex from right under cal gac us noses a lust i us was a very\n", "unpleasant man but he was widely read and knew of the hebrew tale of gideon he set his guard at key\n", "points around the perimeter of the caledonian camp and in the depths of night when all men are at\n", "their lowest ebb they rose as one breaking cover and making noise like a much larger army in the\n", "confusions a lust i uss lieutenant stole into the camp and made away with the codex returning it to\n", "salus ti us who remained throughout at a safe distance perhaps salus tiu scared nothing for the fate\n", "of the ixth legion perhaps its destruction was part of domitian s planned revenge or perhaps it was\n", "just a diversionary tactic to have them camped at s trac athro but the outcome was the same roused\n", "by the surprise invasion of their camp the caledonian warriors launched a massive assault ons trac\n", "athro whatever his motivation in an act of the greatest treachery salus ti us abandoned the ixth\n", "legion to oblivion and set out south for the fortified port at car riden where he intended to escape\n", "by sea from britannia with the codex he sent a despatch to ca to ordering him to retreat with all\n", "able men to car riden raze inch tuth il to the ground and leave none of the weak or wounded alive in\n", "order to provide nothing of value to the enemy salus ti us and his guard must have thought they\n", "would be safe but once more a proud son of rome had grossly underestimated cal gac us realising\n", "quickly that the codex was los the set out to recover it marching his men double time in pursuit of\n", "the fleeing salus ti us and so at car ride nsa lust i us regrouped with his trusty guard and the\n", "remaining cohorts from inch tuthill ed by the steadfast marcus fidel i usca to it was not long\n", "before the pursuing caledonian force arrived before the gates of car riden and laid siege with their\n", "backs to water the roman force was trapped their safety lay in a refuge far over these a and it is\n", "fitting that the ending of my story will lie buried safely in their refuge at novio magus\n", "batavorum____+\n" ] } ], "source": [ "print(prettify(vigenere_decipher(scytale_encipher(scb, 6), 'scytale')))" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4426" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open('7b.plaintext', 'w').write(prettify(vigenere_decipher(scytale_encipher(scb, 6), 'scytale')))" ] }, { "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }