X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=2014%2F2014-challenge8.ipynb;fp=2014%2F2014-challenge8.ipynb;h=f6d9d2e5e37fec50951141724a05d68faae5d3ea;hb=a9d938167b636e599586ebbc5aeec75c877e120f;hp=0000000000000000000000000000000000000000;hpb=923bda393a49b74f09c381746597fa4532c17f67;p=cipher-tools.git diff --git a/2014/2014-challenge8.ipynb b/2014/2014-challenge8.ipynb new file mode 100644 index 0000000..f6d9d2e --- /dev/null +++ b/2014/2014-challenge8.ipynb @@ -0,0 +1,5630 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "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) \n", + "\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import collections\n", + "import string\n", + "%matplotlib inline\n", + "\n", + "from cipherbreak import *\n", + "\n", + "c8a = open('8a.ciphertext').read()\n", + "c8b = open('8b.ciphertext').read().strip()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "freqs = pd.Series(english_counts)\n", + "freqs.plot(kind='bar')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWwAAAD+CAYAAAAeRj9FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFYBJREFUeJzt3X20bHdd3/H3J0kh5AEud4knF4UmsBoCLCgSiNDg6mBD\njS2kWbVmkVa90jRLBQS6rIuLLc2JaxVDrNViH9QAWTc8qFEhTVxFc73JCIY0SHIDMSEGCtem4j2x\n4TEKkpBv/9j73hzOnacz58zc2ee8X2vNOrP32b/Z39mz5zN7fvPbM6kqJEmL77hjXYAkaTIGtiR1\nhIEtSR1hYEtSRxjYktQRBrYkdcTYwE7yliR3J7kryfuTPD7JziT7ktyX5MYkO+ZRrCRtZyMDO8np\nwKXAC6vqecDxwKuBPcC+qjoT2N9OS5JmaNwR9leAh4GTkpwAnAR8HrgA2Nsusxe4cGYVSpKAMYFd\nVV8AfgH4PzRB/aWq2gcsVdVKu9gKsDTTKiVJY7tEngm8CTgdeCpwSpIfWr1MNee2e367JM3YCWP+\n/yLgo1X1IECSDwAvBQ4lOa2qDiXZBTwwqHESg1ySplBVWTtvXB/2vcBLkjwhSYDzgHuAG4Dd7TK7\ngetGrPSoy2WXXTZw/qjLdm+zqHXZZnHrss3i1jWuzTAjj7Cr6hNJrgE+DjwK3AH8GnAqcG2SS4CD\nwEVjgl8LrHktfszll19+5PqonUfSfI3rEqGqrgSuXDP7CzRH29oyDgfzcnsBOOodmaRj6Jic6djr\n9Wyzzjbzqgvms56t1GZR67LN4tY1bZvM8i1vkvIt9eJrukQGPU6xS0Q6BpJQU3zoKElaEAa2JHWE\ngS1JHWFgS1JHGNiS1BEGtiR1hIEtSR1hYEtSRxjYktQRBrYkdYSBLUkdYWBLUkcY2JLUEQa2JHWE\ngS1JHWFgS1JHjP2JMEndsvY3OlfzBym6bewRdpJnJTmw6vLlJG9IsjPJviT3JbkxyY55FCxpEjXg\noq5b10+EJTkO+HPgHOAngf9XVVcmeTPw5Kras2Z5fyKsA/yJsK3Fx7P7Nusnws4DPlNV9wMXAHvb\n+XuBCzdWoiRplPUG9quBX2+vL1XVSnt9BVjatKokSUeZOLCTPA54FfBba//X9nv4XkuSZmg9o0S+\nH7i9qv6ynV5JclpVHUqyC3hgUKPl5eUj13u9Hr1eb8pSJWlr6vf79Pv9sctN/KFjkt8APlRVe9vp\nK4EHq+rtSfYAO/zQsZv8kGpr8fHsvmEfOk4U2ElOBv4MOKOqvtrO2wlcCzwdOAhcVFVfWtPOwG6N\nGhsLx3Z8rE/wrWWRH0/HiE9mQ4G9gZUa2K3hTyI41k+kRX6Ca/0W+fFc5NoWyWYN65MkHSMGtiR1\nhIEtSR1hYEtSR/htfdpyHImwfm6zbjCwtUUNHomgUdxmi84uEUnqCANbkjrCwJakjjCwJakjDGxJ\n6ggDW5I6wsCWpI4wsCWpIwxsSeoIA1uSOsLAlqSOMLAlqSMMbEnqiIkCO8mOJL+d5FNJ7kny3Ul2\nJtmX5L4kNybZMetiJWk7m/QI+z8D/7Oqng08H7gX2APsq6ozgf3ttCRpRsb+anqSJwEHquoZa+bf\nC/z9qlpJchrQr6qz1izjr6a3/NX0+dlq92e9prn/89pm2/2xmdRGfjX9DOAvk1yd5I4kVyU5GViq\nqpV2mRVgaRPrlSStMckvzpwAvBB4fVX9cZJfYk33R1VVkoEvj8vLy0eu93o9er3e1MVK0lbU7/fp\n9/tjl5ukS+Q04NaqOqOdfhnwFuAZwMur6lCSXcDNdokMZ5fI/Gy1+7Nedol039RdIlV1CLg/yZnt\nrPOAu4EbgN3tvN3AdZtUqyRpgLFH2ABJ/i7wTuBxwP8GXgMcD1wLPB04CFxUVV9a084j7JZH2POz\n1e7PenmE3X3DjrAnCuwNrNTAbhnY87PV7s96Gdjdt5FRIpKkBTDJKJFOaV7BB/MVXFKXbbnAbgx+\nyyVJXWaXiCR1hIEtSR1hYEtSRxjYktQRW/RDx61h1IgXcNSLtN0Y2Atv+Mk2krYXA1vStteVd7MG\ntiQBXXg364eOktQRHmFLc9KVt91aXAa2NFeL/7Zbi8suEUnqCANbkjrCwJakjjCwJakjDGxJ6oiJ\nRokkOQh8Bfgm8HBVnZNkJ/CbwN9myI/wSpI2z6RH2AX0quq7quqcdt4eYF9VnQnsb6clSTOyni6R\ntQNFLwD2ttf3AhduSkWS1AFJhl5mZT1H2H+Q5ONJLm3nLVXVSnt9BVja9OokaaHVgMvsTHqm47lV\n9RdJngLsS3Lv6n9WVSUZWOny8vKR671ej16vN2Wpi8NTjCVtpn6/T7/fH7tc1hsuSS4DHgIupenX\nPpRkF3BzVZ21Ztmad3g1YTr4V9M3q5bh6xi+nnm1mcY8ttk8Ler9WeTHc17bbCs9NrO8L0moqqOO\nDMd2iSQ5Kcmp7fWTgX8I3AVcD+xuF9sNXLehCiVJI03SJbIEfLDtBjgBeF9V3Zjk48C1SS6hHdY3\nsyolSevvElnXjdslMvc201jUt6nTWtT7s8iPp10iW6RLRJK0GAxsSeoIA1uSOsLAlqSOMLAlqSMM\nbEnqCANbkjrCwJakjjCwJakjJv22PumYGPXNiF08C1PaCANbHTD49F9pu7FLRJI6wsCWpI4wsCWp\nIwxsSeoIP3TUVBy9Ic2fga0NcPSGNE92iUhSRxjYktQREwV2kuOTHEhyQzu9M8m+JPcluTHJjtmW\nKUma9Aj7jcA9PNZpuQfYV1VnAvvbaUnSDI0N7CTfCfwj4J089onSBcDe9vpe4MKZVCdJOmKSI+xf\nBH4aeHTVvKWqWmmvrwBLm12YJOlbjRzWl+SVwANVdSBJb9AyVVVJhg68XV5ePnK91+vR6w28GUna\ntvr9Pv1+f+xyGXWSQ5K3AT8MPAKcCDwR+ADwYqBXVYeS7AJurqqzBrSveZ9E0ZzQMXh88GbVMnwd\nw9czrzbTmGabzWM7L3pt6+XjubUem1nelyRU1VEnNYzsEqmqn6mqp1XVGcCrgZuq6oeB64Hd7WK7\nges2VJ0kaaz1nul4+GXjCuDaJJcAB4GLNrMoadGNOjUfPD1fszGyS2TDN26XyNzbTGOrvYXeSvvA\n5tbWzcdzHrZEl4gkaXEs9Jc/+Y1wkvSYhQ7sht8IJ0lgl4gkdYaBLUkdYWBLUkcY2JLUEQa2JHWE\ngS1JHdGBYX2SFpHnScyfgS1pAzxPYp7sEpGkjjCwJakjDGxJ6ggDW5I6wsCWpI4wsCWpIwxsSeoI\nA1uSOmJkYCc5McltSe5Mck+Sn2vn70yyL8l9SW5MsmM+5UrS9jUysKvq68DLq+oFwPOBlyd5GbAH\n2FdVZwL722lJ2lRJRl62m7FdIlX11+3VxwHHA18ELgD2tvP3AhfOpDpJooZctp+xgZ3kuCR3AivA\nzVV1N7BUVSvtIivA0gxrlCQxwZc/VdWjwAuSPAn4/SQvX/P/SjL05W55efnI9V6vR6/Xm7pYSdqK\n+v0+/X5/7HJZz9cgJnkr8DXgXwG9qjqUZBfNkfdZA5avjXzNYtNHNfjbwIbd7jRtNq+u4euZV5tp\nLOp2XuTafDzn0+bYb7Npatt4XUmoqqM66ceNEvm2wyNAkjwBeAVwALge2N0uthu4bkPVSZLGGtcl\nsgvYm+Q4mnB/T1XtT3IAuDbJJcBB4KLZliltT/5IgFZbV5fIum/cLpG5t5nGom7nRa7t2O8D3eve\nmKbNsX8OTFPbMeoSkSQtDn8iTNKWMu6Emi53JRnYkrag4d0bXWaXiCR1hIEtSR1hYEtSRxjYktQR\nBrYkdYSBLUkdMbdhfZ5iOx9beQyqtN3NeRz24NM4tdm25hhUabuzS0SSOsLAlqSOMLAlqSMMbEnq\nCL/8SdueI2vUFQa2BDiyRl1gYOMYcUndYGAf4RhxSYtt7IeOSZ6W5OYkdyf5kyRvaOfvTLIvyX1J\nbjz86+qSpNmYZJTIw8C/rqrnAi8BXpfk2cAeYF9VnQnsb6clSTMyNrCr6lBV3dlefwj4FPAdwAXA\n3naxvcCFsypSkrTOcdhJTge+C7gNWKqqlfZfK8DSplYmSfoWE3/omOQU4HeAN1bVV1ePrKiqSjJw\nOMXy8vKqqT7Qm6ZOSdqy+v0+/X5/7HKZZNhakr8F/C7woar6pXbevUCvqg4l2QXcXFVnrWlXh2+/\nCfjBIzGG1bCobYYvv9XabO52noaP52I+B+bV5thv52nabPw5kISqOmqY2iSjRAK8C7jncFi3rgd2\nt9d3A9dtqEJJ0kiTdImcC/wQ8MkkB9p5bwGuAK5NcglwELhoJhVKkoAJAruq/ojhR+LnbW45kqRh\n/LY+SeoIA1uSOsLAlqSOMLAlqSMMbEnqCANbkjrCwJakjjCwJakjDGxJ6gh/IkyS5mSjvx9rYEvS\nXE3/+7F2iUhSR3iErbnZ6NtBabszsDVn078dlLY7u0QkqSMMbEnqCANbkjrCwJakjpjkR3jfnWQl\nyV2r5u1Msi/JfUluTLJjtmVKkiY5wr4aOH/NvD3Avqo6E9jfTkuSZmhsYFfVR4Avrpl9AbC3vb4X\nuHCT65IkrTFtH/ZSVa2011eApU2qR5I0xIY/dKzmFDVPU5OkGZv2TMeVJKdV1aEku4AHhi24vLy8\naqoP9KZcpSRtXd+alYNlku9wSHI6cENVPa+dvhJ4sKrenmQPsKOqjvrgMUkdvv3meyQGn5Y8rIZF\nbTN8+a3WpnuPzTRtjv12nqZN97bzNG2O/Xaeps3G738Squqo72yYZFjfrwMfBZ6V5P4krwGuAF6R\n5D7ge9tpSdIMje0SqaqLh/zrvE2uRZI0gmc6SlJHGNiS1BEGtiR1hIEtSR1hYEtSRxjYktQRBrYk\ndYSBLUkdYWBLUkcY2JLUEQa2JHWEgS1JHWFgS1JHGNiS1BEGtiR1hIEtSR1hYEtSRxjYktQRBrYk\ndcSGAjvJ+UnuTfLpJG/erKIkSUebOrCTHA/8F+B84DnAxUmePVnr/hRr3O5t5rEO20zXZh7rsM10\nbeaxjvm12cgR9jnAZ6rqYFU9DPwG8E8ma9qfYnXbvc081mGb6drMYx22ma7NPNYxvzYbCezvAO5f\nNf1/23mSpBnYSGDXplUhSRorVdPlbpKXAMtVdX47/Rbg0ap6+6plDHVJmkJVZe28jQT2CcCfAv8A\n+DzwMeDiqvrURoqUJA12wrQNq+qRJK8Hfh84HniXYS1JszP1EbYkab6mPsJeryQ7gb8DPP7wvKr6\n8IjlnwC8FngZzQecHwH+e1V9fZPq+alVkwVk1XWq6j+NaHsc8C+AM6rqZ5M8HTitqj62GbWtqm9t\nXV8Gbq+qO4e0ORH4AeB0Hntsq6p+dpNquqWqzk3yEEd/6FzAF4Cfr6r/OqDt2VV1+5p5r6yq392M\n2lbd5ouBn+HobfD8EW3Wvd2SvAD4Htp9s6o+Maaude/PQ/aBI9fX7qNJAnxnVa0evbUwklw2YPam\n7Z/bwVxOTU9yKfCHwO8Bl9N0oyyPaXYNzQk576A5Qee5wHvGrOeaJE9eNb0zybuHLH4qcApwNvAT\nwFNphiX+OPDCMbX9N+ClwD9vpx9q5w2q6T3t3zeNuc21zm5rOVzXjwHfD1w14qzS/wFcADzc1vQQ\n8FdD6rql/ftQkq+uuXxlUJuqOrf9e0pVnbrm8sS25jcMqe2qJM9btf6LgX8/pLZBNY2sbZX3AVfT\nBPCr2ssFY9pMvN3a+t4IvBd4CrAEvDfJsPt92Lr3Z4bvm6fQ7L+DfGjMbR4lyUVJnthef2uSDyYZ\n+RxI8vZJ5q3xVzy2fb9Jsz+fPmY9P5Vk4uHCSd6b5NIkZ62jzXMGzOuNafOG1Vkz4XpuSvKP18z7\ntfXcBlU18wvwJ8ATgDvb6bOAD45pc88k89b8/85J5q35/0eAU1dNn0pzxDSqzYHVf9vrnxh2P2ie\ncJ8Edq69jKnrlFXTpwAfBk4CPjVsO8/j8RyzbZ46ZP4zgDvax/7S9v49aQbrv2WKNuvabsBdwMmr\npk8G7hrTZpr9eZp9cy9wznrvT/v3ZTRnc7wSuG1MmwPDbmcd63088IdjllkG7gb+CHg9sDRm+e8F\nLgP2AZ8Dfgd407jHH3gzzbuXk4BfBv7XmDb/AfgMcC3N2d6Z4P5+rn0OXzZqO466zOvLn75eVV+D\n5u1nVd0LPGtMmzuSvPTwRDuM8PYRy7eLZeeqiZ00H4iO8u00R1aHPdzOG+Ub7an5h9fzFODRIcv+\nCrCf5v7evuby8RHreArwjTV1LVXVXwPD3kZ/NMnQt/7zUFWfHzL/s8DFwAdpjn6/r6q+PIMSLk/y\nriQXJ/mB9vJPx7SZZrs9OuT6MNPsz9Psmy8Bbk3y2SR3tZdPjmnzzfbvK4GrqummetygBZP8RJK7\ngGetuv27khykOShZj5MZc7JdVS1X1XOB1wG7gA8n2T9i+ZtowvStwFXAi2nepYzy3cDTgFtpRrv9\nBfD3xtT1b4EzgXcDPwp8OsnbkjxzRLMv0bygLCW5IcmOMXUdZV592Pe3bx+uA/Yl+SJwcNCC7c5w\nuLZbktxP03f3dJphhKP8As3Oei3Nq+UP0jx4o1wDfCzJB9o2F9IcpYzyyzTB8+1J3gb8M+DfDVqw\nqt4BvCPJr1TVj4+53dXeB9yW5Lq2rlcB709yMs1R+xGrttnxwGuSfA74m8dKGN5/O2urajtsJ01X\n3G1JZlHbbpoXxxP41iD9wIg238P6ttvVNPWv3meGdb0d9iIG7M/t9hm2rmn2ze8b8/9B/rx9a/4K\n4Iq2T3/Ywdz7abpdruCxo1KAr1bVg6NWsmZfOI7mxWfS/usHgEPAgzQHM8PWsZ/mheBWmqPyF1XV\nA2Nu+xHgazS9ACcCn62qsS/CVfVokkPACs2L3pOB307yB1X100PaPAK8NsmP0ryDWl+3SntYPjdt\n39ATgd+rqm8M+P/pI5pXVf3ZmNt/Ls2rWAE3VdU9o5Zv25zNYx8gfbiqDkzQ5tk0Y9AB9tcMhjS2\nH6Cd29Z1S1UNPCIfs82oqoObXduk5l1bkj8Fzqp17NjDahxVW7vPHPkAcdw+M+12mGbfXK/2IOB8\n4JNV9ekku4DnVdWNm7ye01dNPgKsVPM9RKPavBa4iCbcfwv4zVHP6SS/SPPi+HXgozSfnd16+B3+\nkDafAK6nefH4NuBXgb+pqh8c0eaNwI/QvIC8k6aL9+E0AxI+XVVHHWkn+bGq+tVV02cDr6uqfzls\nPUfdxrwDW5qlJFcD/7Gq7j7WtWjjkvwcTUgPHBk1ot2pNF0V/4ZmBNfjRyz74qr64zXzfqSqrhnR\n5nLg3YMOIJM8Z5IDxWkY2NpSktwLPJPmA56F6BbS/CT5SZp3JGfT7AMfoXkHdNMxLWyTzG0ctjQn\n5x/rAnRMnUjzWdYd47pbusgjbEnqCH/TUZI6wsCWpI4wsCWpIwxsSeoIA1uSOuL/Axc+C4z6mlNK\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "freqs_8a = pd.Series(collections.Counter([l.lower() for l in c8a if l in string.ascii_letters]))\n", + "freqs_8a.plot(kind='bar')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'nyvlggsyglchxfeuytqcesqxpziufiggrbjhpayncruyfpsxufiupskyrectmmcncruyregxigrlglbtiblmecebzsvrlpuxpbibjajrljreobajrlufigjehbezywtmgjyxfqxictsgrdgtbjafyoocwtmjblctwwucqmgofrlfmrfrlfwlbtijlwuypmchjqxicrfchumtsmzjbimyvhcuvyrugxjcwpdtpuisrlfdhbaencyqumufeogrhcrjmytqsmsxjmrcsxjrmttiswzvjrfpecjitnidgemdssaitasvjhuyofgxpsxgmvvqfvrxiyxxmymbxfjpufigbeufeuuiiyzfavbaofbxicmsamqfisqwpgrtribbmtskhcwuuimcxufinbitrvpwxsmnbljppytuixgpmlifbgpmtfpeugsodvpkxicsnyrjeswcvokioreoyvnchggkirishiuyrerlfdpjeluasorvpjwzqxfkwgpsnyhsmrfkiblaigpfuiociersflwvpiuusufmoewpliufeuuiemrprwflhdpmuggbjmodsskeugsoygsmwtrlfzecypnyreyftrvbgxblhuusufeuuivqiblsoavjrmdyplcchcrfpeugsonvprsdmpplxiyxdfeolimemwcrufimczfjsgasnkmukiorxicjeylbtitfsxlmobiwcppnmoexigwqjeogenqyscxiyxufizummjvfgrtreucxictpuisqyqnpzumufmoyjfuqplxiqfvrajrlmsglrlfwajjpomxhsitqxiyxxcoomabzsvrmuyreuixgpmnyugxpsxpdfvqmocwtdssjsoeiomyhfxpasncyqumufeqjeomjpsvpurumiynppgxjrmorlfkiblxjkixcrpuoomaufeurlfgvigkicwuqidsvjrcdmqnsrjaeugsoqescioavznxfbytgrhygbbioswdgticvtmafaeoqxbpxisrugrhrlsmyhfxichbrecywfdssmxicvjlxfpgfnxtuidyrdpedixigwnycccxicfscelrlsmyhfaffewcffcrmmslgrhdssgrufiggkirehymoqxufigbemcxtlsuqgscajryqypmrlfzitrlbpvz'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c8as = sanitise(c8a)\n", + "c8as" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('bye', -1461.9840974270046)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key_a, score = vigenere_frequency_break(c8as)\n", + "key_a, score" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'mark i cracked what appears to be the final document about the trojan deployment and i think i have an idea about how to deal with it and with the flag day associates the principal weakness of any system like the one they have installed is the need to provide large quantities of power the fda came up with an ingenious solution but it is very vulnerable special forces could take it out for us but that would tell the fda that we have cracked their ciphers so instead i suggest we let them destroy trojan for us we will need cooperation from the omani government an armed fighter jet and the flight control systems from a drone meanwhile we need to ensure two things one that we do not send critical information across the ba balm and abstrait and two that we use an on critical key generation protocol on that channel given the level of commitment the fda have shown in developing this plan i am sure that they will reinstate the powersupply within a few months but with luck they will not guess that we know about it and we will put it out of business for long enough to come up with a plan of our own to exploit it in the meantime we now know that their highest security communications are encrypted using a caden us cipher so we can start hunting through the database for other intercepts we can crack this maybe the breakthrough we have been looking for in the fight against the fda lets not screw it up all the best harry'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "' '.join(segment(vigenere_decipher(c8as, key_a)))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "875.0" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(c8b) / 8" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['00000',\n", + " '00101',\n", + " '00010',\n", + " '00000',\n", + " '00100',\n", + " '10100',\n", + " '01110',\n", + " '10011',\n", + " '10011',\n", + " '00000',\n", + " '00010',\n", + " '10011',\n", + " '00111',\n", + " '10001',\n", + " '01000',\n", + " '01110',\n", + " '01011',\n", + " '00100',\n", + " '10011',\n", + " '00010',\n", + " '10010',\n", + " '00100',\n", + " '10001',\n", + " '10011',\n", + " '00111',\n", + " '10010',\n", + " '00111',\n", + " '10011',\n", + " '10001',\n", + " '00000',\n", + " '00111',\n", + " '01010',\n", + " '11000',\n", + " '01110',\n", + " '10001',\n", + " '01111',\n", + " '00101',\n", + " '10001',\n", + " '00110',\n", + " '00100',\n", + " '01110',\n", + " '00000',\n", + " '00011',\n", + " '01111',\n", + " '01111',\n", + " '01001',\n", + " '01101',\n", + " '00110',\n", + " '01011',\n", + " '10011',\n", + " '00100',\n", + " '10001',\n", + " '01101',\n", + " '00100',\n", + " '00101',\n", + " '00100',\n", + " '01110',\n", + " '00101',\n", + " '01000',\n", + " '01110',\n", + " '10001',\n", + " '10011',\n", + " '10010',\n", + " '00011',\n", + " '00011',\n", + " '01110',\n", + " '00100',\n", + " '00100',\n", + " '10100',\n", + " '01100',\n", + " '10010',\n", + " '00010',\n", + " '10001',\n", + " '10100',\n", + " '00100',\n", + " '10001',\n", + " '01101',\n", + " '00101',\n", + " '00100',\n", + " '10011',\n", + " '01011',\n", + " '00000',\n", + " '00000',\n", + " '00101',\n", + " '10010',\n", + " '10011',\n", + " '10110',\n", + " '01000',\n", + " '00100',\n", + " '01101',\n", + " '10011',\n", + " '10001',\n", + " '10101',\n", + " '01110',\n", + " '01110',\n", + " '01101',\n", + " '00100',\n", + " '10001',\n", + " '00111',\n", + " '10100',\n", + " '00000',\n", + " '00111',\n", + " '10001',\n", + " '00000',\n", + " '10101',\n", + " '00100',\n", + " '10001',\n", + " '00100',\n", + " '00100',\n", + " '10011',\n", + " '10010',\n", + " '10101',\n", + " '10010',\n", + " '01000',\n", + " '00100',\n", + " '01011',\n", + " '00111',\n", + " '01011',\n", + " '01110',\n", + " '10010',\n", + " '10011',\n", + " '00011',\n", + " '01110',\n", + " '00000',\n", + " '01011',\n", + " '01110',\n", + " '11000',\n", + " '00000',\n", + " '00100',\n", + " '10010',\n", + " '01100',\n", + " '01101',\n", + " '01101',\n", + " '00011',\n", + " '01000',\n", + " '00110',\n", + " '01101',\n", + " '01101',\n", + " '10001',\n", + " '00111',\n", + " '01110',\n", + " '00111',\n", + " '00111',\n", + " '10011',\n", + " '10010',\n", + " '01101',\n", + " '00000',\n", + " '01110',\n", + " '01000',\n", + " '01011',\n", + " '01101',\n", + " '00010',\n", + " '01101',\n", + " '10010',\n", + " '10010',\n", + " '01000',\n", + " '00010',\n", + " '10001',\n", + " '00100',\n", + " '00000',\n", + " '01101',\n", + " '01101',\n", + " '00100',\n", + " '00100',\n", + " '01000',\n", + " '01000',\n", + " '01000',\n", + " '00100',\n", + " '10001',\n", + " '10110',\n", + " '10011',\n", + " '00000',\n", + " '01101',\n", + " '00100',\n", + " '10010',\n", + " '10001',\n", + " '10101',\n", + " '01110',\n", + " '00110',\n", + " '01000',\n", + " '00100',\n", + " '01000',\n", + " '11000',\n", + " '10110',\n", + " '10010',\n", + " '10010',\n", + " '00011',\n", + " '00110',\n", + " '01111',\n", + " '10101',\n", + " '01110',\n", + " '01000',\n", + " '00000',\n", + " '01000',\n", + " '10010',\n", + " '00000',\n", + " '01110',\n", + " '00000',\n", + " '00100',\n", + " '01110',\n", + " '00000',\n", + " '00100',\n", + " '00011',\n", + " '10001',\n", + " '01101',\n", + " '01000',\n", + " '10011',\n", + " '10001',\n", + " '01101',\n", + " '10111',\n", + " '00100',\n", + " '01000',\n", + " '00110',\n", + " '10001',\n", + " '01111',\n", + " '10010',\n", + " '10010',\n", + " '00111',\n", + " '00000',\n", + " '00011',\n", + " '00111',\n", + " '00011',\n", + " '10011',\n", + " '01110',\n", + " '01000',\n", + " '01111',\n", + " '00000',\n", + " '00000',\n", + " '10011',\n", + " '00100',\n", + " '10111',\n", + " '00100',\n", + " '01101',\n", + " '01101',\n", + " '00100',\n", + " '10010',\n", + " '00000',\n", + " '00110',\n", + " '10001',\n", + " '01110',\n", + " '00001',\n", + " '10011',\n", + " '01011',\n", + " '00100',\n", + " '10010',\n", + " '10001',\n", + " '01101',\n", + " '10001',\n", + " '01110',\n", + " '01000',\n", + " '10001',\n", + " '11000',\n", + " '01111',\n", + " '00001',\n", + " '00110',\n", + " '00100',\n", + " '00011',\n", + " '00010',\n", + " '01011',\n", + " '01011',\n", + " '01000',\n", + " '10110',\n", + " '00000',\n", + " '01011',\n", + " '00000',\n", + " '01011',\n", + " '00100',\n", + " '00100',\n", + " '01101',\n", + " '01000',\n", + " '00110',\n", + " '10001',\n", + " '10001',\n", + " '01101',\n", + " '10110',\n", + " '11000',\n", + " '10001',\n", + " '01011',\n", + " '01000',\n", + " '01100',\n", + " '01011',\n", + " '01111',\n", + " '10010',\n", + " '10011',\n", + " '01110',\n", + " '01011',\n", + " '00100',\n", + " '00101',\n", + " '10011',\n", + " '10001',\n", + " '00011',\n", + " '01100',\n", + " '10100',\n", + " '00000',\n", + " '10001',\n", + " '01000',\n", + " '00100',\n", + " '00100',\n", + " '00100',\n", + " '01000',\n", + " '01000',\n", + " '00000',\n", + " '01110',\n", + " '01011',\n", + " '01101',\n", + " '00100',\n", + " '10110',\n", + " '10010',\n", + " '00000',\n", + " '01110',\n", + " '00111',\n", + " '10001',\n", + " '10011',\n", + " '01011',\n", + " '10010',\n", + " '10011',\n", + " '01110',\n", + " '00001',\n", + " '00100',\n", + " '10011',\n", + " '01101',\n", + " '10010',\n", + " '01011',\n", + " '10101',\n", + " '00101',\n", + " '01000',\n", + " '10101',\n", + " '00011',\n", + " '01110',\n", + " '10101',\n", + " '10011',\n", + " '01111',\n", + " '01110',\n", + " '00000',\n", + " '00100',\n", + " '00100',\n", + " '01000',\n", + " '10010',\n", + " '00010',\n", + " '01000',\n", + " '01110',\n", + " '00111',\n", + " '01000',\n", + " '01111',\n", + " '10010',\n", + " '00100',\n", + " '10101',\n", + " '00100',\n", + " '00100',\n", + " '00011',\n", + " '10011',\n", + " '00100',\n", + " '10110',\n", + " '00101',\n", + " '00000',\n", + " '10001',\n", + " '01101',\n", + " '00111',\n", + " '00100',\n", + " '00001',\n", + " '01011',\n", + " '00100',\n", + " '00000',\n", + " '01110',\n", + " '10011',\n", + " '01110',\n", + " '00111',\n", + " '10011',\n", + " '10011',\n", + " '10011',\n", + " '00100',\n", + " '01111',\n", + " '01101',\n", + " '00010',\n", + " '01010',\n", + " '00000',\n", + " '01110',\n", + " '01101',\n", + " '00111',\n", + " '10110',\n", + " '00100',\n", + " '10011',\n", + " '01100',\n", + " '10101',\n", + " '11000',\n", + " '01111',\n", + " '10001',\n", + " '10001',\n", + " '00100',\n", + " '01110',\n", + " '01101',\n", + " '01101',\n", + " '00000',\n", + " '10010',\n", + " '00110',\n", + " '00011',\n", + " '00100',\n", + " '00011',\n", + " '01110',\n", + " '00100',\n", + " '00100',\n", + " '00100',\n", + " '01110',\n", + " '00000',\n", + " '00000',\n", + " '01100',\n", + " '10011',\n", + " '00010',\n", + " '01000',\n", + " '00010',\n", + " '10011',\n", + " '10011',\n", + " '01000',\n", + " '00101',\n", + " '01101',\n", + " '00000',\n", + " '00011',\n", + " '10001',\n", + " '00100',\n", + " '10010',\n", + " '10001',\n", + " '10011',\n", + " '10010',\n", + " '00100',\n", + " '10001',\n", + " '01110',\n", + " '10010',\n", + " '00100',\n", + " '10011',\n", + " '10001',\n", + " '00111',\n", + " '00010',\n", + " '01000',\n", + " '00010',\n", + " '10011',\n", + " '01111',\n", + " '10010',\n", + " '00000',\n", + " '00000',\n", + " '00100',\n", + " '00111',\n", + " '01011',\n", + " '00011',\n", + " '00111',\n", + " '10010',\n", + " '00101',\n", + " '10111',\n", + " '10010',\n", + " '01110',\n", + " '00000',\n", + " '01110',\n", + " '10011',\n", + " '00010',\n", + " '10011',\n", + " '00001',\n", + " '00001',\n", + " '10010',\n", + " '01110',\n", + " '00100',\n", + " '01000',\n", + " '10001',\n", + " '01101',\n", + " '10010',\n", + " '00000',\n", + " '00011',\n", + " '01011',\n", + " '11000',\n", + " '10011',\n", + " '10001',\n", + " '10001',\n", + " '10100',\n", + " '01101',\n", + " '10001',\n", + " '00010',\n", + " '00100',\n", + " '01111',\n", + " '10011',\n", + " '10011',\n", + " '00111',\n", + " '10001',\n", + " '00100',\n", + " '10100',\n", + " '00111',\n", + " '01101',\n", + " '01010',\n", + " '10011',\n", + " '00000',\n", + " '00010',\n", + " '00100',\n", + " '00010',\n", + " '00100',\n", + " '00100',\n", + " '01011',\n", + " '10001',\n", + " '10110',\n", + " '01101',\n", + " '01000',\n", + " '10001',\n", + " '00100',\n", + " '00100',\n", + " '00100',\n", + " '00000',\n", + " '00100',\n", + " '10010',\n", + " '00100',\n", + " '00100',\n", + " '00100',\n", + " '01000',\n", + " '00011',\n", + " '01000',\n", + " '10010',\n", + " '01110',\n", + " '00110',\n", + " '00010',\n", + " '00100',\n", + " '01110',\n", + " '01100',\n", + " '01101',\n", + " '10001',\n", + " '10011',\n", + " '00100',\n", + " '01001',\n", + " '00111',\n", + " '00000',\n", + " '00110',\n", + " '00000',\n", + " '00001',\n", + " '10010',\n", + " '00100',\n", + " '01101',\n", + " '01000',\n", + " '10011',\n", + " '01011',\n", + " '10110',\n", + " '10011',\n", + " '10001',\n", + " '01101',\n", + " '00001',\n", + " '01100',\n", + " '01000',\n", + " '00100',\n", + " '01011',\n", + " '10010',\n", + " '00000',\n", + " '10001',\n", + " '00100',\n", + " '10011',\n", + " '00100',\n", + " '10010',\n", + " '10001',\n", + " '01101',\n", + " '00110',\n", + " '10010',\n", + " '01101',\n", + " '00111',\n", + " '00100',\n", + " '00001',\n", + " '01000',\n", + " '01110',\n", + " '10010',\n", + " '00011',\n", + " '01000',\n", + " '00100',\n", + " '01101',\n", + " '00000',\n", + " '00101',\n", + " '01011',\n", + " '00100',\n", + " '01000',\n", + " '10010',\n", + " '00000',\n", + " '00111',\n", + " '01110',\n", + " '00010',\n", + " '01000',\n", + " '00101',\n", + " '00100',\n", + " '10101',\n", + " '01100',\n", + " '00101',\n", + " '00000',\n", + " '10011',\n", + " '00000',\n", + " '01101',\n", + " '00000',\n", + " '10011',\n", + " '10001',\n", + " '01101',\n", + " '01000',\n", + " '00000',\n", + " '00110',\n", + " '01101',\n", + " '00111',\n", + " '00000',\n", + " '10011',\n", + " '01101',\n", + " '01100',\n", + " '01000',\n", + " '00001',\n", + " '01101',\n", + " '01000',\n", + " '10100',\n", + " '00101',\n", + " '00100',\n", + " '01101',\n", + " '10001',\n", + " '10011',\n", + " '01110',\n", + " '10011',\n", + " '10011',\n", + " '10001',\n", + " '01101',\n", + " '11000',\n", + " '01111',\n", + " '00000',\n", + " '01000',\n", + " '00011',\n", + " '11000',\n", + " '01000',\n", + " '00100',\n", + " '00110',\n", + " '00011',\n", + " '01101',\n", + " '01100',\n", + " '00100',\n", + " '10001',\n", + " '00111',\n", + " '00111',\n", + " '01000',\n", + " '01110',\n", + " '10011',\n", + " '10001',\n", + " '00100',\n", + " '10011',\n", + " '00010',\n", + " '00100',\n", + " '10010',\n", + " '10010',\n", + " '00100',\n", + " '01000',\n", + " '01011',\n", + " '00011',\n", + " '10001',\n", + " '00001',\n", + " '00010',\n", + " '00100',\n", + " '01111',\n", + " '10001',\n", + " '01000',\n", + " '00110',\n", + " '00000',\n", + " '00100',\n", + " '10010',\n", + " '01110',\n", + " '00000',\n", + " '00011',\n", + " '01011',\n", + " '10011',\n", + " '00000',\n", + " '00111',\n", + " '01000',\n", + " '00100',\n", + " '10101',\n", + " '00100',\n", + " '00001',\n", + " '10001',\n", + " '00010',\n", + " '00100',\n", + " '01101',\n", + " '01011',\n", + " '00100',\n", + " '10101',\n", + " '00000',\n", + " '10010',\n", + " '00000',\n", + " '00011',\n", + " '01101',\n", + " '01101',\n", + " '10011',\n", + " '00111',\n", + " '01101',\n", + " '00100',\n", + " '01000',\n", + " '10011',\n", + " '00100',\n", + " '01000',\n", + " '01000',\n", + " '10010',\n", + " '00000',\n", + " '00111',\n", + " '10100',\n", + " '00111',\n", + " '00111',\n", + " '10100',\n", + " '00000',\n", + " '01100',\n", + " '01110',\n", + " '01101',\n", + " '00100',\n", + " '00101',\n", + " '11000',\n", + " '00111',\n", + " '01011',\n", + " '01110',\n", + " '01101',\n", + " '10110',\n", + " '00111',\n", + " '00000',\n", + " '00100',\n", + " '00100',\n", + " '00100',\n", + " '00100',\n", + " '01110',\n", + " '10010',\n", + " '01101',\n", + " '00100',\n", + " '00100',\n", + " '11000',\n", + " '00000',\n", + " '01101',\n", + " '00100',\n", + " '01000',\n", + " '10010',\n", + " '00100',\n", + " '10011',\n", + " '01110',\n", + " '00110',\n", + " '11000',\n", + " '01000',\n", + " '10011',\n", + " '00100',\n", + " '10001',\n", + " '01011',\n", + " '01000',\n", + " '00111',\n", + " '10011',\n", + " '00010',\n", + " '01100',\n", + " '01000',\n", + " '01110',\n", + " '01000',\n", + " '10001',\n", + " '00000',\n", + " '10001',\n", + " '00101',\n", + " '00011',\n", + " '01110',\n", + " '00100',\n", + " '10011',\n", + " '01101',\n", + " '01000',\n", + " '00111',\n", + " '10011',\n", + " '01101',\n", + " '00100',\n", + " '00111',\n", + " '01000',\n", + " '01000',\n", + " '01010',\n", + " '00000',\n", + " '01100',\n", + " '10001',\n", + " '00011',\n", + " '01100',\n", + " '01101',\n", + " '00000',\n", + " '00011',\n", + " '00000',\n", + " '01101',\n", + " '00000',\n", + " '01110',\n", + " '00011',\n", + " '10010',\n", + " '00100',\n", + " '10010',\n", + " '00100',\n", + " '01000',\n", + " '11000',\n", + " '00010',\n", + " '01011',\n", + " '10010',\n", + " '01000',\n", + " '00000',\n", + " '01101',\n", + " '10011',\n", + " '00000',\n", + " '01110',\n", + " '01011',\n", + " '10011',\n", + " '00010',\n", + " '01000',\n", + " '11000',\n", + " '01100',\n", + " '01000',\n", + " '00011',\n", + " '00100',\n", + " '01101',\n", + " '10011',\n", + " '10011',\n", + " '00111',\n", + " '01011',\n", + " '10011',\n", + " '01101',\n", + " '00011',\n", + " '10111',\n", + " '10011',\n", + " '10011',\n", + " '10011',\n", + " '01100',\n", + " '00000',\n", + " '10010',\n", + " '00001',\n", + " '01011',\n", + " '00100',\n", + " '00000',\n", + " '00100',\n", + " '00100',\n", + " '10011',\n", + " '01011',\n", + " '01000',\n", + " '10010',\n", + " '01000',\n", + " '10001',\n", + " '10011',\n", + " '10110',\n", + " '10011',\n", + " '10100',\n", + " '10001',\n", + " '01111',\n", + " '00101',\n", + " '00000',\n", + " '01000',\n", + " '01011',\n", + " '10011',\n", + " '00100',\n", + " '00000',\n", + " '01110',\n", + " '00100',\n", + " '00101',\n", + " '00100',\n", + " '01000',\n", + " '10010',\n", + " '01000',\n", + " '01000',\n", + " '01000',\n", + " '11000',\n", + " '01000',\n", + " '10010',\n", + " '01000',\n", + " '01010',\n", + " '10101',\n", + " '10011',\n", + " '10110',\n", + " '01000',\n", + " '10010',\n", + " '01111',\n", + " '10001',\n", + " '00001',\n", + " '10010',\n", + " '01000',\n", + " '01101',\n", + " '00100',\n", + " '01011',\n", + " '01111',\n", + " '00111',\n", + " '10001',\n", + " '01100',\n", + " '01110',\n", + " '00111',\n", + " '01000',\n", + " '00000',\n", + " '00110',\n", + " '01101',\n", + " '01011',\n", + " '10010',\n", + " '01011',\n", + " '10101',\n", + " '01000',\n", + " '10011',\n", + " '01110',\n", + " '00011',\n", + " '00000',\n", + " '01000',\n", + " '10010',\n", + " '00011',\n", + " '01111',\n", + " '01101',\n", + " '11000',\n", + " '00011',\n", + " '00011',\n", + " '00010',\n", + " '00000',\n", + " '00000',\n", + " '01110',\n", + " '10011',\n", + " '00000',\n", + " '00111',\n", + " '00010',\n", + " '00100',\n", + " '00111',\n", + " '10011',\n", + " '10100',\n", + " '00100',\n", + " '01000',\n", + " '10001',\n", + " '10001',\n", + " '00100',\n", + " '00011',\n", + " '00000',\n", + " '00100',\n", + " '00010',\n", + " '10011',\n", + " '01110',\n", + " '10010',\n", + " '01101',\n", + " '10001',\n", + " '00111',\n", + " '10101',\n", + " '01101',\n", + " '00000',\n", + " '01110',\n", + " '00011',\n", + " '01110',\n", + " '01000',\n", + " '01010',\n", + " '01110',\n", + " '00100',\n", + " '10011',\n", + " '00010',\n", + " '01000',\n", + " '01101',\n", + " '00100',\n", + " '01101',\n", + " '00100',\n", + " '10100',\n", + " '10001',\n", + " '10001',\n", + " '01000',\n", + " '10010',\n", + " '00011',\n", + " '00010',\n", + " '01110',\n", + " '10100',\n", + " '10001',\n", + " '00000',\n", + " '00110',\n", + " '01011',\n", + " '10101',\n", + " '01000',\n", + " '01100',\n", + " '01100',\n", + " '10100',\n", + " '01111',\n", + " '01111',\n", + " '00011',\n", + " '01000',\n", + " '10011',\n", + " '00100',\n", + " '00000',\n", + " '01101',\n", + " '00011',\n", + " '01000',\n", + " '10011',\n", + " '01100',\n", + " '00000',\n", + " '00000',\n", + " '01000',\n", + " '00000',\n", + " '01000',\n", + " '00100',\n", + " '01011',\n", + " '00100',\n", + " '01110',\n", + " '01101',\n", + " '01101',\n", + " '10001',\n", + " '00100',\n", + " '00100',\n", + " '00011',\n", + " '00000',\n", + " '01110',\n", + " '00011',\n", + " '00001',\n", + " '01110',\n", + " '01000',\n", + " '10100',\n", + " '01100',\n", + " '00100',\n", + " '01011',\n", + " '10001',\n", + " '01110',\n", + " '10011',\n", + " '01101',\n", + " '10011',\n", + " '10011',\n", + " '10011',\n", + " '00110',\n", + " '01000',\n", + " '10011',\n", + " '01101',\n", + " ...]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[c for c in chunks(c8b, 5)]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[0,\n", + " 5,\n", + " 2,\n", + " 0,\n", + " 4,\n", + " 20,\n", + " 14,\n", + " 19,\n", + " 19,\n", + " 0,\n", + " 2,\n", + " 19,\n", + " 7,\n", + " 17,\n", + " 8,\n", + " 14,\n", + " 11,\n", + " 4,\n", + " 19,\n", + " 2,\n", + " 18,\n", + " 4,\n", + " 17,\n", + " 19,\n", + " 7,\n", + " 18,\n", + " 7,\n", + " 19,\n", + " 17,\n", + " 0,\n", + " 7,\n", + " 10,\n", + " 24,\n", + " 14,\n", + " 17,\n", + " 15,\n", + " 5,\n", + " 17,\n", + " 6,\n", + " 4,\n", + " 14,\n", + " 0,\n", + " 3,\n", + " 15,\n", + " 15,\n", + " 9,\n", + " 13,\n", + " 6,\n", + " 11,\n", + " 19,\n", + " 4,\n", + " 17,\n", + " 13,\n", + " 4,\n", + " 5,\n", + " 4,\n", + " 14,\n", + " 5,\n", + " 8,\n", + " 14,\n", + " 17,\n", + " 19,\n", + " 18,\n", + " 3,\n", + " 3,\n", + " 14,\n", + " 4,\n", + " 4,\n", + " 20,\n", + " 12,\n", + " 18,\n", + " 2,\n", + " 17,\n", + " 20,\n", + " 4,\n", + " 17,\n", + " 13,\n", + " 5,\n", + " 4,\n", + " 19,\n", + " 11,\n", + " 0,\n", + " 0,\n", + " 5,\n", + " 18,\n", + " 19,\n", + " 22,\n", + " 8,\n", + " 4,\n", + " 13,\n", + " 19,\n", + " 17,\n", + " 21,\n", + " 14,\n", + " 14,\n", + " 13,\n", + " 4,\n", + " 17,\n", + " 7,\n", + " 20,\n", + " 0,\n", + " 7,\n", + " 17,\n", + " 0,\n", + " 21,\n", + " 4,\n", + " 17,\n", + " 4,\n", + " 4,\n", + " 19,\n", + " 18,\n", + " 21,\n", + " 18,\n", + " 8,\n", + " 4,\n", + " 11,\n", + " 7,\n", + " 11,\n", + " 14,\n", + " 18,\n", + " 19,\n", + " 3,\n", + " 14,\n", + " 0,\n", + " 11,\n", + " 14,\n", + " 24,\n", + " 0,\n", + " 4,\n", + " 18,\n", + " 12,\n", + " 13,\n", + " 13,\n", + " 3,\n", + " 8,\n", + " 6,\n", + " 13,\n", + " 13,\n", + " 17,\n", + " 7,\n", + " 14,\n", + " 7,\n", + " 7,\n", + " 19,\n", + " 18,\n", + " 13,\n", + " 0,\n", + " 14,\n", + " 8,\n", + " 11,\n", + " 13,\n", + " 2,\n", + " 13,\n", + " 18,\n", + " 18,\n", + " 8,\n", + " 2,\n", + " 17,\n", + " 4,\n", + " 0,\n", + " 13,\n", + " 13,\n", + " 4,\n", + " 4,\n", + " 8,\n", + " 8,\n", + " 8,\n", + " 4,\n", + " 17,\n", + " 22,\n", + " 19,\n", + " 0,\n", + " 13,\n", + " 4,\n", + " 18,\n", + " 17,\n", + " 21,\n", + " 14,\n", + " 6,\n", + " 8,\n", + " 4,\n", + " 8,\n", + " 24,\n", + " 22,\n", + " 18,\n", + " 18,\n", + " 3,\n", + " 6,\n", + " 15,\n", + " 21,\n", + " 14,\n", + " 8,\n", + " 0,\n", + " 8,\n", + " 18,\n", + " 0,\n", + " 14,\n", + " 0,\n", + " 4,\n", + " 14,\n", + " 0,\n", + " 4,\n", + " 3,\n", + " 17,\n", + " 13,\n", + " 8,\n", + " 19,\n", + " 17,\n", + " 13,\n", + " 23,\n", + " 4,\n", + " 8,\n", + " 6,\n", + " 17,\n", + " 15,\n", + " 18,\n", + " 18,\n", + " 7,\n", + " 0,\n", + " 3,\n", + " 7,\n", + " 3,\n", + " 19,\n", + " 14,\n", + " 8,\n", + " 15,\n", + " 0,\n", + " 0,\n", + " 19,\n", + " 4,\n", + " 23,\n", + " 4,\n", + " 13,\n", + " 13,\n", + " 4,\n", + " 18,\n", + " 0,\n", + " 6,\n", + " 17,\n", + " 14,\n", + " 1,\n", + " 19,\n", + " 11,\n", + " 4,\n", + " 18,\n", + " 17,\n", + " 13,\n", + " 17,\n", + " 14,\n", + " 8,\n", + " 17,\n", + " 24,\n", + " 15,\n", + " 1,\n", + " 6,\n", + " 4,\n", + " 3,\n", + " 2,\n", + " 11,\n", + " 11,\n", + " 8,\n", + " 22,\n", + " 0,\n", + " 11,\n", + " 0,\n", + " 11,\n", + " 4,\n", + " 4,\n", + " 13,\n", + " 8,\n", + " 6,\n", + " 17,\n", + " 17,\n", + " 13,\n", + " 22,\n", + " 24,\n", + " 17,\n", + " 11,\n", + " 8,\n", + " 12,\n", + " 11,\n", + " 15,\n", + " 18,\n", + " 19,\n", + " 14,\n", + " 11,\n", + " 4,\n", + " 5,\n", + " 19,\n", + " 17,\n", + " 3,\n", + " 12,\n", + " 20,\n", + " 0,\n", + " 17,\n", + " 8,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 8,\n", + " 8,\n", + " 0,\n", + " 14,\n", + " 11,\n", + " 13,\n", + " 4,\n", + " 22,\n", + " 18,\n", + " 0,\n", + " 14,\n", + " 7,\n", + " 17,\n", + " 19,\n", + " 11,\n", + " 18,\n", + " 19,\n", + " 14,\n", + " 1,\n", + " 4,\n", + " 19,\n", + " 13,\n", + " 18,\n", + " 11,\n", + " 21,\n", + " 5,\n", + " 8,\n", + " 21,\n", + " 3,\n", + " 14,\n", + " 21,\n", + " 19,\n", + " 15,\n", + " 14,\n", + " 0,\n", + " 4,\n", + " 4,\n", + " 8,\n", + " 18,\n", + " 2,\n", + " 8,\n", + " 14,\n", + " 7,\n", + " 8,\n", + " 15,\n", + " 18,\n", + " 4,\n", + " 21,\n", + " 4,\n", + " 4,\n", + " 3,\n", + " 19,\n", + " 4,\n", + " 22,\n", + " 5,\n", + " 0,\n", + " 17,\n", + " 13,\n", + " 7,\n", + " 4,\n", + " 1,\n", + " 11,\n", + " 4,\n", + " 0,\n", + " 14,\n", + " 19,\n", + " 14,\n", + " 7,\n", + " 19,\n", + " 19,\n", + " 19,\n", + " 4,\n", + " 15,\n", + " 13,\n", + " 2,\n", + " 10,\n", + " 0,\n", + " 14,\n", + " 13,\n", + " 7,\n", + " 22,\n", + " 4,\n", + " 19,\n", + " 12,\n", + " 21,\n", + " 24,\n", + " 15,\n", + " 17,\n", + " 17,\n", + " 4,\n", + " 14,\n", + " 13,\n", + " 13,\n", + " 0,\n", + " 18,\n", + " 6,\n", + " 3,\n", + " 4,\n", + " 3,\n", + " 14,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 14,\n", + " 0,\n", + " 0,\n", + " 12,\n", + " 19,\n", + " 2,\n", + " 8,\n", + " 2,\n", + " 19,\n", + " 19,\n", + " 8,\n", + " 5,\n", + " 13,\n", + " 0,\n", + " 3,\n", + " 17,\n", + " 4,\n", + " 18,\n", + " 17,\n", + " 19,\n", + " 18,\n", + " 4,\n", + " 17,\n", + " 14,\n", + " 18,\n", + " 4,\n", + " 19,\n", + " 17,\n", + " 7,\n", + " 2,\n", + " 8,\n", + " 2,\n", + " 19,\n", + " 15,\n", + " 18,\n", + " 0,\n", + " 0,\n", + " 4,\n", + " 7,\n", + " 11,\n", + " 3,\n", + " 7,\n", + " 18,\n", + " 5,\n", + " 23,\n", + " 18,\n", + " 14,\n", + " 0,\n", + " 14,\n", + " 19,\n", + " 2,\n", + " 19,\n", + " 1,\n", + " 1,\n", + " 18,\n", + " 14,\n", + " 4,\n", + " 8,\n", + " 17,\n", + " 13,\n", + " 18,\n", + " 0,\n", + " 3,\n", + " 11,\n", + " 24,\n", + " 19,\n", + " 17,\n", + " 17,\n", + " 20,\n", + " 13,\n", + " 17,\n", + " 2,\n", + " 4,\n", + " 15,\n", + " 19,\n", + " 19,\n", + " 7,\n", + " 17,\n", + " 4,\n", + " 20,\n", + " 7,\n", + " 13,\n", + " 10,\n", + " 19,\n", + " 0,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 4,\n", + " 4,\n", + " 11,\n", + " 17,\n", + " 22,\n", + " 13,\n", + " 8,\n", + " 17,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 0,\n", + " 4,\n", + " 18,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 8,\n", + " 3,\n", + " 8,\n", + " 18,\n", + " 14,\n", + " 6,\n", + " 2,\n", + " 4,\n", + " 14,\n", + " 12,\n", + " 13,\n", + " 17,\n", + " 19,\n", + " 4,\n", + " 9,\n", + " 7,\n", + " 0,\n", + " 6,\n", + " 0,\n", + " 1,\n", + " 18,\n", + " 4,\n", + " 13,\n", + " 8,\n", + " 19,\n", + " 11,\n", + " 22,\n", + " 19,\n", + " 17,\n", + " 13,\n", + " 1,\n", + " 12,\n", + " 8,\n", + " 4,\n", + " 11,\n", + " 18,\n", + " 0,\n", + " 17,\n", + " 4,\n", + " 19,\n", + " 4,\n", + " 18,\n", + " 17,\n", + " 13,\n", + " 6,\n", + " 18,\n", + " 13,\n", + " 7,\n", + " 4,\n", + " 1,\n", + " 8,\n", + " 14,\n", + " 18,\n", + " 3,\n", + " 8,\n", + " 4,\n", + " 13,\n", + " 0,\n", + " 5,\n", + " 11,\n", + " 4,\n", + " 8,\n", + " 18,\n", + " 0,\n", + " 7,\n", + " 14,\n", + " 2,\n", + " 8,\n", + " 5,\n", + " 4,\n", + " 21,\n", + " 12,\n", + " 5,\n", + " 0,\n", + " 19,\n", + " 0,\n", + " 13,\n", + " 0,\n", + " 19,\n", + " 17,\n", + " 13,\n", + " 8,\n", + " 0,\n", + " 6,\n", + " 13,\n", + " 7,\n", + " 0,\n", + " 19,\n", + " 13,\n", + " 12,\n", + " 8,\n", + " 1,\n", + " 13,\n", + " 8,\n", + " 20,\n", + " 5,\n", + " 4,\n", + " 13,\n", + " 17,\n", + " 19,\n", + " 14,\n", + " 19,\n", + " 19,\n", + " 17,\n", + " 13,\n", + " 24,\n", + " 15,\n", + " 0,\n", + " 8,\n", + " 3,\n", + " 24,\n", + " 8,\n", + " 4,\n", + " 6,\n", + " 3,\n", + " 13,\n", + " 12,\n", + " 4,\n", + " 17,\n", + " 7,\n", + " 7,\n", + " 8,\n", + " 14,\n", + " 19,\n", + " 17,\n", + " 4,\n", + " 19,\n", + " 2,\n", + " 4,\n", + " 18,\n", + " 18,\n", + " 4,\n", + " 8,\n", + " 11,\n", + " 3,\n", + " 17,\n", + " 1,\n", + " 2,\n", + " 4,\n", + " 15,\n", + " 17,\n", + " 8,\n", + " 6,\n", + " 0,\n", + " 4,\n", + " 18,\n", + " 14,\n", + " 0,\n", + " 3,\n", + " 11,\n", + " 19,\n", + " 0,\n", + " 7,\n", + " 8,\n", + " 4,\n", + " 21,\n", + " 4,\n", + " 1,\n", + " 17,\n", + " 2,\n", + " 4,\n", + " 13,\n", + " 11,\n", + " 4,\n", + " 21,\n", + " 0,\n", + " 18,\n", + " 0,\n", + " 3,\n", + " 13,\n", + " 13,\n", + " 19,\n", + " 7,\n", + " 13,\n", + " 4,\n", + " 8,\n", + " 19,\n", + " 4,\n", + " 8,\n", + " 8,\n", + " 18,\n", + " 0,\n", + " 7,\n", + " 20,\n", + " 7,\n", + " 7,\n", + " 20,\n", + " 0,\n", + " 12,\n", + " 14,\n", + " 13,\n", + " 4,\n", + " 5,\n", + " 24,\n", + " 7,\n", + " 11,\n", + " 14,\n", + " 13,\n", + " 22,\n", + " 7,\n", + " 0,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 4,\n", + " 14,\n", + " 18,\n", + " 13,\n", + " 4,\n", + " 4,\n", + " 24,\n", + " 0,\n", + " 13,\n", + " 4,\n", + " 8,\n", + " 18,\n", + " 4,\n", + " 19,\n", + " 14,\n", + " 6,\n", + " 24,\n", + " 8,\n", + " 19,\n", + " 4,\n", + " 17,\n", + " 11,\n", + " 8,\n", + " 7,\n", + " 19,\n", + " 2,\n", + " 12,\n", + " 8,\n", + " 14,\n", + " 8,\n", + " 17,\n", + " 0,\n", + " 17,\n", + " 5,\n", + " 3,\n", + " 14,\n", + " 4,\n", + " 19,\n", + " 13,\n", + " 8,\n", + " 7,\n", + " 19,\n", + " 13,\n", + " 4,\n", + " 7,\n", + " 8,\n", + " 8,\n", + " 10,\n", + " 0,\n", + " 12,\n", + " 17,\n", + " 3,\n", + " 12,\n", + " 13,\n", + " 0,\n", + " 3,\n", + " 0,\n", + " 13,\n", + " 0,\n", + " 14,\n", + " 3,\n", + " 18,\n", + " 4,\n", + " 18,\n", + " 4,\n", + " 8,\n", + " 24,\n", + " 2,\n", + " 11,\n", + " 18,\n", + " 8,\n", + " 0,\n", + " 13,\n", + " 19,\n", + " 0,\n", + " 14,\n", + " 11,\n", + " 19,\n", + " 2,\n", + " 8,\n", + " 24,\n", + " 12,\n", + " 8,\n", + " 3,\n", + " 4,\n", + " 13,\n", + " 19,\n", + " 19,\n", + " 7,\n", + " 11,\n", + " 19,\n", + " 13,\n", + " 3,\n", + " 23,\n", + " 19,\n", + " 19,\n", + " 19,\n", + " 12,\n", + " 0,\n", + " 18,\n", + " 1,\n", + " 11,\n", + " 4,\n", + " 0,\n", + " 4,\n", + " 4,\n", + " 19,\n", + " 11,\n", + " 8,\n", + " 18,\n", + " 8,\n", + " 17,\n", + " 19,\n", + " 22,\n", + " 19,\n", + " 20,\n", + " 17,\n", + " 15,\n", + " 5,\n", + " 0,\n", + " 8,\n", + " 11,\n", + " 19,\n", + " 4,\n", + " 0,\n", + " 14,\n", + " 4,\n", + " 5,\n", + " 4,\n", + " 8,\n", + " 18,\n", + " 8,\n", + " 8,\n", + " 8,\n", + " 24,\n", + " 8,\n", + " 18,\n", + " 8,\n", + " 10,\n", + " 21,\n", + " 19,\n", + " 22,\n", + " 8,\n", + " 18,\n", + " 15,\n", + " 17,\n", + " 1,\n", + " 18,\n", + " 8,\n", + " 13,\n", + " 4,\n", + " 11,\n", + " 15,\n", + " 7,\n", + " 17,\n", + " 12,\n", + " 14,\n", + " 7,\n", + " 8,\n", + " 0,\n", + " 6,\n", + " 13,\n", + " 11,\n", + " 18,\n", + " 11,\n", + " 21,\n", + " 8,\n", + " 19,\n", + " 14,\n", + " 3,\n", + " 0,\n", + " 8,\n", + " 18,\n", + " 3,\n", + " 15,\n", + " 13,\n", + " 24,\n", + " 3,\n", + " 3,\n", + " 2,\n", + " 0,\n", + " 0,\n", + " 14,\n", + " 19,\n", + " 0,\n", + " 7,\n", + " 2,\n", + " 4,\n", + " 7,\n", + " 19,\n", + " 20,\n", + " 4,\n", + " 8,\n", + " 17,\n", + " 17,\n", + " 4,\n", + " 3,\n", + " 0,\n", + " 4,\n", + " 2,\n", + " 19,\n", + " 14,\n", + " 18,\n", + " 13,\n", + " 17,\n", + " 7,\n", + " 21,\n", + " 13,\n", + " 0,\n", + " 14,\n", + " 3,\n", + " 14,\n", + " 8,\n", + " 10,\n", + " 14,\n", + " 4,\n", + " 19,\n", + " 2,\n", + " 8,\n", + " 13,\n", + " 4,\n", + " 13,\n", + " 4,\n", + " 20,\n", + " 17,\n", + " 17,\n", + " 8,\n", + " 18,\n", + " 3,\n", + " 2,\n", + " 14,\n", + " 20,\n", + " 17,\n", + " 0,\n", + " 6,\n", + " 11,\n", + " 21,\n", + " 8,\n", + " 12,\n", + " 12,\n", + " 20,\n", + " 15,\n", + " 15,\n", + " 3,\n", + " 8,\n", + " 19,\n", + " 4,\n", + " 0,\n", + " 13,\n", + " 3,\n", + " 8,\n", + " 19,\n", + " 12,\n", + " 0,\n", + " 0,\n", + " 8,\n", + " 0,\n", + " 8,\n", + " 4,\n", + " 11,\n", + " 4,\n", + " 14,\n", + " 13,\n", + " 13,\n", + " 17,\n", + " 4,\n", + " 4,\n", + " 3,\n", + " 0,\n", + " 14,\n", + " 3,\n", + " 1,\n", + " 14,\n", + " 8,\n", + " 20,\n", + " 12,\n", + " 4,\n", + " 11,\n", + " 17,\n", + " 14,\n", + " 19,\n", + " 13,\n", + " 19,\n", + " 19,\n", + " 19,\n", + " 6,\n", + " 8,\n", + " 19,\n", + " 13,\n", + " ...]" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(int(c, 2)) for c in chunks(c8b, 5)]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "24" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max([(int(c, 2)) for c in chunks(c8b, 5)])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'y'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max([chr(int(c, 2) + ord('a')) for c in chunks(c8b, 5)])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def cadenus_letter(n, doubled='v'):\n", + " letter = chr(n + ord('a'))\n", + " if letter > doubled:\n", + " letter = chr(n + ord('a') + 1)\n", + " return letter" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdtoipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlimlpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxsoaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaeseeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypaidyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogyiterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsiantaoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefeisiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghynweintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeemrpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylonahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "c8bl = ''.join([cadenus_letter(int(c, 2), doubled='z') for c in chunks(c8b, 5)])\n", + "c8bl" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "('a', 'y')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "min(c8bl), max(c8bl)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(1400, 56.0)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(c8bl), len(c8bl) / 25" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nNbxLWGOjAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "freqs_8b = pd.Series(collections.Counter([l.lower() for l in c8bl if l in string.ascii_letters]))\n", + "freqs_8b.plot(kind='bar')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "freqs = pd.Series(english_counts)\n", + "freqs.plot(kind='bar')" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefe',\n", + " 'ofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsv',\n", + " 'sielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiie',\n", + " 'rwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdto',\n", + " 'ipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlim',\n", + " 'lpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaee',\n", + " 'isciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonn',\n", + " 'asgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxs',\n", + " 'oaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaes',\n", + " 'eeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebios',\n", + " 'dienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypai',\n", + " 'dyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlev',\n", + " 'asadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogy',\n", + " 'iterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsian',\n", + " 'taoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefe',\n", + " 'isiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaota',\n", + " 'hcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmu',\n", + " 'ppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienni',\n", + " 'klysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepo',\n", + " 'ynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghyn',\n", + " 'weintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaa',\n", + " 'noeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeem',\n", + " 'rpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylon',\n", + " 'ahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatef',\n", + " 'aaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda']" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rows = chunks(c8bl, len(c8bl) // 25)\n", + "rows" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['a..ae....a..h....e..se..hsh..ah....p...e.a.pp.....e..e.e',\n", + " '......s...ee..s...e...e..aa.s...e.......e.h.ah.a.e.ee.s.',\n", + " 's.e.h..s...a...aes.........h.hh.s.a......ss...ea..ee...e',\n", + " '...a.es.....e...ss..p...a.sa.ae.ae........e...pssha.h...',\n", + " '.paa.e.e..esa......es.......p..e......a.a.ee............',\n", + " '.ps...e......a..eee..a...e.sa.h...s...e..s.........p.aee',\n", + " '.s...h.pse.ee..e..a..he..ea...h...ep...a..h.e....p..e...',\n", + " 'as..e..eee.aa..........a..es..se..se..h....psaaeh..hs..s',\n", + " '.a......s.e...sa..........ep..h.e.h...a.e.ee......eeeaes',\n", + " 'eee...s...e.....e.ha.a.se...........e.sa.e.es...s.he...s',\n", + " '..e.a..e.sah....e...a.a.a....a..ha.........e.........pa.',\n", + " '...e....e.hh....e..esse......ep...aes.a...ah.e.e...e..e.',\n", + " 'asa....h.e..e..sah.hh.a...e..h....haeeee.s.ee.a.e.se....',\n", + " '..e...h.......a....e...h..eh...a.....a.a.a..sese....s.a.',\n", + " '.a.........e...h.........as..eaee...s.......p.a...ea.e.e',\n", + " '.s.....s......sp..s..e.ph...h.a...s......a.s.p.....aa..a',\n", + " 'h.eh..e...e.ae...s..h..a......e....e.e....s.....a.......',\n", + " 'pp...ea.....aa.a.e.e....ee.a.......e................e...',\n", + " '...s..s.....p.p....ss...e.as...s..ea......h..h...p...ep.',\n", + " '..a.s..s..sa.es...ae......a..eea.s.......s..ha.e...s.h..',\n", + " '.e...e......ee..a...s..aae...........eh............a..aa',\n", + " '..ee.....h.s...ea...e.e.e....a....pe....aha...e......ee.',\n", + " '.pa.....a.es..ssp....ee...a.h....ss.s..p......p.aeea....',\n", + " 'aha.........a....e...a.e..........ee........e...aheea.e.',\n", + " 'aaep.....shee..pa.e..e......e..h.es......s.s........p..a']" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chunks(''.join([l if l in 'phase' else '.' for l in c8bl]), 56)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['aosriliaoeddaitihpkywnraa',\n", + " 'ffiwppssaeiystascplneopha',\n", + " 'cietascgoeeiaeoiedyaieaae',\n", + " 'aolaatidtinedrlihislneoup',\n", + " 'erhntooecdagnltittostlltr',\n", + " 'utleelhdtifdnicyuegnedinr',\n", + " 'ososxeiobslnthiieasvgottc',\n", + " 'tdsrefpeboemhtysintsoiocr',\n", + " 'tdtvntsesgiencmirdcddnano',\n", + " 'aodonreeocsremikriioihfts',\n", + " 'ceogedvoeeahiidvetfsiuech',\n", + " 'teaismeaiohhtoetdmyalssbe',\n", + " 'huleauearmoieinwaapnegoae',\n", + " 'rmoigadmnncoirtieaieeiowr',\n", + " 'isyyrrttsritiatscipsdtslr',\n", + " 'ocawoiecatfrsrhptavitesop',\n", + " 'lresbewideeeaflroiitaapna',\n", + " 'eusstefcljvthdtbsedfrofel',\n", + " 'temdleatyhmcuonsnlvanrnfe',\n", + " 'crngeirttafehedireseoiltd',\n", + " 'snnpsinirgashtxnhosnsenoi',\n", + " 'efdvrahfratsuntevnmlrceae',\n", + " 'reionoenubaeaitlnnntceetn',\n", + " 'ttgirlbansnimhtparcgavoeg',\n", + " 'hlnaonldrealotmhoeeoaeoci',\n", + " 'saniieercntdnnardeidemtvd',\n", + " 'harsrwaeeirreesmodaannaor',\n", + " 'tfhaysosptnbfhboiastdtcwr',\n", + " 'rsoopatrtlicyilhkoittrhde',\n", + " 'athaboottwaehieiodiecallo',\n", + " 'hwheghhshtgplkaaebteutlwu',\n", + " 'kitoerterrnroaegtosatmivh',\n", + " 'yesadttrenhinmencinittrnv',\n", + " 'onnecltoubagwrtliunsffsne',\n", + " 'rtadlseshmtahdlsnmeidpses',\n", + " 'prorltpenineamileeacrexeu',\n", + " 'fviniontkemsensvnltrbusdr',\n", + " 'roliwbcrtlioeaiierioecoto',\n", + " 'gontaekhasbaedrtuotohufiy',\n", + " 'encrltaccandeatortotttpit',\n", + " 'oennanoierilonwdrnmmmadon',\n", + " 'arsxlsncceutsataitrsfhfis',\n", + " 'dhseelhtetfanouisthmiatgo',\n", + " 'puiievwpeeehedrsdtbftmfts',\n", + " 'pacgnfeslsniespdcgnhotrei',\n", + " 'jhrriitarrreyefpoihaonngn',\n", + " 'nrepgvmawntvasanutnurepmu',\n", + " 'gaasrdvengoeneiyrniedwrti',\n", + " 'lvnsroyhistbeildardnroaau',\n", + " 'tenhnvplrntriytdglpiunehi',\n", + " 'ereawtrdehrcsceclrrriieeo',\n", + " 'reedyprheeneelaavilsacaef',\n", + " 'neihroesebyntsoaiergodyap',\n", + " 'etidlaofaiploieomnehyeltr',\n", + " 'fsitienxeoaegaftmnpyaeoed',\n", + " 'eveomensssivyneauionamnfa']" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "columns = [''.join(c) for c in zip(*rows)]\n", + "columns" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'a': [(0, 0),\n", + " (0, 3),\n", + " (0, 9),\n", + " (0, 29),\n", + " (0, 41),\n", + " (1, 25),\n", + " (1, 26),\n", + " (1, 44),\n", + " (1, 47),\n", + " (2, 11),\n", + " (2, 15),\n", + " (2, 34),\n", + " (2, 47),\n", + " (3, 3),\n", + " (3, 24),\n", + " (3, 27),\n", + " (3, 29),\n", + " (3, 32),\n", + " (3, 50),\n", + " (4, 2),\n", + " (4, 3),\n", + " (4, 12),\n", + " (4, 38),\n", + " (4, 40),\n", + " (5, 13),\n", + " (5, 21),\n", + " (5, 28),\n", + " (5, 53),\n", + " (6, 18),\n", + " (6, 26),\n", + " (6, 39),\n", + " (7, 0),\n", + " (7, 11),\n", + " (7, 12),\n", + " (7, 23),\n", + " (7, 45),\n", + " (7, 46),\n", + " (8, 1),\n", + " (8, 15),\n", + " (8, 38),\n", + " (8, 53),\n", + " (9, 19),\n", + " (9, 21),\n", + " (9, 39),\n", + " (10, 4),\n", + " (10, 10),\n", + " (10, 20),\n", + " (10, 22),\n", + " (10, 24),\n", + " (10, 29),\n", + " (10, 33),\n", + " (10, 54),\n", + " (11, 34),\n", + " (11, 38),\n", + " (11, 42),\n", + " (12, 0),\n", + " (12, 2),\n", + " (12, 16),\n", + " (12, 22),\n", + " (12, 35),\n", + " (12, 46),\n", + " (13, 14),\n", + " (13, 31),\n", + " (13, 37),\n", + " (13, 39),\n", + " (13, 41),\n", + " (13, 54),\n", + " (14, 1),\n", + " (14, 25),\n", + " (14, 30),\n", + " (14, 46),\n", + " (14, 51),\n", + " (15, 30),\n", + " (15, 41),\n", + " (15, 51),\n", + " (15, 52),\n", + " (15, 55),\n", + " (16, 12),\n", + " (16, 23),\n", + " (16, 48),\n", + " (17, 6),\n", + " (17, 12),\n", + " (17, 13),\n", + " (17, 15),\n", + " (17, 27),\n", + " (18, 26),\n", + " (18, 35),\n", + " (19, 2),\n", + " (19, 11),\n", + " (19, 18),\n", + " (19, 26),\n", + " (19, 31),\n", + " (19, 45),\n", + " (20, 16),\n", + " (20, 23),\n", + " (20, 24),\n", + " (20, 51),\n", + " (20, 54),\n", + " (20, 55),\n", + " (21, 16),\n", + " (21, 29),\n", + " (21, 40),\n", + " (21, 42),\n", + " (22, 2),\n", + " (22, 8),\n", + " (22, 26),\n", + " (22, 48),\n", + " (22, 51),\n", + " (23, 0),\n", + " (23, 2),\n", + " (23, 12),\n", + " (23, 21),\n", + " (23, 48),\n", + " (23, 52),\n", + " (24, 0),\n", + " (24, 1),\n", + " (24, 16),\n", + " (24, 55)],\n", + " 'e': [(0, 4),\n", + " (0, 17),\n", + " (0, 21),\n", + " (0, 39),\n", + " (0, 50),\n", + " (0, 53),\n", + " (0, 55),\n", + " (1, 10),\n", + " (1, 11),\n", + " (1, 18),\n", + " (1, 22),\n", + " (1, 32),\n", + " (1, 40),\n", + " (1, 49),\n", + " (1, 51),\n", + " (1, 52),\n", + " (2, 2),\n", + " (2, 16),\n", + " (2, 46),\n", + " (2, 50),\n", + " (2, 51),\n", + " (2, 55),\n", + " (3, 5),\n", + " (3, 12),\n", + " (3, 30),\n", + " (3, 33),\n", + " (3, 42),\n", + " (4, 5),\n", + " (4, 7),\n", + " (4, 10),\n", + " (4, 19),\n", + " (4, 31),\n", + " (4, 42),\n", + " (4, 43),\n", + " (5, 6),\n", + " (5, 16),\n", + " (5, 17),\n", + " (5, 18),\n", + " (5, 25),\n", + " (5, 38),\n", + " (5, 54),\n", + " (5, 55),\n", + " (6, 9),\n", + " (6, 11),\n", + " (6, 12),\n", + " (6, 15),\n", + " (6, 22),\n", + " (6, 25),\n", + " (6, 34),\n", + " (6, 44),\n", + " (6, 52),\n", + " (7, 4),\n", + " (7, 7),\n", + " (7, 8),\n", + " (7, 9),\n", + " (7, 26),\n", + " (7, 31),\n", + " (7, 35),\n", + " (7, 47),\n", + " (8, 10),\n", + " (8, 26),\n", + " (8, 32),\n", + " (8, 40),\n", + " (8, 42),\n", + " (8, 43),\n", + " (8, 50),\n", + " (8, 51),\n", + " (8, 52),\n", + " (8, 54),\n", + " (9, 0),\n", + " (9, 1),\n", + " (9, 2),\n", + " (9, 10),\n", + " (9, 16),\n", + " (9, 24),\n", + " (9, 36),\n", + " (9, 41),\n", + " (9, 43),\n", + " (9, 51),\n", + " (10, 2),\n", + " (10, 7),\n", + " (10, 16),\n", + " (10, 43),\n", + " (11, 3),\n", + " (11, 8),\n", + " (11, 16),\n", + " (11, 19),\n", + " (11, 22),\n", + " (11, 29),\n", + " (11, 35),\n", + " (11, 45),\n", + " (11, 47),\n", + " (11, 51),\n", + " (11, 54),\n", + " (12, 9),\n", + " (12, 12),\n", + " (12, 26),\n", + " (12, 36),\n", + " (12, 37),\n", + " (12, 38),\n", + " (12, 39),\n", + " (12, 43),\n", + " (12, 44),\n", + " (12, 48),\n", + " (12, 51),\n", + " (13, 2),\n", + " (13, 19),\n", + " (13, 26),\n", + " (13, 45),\n", + " (13, 47),\n", + " (14, 11),\n", + " (14, 29),\n", + " (14, 31),\n", + " (14, 32),\n", + " (14, 50),\n", + " (14, 53),\n", + " (14, 55),\n", + " (15, 21),\n", + " (16, 2),\n", + " (16, 6),\n", + " (16, 10),\n", + " (16, 13),\n", + " (16, 30),\n", + " (16, 35),\n", + " (16, 37),\n", + " (17, 5),\n", + " (17, 17),\n", + " (17, 19),\n", + " (17, 24),\n", + " (17, 25),\n", + " (17, 35),\n", + " (17, 52),\n", + " (18, 24),\n", + " (18, 34),\n", + " (18, 53),\n", + " (19, 13),\n", + " (19, 19),\n", + " (19, 29),\n", + " (19, 30),\n", + " (19, 47),\n", + " (20, 1),\n", + " (20, 5),\n", + " (20, 12),\n", + " (20, 13),\n", + " (20, 25),\n", + " (20, 37),\n", + " (21, 2),\n", + " (21, 3),\n", + " (21, 15),\n", + " (21, 20),\n", + " (21, 22),\n", + " (21, 24),\n", + " (21, 35),\n", + " (21, 46),\n", + " (21, 53),\n", + " (21, 54),\n", + " (22, 10),\n", + " (22, 21),\n", + " (22, 22),\n", + " (22, 49),\n", + " (22, 50),\n", + " (23, 17),\n", + " (23, 23),\n", + " (23, 34),\n", + " (23, 35),\n", + " (23, 44),\n", + " (23, 50),\n", + " (23, 51),\n", + " (23, 54),\n", + " (24, 2),\n", + " (24, 11),\n", + " (24, 12),\n", + " (24, 18),\n", + " (24, 21),\n", + " (24, 28),\n", + " (24, 33)],\n", + " 'h': [(0, 12),\n", + " (0, 24),\n", + " (0, 26),\n", + " (0, 30),\n", + " (1, 42),\n", + " (1, 45),\n", + " (2, 4),\n", + " (2, 27),\n", + " (2, 29),\n", + " (2, 30),\n", + " (3, 49),\n", + " (3, 52),\n", + " (5, 30),\n", + " (6, 5),\n", + " (6, 21),\n", + " (6, 30),\n", + " (6, 42),\n", + " (7, 38),\n", + " (7, 48),\n", + " (7, 51),\n", + " (8, 30),\n", + " (8, 34),\n", + " (9, 18),\n", + " (9, 50),\n", + " (10, 11),\n", + " (10, 32),\n", + " (11, 10),\n", + " (11, 11),\n", + " (11, 43),\n", + " (12, 7),\n", + " (12, 17),\n", + " (12, 19),\n", + " (12, 20),\n", + " (12, 29),\n", + " (12, 34),\n", + " (13, 6),\n", + " (13, 23),\n", + " (13, 27),\n", + " (14, 15),\n", + " (15, 24),\n", + " (15, 28),\n", + " (16, 0),\n", + " (16, 3),\n", + " (16, 20),\n", + " (18, 42),\n", + " (18, 45),\n", + " (19, 44),\n", + " (19, 53),\n", + " (20, 38),\n", + " (21, 9),\n", + " (21, 41),\n", + " (22, 28),\n", + " (23, 1),\n", + " (23, 49),\n", + " (24, 10),\n", + " (24, 31)],\n", + " 'n': [(0, 46),\n", + " (0, 52),\n", + " (1, 20),\n", + " (1, 33),\n", + " (1, 39),\n", + " (2, 19),\n", + " (2, 20),\n", + " (2, 24),\n", + " (2, 25),\n", + " (2, 33),\n", + " (2, 38),\n", + " (2, 40),\n", + " (2, 48),\n", + " (2, 49),\n", + " (3, 4),\n", + " (3, 36),\n", + " (3, 40),\n", + " (4, 8),\n", + " (4, 9),\n", + " (4, 22),\n", + " (4, 44),\n", + " (4, 49),\n", + " (5, 24),\n", + " (5, 40),\n", + " (6, 20),\n", + " (6, 36),\n", + " (6, 41),\n", + " (6, 54),\n", + " (6, 55),\n", + " (7, 22),\n", + " (8, 13),\n", + " (8, 23),\n", + " (8, 35),\n", + " (8, 47),\n", + " (9, 13),\n", + " (9, 25),\n", + " (9, 32),\n", + " (9, 46),\n", + " (9, 49),\n", + " (10, 3),\n", + " (10, 23),\n", + " (10, 27),\n", + " (10, 31),\n", + " (10, 35),\n", + " (10, 39),\n", + " (10, 44),\n", + " (10, 51),\n", + " (11, 6),\n", + " (11, 52),\n", + " (12, 4),\n", + " (12, 5),\n", + " (12, 8),\n", + " (12, 25),\n", + " (12, 32),\n", + " (12, 42),\n", + " (12, 47),\n", + " (13, 21),\n", + " (13, 25),\n", + " (13, 36),\n", + " (13, 40),\n", + " (13, 55),\n", + " (14, 12),\n", + " (14, 18),\n", + " (15, 20),\n", + " (15, 32),\n", + " (15, 46),\n", + " (16, 18),\n", + " (16, 22),\n", + " (16, 34),\n", + " (16, 36),\n", + " (17, 7),\n", + " (17, 21),\n", + " (17, 22),\n", + " (17, 40),\n", + " (17, 47),\n", + " (17, 53),\n", + " (17, 54),\n", + " (18, 22),\n", + " (18, 32),\n", + " (18, 33),\n", + " (18, 44),\n", + " (18, 46),\n", + " (19, 1),\n", + " (19, 5),\n", + " (19, 12),\n", + " (19, 20),\n", + " (19, 48),\n", + " (19, 55),\n", + " (20, 3),\n", + " (20, 18),\n", + " (20, 26),\n", + " (21, 0),\n", + " (21, 8),\n", + " (21, 26),\n", + " (21, 45),\n", + " (21, 49),\n", + " (22, 18),\n", + " (22, 20),\n", + " (22, 45),\n", + " (22, 55),\n", + " (23, 5),\n", + " (23, 8),\n", + " (23, 16),\n", + " (23, 32),\n", + " (23, 33),\n", + " (24, 22),\n", + " (24, 40),\n", + " (24, 45)],\n", + " 'p': [(0, 35),\n", + " (0, 43),\n", + " (0, 44),\n", + " (3, 20),\n", + " (3, 46),\n", + " (4, 1),\n", + " (4, 28),\n", + " (5, 1),\n", + " (5, 51),\n", + " (6, 7),\n", + " (6, 35),\n", + " (6, 49),\n", + " (7, 43),\n", + " (8, 27),\n", + " (10, 53),\n", + " (11, 30),\n", + " (14, 44),\n", + " (15, 15),\n", + " (15, 23),\n", + " (15, 45),\n", + " (17, 0),\n", + " (17, 1),\n", + " (18, 12),\n", + " (18, 14),\n", + " (18, 49),\n", + " (18, 54),\n", + " (21, 34),\n", + " (22, 1),\n", + " (22, 16),\n", + " (22, 39),\n", + " (22, 46),\n", + " (24, 3),\n", + " (24, 15),\n", + " (24, 52)],\n", + " 's': [(0, 20),\n", + " (0, 25),\n", + " (1, 6),\n", + " (1, 14),\n", + " (1, 28),\n", + " (1, 54),\n", + " (2, 0),\n", + " (2, 7),\n", + " (2, 17),\n", + " (2, 32),\n", + " (2, 41),\n", + " (2, 42),\n", + " (3, 6),\n", + " (3, 16),\n", + " (3, 17),\n", + " (3, 26),\n", + " (3, 47),\n", + " (3, 48),\n", + " (4, 11),\n", + " (4, 20),\n", + " (5, 2),\n", + " (5, 27),\n", + " (5, 34),\n", + " (5, 41),\n", + " (6, 1),\n", + " (6, 8),\n", + " (7, 1),\n", + " (7, 27),\n", + " (7, 30),\n", + " (7, 34),\n", + " (7, 44),\n", + " (7, 52),\n", + " (7, 55),\n", + " (8, 8),\n", + " (8, 14),\n", + " (8, 55),\n", + " (9, 6),\n", + " (9, 23),\n", + " (9, 38),\n", + " (9, 44),\n", + " (9, 48),\n", + " (9, 55),\n", + " (10, 9),\n", + " (11, 20),\n", + " (11, 21),\n", + " (11, 36),\n", + " (12, 1),\n", + " (12, 15),\n", + " (12, 41),\n", + " (12, 50),\n", + " (13, 44),\n", + " (13, 46),\n", + " (13, 52),\n", + " (14, 26),\n", + " (14, 36),\n", + " (15, 1),\n", + " (15, 7),\n", + " (15, 14),\n", + " (15, 18),\n", + " (15, 34),\n", + " (15, 43),\n", + " (16, 17),\n", + " (16, 42),\n", + " (18, 3),\n", + " (18, 6),\n", + " (18, 19),\n", + " (18, 20),\n", + " (18, 27),\n", + " (18, 31),\n", + " (19, 4),\n", + " (19, 7),\n", + " (19, 10),\n", + " (19, 14),\n", + " (19, 33),\n", + " (19, 41),\n", + " (19, 51),\n", + " (20, 20),\n", + " (21, 11),\n", + " (22, 11),\n", + " (22, 14),\n", + " (22, 15),\n", + " (22, 33),\n", + " (22, 34),\n", + " (22, 36),\n", + " (24, 9),\n", + " (24, 34),\n", + " (24, 41),\n", + " (24, 43)],\n", + " 'v': [(1, 36),\n", + " (1, 48),\n", + " (1, 55),\n", + " (3, 8),\n", + " (3, 21),\n", + " (5, 43),\n", + " (5, 46),\n", + " (5, 49),\n", + " (6, 10),\n", + " (6, 47),\n", + " (10, 17),\n", + " (11, 46),\n", + " (11, 55),\n", + " (15, 10),\n", + " (15, 36),\n", + " (16, 21),\n", + " (16, 51),\n", + " (18, 15),\n", + " (18, 18),\n", + " (19, 6),\n", + " (21, 23),\n", + " (23, 25),\n", + " (23, 31),\n", + " (24, 32)]}" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "letter_positions = {letter: [(r, c) for r, row in enumerate(rows) for c, char in enumerate(row) if char == letter] \n", + " for letter in deduplicate('phaseseven')}\n", + "letter_positions" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{0: 'a',\n", + " 1: 'z',\n", + " 2: 'y',\n", + " 3: 'x',\n", + " 4: 'v',\n", + " 5: 'u',\n", + " 6: 't',\n", + " 7: 's',\n", + " 8: 'r',\n", + " 9: 'q',\n", + " 10: 'p',\n", + " 11: 'o',\n", + " 12: 'n',\n", + " 13: 'm',\n", + " 14: 'l',\n", + " 15: 'k',\n", + " 16: 'j',\n", + " 17: 'i',\n", + " 18: 'h',\n", + " 19: 'g',\n", + " 20: 'f',\n", + " 21: 'e',\n", + " 22: 'd',\n", + " 23: 'c',\n", + " 24: 'b'}" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "keycolumn = make_cadenus_keycolumn(reverse=True)\n", + "inverse_keycolumn = {v: l for l, v in keycolumn.items()}\n", + "inverse_keycolumn" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def valid_partial_solution(solution, inverse_keycolumn):\n", + " row_indices = [p[0] for p in sorted(solution, key=lambda x: x[1])]\n", + " row_letters = [inverse_keycolumn[i] for i in row_indices]\n", + " letter_pairs = ngrams(row_letters, 2)\n", + " return all(p[0] <= p[1] for p in letter_pairs)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "43005" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "solutions = [[p] for p in letter_positions['p']]\n", + "for letter in 'ha': #'haseseven':\n", + " new_solutions = []\n", + " for solution in solutions:\n", + " used_columns = [p[1] for p in solution]\n", + " for position in letter_positions[letter]:\n", + " if position[1] not in used_columns:\n", + " if valid_partial_solution(solution + [position], inverse_keycolumn):\n", + " new_solutions += [solution + [position]]\n", + " solutions = new_solutions\n", + "len(solutions)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "valid_partial_solution(solutions[1], inverse_keycolumn)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['pha',\n", + " 'ruo',\n", + " 'oll',\n", + " 'rea',\n", + " 'laa',\n", + " 'tut',\n", + " 'pei',\n", + " 'ead',\n", + " 'nrt',\n", + " 'imi',\n", + " 'non',\n", + " 'eie',\n", + " 'aed',\n", + " 'mir',\n", + " 'inl',\n", + " 'lwi',\n", + " 'eah',\n", + " 'eai',\n", + " 'aps',\n", + " 'cnl',\n", + " 'ren',\n", + " 'ege',\n", + " 'xoo',\n", + " 'eau',\n", + " 'uep']" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "display = []\n", + "for p in solutions[1]:\n", + " this_column = columns[p[1]]\n", + " rotated_column = this_column[p[0]:] + this_column[:p[0]]\n", + " display += [rotated_column]\n", + "display_rows = [''.join(r) for r in zip(*display)]\n", + "display_rows" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def display_solution(solution, columns):\n", + " display = []\n", + " for p in solution:\n", + " this_column = columns[p[1]]\n", + " rotated_column = this_column[p[0]:] + this_column[:p[0]]\n", + " display += [rotated_column]\n", + " return [''.join(r) for r in zip(*display)]" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['pha',\n", + " 'ruo',\n", + " 'ols',\n", + " 'rer',\n", + " 'lai',\n", + " 'tul',\n", + " 'pei',\n", + " 'eaa',\n", + " 'nro',\n", + " 'ime',\n", + " 'nod',\n", + " 'eid',\n", + " 'aea',\n", + " 'mii',\n", + " 'int',\n", + " 'lwi',\n", + " 'eah',\n", + " 'eap',\n", + " 'apk',\n", + " 'cny',\n", + " 'rew',\n", + " 'egn',\n", + " 'xor',\n", + " 'eaa',\n", + " 'uea']" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "display_solution(solutions[0], columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "-109.09171451522874" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(Ptrigrams(r) for r in display_rows)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def score_solution(solution, columns):\n", + " display = []\n", + " for p in solution:\n", + " this_column = columns[p[1]]\n", + " rotated_column = this_column[p[0]:] + this_column[:p[0]]\n", + " display += [rotated_column]\n", + " display_rows = [''.join(r) for r in zip(*display)]\n", + " return sum(Ptrigrams(r) for r in display_rows)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[([(0, 35), (0, 12), (0, 0)],\n", + " ['pha',\n", + " 'ruo',\n", + " 'ols',\n", + " 'rer',\n", + " 'lai',\n", + " 'tul',\n", + " 'pei',\n", + " 'eaa',\n", + " 'nro',\n", + " 'ime',\n", + " 'nod',\n", + " 'eid',\n", + " 'aea',\n", + " 'mii',\n", + " 'int',\n", + " 'lwi',\n", + " 'eah',\n", + " 'eap',\n", + " 'apk',\n", + " 'cny',\n", + " 'rew',\n", + " 'egn',\n", + " 'xor',\n", + " 'eaa',\n", + " 'uea'],\n", + " -112.23213925765266),\n", + " ([(0, 35), (0, 12), (0, 3)],\n", + " ['pha',\n", + " 'ruo',\n", + " 'oll',\n", + " 'rea',\n", + " 'laa',\n", + " 'tut',\n", + " 'pei',\n", + " 'ead',\n", + " 'nrt',\n", + " 'imi',\n", + " 'non',\n", + " 'eie',\n", + " 'aed',\n", + " 'mir',\n", + " 'inl',\n", + " 'lwi',\n", + " 'eah',\n", + " 'eai',\n", + " 'aps',\n", + " 'cnl',\n", + " 'ren',\n", + " 'ege',\n", + " 'xoo',\n", + " 'eau',\n", + " 'uep'],\n", + " -109.09171451522874),\n", + " ([(0, 35), (0, 12), (0, 9)],\n", + " ['pha',\n", + " 'ruo',\n", + " 'old',\n", + " 'reo',\n", + " 'lan',\n", + " 'tur',\n", + " 'pee',\n", + " 'eae',\n", + " 'nro',\n", + " 'imc',\n", + " 'nos',\n", + " 'eir',\n", + " 'aee',\n", + " 'mim',\n", + " 'ini',\n", + " 'lwk',\n", + " 'ear',\n", + " 'eai',\n", + " 'api',\n", + " 'cno',\n", + " 'rei',\n", + " 'egh',\n", + " 'xof',\n", + " 'eat',\n", + " 'ues'],\n", + " -105.51902198106185),\n", + " ([(0, 35), (0, 12), (0, 29)],\n", + " ['pha',\n", + " 'rut',\n", + " 'olh',\n", + " 'rea',\n", + " 'lab',\n", + " 'tuo',\n", + " 'peo',\n", + " 'eat',\n", + " 'nrt',\n", + " 'imw',\n", + " 'noa',\n", + " 'eie',\n", + " 'aeh',\n", + " 'mii',\n", + " 'ine',\n", + " 'lwi',\n", + " 'eao',\n", + " 'ead',\n", + " 'api',\n", + " 'cne',\n", + " 'rec',\n", + " 'ega',\n", + " 'xol',\n", + " 'eal',\n", + " 'ueo'],\n", + " -106.91642615054437),\n", + " ([(0, 35), (0, 12), (0, 41)],\n", + " ['pha',\n", + " 'rur',\n", + " 'ols',\n", + " 'rex',\n", + " 'lal',\n", + " 'tus',\n", + " 'pen',\n", + " 'eac',\n", + " 'nrc',\n", + " 'ime',\n", + " 'nou',\n", + " 'eit',\n", + " 'aes',\n", + " 'mia',\n", + " 'int',\n", + " 'lwa',\n", + " 'eai',\n", + " 'eat',\n", + " 'apr',\n", + " 'cns',\n", + " 'ref',\n", + " 'egh',\n", + " 'xof',\n", + " 'eai',\n", + " 'ues'],\n", + " -100.92420426683796),\n", + " ([(0, 35), (0, 12), (1, 44)],\n", + " ['pha',\n", + " 'ruc',\n", + " 'olg',\n", + " 'ren',\n", + " 'laf',\n", + " 'tue',\n", + " 'pes',\n", + " 'eal',\n", + " 'nrs',\n", + " 'imn',\n", + " 'noi',\n", + " 'eie',\n", + " 'aes',\n", + " 'mip',\n", + " 'ind',\n", + " 'lwc',\n", + " 'eag',\n", + " 'ean',\n", + " 'aph',\n", + " 'cno',\n", + " 'ret',\n", + " 'egr',\n", + " 'xoe',\n", + " 'eai',\n", + " 'uep'],\n", + " -108.53207489276411),\n", + " ([(0, 35), (0, 12), (1, 47)],\n", + " ['pha',\n", + " 'rua',\n", + " 'ols',\n", + " 'rer',\n", + " 'lad',\n", + " 'tuv',\n", + " 'pee',\n", + " 'ean',\n", + " 'nrg',\n", + " 'imo',\n", + " 'noe',\n", + " 'ein',\n", + " 'aee',\n", + " 'mii',\n", + " 'iny',\n", + " 'lwr',\n", + " 'ean',\n", + " 'eai',\n", + " 'ape',\n", + " 'cnd',\n", + " 'rew',\n", + " 'egr',\n", + " 'xot',\n", + " 'eai',\n", + " 'ueg'],\n", + " -109.50900823047225),\n", + " ([(0, 35), (0, 12), (2, 47)],\n", + " ['pha',\n", + " 'rus',\n", + " 'olr',\n", + " 'red',\n", + " 'lav',\n", + " 'tue',\n", + " 'pen',\n", + " 'eag',\n", + " 'nro',\n", + " 'ime',\n", + " 'non',\n", + " 'eie',\n", + " 'aei',\n", + " 'miy',\n", + " 'inr',\n", + " 'lwn',\n", + " 'eai',\n", + " 'eae',\n", + " 'apd',\n", + " 'cnw',\n", + " 'rer',\n", + " 'egt',\n", + " 'xoi',\n", + " 'eag',\n", + " 'uea'],\n", + " -114.40196859359595),\n", + " ([(0, 35), (0, 12), (3, 50)],\n", + " ['pha',\n", + " 'ruw',\n", + " 'olt',\n", + " 'rer',\n", + " 'lad',\n", + " 'tue',\n", + " 'peh',\n", + " 'ear',\n", + " 'nrc',\n", + " 'ims',\n", + " 'noc',\n", + " 'eie',\n", + " 'aec',\n", + " 'mil',\n", + " 'inr',\n", + " 'lwr',\n", + " 'ear',\n", + " 'eai',\n", + " 'api',\n", + " 'cne',\n", + " 'ree',\n", + " 'ego',\n", + " 'xoe',\n", + " 'ear',\n", + " 'uee'],\n", + " -106.68850150792129),\n", + " ([(0, 35), (0, 12), (4, 38)],\n", + " ['pha',\n", + " 'rue',\n", + " 'olk',\n", + " 'reh',\n", + " 'laa',\n", + " 'tus',\n", + " 'peb',\n", + " 'eaa',\n", + " 'nre',\n", + " 'imd',\n", + " 'nor',\n", + " 'eit',\n", + " 'aeu',\n", + " 'mio',\n", + " 'int',\n", + " 'lwo',\n", + " 'eah',\n", + " 'eau',\n", + " 'apf',\n", + " 'cni',\n", + " 'rey',\n", + " 'egg',\n", + " 'xoo',\n", + " 'ean',\n", + " 'uet'],\n", + " -108.49770543928673)]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(s, display_solution(s, columns), score_solution(s, columns)) for s in solutions[:10]]" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[[(0, 35), (0, 12), (0, 41)],\n", + " [(0, 35), (0, 12), (0, 9)],\n", + " [(0, 35), (0, 12), (3, 50)],\n", + " [(0, 35), (0, 12), (0, 29)],\n", + " [(0, 35), (0, 12), (4, 38)],\n", + " [(0, 35), (0, 12), (1, 44)],\n", + " [(0, 35), (0, 12), (0, 3)],\n", + " [(0, 35), (0, 12), (1, 47)],\n", + " [(0, 35), (0, 12), (0, 0)],\n", + " [(0, 35), (0, 12), (2, 47)]]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(solutions[:10], key=lambda s: score_solution(s, columns), reverse=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "solutions = sorted(solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10000" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "for letter in 'seseven': #'haseeight':\n", + " new_solutions = []\n", + " for solution in solutions:\n", + " used_columns = [p[1] for p in solution]\n", + " for position in letter_positions[letter]:\n", + " if position[1] not in used_columns:\n", + " if valid_partial_solution(solution + [position], inverse_keycolumn):\n", + " new_solutions += [solution + [position]]\n", + " solutions = sorted(new_solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]\n", + "len(solutions)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['phaseseven',\n", + " 'ninmelcalh',\n", + " 'andodrinho',\n", + " 'lmedyierts',\n", + " 'reaapstnen',\n", + " 'entaryafts',\n", + " 'sconhysefe',\n", + " 'birnerctan',\n", + " 'entaergeno',\n", + " 'wioontomoi',\n", + " 'ittretedus',\n", + " 'dttheselin',\n", + " 'ertalriesn',\n", + " 'enpraiaatp',\n", + " 'evisateths',\n", + " 'aytrvioymi',\n", + " 'feewiaihin',\n", + " 'lsnaltemai',\n", + " 'racessdctr',\n", + " 'odreacyugg',\n", + " 'itliciaooa',\n", + " 'ittrapinds',\n", + " 'trareseshh',\n", + " 'aecefdanst',\n", + " 'ancertalex']" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "display_solution(solutions[0], columns)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "849" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hinted_keywords = [w for w in keywords if w[0] =='f' if len(transpositions_of(w)) == 7]\n", + "len(hinted_keywords)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['fabrics',\n", + " 'facings',\n", + " 'faction',\n", + " 'factors',\n", + " 'factory',\n", + " 'faculty',\n", + " 'fadeout',\n", + " 'failure',\n", + " 'fainest',\n", + " 'fainted']" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hinted_keywords[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "175" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "first_chunk = c8bl[:175]\n", + "len(first_chunk)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['gatlrlnjtonethnirreh',\n", + " 'raorejnptreanhriaeso',\n", + " 'raohoanptraesrriasul',\n", + " 'raohhanptraemrriasln',\n", + " 'raorhaeptrnemsrianln',\n", + " 'raonlneptrnissriaaoc',\n", + " 'garhrarjtartsnnifphn',\n", + " 'raoaalapteesnfriunnr',\n", + " 'raonanhpterfrariutpn',\n", + " 'garehhrjteaaraniessp',\n", + " 'raonhalpterafnriutsp',\n", + " 'fainrleptorniseirtno',\n", + " 'raoaanhptemfrariunpn',\n", + " 'raloannptirsrhrioalt',\n", + " 'falmireptinonseiosrn',\n", + " 'ralhaanptiafmrriospn',\n", + " 'faeilenptnoisreirroo',\n", + " 'raeoeanptneafhrirusp',\n", + " 'earotktntvrugheivarj',\n", + " 'gaeorhojtarernnisaep',\n", + " 'gaeorhnjtarerhnisaep',\n", + " 'raeooaeptareesrisaun',\n", + " 'garnahrjtvenranivrep',\n", + " 'raalaenptmifsrrinopo',\n", + " 'faoeoepptnneareihrus',\n", + " 'falhonpptnaerreirsut',\n", + " 'fanroanpthiesreiaoul',\n", + " 'fanhonpptraerreinsut',\n", + " 'rahnaanptaofmrrisepn',\n", + " 'fahrrinptaitoreisohh',\n", + " 'rarrjaaptnensfrineon',\n", + " 'gaaohrmjtsrrnnninapn',\n", + " 'gaaarhrjtsenraninnnp',\n", + " 'gasrlhrjtntnraniehrp',\n", + " 'fasanomptnensneieean',\n", + " 'raalrempftinsnrpiono',\n", + " 'raaorejpftneanrpihes',\n", + " 'ghrrlanjratnthnpfhri',\n", + " 'gharnarjreaetvnpnfai',\n", + " 'frtroenppwthsredoheo',\n", + " 'frahoepppeaearednsus',\n", + " 'raeaoalpfnsntirprlhi',\n", + " 'raaiahnpfmotarrpnhis',\n", + " 'froiianppnoosredhhrl',\n", + " 'rahrinnpfaeeorrpsere',\n", + " 'rahaaiupfaeselrpsnlr',\n", + " 'raaerejpfsreanrpnpes',\n", + " 'graeohnjetarrhneisap',\n", + " 'fitahanpoimesrerenln',\n", + " 'grtaaahjeosntrnernei',\n", + " 'rotaaanpeosetrrurnni',\n", + " 'roieaaopeeanfnrureep',\n", + " 'rrejahnpernfarrepops',\n", + " 'rrejarepernfnsrepopn',\n", + " 'fopalrnpertntheuiirh',\n", + " 'frpnhrlperoapneeiesd',\n", + " 'foperehpernpaaeuirds',\n", + " 'fopalaapersnteeuinri',\n", + " 'rrjalaepensnfrreonrp',\n", + " 'fopaarnpersmpreuinnd',\n", + " 'roatalhpeeifnarunepr',\n", + " 'gtfiehrjuterranrrrep',\n", + " 'rrainanpeneofhreerep',\n", + " 'filhranpoiapmrerosdn',\n", + " 'rrrajaapevtnnfrevioe',\n", + " 'roeaaanpeatefhrusinp',\n", + " 'rreinanpeaeofhresrep',\n", + " 'ronealnperrfnhrutppr',\n", + " 'fioraenpohpmsreredno',\n", + " 'fonprlnperrpnheutidr',\n", + " 'finlrenporipsrertodo',\n", + " 'rrlatajpenfisnrerpen',\n", + " 'rooaeaepenfntaruhpri',\n", + " 'fiairnhpomopraernhdn',\n", + " 'pfomrteddsnnwstcnsno',\n", + " 'rrninalpeheofnrearep',\n", + " 'fonrraeperipmseunodn',\n", + " 'fonrnrhperirpaeunotd',\n", + " 'pfnsoaiddsoseetccrne',\n", + " 'grnatahjeetonrnesire',\n", + " 'grnarhrjeetnranesinp',\n", + " 'ronarampeetnfnrusinp',\n", + " 'roaaeaepeifresrueppn',\n", + " 'finnnorpoesnsperscan',\n", + " 'rosaanmpeoftnnrurpia',\n", + " 'flapannpitrsrheoiilt',\n", + " 'raaeoaopntaefnreieup',\n", + " 'faaeorppntaevreeieuv',\n", + " 'eaattktnntrogheeivrj',\n", + " 'gaanthnjeteorhnniarp',\n", + " 'rlaealnpitnfnhroirpr',\n", + " 'faanorppeteevreniauv',\n", + " 'raaejanpetanfhrnisop',\n", + " 'gaarehrjntvaraneivep',\n", + " 'raaeuaopetalfnrnisip',\n", + " 'faaooeppetnearenihus',\n", + " 'gaanehrjnthrraneiaep',\n", + " 'raannalpethofnrniaep',\n", + " 'eaahtktnntaogheeisrj',\n", + " 'ftaaormpwtshnneoinen',\n", + " 'ftashanpwtnemreoieln',\n", + " 'ftashnapwtnenmeoiela',\n", + " 'faasoeppetnearenieus',\n", + " 'faaeoeppetsearenious',\n", + " 'farnorppepeevrendauv',\n", + " 'farnonrpepeehiendaua',\n", + " 'farnoeppepeearendsus',\n", + " 'gfrirhrjteearanrernp',\n", + " 'raoieaopneeafnreurep',\n", + " 'paoprhndeeeiartnufos',\n", + " 'paoprredeeeinstnufon',\n", + " 'faoeirnpeeaeihenusro',\n", + " 'raolhaepeenafrrnursp',\n", + " 'gaaahhrjestarannlisp',\n", + " 'rlrahalpittafnrohisp',\n", + " 'gaviehrjnvearaneorep',\n", + " 'raaoorapesneatrnlhuf',\n", + " 'flaoinrpisnorpeolhrt',\n", + " 'ptrlfondwtndhhtohrce',\n", + " 'pthafnhdwemdratolncn',\n", + " 'ftrhnaipwtartoeohsni',\n", + " 'rlaaniapissrefrolntr',\n", + " 'rlralaepitsnfrrohnrp',\n", + " 'rlraraepitsnfrrohnnp',\n", + " 'fthsranpwenpmreoledn',\n", + " 'fthnraepweapmseolidn',\n", + " 'plasinpdisnoretolert',\n", + " 'rlnaniepinfresroaptr',\n", + " 'faauirlpeslopnennird',\n", + " 'raaeuaepesalfrrnnsip',\n", + " 'flnnrrepinrtpseoatwd',\n", + " 'faaeuirpesalopennsir',\n", + " 'ptnocemdwnhesntoaeto',\n", + " 'raannaepesrofrrnnnep',\n", + " 'flanrrapisripmeonnod',\n", + " 'ftamrropwsnnpseonsnd',\n", + " 'plarinpdisnoretonnrt',\n", + " 'plnninpdineoretoasrt',\n", + " 'pleinpndisorertoortf',\n", + " 'ftehnrapwseapmeoolid',\n", + " 'fvaaoeppvteeareoinus',\n", + " 'raaeoaopstnefnrlirup',\n", + " 'fvaeoeppvtneareoirus',\n", + " 'grianhrjtesrranhrnnp',\n", + " 'fhpaarepertmnseliinn',\n", + " 'raotaanpseiefhrluenp',\n", + " 'rronhaepterafrrhunsp',\n", + " 'rrlealnptirfnhrhoppr',\n", + " 'fvaeoeppvereareonpus',\n", + " 'frlprlnptirpnhehoidr',\n", + " 'rvarajapvnetnfroeeio',\n", + " 'raaoahapseetafrlnuis',\n", + " 'frwrohnptopharehades',\n", + " 'rroeanhpthrfrarheppn',\n", + " 'ranelanpsrrifhrltpop',\n", + " 'rroeaanpthrsfrrhepnp',\n", + " 'gaoanhrjsnteranlhirp',\n", + " 'rrlajanptntnfhrhriop',\n", + " 'grlaehrjtntsranhriop',\n", + " 'eaotatknsnothgelhrir',\n", + " 'rrltornptnieahrhreuf',\n", + " 'rhliatnpenefhhrlrrpa',\n", + " 'faoionppsneerrelhrut',\n", + " 'raornaepsnaotnrlhfei',\n", + " 'faoeonppsnrerrelhput',\n", + " 'faoropnpsnperrelhdui',\n", + " 'raoaianpsnfotrrlhphi',\n", + " 'rhaanaspemfrtnrlnpni',\n", + " 'rrljasaptnntnfrhroie',\n", + " 'fhaprhnpemrparelnids',\n", + " 'frlposrptnrenpehriue',\n", + " 'paouinpdsnloretlhirt',\n", + " 'frliatnptnotwhehrhio',\n", + " 'frlwaohptnothaehraie',\n", + " 'rrliahaptnotafrhrhis',\n", + " 'fhawahnpemotarelnais',\n", + " 'raoeooapsnnertrlhrua',\n", + " 'paoiinpdsnooretlhhrt',\n", + " 'frliataptnoswtehrhno',\n", + " 'rrlnauaptnhtlfrhraii',\n", + " 'fhahirnpemaoprelnsrd',\n", + " 'fharaorpemnsapelnnne',\n", + " 'fhasrorpemnpanelnede',\n", + " 'fhatrmrpeswpnnelnods',\n", + " 'paalinpdssioretlnort',\n", + " 'rraoealptshrfnrhnepp',\n", + " 'fhnoeaepenarmselaepn',\n", + " 'paaoremdessnfntennnd',\n", + " 'paslinpdsnioretleort',\n", + " 'fhnirmrpeeopnnelsrds',\n", + " 'frnrailptentoiehsnir',\n", + " 'roajraapntnenfrhioee',\n", + " 'faailrepmtoinseniron',\n", + " 'foaeoeppntnearehirus',\n", + " 'glanohnjntrrrhnritap',\n", + " 'rlanoonpntrrehrritau',\n", + " 'goaeehrjntaaranhisep',\n", + " 'roaeuaapntalferhisip',\n", + " 'roaeeoapntaaefrhiseu',\n", + " 'flanrlepntrtiseritwo',\n", + " 'rlanhoopntraerrritsu',\n", + " 'faaapnrpmtsroneninie',\n", + " 'flaeonppntserreriout',\n", + " 'glhrranjnreathnrpefi',\n", + " 'flrrpnhpnperoaerdeie',\n", + " 'flrwrohpnpothaerdahe',\n", + " 'rlaninnpnfreohrrptre',\n", + " 'forosimpspaoenenderu',\n", + " 'farnrlepmpriisendnoo',\n", + " 'goratahjnetonrnheire',\n", + " 'raoraenpmeatsrrnufio',\n", + " 'rlrejanpnernfhrrepop',\n", + " 'gorhraejneratanhepfi',\n", + " 'glrhranjnerathnrepfi',\n", + " 'rloanenpnefrrhrruptp',\n", + " 'rlrjahapnentafrreois',\n", + " 'paoprhndmeeiartnufos',\n", + " 'rorejaepneanfrrhesop',\n", + " 'flonprnpnerrpherutid',\n", + " 'rloneaepnehafrrruaep',\n", + " 'foapianpnsrotrehlihi',\n", + " 'foapirnpnsroprehlihd',\n", + " 'flrliinpntioeherhorr',\n", + " 'flrohatpnthatwerhesi',\n", + " 'rlrohaepnthafrrrhesp',\n", + " 'rahnhaepmerafrrnlnsp',\n", + " 'rlrhnaepntaofrrrhsep',\n", + " 'rlrsoaepntnhfrrrheep',\n", + " 'raaoraepmsenfrrnnunp',\n", + " 'raonnrapsroretrnaene',\n", + " 'raiuaanpselfmrrnripn',\n", + " 'faieoeppseaearenreus',\n", + " 'faraoeppspeearendnus',\n", + " 'falaninpsitrorenoitr',\n", + " 'fatnrirpswrtopenonhh',\n", + " 'paerhomdstneantnvnle',\n", + " 'gantahrjseierannaenp',\n", + " 'raetlalpsniifnrnreop',\n", + " 'raetlanpsniifrrnreop',\n", + " 'faoirhapsaenemenernl',\n", + " 'raoeaanpshrfmrrneppn',\n", + " 'ranalalpsrfntirntpri',\n", + " 'fanpaoepsrrserentilu',\n", + " 'fanuirlpsrlopnentird',\n", + " 'faatonrpsmierienneun',\n", + " 'pallinpdsnioretnrort',\n", + " 'paltropdsnwthetnrohe',\n", + " 'galnaohjsnrtrrnnrtia',\n", + " 'paaoinedsmhorftnnern',\n", + " 'fnonisrpnssonpeancre',\n", + " 'ranotaapsreiefrnnuen',\n", + " 'famriaopsnnothensnri',\n", + " 'famriropsnnopsensnrd',\n", + " 'pnnsiopdnsoohetacrre',\n", + " 'ratalrnptositnrirnoh',\n", + " 'ealktvanttgovseihjro',\n", + " 'gaoharajtrrnelniapee',\n", + " 'gaorahfjtrenrtniaeep',\n", + " 'raooathptreeuariaunr',\n", + " 'raorrhtptrntanrianhs',\n", + " 'faoatolpteeuaeeiunre',\n", + " 'failnraptoirtleironh',\n", + " 'raonhanpterafrriutsp',\n", + " 'rarojaaptennsfriehol',\n", + " 'raolnanptenrfhriurtp',\n", + " 'failthoptonheneirral',\n", + " 'faionoiptosarneirnis',\n", + " 'faorrasptenilceiunoe',\n", + " 'fatlvnnptwivnseioooa',\n", + " 'gaaavlajtenvcfnineoe',\n", + " 'ralnahnptirfasrionps',\n", + " 'falmireptinonseiosrn',\n", + " 'gaahhlajtearnfninspr',\n", + " 'ranoafrpteeedariaunc',\n", + " 'ranrnnapteehofriaeae',\n", + " 'ranonfcptrrtdhritsnc',\n", + " 'raeooasptarelcrisaue',\n", + " 'raeoeroptarsehrisaoe',\n", + " 'raoenuvptnnohurihrec',\n", + " 'raoeluvptnnihurihroc',\n", + " 'galavlajtnmvcfnirnoe',\n", + " 'raahnanptmaofrrinsep',\n", + " 'ganorctjthrehwniaaeo',\n", + " 'fanroanpthiesreiaoul',\n", + " 'ganhhnajtrarrfninspt',\n", + " 'ranhaoyptrafherinspe',\n", + " 'fahattmptacwuneiseor',\n", + " 'gahehfhjtarrtonisepo',\n", + " 'gahehlajtarrnfnisepr',\n", + " 'fanlnifptnisoteiaocr',\n", + " 'faamriaptsnnoceinsnr',\n", + " 'raalnripftnhtorpirah',\n", + " 'ghanrtajrtheonnpiaer',\n", + " 'raahnylpftaoenrpisen',\n", + " 'raarnyopftnoenrpinen',\n", + " 'gharaaajrtnsmfnpinnn',\n", + " 'raaraoypftnsserpinnn',\n", + " 'ghtanaojromntnnprnai',\n", + " 'ghrosefjraoyttnpfgdt',\n", + " 'ghrraocjraamdhnpflns',\n", + " 'oykrtcsgegaiatfnjfel',\n", + " 'ekhrtulngraiheejpfec',\n", + " 'rarstolpfpyuherpdere',\n", + " 'fryltolppeiuaeednore',\n", + " 'ghaatoojrnfsdrnpepys',\n", + " 'gharooojrnerdrnpeeas',\n", + " 'raaoithpfeeeuarpnurr',\n", + " 'raafontpfesrturpnrsn',\n", + " 'frlanirppisroaedoltr',\n", + " 'friintnppooruhedhrtr',\n", + " 'raeirolpfaeeherpsree',\n", + " 'frawkrrppmogvnednajv',\n", + " 'ghonavhjrnrtuonphtir',\n", + " 'frloiroppnnaeaedrhae',\n", + " 'raankrspfmaghtrpnije',\n", + " 'frosanappsnenmedneea',\n", + " 'rahrinopfaeeoorpsere',\n", + " 'frsyoteppnesugedennr',\n", + " 'raeniaepfsrotarpothi',\n", + " 'granoahjethrsrneiaal',\n", + " 'fiihrhepoeaeeaerrsel',\n", + " 'roeseooperytonrupevg',\n", + " 'roeaathperfeuaruppnr',\n", + " 'grtaooujehsrdhnernas',\n", + " 'roaaeoopeferonrupnpg',\n", + " 'rraaesopefnrmhrepepn',\n", + " 'rraeesspefarmnrepspn',\n", + " 'roaliyfpefneetruprrn',\n", + " 'roaaionpefmeohrupnrg',\n", + " 'fopalrrpersneheuinre',\n", + " 'frainsopeneomaeeeren',\n", + " 'roaaranpeefvterunpvi',\n", + " 'filanvspoieevyeronao',\n", + " 'fileoonpoindoherorsg',\n", + " 'roatsecpenrrteruevht',\n", + " 'roahalrpeeafnprunspr',\n", + " 'foahroopeeaidoeunsos',\n", + " 'roahlaipeeanthrunsri',\n", + " 'roeaasapeatemirusinn',\n", + " 'finaltnportiuhertior',\n", + " 'finalthportiuaertior',\n", + " 'roeaaswpeatemfrusinn',\n", + " 'etravehnuvtuhrervirk',\n", + " 'greavlrjeatutanesirh',\n", + " 'rrejaorpeanfnpresoph',\n", + " 'rresserpeamnfpresntd',\n", + " 'fonsetopermgooeutnhd',\n", + " 'fiotdeopohuotnererot',\n", + " 'fintdkfporuogtertroj',\n", + " 'roeaavtpeaeturrusnir',\n", + " 'rolaaatpenftmrrurpin',\n", + " 'grohtaajenrotnnehpri',\n", + " 'rooataepenfisnruhpel',\n", + " 'fiargfipompjteerndnr',\n", + " 'fiargvapompjvierndno',\n", + " 'rolahsepenfaytrurpsd',\n", + " 'rolasaapenfnterurpei',\n", + " 'rolasrhpenfnterurpeh',\n", + " 'filrsroponpntserrdeh',\n", + " 'filinrnponorpherrhtd',\n", + " 'rolesatpennntarurrei',\n", + " 'ronoaafperrtetrunain',\n", + " 'fonrraeperipmseunodn',\n", + " 'fonrnrhperirpaeunotd',\n", + " 'fonrharperiateeunosi',\n", + " 'ronnstrperhcaprunaei',\n", + " 'rosaorfpenfgtsruepfh',\n", + " 'fonarropeetneaeusine',\n", + " 'finarrhpoetneeersine',\n", + " 'ronantipeetsuirusicr',\n", + " 'gaattirjntotoaneirsr',\n", + " 'raajvaepetnostrniool',\n", + " 'flaplerpitrntveoiirt',\n", + " 'faareoopntvaeaeeiveu',\n", + " 'raaveftpntoutsreiolo',\n", + " 'rlatroopithionroiatg',\n", + " 'faavetopetoluaenioor',\n", + " 'raannalpethofnrniaep',\n", + " 'raannanpetrofhrninep',\n", + " 'faanrofpetrieteninou',\n", + " 'rlahoelpitartnroisat',\n", + " 'faahgtepetajugenisnr',\n", + " 'gaahehfjntarrtneisep',\n", + " 'rlahnanpitarfrroistp',\n", + " 'rlahiyepitahearoisin',\n", + " 'rlahiylpitahenroisin',\n", + " 'rlariyopitnhenroinin',\n", + " 'faahntopetatuaenisnr',\n", + " 'ftahnrspwtattleoisnh',\n", + " 'rlarsetpitnntaroinet',\n", + " 'flaarimpitsnoneoinnr',\n", + " 'gaannhajeterrfnnisnp',\n", + " 'raartsopnfpsmhrepdyn',\n", + " 'farrntopepatuaendlnr',\n", + " 'farnonrpepeehiendaua',\n", + " 'farnroopephieoendaou',\n", + " 'raahinopefaeoornpsre',\n", + " 'raaaotfpefieitrnpeue',\n", + " 'flrnriepipenoneodsnr',\n", + " 'rlannaapifenmtropsan',\n", + " 'faoiesopneeamaeeuren',\n", + " 'flienoopionhdoeorras',\n", + " 'flinhoopioradoeortss',\n", + " 'fliseerpiolstveorlst',\n", + " 'fliteoopiohsoneorasg',\n", + " 'fliteonpiohsoheorasg',\n", + " 'plilhrvdionaeutorrse',\n", + " 'favhhtopevekuaenosgr',\n", + " 'plavdrvdisveeutologe',\n", + " 'flrvtoopitvcdoeohoas',\n", + " 'flrseorpitledaeohlds',\n", + " 'flrseorpitledaeohlds',\n", + " 'plavervdisoeeutolode',\n", + " 'rlaoanipisnfrerolhpt',\n", + " 'flrliefpitnorteohrrp',\n", + " 'pthafnhdwemdratolncn',\n", + " 'planervdishgeutolahe',\n", + " 'ftrhnaipwtartoeohsni',\n", + " 'rlrsalrpitnfnprohepr',\n", + " 'faatctopesieuaennehr',\n", + " 'ftnronfpwnphsteoadec',\n", + " 'flnierhpinoreaeoarpe',\n", + " 'paaeuivdesaloutnnsir',\n", + " 'raalofrpesnsdprnnrnc',\n", + " 'flaadoopismedoeonngs',\n", + " 'flamrrnpisnipreonsod',\n", + " 'ftamrropwsnnpseonsnd',\n", + " 'ftardkapwsnogmeonnoj',\n", + " 'ftnndkopwnsogneoacoj',\n", + " 'rletaropishtiorooait',\n", + " 'flemrropisnipoeoosod',\n", + " 'grianeajtesrgfnhrnnh',\n", + " 'rajtvsvpsnivcurloeoe',\n", + " 'frpjoonptrndohehiosg',\n", + " 'prpraordteissvthfoln',\n", + " 'prinhovdtoraeuthrnsu',\n", + " 'rrlranoptiatarrhofii',\n", + " 'palrnrvdsithtutlowah',\n", + " 'raianhrpsofraprlhpts',\n", + " 'rrorarrpthatvnrhefiv',\n", + " 'fveeaoopvareeaeospnu',\n", + " 'ranhaovpsrateurltsiu',\n", + " 'fhafyoipeeseneelernh',\n", + " 'rrhfaiuptetiehrhlrhr',\n", + " 'rrvdapoptvoceorhooef',\n", + " 'prvgovgdtvheuftholur',\n", + " 'frvgsaeptvhrcaeholhe',\n", + " 'rhahirepesaiptrllsed',\n", + " 'rrlajaoptntnfnrhriop',\n", + " 'faoaponpsntrerelhiiu',\n", + " 'grlthaojtnortnnhrrpi',\n", + " 'rrliaatptneflnrhrrpe',\n", + " 'rhliatnpenefhhrlrrpa',\n", + " 'rrlaaotptnftsrrhrpin',\n", + " 'gaoherfjsnrrptnlhped',\n", + " 'frlrlhlptnpireehrdop',\n", + " 'raoaahepsnfeehrlhpns',\n", + " 'fharwanpemposhelndal',\n", + " 'raoanaipsnfrtorlhpti',\n", + " 'rhaanhrpemfraprlnpns',\n", + " 'faormropespnnneendsn',\n", + " 'rrlahhfptnfaesrhrpsl',\n", + " 'rrlasaoptnfntsrhrpei',\n", + " 'fharshepempnraelndep',\n", + " 'fhaphsrpemdrmnelntpn',\n", + " 'fhaproipemrpneelnidh',\n", + " 'prlrlfadtntidlthrwoc',\n", + " 'frliatfptnotwtehrhio',\n", + " 'frlirdfptnopetehrhdg',\n", + " 'frlitrnptnowphehrhod',\n", + " 'frlwvyaptnovdcehraoo',\n", + " 'rrlnauaptnhtlfrhraii',\n", + " 'rhansaapemrnftrlnnep',\n", + " 'frlhorgptnaephehrsud',\n", + " 'fhahscepemayaaelnsdl',\n", + " 'rhasathpemntaorlneii',\n", + " 'rhnhaarperafmprlnspn',\n", + " 'rraoataptsrtnnrhnair',\n", + " 'fratornptswhprehnoed',\n", + " 'faaneoopssrreaelntpu',\n", + " 'fraoraiptshntoehneni',\n", + " 'fhaanaspesmrerelnnne',\n", + " 'fhaarrhpesmnprelnnnd',\n", + " 'frnplaopterissehsiol',\n", + " 'frnrhfopteiesoehsolr',\n", + " 'frnratrpteisnhehsolr',\n", + " 'raaohaapmtracnrniase',\n", + " 'gaaoradjmtrnsenniann',\n", + " 'goaeorojntareanhisae',\n", + " 'foaeeoopntaaeaehiseu',\n", + " 'foaeuaipntaleoehisin',\n", + " 'raasoalpmtoefnrnirup',\n", + " 'glasntajntoewfnrirto',\n", + " 'raasaeopmtoatornircv',\n", + " 'gohieaajnreanfnhpree',\n", + " 'rlaiuarpnfelearrprin',\n", + " 'gohraocjnramdhnhpfns',\n", + " 'glhraosjnramdtnrpfns',\n", + " 'gohassujnrfyrhnhppeh',\n", + " 'rlarshtpnfpyerrrpdel',\n", + " 'gohytuvjnreohunhpndc',\n", + " 'roakfrfpnfgttsrhpjuh',\n", + " 'flrkrolpnpgeaeerdjee',\n", + " 'gohyahfjnrenetnhpnes',\n", + " 'rlakserpnfgrtvrrpjht',\n", + " 'faronvlpmpotvcendgno',\n", + " 'roaoooipsfosrnrnpgns',\n", + " 'flrraropnpaaeaerdlce',\n", + " 'rlaninrpnfreoarrptre',\n", + " 'rlanrnopnfratdrrptln',\n", + " 'rlansorpnfroeprrptru',\n", + " 'farosiopmphoooenderr',\n", + " 'farlahepmposraendsnp',\n", + " 'flrnriypnphioeerdaoh',\n", + " 'flrhnropnpateaerdsne',\n", + " 'farrshdpmpnneeendnel',\n", + " 'fliihrhpnoeaeeerrrse',\n", + " 'floposfpnerdyteruise',\n", + " 'pafnrofdmdrtettncnwu',\n", + " 'plinurvdnohleutrraie',\n", + " 'rlosnerpneoetprrurtv',\n", + " 'faisafopmooasoenrrcr',\n", + " 'flrohirpnthaoperhesr',\n", + " 'plrohivdnthaoutrhesr',\n", + " 'fahnhtipmeraioenlnse',\n", + " 'fahnhirpmeraopenlnsr',\n", + " 'flrhrorpntaieperhsou',\n", + " 'plrsoivdntnhoutrheer',\n", + " 'fahsnirpmenropenlenr',\n", + " 'fahnsirpmeaoopenlirr',\n", + " 'foniniapsnesolenarcr',\n", + " 'fanpalfpmnrtitenaiio',\n", + " 'paairovdmsoneutnnrnu',\n", + " 'paafroadmsdneetnncnu',\n", + " 'flaitirpnsohopernhar',\n", + " 'raonnrapsroretrnaene',\n", + " 'faesltopsryiuaenpeor',\n", + " 'faraltopspeiuaendnor',\n", + " 'fnponsopnresmseaiucn',\n", + " 'fneisaapnuontmealrei',\n", + " 'fatiatnpswemneenornr',\n", + " 'gaaetctjsntiasnnevel',\n", + " 'faoirirpshenotenernr',\n", + " 'faneoogpsrreafentpue',\n", + " 'ranalrapsrfnpcrntprd',\n", + " 'faoooynpshadereneesn',\n", + " 'pallrhpdsnitirtnrohi',\n", + " 'faodoynpssederenngsn',\n", + " 'rnaovirpnmsviprannoe',\n", + " 'faorrrapssnipmennnod',\n", + " 'faorrrmpssnipnennnod',\n", + " 'ranaaajpsrfetnrnnpni',\n", + " 'panfgrddsrdjtetnncnh',\n", + " 'famriaopsnnothensnri',\n", + " 'fnnilrfpnsoipteacrod',\n", + " 'fnstokmpnocdgnearasj',\n", + " 'gaohsaojtrrlerniapln',\n", + " 'raonnafptrsnctriacae',\n", + " 'raonhvopterauoriutsr',\n", + " 'garortajtenpufniehrr',\n", + " 'raolnanptenrfhriurtp',\n", + " 'raauafrptelntvrinieo',\n", + " 'gaaeelsjtntttmnievth',\n", + " 'falaverptinveeeioeod',\n", + " 'ralnahnptirfasrionps',\n", + " 'gaanrrfjtnhepdnieaer',\n", + " 'raanohfptereadrinnus',\n", + " 'faeiltoptnoiureirror',\n", + " 'raeonftptartdsrissnc',\n", + " 'gaeororjtareaanisaee',\n", + " 'ranhusfptrahndritsct',\n", + " 'ranhusfptrahndritsct',\n", + " 'ranhusiptrahnhritsct',\n", + " 'raaaskaptmfngnrinpej',\n", + " 'raaieflptmostnrinhoo',\n", + " 'ranhaoyptrafherinspe',\n", + " 'fahattmptacwuneiseor',\n", + " 'faratsnptncwmseineon',\n", + " 'ranaotfptsfgntricpfr',\n", + " 'faroparptnerseeinuin',\n", + " 'rahiknoptahgrorisijt',\n", + " 'rahionoptahorerisigt',\n", + " 'raalreyptsinterinonv',\n", + " 'raaaotfpftmgntrpinfr',\n", + " 'ghaheotjrtaroanpiseg',\n", + " 'ghrosefjraoyttnpfgdt',\n", + " 'ghrysorjraeyrnnpfnds',\n", + " 'fryltolppeiuaeednore',\n", + " 'friintnppooruhedhrtr',\n", + " 'frnaplkpprsrngedtnir',\n", + " 'ghorreajrnaeatnphfes',\n", + " 'raliyrdpfnoevorprhnv',\n", + " 'ghlnavtjrnrturnprtir',\n", + " 'frloknippnngsoedrhjc',\n", + " 'frarilrppmnoiaednnro',\n", + " 'frahiltppmaoiuednsro',\n", + " 'frarilsppmnoimednnro',\n", + " 'frarilsppmnoimednnro',\n", + " 'frsninsppnsoamedtcri',\n", + " 'ranhrhrpfratehrpnshl',\n", + " 'frhonrrppaerieedsuno',\n", + " 'frhrkaippangmoedsnjn',\n", + " 'grtvealjeovattnerosi',\n", + " 'rrejahtpernfaurepops',\n", + " 'poprhredeeiaeatufose',\n", + " 'pipaaoedoesmeatrfnnu',\n", + " 'rraoltrpeneeapreeusi',\n", + " 'foaigsrpeeofyaeunrtd',\n", + " 'pftterrddwulevtcoroe',\n", + " 'foafrripeesanoeunrln',\n", + " 'foahroopeeaidoeunsos',\n", + " 'roeaasapeatemirusinn',\n", + " 'finaltnportiuhertior',\n", + " 'greavlsjeatutmnesirh',\n", + " 'roeotcspeadsemrussyt',\n", + " 'fonsetopermgooeutnhd',\n", + " 'rrevkdopeaugtrresrjo',\n", + " 'grohtsojenroyonehprd',\n", + " 'frlrrolpenppeeeerdru',\n", + " 'filrthsponphenerrdal',\n", + " 'roaasarpemfntnrunpei',\n", + " 'filinrnponorpherrhtd',\n", + " 'fonrharperiateeunosi',\n", + " 'fomrstopeninuseusoer',\n", + " 'pirnfoldonsdhetrncce',\n", + " 'ronaenopeefrrorusppt',\n", + " 'raajafapetnftnrniopr',\n", + " 'raajaafpetnfstrniopl',\n", + " 'raanntapetroosrniner',\n", + " 'rlahtrupitaothroisrh',\n", + " 'faahgtepetajugenisnr',\n", + " 'rlahnanpitarfrroistp',\n", + " 'gaahgovjetahounnislg',\n", + " 'gaahgotjetahoannislg',\n", + " 'rlaraeypitnsteroinnv',\n", + " 'flaarimpitsnoneoinnr',\n", + " 'ftashaopwtnemgeoieln',\n", + " 'raaejaspnfrnemreppon',\n", + " 'raaretrpefphuarnpdkr',\n", + " 'farnrorpeprieaendnou',\n", + " 'farnrltpephiiuendaoo',\n", + " 'flrnirrpipeoneeodsrn',\n", + " 'flienorpionrdaeorrns',\n", + " 'farrinipneveooeeevre',\n", + " 'flinhoopioradoeortss',\n", + " 'plapprrdiserevtolfie',\n", + " 'flahagrpisatheeolsil',\n", + " 'flrhifapitaosneohsrr',\n", + " 'flrsrlipitnpnoeohedr',\n", + " 'gaaorocjesrnoannnans',\n", + " 'flarpropispdeoeonrte',\n", + " 'rlariyspisnheyronnin',\n", + " 'rleerucpistpheroovdc',\n", + " 'flenrrypisaipeeooiod',\n", + " 'fapjrrrpsrnehaelioee',\n", + " 'frlrahoptitnenehowes',\n", + " 'raaloofpseidrtrlnosa',\n", + " 'fhtfhcopewteeoelorsi',\n", + " 'frlfhnhptitearehorsi',\n", + " 'palfacfdsiteedtlorei',\n", + " 'frhfodsptesoemehlrgg',\n", + " 'prhttaedtewuisthlorh',\n", + " 'rrhfaiuptetiehrhlrhr',\n", + " 'rrvitaaptvhicnrhoiee',\n", + " 'prviroadtvhienthoiou',\n", + " 'frvgnhaptvhoeneholes',\n", + " 'fhvnecrpevssanelocsl',\n", + " 'phvnstidevslaotlocli',\n", + " 'paahnuadesarrmtelsii',\n", + " 'gaohaatjsnrtmvnlhpin',\n", + " 'grlhtrojtnroprnhrprd',\n", + " 'grlhtutjtnrirrnhrpei',\n", + " 'rrlailvptnfeivrhrpro',\n", + " 'faorphrpsnpreeelhdil',\n", + " 'faoropnpsnperrelhdui',\n", + " 'faormropespnnneendsn',\n", + " 'rhaansrpemfrnprlnpne',\n", + " 'fharnsapemprneelndne',\n", + " 'rhaahanpemfatrrlnpsi',\n", + " 'fharhhapemparnelndsp',\n", + " 'frlrsaiptnpneoehrdee',\n", + " 'rhaashlpemfnenrlnpes',\n", + " 'rrlfksdptnpgmorhrejn',\n", + " 'frlprosptnrpsmehridn',\n", + " 'prlpisodtneonethrfre',\n", + " 'frlpvdnptnrvotehrioo',\n", + " 'rrliahiptnotahrhrhis',\n", + " 'frlwvyaptnovdcehraoo',\n", + " 'rhansaapemrnftrlnnep',\n", + " 'pharesidemnfnotlnnde',\n", + " 'rrlhofoptnaepdrhrsue',\n", + " 'fhahiptpemaoduelnsrt',\n", + " 'grlsattjtnntahnhreii',\n", + " 'grlsattjtnntahnhreii',\n", + " 'frneofoptrgetdehnhur',\n", + " 'fhnhraiperapmoelnsdn',\n", + " 'pratiahdtswosithnohl',\n", + " 'fratornptswhprehnoed',\n", + " 'rraoealptshrfnrhnepp',\n", + " 'rhaaniupesmrerrlnnnr',\n", + " 'fhaanaspesmrerelnnne',\n", + " 'roajanfpntnsrtrhiolt',\n", + " 'goanlfojntentanhirro',\n", + " 'glanohnjntrrrhnritap',\n", + " 'rlanoonpntrrehrritau',\n", + " 'flaorevpnthtnveriewe',\n", + " 'faaoranpmthtlneniewe',\n", + " 'rlanuvrpntrluarritir',\n", + " 'rlahaaopntafmhrrispn',\n", + " 'gohrystjnraeyunhpfnd',\n", + " 'glhryssjnraeymnrpfnd',\n", + " 'elkatoenngfirgerjpes',\n", + " 'gohyfuvjnreshunhpnrc',\n", + " 'faronnapmpohteendgan',\n", + " 'forynhepsperatendnns',\n", + " 'flrrpnhpnperoaerdeie',\n", + " 'roaeinepnfaeonrhpsre',\n", + " 'rlannyrpnfhoehrrpaen',\n", + " 'fornohfpspsgltendcfc',\n", + " 'glroanejnerthgnreaia',\n", + " 'gothrsrjnurayenhrpfd',\n", + " 'ploprhrdneeiaetrufos',\n", + " 'faopohspmerdomenuiso',\n", + " 'failftrpmoisuaenrorr',\n", + " 'faieerlpmolsanenrosl',\n", + " 'fainuorpmorldaenrnis',\n", + " 'foisrropsooaeoenrrte',\n", + " 'plisaafdnooaedtrrrcn',\n", + " 'fahinyopmeordrenlrno',\n", + " 'fahnhirpmeraopenlnsr',\n", + " 'foairoypssondeennrns',\n", + " 'roamrsfpssnnytrnnsnd',\n", + " 'faerylipsaheioenseno',\n", + " 'faaihnypsmoendennrla',\n", + " 'faaoiropsmhonoennern',\n", + " 'raarnaspsmnofyrnnnep',\n", + " 'ranaaajpsrfetnrnnpni',\n", + " 'pnnftsndnsdwmttaccon',\n", + " 'pnnhtsndnslamttaccin',\n", + " 'fnstorypnoceheearaue',\n", + " 'gaorasgjtrenmhniaeen',\n", + " 'raonhvopterauoriutsr',\n", + " 'garnuecjtehhtanieacv',\n", + " 'faeiltoptnoiureirror',\n", + " 'gaeororjtareaanisaee',\n", + " 'ranhusfptrahndritsct',\n", + " 'faloceeptnsaaseirnle',\n", + " 'raheltaptatiuiristor',\n", + " 'rahelfrptatidnristoc',\n", + " 'raaalonpftmiohrpinog',\n", + " 'raahnylpftaoenrpisen',\n", + " 'raahnoapftaoomrpiseg',\n", + " 'raaoisrpfeeemnrpnurn',\n", + " 'friintrppooruvedhrtr',\n", + " 'frahiltppmaoiuednsro',\n", + " 'frahiltppmaoiuednsro',\n", + " 'frarilsppmnoimednnro',\n", + " 'frsninsppnsoamedtcri',\n", + " 'frhonrrppaerieedsuno',\n", + " 'fiirohrpoeneaeerrnus',\n", + " 'roaliyrpefneevruprrn',\n", + " 'foadyhepeloeraeueonp',\n", + " 'foeaasepeatemgeusinn',\n", + " 'foeaastpeatemceusinn',\n", + " 'rreavespeatuhmresirk',\n", + " 'fonprlsperrpnmeutidr',\n", + " 'filrtovponphsverrdan',\n", + " 'gaantcrjetevasnniaul',\n", + " 'rlanvrapitruanroitrl',\n", + " 'raarvylpntvueireivrn',\n", + " 'raanntapetroosrniner',\n", + " 'gaahoaujetagernnisfe',\n", + " 'rlahiylpitahenroisin',\n", + " 'ftashnapwtnenmeoiela',\n", + " 'rlaneynpitatehroiivn',\n", + " 'raaejyfpnfrnetreppon',\n", + " 'farnrlspepriimendnoo',\n", + " 'flientrpionhuheorrar',\n", + " 'flaahcnpistaaseolisl',\n", + " 'gaavttajesvaiennloie',\n", + " 'flareoepispndaeonres',\n", + " 'fapjrrrpsrnehaelioee',\n", + " 'rrlailvptnfeivrhrpro',\n", + " 'rrlaponptnfdrtrhrpts',\n", + " 'faorgropsnpjeaelhdne',\n", + " 'fharroapemppnselndrh',\n", + " 'rhaansrpemfrnprlnpne',\n", + " 'rhaahanpemfatrrlnpsi',\n", + " 'fhaphthpemdruaelntpr',\n", + " 'prlhrofdtnaisdthrson',\n", + " 'phahfnedemadrgtlnscn',\n", + " 'paorafndesnsdstennnc',\n", + " 'ransreopshnetdrlatev',\n", + " 'frneofoptrgetdehnhur',\n", + " 'fhnaorepenmapselaned',\n", + " 'rhaaniupesmrerrlnnnr',\n", + " 'rhnraudpeenmrorlsnni',\n", + " 'rlanoonpntrrehrritau',\n", + " 'rlanoonpntrrehrritau',\n", + " 'foanpospntrrelehitiu',\n", + " 'rlanuvrpntrluarritir',\n", + " 'roakfrfpnfgttsrhpjuh',\n", + " 'gohyfuvjnreshunhpnrc',\n", + " 'gohyahfjnrenetnhpnes',\n", + " 'gohyahfjnrenetnhpnes',\n", + " 'forynhepsperatendnns',\n", + " 'farrlnopmpacooendlee',\n", + " 'farlahepmposraendsnp',\n", + " 'glroanejnerthgnreaia',\n", + " 'rooaeeapnefarerhupsp',\n", + " 'gotnfecjnuedranhrrcp',\n", + " 'flinurrpnohleherraie',\n", + " 'fairoffpmonestenrnur',\n", + " 'flohdydpneaoeeeruson',\n", + " 'ponfnradsndspstnaccr',\n", + " 'roamrsfpssnnytrnnsnd',\n", + " 'roamrsfpssnnytrnnsnd',\n", + " 'faeryltpsaheiwenseno',\n", + " 'fartdrypsnneedennrge',\n", + " 'fartdonpsnnedsennrgs',\n", + " 'fnstorypnoceheearaue',\n", + " 'raalfhspteidcmrinoch',\n", + " 'gaanrfijtnheponieaee',\n", + " 'fanhusiptrahnoeitsct',\n", + " 'frahiltppmaoiuednsro',\n", + " 'rahrnnopfaerodrpsene',\n", + " 'roaliyrpefneevruprrn',\n", + " 'foailsopeeoeyoeunrsd',\n", + " 'roeavtspeatusmrusiry',\n", + " 'grohosujenrryhnehpad',\n", + " 'frlrrolpenppeeeerdru',\n", + " 'rooasahpenflmeruhpln',\n", + " 'gaanhfejnterttneirpr',\n", + " 'raajafapetnftnrniopr',\n", + " 'raarvylpntvueireivrn',\n", + " 'gartptfjnerdwtneevto',\n", + " 'flientrpionhuheorrar',\n", + " 'flareoepispndaeonres',\n", + " 'fharohepempnlaelndhc',\n", + " 'paneoafdshgeedtlahun',\n", + " 'rlanoonpntrrehrritau',\n", + " 'raarcvapmfpevsrnpdho',\n", + " 'rlarnerpnfarrprrplie',\n", + " 'flinurrpnohleherraie',\n", + " 'fahoroopmeannoenlenh',\n", + " 'raallrmpftnianrpirol',\n", + " 'rlanvrapitruanroitrl',\n", + " 'faonpfcpeeedtaenuatr',\n", + " 'raallrmpftnianrpirol']" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[cadenus_decipher(first_chunk, w, keycolumn)[:20] for w in hinted_keywords]" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[w for w in hinted_keywords if cadenus_decipher(first_chunk, w, keycolumn).startswith('phaseseven')]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def cadenus_break_worker(message, keyword, keycolumn, fitness):\n", + " message_chunks = chunks(message, 175)\n", + " plaintext = ''.join(cadenus_decipher(c, keyword, keycolumn) for c in message_chunks)\n", + " fit = fitness(plaintext)\n", + " return (keyword, keycolumn), fit" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def cadenus_break(message, words=keywords, fitness=Pbigrams):\n", + " c = make_cadenus_keycolumn(reverse=True)\n", + " results = starmap(cadenus_break_worker, [(message, \n", + " w, \n", + " make_cadenus_keycolumn(doubled_letters='vw', start=s, reverse=r), \n", + " fitness)\n", + " for w in words for s in string.ascii_lowercase for r in [True, False]])\n", + " # return list(results)\n", + " return max(results, key=lambda k: k[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(('finalist',\n", + " {'a': 6,\n", + " 'b': 5,\n", + " 'c': 4,\n", + " 'd': 3,\n", + " 'e': 2,\n", + " 'f': 1,\n", + " 'g': 0,\n", + " 'h': 24,\n", + " 'i': 23,\n", + " 'j': 22,\n", + " 'k': 21,\n", + " 'l': 20,\n", + " 'm': 19,\n", + " 'n': 18,\n", + " 'o': 17,\n", + " 'p': 16,\n", + " 'q': 15,\n", + " 'r': 14,\n", + " 's': 13,\n", + " 't': 12,\n", + " 'u': 11,\n", + " 'v': 10,\n", + " 'w': 10,\n", + " 'x': 9,\n", + " 'y': 8,\n", + " 'z': 7}),\n", + " -5286.197562931952)" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "key8b, fitness = cadenus_break(c8bl, words=hinted_keywords, fitness=Ptrigrams)\n", + "key8b, fitness" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'wledgctftrojhrtheonovoresoovrpanegoarerufofinaltnportiuhertiorafthehasdwarenncompleeeandoastestssoveconlrudedtlsreisnntignfrrrthesinaaltranlicthaaehesecisityseemiceshuneanykhf'" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cadenus_decipher(first_chunk, key8b[0], key8b[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[('finalist', 'z', 'az', True),\n", + " ('finalist', 'a', 'no', True),\n", + " ('finalist', 'n', 'no', True),\n", + " ('finalist', 'a', 'nu', True),\n", + " ('finalist', 'n', 'nu', True),\n", + " ('finalist', 'a', 'nz', True),\n", + " ('finalist', 'n', 'nz', True),\n", + " ('finalist', 'a', 'op', True),\n", + " ('finalist', 'o', 'op', True),\n", + " ('finalist', 'a', 'oq', True),\n", + " ('finalist', 'o', 'oq', True),\n", + " ('finalist', 'a', 'or', True),\n", + " ('finalist', 'o', 'or', True),\n", + " ('finalist', 'a', 'os', True),\n", + " ('finalist', 'o', 'os', True),\n", + " ('finalist', 'a', 'ot', True),\n", + " ('finalist', 'o', 'ot', True),\n", + " ('finalist', 'a', 'ou', True),\n", + " ('finalist', 'o', 'ou', True),\n", + " ('finalist', 'a', 'ov', True),\n", + " ('finalist', 'o', 'ov', True),\n", + " ('finalist', 'a', 'ow', True),\n", + " ('finalist', 'o', 'ow', True),\n", + " ('finalist', 'a', 'ox', True),\n", + " ('finalist', 'o', 'ox', True),\n", + " ('finalist', 'a', 'oy', True),\n", + " ('finalist', 'o', 'oy', True),\n", + " ('finalist', 'a', 'oz', True),\n", + " ('finalist', 'o', 'oz', True),\n", + " ('finalist', 'a', 'pq', True),\n", + " ('finalist', 'p', 'pq', True),\n", + " ('finalist', 'a', 'pr', True),\n", + " ('finalist', 'p', 'pr', True),\n", + " ('finalist', 'a', 'ps', True),\n", + " ('finalist', 'p', 'ps', True),\n", + " ('finalist', 'a', 'pt', True),\n", + " ('finalist', 'p', 'pt', True),\n", + " ('finalist', 'a', 'pu', True),\n", + " ('finalist', 'p', 'pu', True),\n", + " ('finalist', 'a', 'pv', True),\n", + " ('finalist', 'p', 'pv', True),\n", + " ('finalist', 'a', 'pw', True),\n", + " ('finalist', 'p', 'pw', True),\n", + " ('finalist', 'a', 'px', True),\n", + " ('finalist', 'p', 'px', True),\n", + " ('finalist', 'a', 'py', True),\n", + " ('finalist', 'p', 'py', True),\n", + " ('finalist', 'a', 'pz', True),\n", + " ('finalist', 'p', 'pz', True),\n", + " ('finalist', 'a', 'qr', True),\n", + " ('finalist', 'q', 'qr', True),\n", + " ('finalist', 'a', 'qs', True),\n", + " ('finalist', 'q', 'qs', True),\n", + " ('finalist', 'a', 'qt', True),\n", + " ('finalist', 'q', 'qt', True),\n", + " ('finalist', 'a', 'qu', True),\n", + " ('finalist', 'q', 'qu', True),\n", + " ('finalist', 'a', 'qv', True),\n", + " ('finalist', 'q', 'qv', True),\n", + " ('finalist', 'a', 'qw', True),\n", + " ('finalist', 'q', 'qw', True),\n", + " ('finalist', 'a', 'qx', True),\n", + " ('finalist', 'q', 'qx', True),\n", + " ('finalist', 'a', 'qy', True),\n", + " ('finalist', 'q', 'qy', True),\n", + " ('finalist', 'a', 'qz', True),\n", + " ('finalist', 'q', 'qz', True),\n", + " ('finalist', 'a', 'rs', True),\n", + " ('finalist', 'r', 'rs', True),\n", + " ('finalist', 'a', 'rt', True),\n", + " ('finalist', 'r', 'rt', True),\n", + " ('finalist', 'a', 'ru', True),\n", + " ('finalist', 'r', 'ru', True),\n", + " ('finalist', 'a', 'rv', True),\n", + " ('finalist', 'r', 'rv', True),\n", + " ('finalist', 'a', 'rw', True),\n", + " ('finalist', 'r', 'rw', True),\n", + " ('finalist', 'a', 'rx', True),\n", + " ('finalist', 'r', 'rx', True),\n", + " ('finalist', 'a', 'ry', True),\n", + " ('finalist', 'r', 'ry', True),\n", + " ('finalist', 'a', 'rz', True),\n", + " ('finalist', 'r', 'rz', True),\n", + " ('finalist', 'a', 'st', True),\n", + " ('finalist', 's', 'st', True),\n", + " ('finalist', 'a', 'su', True),\n", + " ('finalist', 's', 'su', True),\n", + " ('finalist', 'a', 'sv', True),\n", + " ('finalist', 's', 'sv', True),\n", + " ('finalist', 'a', 'sw', True),\n", + " ('finalist', 's', 'sw', True),\n", + " ('finalist', 'a', 'sx', True),\n", + " ('finalist', 's', 'sx', True),\n", + " ('finalist', 'a', 'sy', True),\n", + " ('finalist', 's', 'sy', True),\n", + " ('finalist', 'a', 'sz', True),\n", + " ('finalist', 's', 'sz', True),\n", + " ('finalist', 'a', 'tu', True),\n", + " ('finalist', 't', 'tu', True),\n", + " ('finalist', 'a', 'tv', True),\n", + " ('finalist', 't', 'tv', True),\n", + " ('finalist', 'a', 'tw', True),\n", + " ('finalist', 't', 'tw', True),\n", + " ('finalist', 'a', 'tx', True),\n", + " ('finalist', 't', 'tx', True),\n", + " ('finalist', 'a', 'ty', True),\n", + " ('finalist', 't', 'ty', True),\n", + " ('finalist', 'a', 'tz', True),\n", + " ('finalist', 't', 'tz', True),\n", + " ('finalist', 'a', 'uv', True),\n", + " ('finalist', 'u', 'uv', True),\n", + " ('finalist', 'a', 'uw', True),\n", + " ('finalist', 'u', 'uw', True),\n", + " ('finalist', 'a', 'ux', True),\n", + " ('finalist', 'u', 'ux', True),\n", + " ('finalist', 'a', 'uy', True),\n", + " ('finalist', 'u', 'uy', True),\n", + " ('finalist', 'a', 'uz', True),\n", + " ('finalist', 'u', 'uz', True),\n", + " ('finalist', 'a', 'vw', True),\n", + " ('finalist', 'v', 'vw', True),\n", + " ('finalist', 'a', 'vx', True),\n", + " ('finalist', 'v', 'vx', True),\n", + " ('finalist', 'a', 'vy', True),\n", + " ('finalist', 'v', 'vy', True),\n", + " ('finalist', 'a', 'vz', True),\n", + " ('finalist', 'v', 'vz', True),\n", + " ('finalist', 'a', 'wx', True),\n", + " ('finalist', 'w', 'wx', True),\n", + " ('finalist', 'a', 'wy', True),\n", + " ('finalist', 'w', 'wy', True),\n", + " ('finalist', 'a', 'wz', True),\n", + " ('finalist', 'w', 'wz', True),\n", + " ('finalist', 'a', 'xy', True),\n", + " ('finalist', 'x', 'xy', True),\n", + " ('finalist', 'a', 'xz', True),\n", + " ('finalist', 'x', 'xz', True),\n", + " ('finalist', 'a', 'yz', True),\n", + " ('finalist', 'y', 'yz', True),\n", + " ('finality', 'z', 'az', True),\n", + " ('finality', 'a', 'no', True),\n", + " ('finality', 'n', 'no', True),\n", + " ('finality', 'a', 'nu', True),\n", + " ('finality', 'n', 'nu', True),\n", + " ('finality', 'a', 'nz', True),\n", + " ('finality', 'n', 'nz', True),\n", + " ('finality', 'a', 'op', True),\n", + " ('finality', 'o', 'op', True),\n", + " ('finality', 'a', 'oq', True),\n", + " ('finality', 'o', 'oq', True),\n", + " ('finality', 'a', 'or', True),\n", + " ('finality', 'o', 'or', True),\n", + " ('finality', 'a', 'os', True),\n", + " ('finality', 'o', 'os', True),\n", + " ('finality', 'a', 'ot', True),\n", + " ('finality', 'o', 'ot', True),\n", + " ('finality', 'a', 'ou', True),\n", + " ('finality', 'o', 'ou', True),\n", + " ('finality', 'a', 'ov', True),\n", + " ('finality', 'o', 'ov', True),\n", + " ('finality', 'a', 'ow', True),\n", + " ('finality', 'o', 'ow', True),\n", + " ('finality', 'a', 'ox', True),\n", + " ('finality', 'o', 'ox', True),\n", + " ('finality', 'a', 'oy', True),\n", + " ('finality', 'o', 'oy', True),\n", + " ('finality', 'a', 'oz', True),\n", + " ('finality', 'o', 'oz', True),\n", + " ('finality', 'a', 'pq', True),\n", + " ('finality', 'p', 'pq', True),\n", + " ('finality', 'a', 'pr', True),\n", + " ('finality', 'p', 'pr', True),\n", + " ('finality', 'a', 'ps', True),\n", + " ('finality', 'p', 'ps', True),\n", + " ('finality', 'a', 'pt', True),\n", + " ('finality', 'p', 'pt', True),\n", + " ('finality', 'a', 'pu', True),\n", + " ('finality', 'p', 'pu', True),\n", + " ('finality', 'a', 'pv', True),\n", + " ('finality', 'p', 'pv', True),\n", + " ('finality', 'a', 'pw', True),\n", + " ('finality', 'p', 'pw', True),\n", + " ('finality', 'a', 'px', True),\n", + " ('finality', 'p', 'px', True),\n", + " ('finality', 'a', 'py', True),\n", + " ('finality', 'p', 'py', True),\n", + " ('finality', 'a', 'pz', True),\n", + " ('finality', 'p', 'pz', True),\n", + " ('finality', 'a', 'qr', True),\n", + " ('finality', 'q', 'qr', True),\n", + " ('finality', 'a', 'qs', True),\n", + " ('finality', 'q', 'qs', True),\n", + " ('finality', 'a', 'qt', True),\n", + " ('finality', 'q', 'qt', True),\n", + " ('finality', 'a', 'qu', True),\n", + " ('finality', 'q', 'qu', True),\n", + " ('finality', 'a', 'qv', True),\n", + " ('finality', 'q', 'qv', True),\n", + " ('finality', 'a', 'qw', True),\n", + " ('finality', 'q', 'qw', True),\n", + " ('finality', 'a', 'qx', True),\n", + " ('finality', 'q', 'qx', True),\n", + " ('finality', 'a', 'qy', True),\n", + " ('finality', 'q', 'qy', True),\n", + " ('finality', 'a', 'qz', True),\n", + " ('finality', 'q', 'qz', True),\n", + " ('finality', 'a', 'rs', True),\n", + " ('finality', 'r', 'rs', True),\n", + " ('finality', 'a', 'rt', True),\n", + " ('finality', 'r', 'rt', True),\n", + " ('finality', 'a', 'ru', True),\n", + " ('finality', 'r', 'ru', True),\n", + " ('finality', 'a', 'rv', True),\n", + " ('finality', 'r', 'rv', True),\n", + " ('finality', 'a', 'rw', True),\n", + " ('finality', 'r', 'rw', True),\n", + " ('finality', 'a', 'rx', True),\n", + " ('finality', 'r', 'rx', True),\n", + " ('finality', 'a', 'ry', True),\n", + " ('finality', 'r', 'ry', True),\n", + " ('finality', 'a', 'rz', True),\n", + " ('finality', 'r', 'rz', True),\n", + " ('finality', 'a', 'st', True),\n", + " ('finality', 's', 'st', True),\n", + " ('finality', 'a', 'su', True),\n", + " ('finality', 's', 'su', True),\n", + " ('finality', 'a', 'sv', True),\n", + " ('finality', 's', 'sv', True),\n", + " ('finality', 'a', 'sw', True),\n", + " ('finality', 's', 'sw', True),\n", + " ('finality', 'a', 'sx', True),\n", + " ('finality', 's', 'sx', True),\n", + " ('finality', 'a', 'sy', True),\n", + " ('finality', 's', 'sy', True),\n", + " ('finality', 'a', 'sz', True),\n", + " ('finality', 's', 'sz', True),\n", + " ('finality', 'a', 'tu', True),\n", + " ('finality', 't', 'tu', True),\n", + " ('finality', 'a', 'tv', True),\n", + " ('finality', 't', 'tv', True),\n", + " ('finality', 'a', 'tw', True),\n", + " ('finality', 't', 'tw', True),\n", + " ('finality', 'a', 'tx', True),\n", + " ('finality', 't', 'tx', True),\n", + " ('finality', 'a', 'ty', True),\n", + " ('finality', 't', 'ty', True),\n", + " ('finality', 'a', 'tz', True),\n", + " ('finality', 't', 'tz', True),\n", + " ('finality', 'a', 'uv', True),\n", + " ('finality', 'u', 'uv', True),\n", + " ('finality', 'a', 'uw', True),\n", + " ('finality', 'u', 'uw', True),\n", + " ('finality', 'a', 'ux', True),\n", + " ('finality', 'u', 'ux', True),\n", + " ('finality', 'a', 'uy', True),\n", + " ('finality', 'u', 'uy', True),\n", + " ('finality', 'a', 'uz', True),\n", + " ('finality', 'u', 'uz', True),\n", + " ('finality', 'a', 'vw', True),\n", + " ('finality', 'v', 'vw', True),\n", + " ('finality', 'a', 'vx', True),\n", + " ('finality', 'v', 'vx', True),\n", + " ('finality', 'a', 'vy', True),\n", + " ('finality', 'v', 'vy', True),\n", + " ('finality', 'a', 'vz', True),\n", + " ('finality', 'v', 'vz', True),\n", + " ('finality', 'a', 'wx', True),\n", + " ('finality', 'w', 'wx', True),\n", + " ('finality', 'a', 'wy', True),\n", + " ('finality', 'w', 'wy', True),\n", + " ('finality', 'a', 'wz', True),\n", + " ('finality', 'w', 'wz', True),\n", + " ('finality', 'a', 'xy', True),\n", + " ('finality', 'x', 'xy', True),\n", + " ('finality', 'a', 'xz', True),\n", + " ('finality', 'x', 'xz', True),\n", + " ('finality', 'a', 'yz', True),\n", + " ('finality', 'y', 'yz', True),\n", + " ('foulness', 'x', 'ov', True),\n", + " ('finalists', 'z', 'az', True),\n", + " ('finalists', 'a', 'no', True),\n", + " ('finalists', 'n', 'no', True),\n", + " ('finalists', 'a', 'nu', True),\n", + " ('finalists', 'n', 'nu', True),\n", + " ('finalists', 'a', 'nz', True),\n", + " ('finalists', 'n', 'nz', True),\n", + " ('finalists', 'a', 'op', True),\n", + " ('finalists', 'o', 'op', True),\n", + " ('finalists', 'a', 'oq', True),\n", + " ('finalists', 'o', 'oq', True),\n", + " ('finalists', 'a', 'or', True),\n", + " ('finalists', 'o', 'or', True),\n", + " ('finalists', 'a', 'os', True),\n", + " ('finalists', 'o', 'os', True),\n", + " ('finalists', 'a', 'ot', True),\n", + " ('finalists', 'o', 'ot', True),\n", + " ('finalists', 'a', 'ou', True),\n", + " ('finalists', 'o', 'ou', True),\n", + " ('finalists', 'a', 'ov', True),\n", + " ('finalists', 'o', 'ov', True),\n", + " ('finalists', 'a', 'ow', True),\n", + " ('finalists', 'o', 'ow', True),\n", + " ('finalists', 'a', 'ox', True),\n", + " ('finalists', 'o', 'ox', True),\n", + " ('finalists', 'a', 'oy', True),\n", + " ('finalists', 'o', 'oy', True),\n", + " ('finalists', 'a', 'oz', True),\n", + " ('finalists', 'o', 'oz', True),\n", + " ('finalists', 'a', 'pq', True),\n", + " ('finalists', 'p', 'pq', True),\n", + " ('finalists', 'a', 'pr', True),\n", + " ('finalists', 'p', 'pr', True),\n", + " ('finalists', 'a', 'ps', True),\n", + " ('finalists', 'p', 'ps', True),\n", + " ('finalists', 'a', 'pt', True),\n", + " ('finalists', 'p', 'pt', True),\n", + " ('finalists', 'a', 'pu', True),\n", + " ('finalists', 'p', 'pu', True),\n", + " ('finalists', 'a', 'pv', True),\n", + " ('finalists', 'p', 'pv', True),\n", + " ('finalists', 'a', 'pw', True),\n", + " ('finalists', 'p', 'pw', True),\n", + " ('finalists', 'a', 'px', True),\n", + " ('finalists', 'p', 'px', True),\n", + " ('finalists', 'a', 'py', True),\n", + " ('finalists', 'p', 'py', True),\n", + " ('finalists', 'a', 'pz', True),\n", + " ('finalists', 'p', 'pz', True),\n", + " ('finalists', 'a', 'qr', True),\n", + " ('finalists', 'q', 'qr', True),\n", + " ('finalists', 'a', 'qs', True),\n", + " ('finalists', 'q', 'qs', True),\n", + " ('finalists', 'a', 'qt', True),\n", + " ('finalists', 'q', 'qt', True),\n", + " ('finalists', 'a', 'qu', True),\n", + " ('finalists', 'q', 'qu', True),\n", + " ('finalists', 'a', 'qv', True),\n", + " ('finalists', 'q', 'qv', True),\n", + " ('finalists', 'a', 'qw', True),\n", + " ('finalists', 'q', 'qw', True),\n", + " ('finalists', 'a', 'qx', True),\n", + " ('finalists', 'q', 'qx', True),\n", + " ('finalists', 'a', 'qy', True),\n", + " ('finalists', 'q', 'qy', True),\n", + " ('finalists', 'a', 'qz', True),\n", + " ('finalists', 'q', 'qz', True),\n", + " ('finalists', 'a', 'rs', True),\n", + " ('finalists', 'r', 'rs', True),\n", + " ('finalists', 'a', 'rt', True),\n", + " ('finalists', 'r', 'rt', True),\n", + " ('finalists', 'a', 'ru', True),\n", + " ('finalists', 'r', 'ru', True),\n", + " ('finalists', 'a', 'rv', True),\n", + " ('finalists', 'r', 'rv', True),\n", + " ('finalists', 'a', 'rw', True),\n", + " ('finalists', 'r', 'rw', True),\n", + " ('finalists', 'a', 'rx', True),\n", + " ('finalists', 'r', 'rx', True),\n", + " ('finalists', 'a', 'ry', True),\n", + " ('finalists', 'r', 'ry', True),\n", + " ('finalists', 'a', 'rz', True),\n", + " ('finalists', 'r', 'rz', True),\n", + " ('finalists', 'a', 'st', True),\n", + " ('finalists', 's', 'st', True),\n", + " ('finalists', 'a', 'su', True),\n", + " ('finalists', 's', 'su', True),\n", + " ('finalists', 'a', 'sv', True),\n", + " ('finalists', 's', 'sv', True),\n", + " ('finalists', 'a', 'sw', True),\n", + " ('finalists', 's', 'sw', True),\n", + " ('finalists', 'a', 'sx', True),\n", + " ('finalists', 's', 'sx', True),\n", + " ('finalists', 'a', 'sy', True),\n", + " ('finalists', 's', 'sy', True),\n", + " ('finalists', 'a', 'sz', True),\n", + " ('finalists', 's', 'sz', True),\n", + " ('finalists', 'a', 'tu', True),\n", + " ('finalists', 't', 'tu', True),\n", + " ('finalists', 'a', 'tv', True),\n", + " ('finalists', 't', 'tv', True),\n", + " ('finalists', 'a', 'tw', True),\n", + " ('finalists', 't', 'tw', True),\n", + " ('finalists', 'a', 'tx', True),\n", + " ('finalists', 't', 'tx', True),\n", + " ('finalists', 'a', 'ty', True),\n", + " ('finalists', 't', 'ty', True),\n", + " ('finalists', 'a', 'tz', True),\n", + " ('finalists', 't', 'tz', True),\n", + " ('finalists', 'a', 'uv', True),\n", + " ('finalists', 'u', 'uv', True),\n", + " ('finalists', 'a', 'uw', True),\n", + " ('finalists', 'u', 'uw', True),\n", + " ('finalists', 'a', 'ux', True),\n", + " ('finalists', 'u', 'ux', True),\n", + " ('finalists', 'a', 'uy', True),\n", + " ('finalists', 'u', 'uy', True),\n", + " ('finalists', 'a', 'uz', True),\n", + " ('finalists', 'u', 'uz', True),\n", + " ('finalists', 'a', 'vw', True),\n", + " ('finalists', 'v', 'vw', True),\n", + " ('finalists', 'a', 'vx', True),\n", + " ('finalists', 'v', 'vx', True),\n", + " ('finalists', 'a', 'vy', True),\n", + " ('finalists', 'v', 'vy', True),\n", + " ('finalists', 'a', 'vz', True),\n", + " ('finalists', 'v', 'vz', True),\n", + " ('finalists', 'a', 'wx', True),\n", + " ('finalists', 'w', 'wx', True),\n", + " ('finalists', 'a', 'wy', True),\n", + " ('finalists', 'w', 'wy', True),\n", + " ('finalists', 'a', 'wz', True),\n", + " ('finalists', 'w', 'wz', True),\n", + " ('finalists', 'a', 'xy', True),\n", + " ('finalists', 'x', 'xy', True),\n", + " ('finalists', 'a', 'xz', True),\n", + " ('finalists', 'x', 'xz', True),\n", + " ('finalists', 'a', 'yz', True),\n", + " ('finalists', 'y', 'yz', True),\n", + " ('foulnesss', 'x', 'ov', True)]" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(w, s, d1+d2, r)\n", + " for w in hinted_keywords \n", + " for d1 in string.ascii_lowercase[:25]\n", + " for d2 in string.ascii_lowercase\n", + " for s in string.ascii_lowercase \n", + " for r in [True, False]\n", + " if d2 > d1\n", + " if cadenus_decipher(first_chunk, w, \n", + " make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('finalreport')]" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(w, s, d1+d2, r, cadenus_decipher(first_chunk, w, \n", + " make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r))[:50])\n", + " for w in hinted_keywords \n", + " for d1 in string.ascii_lowercase[:25]\n", + " for d2 in string.ascii_lowercase\n", + " for s in string.ascii_lowercase \n", + " for r in [True, False]\n", + " if d2 > d1\n", + " if cadenus_decipher(first_chunk, w, \n", + " make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('finalreport')]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[('finalist', 'a', 'no', True),\n", + " ('finalist', 'n', 'no', True),\n", + " ('finalist', 'a', 'op', True),\n", + " ('finalist', 'o', 'op', True),\n", + " ('finalist', 'a', 'pq', True),\n", + " ('finalist', 'p', 'pq', True),\n", + " ('finalist', 'a', 'qr', True),\n", + " ('finalist', 'q', 'qr', True),\n", + " ('finalist', 'a', 'rs', True),\n", + " ('finalist', 'r', 'rs', True),\n", + " ('finalist', 'a', 'st', True),\n", + " ('finalist', 's', 'st', True),\n", + " ('finalist', 'a', 'tu', True),\n", + " ('finalist', 't', 'tu', True),\n", + " ('finalist', 'a', 'uv', True),\n", + " ('finalist', 'u', 'uv', True),\n", + " ('finalist', 'a', 'vw', True),\n", + " ('finalist', 'v', 'vw', True),\n", + " ('finalist', 'a', 'wx', True),\n", + " ('finalist', 'w', 'wx', True),\n", + " ('finalist', 'a', 'xy', True),\n", + " ('finalist', 'x', 'xy', True),\n", + " ('finalist', 'a', 'yz', True),\n", + " ('finalist', 'y', 'yz', True),\n", + " ('finality', 'a', 'no', True),\n", + " ('finality', 'n', 'no', True),\n", + " ('finality', 'a', 'op', True),\n", + " ('finality', 'o', 'op', True),\n", + " ('finality', 'a', 'pq', True),\n", + " ('finality', 'p', 'pq', True),\n", + " ('finality', 'a', 'qr', True),\n", + " ('finality', 'q', 'qr', True),\n", + " ('finality', 'a', 'rs', True),\n", + " ('finality', 'r', 'rs', True),\n", + " ('finality', 'a', 'st', True),\n", + " ('finality', 's', 'st', True),\n", + " ('finality', 'a', 'tu', True),\n", + " ('finality', 't', 'tu', True),\n", + " ('finality', 'a', 'uv', True),\n", + " ('finality', 'u', 'uv', True),\n", + " ('finality', 'a', 'vw', True),\n", + " ('finality', 'v', 'vw', True),\n", + " ('finality', 'a', 'wx', True),\n", + " ('finality', 'w', 'wx', True),\n", + " ('finality', 'a', 'xy', True),\n", + " ('finality', 'x', 'xy', True),\n", + " ('finality', 'a', 'yz', True),\n", + " ('finality', 'y', 'yz', True),\n", + " ('finalists', 'a', 'no', True),\n", + " ('finalists', 'n', 'no', True),\n", + " ('finalists', 'a', 'op', True),\n", + " ('finalists', 'o', 'op', True),\n", + " ('finalists', 'a', 'pq', True),\n", + " ('finalists', 'p', 'pq', True),\n", + " ('finalists', 'a', 'qr', True),\n", + " ('finalists', 'q', 'qr', True),\n", + " ('finalists', 'a', 'rs', True),\n", + " ('finalists', 'r', 'rs', True),\n", + " ('finalists', 'a', 'st', True),\n", + " ('finalists', 's', 'st', True),\n", + " ('finalists', 'a', 'tu', True),\n", + " ('finalists', 't', 'tu', True),\n", + " ('finalists', 'a', 'uv', True),\n", + " ('finalists', 'u', 'uv', True),\n", + " ('finalists', 'a', 'vw', True),\n", + " ('finalists', 'v', 'vw', True),\n", + " ('finalists', 'a', 'wx', True),\n", + " ('finalists', 'w', 'wx', True),\n", + " ('finalists', 'a', 'xy', True),\n", + " ('finalists', 'x', 'xy', True),\n", + " ('finalists', 'a', 'yz', True),\n", + " ('finalists', 'y', 'yz', True)]" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(w, s, d1+chr(ord(d1)+1), r)\n", + " for w in hinted_keywords \n", + " for d1 in string.ascii_lowercase[:25]\n", + " # for d2 in string.ascii_lowercase\n", + " for s in string.ascii_lowercase \n", + " for r in [True, False]\n", + " # if d2 > d1\n", + " if cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+chr(ord(d1)+1), start=s, reverse=r)).startswith('final')]" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'phasennrkmffnhignsdaaojsrcisrncheentoeetueweisvhsounsucoaleyrhreitdioseotototdhsoagreeysifaglenhtlhonriuelseairscnrteameteiwnntneefefcrartataieposrlandrlvtartalvhctofnorehdpro'" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cadenus_decipher(first_chunk, 'filbert', make_cadenus_keycolumn(doubled_letters='lu', start='m', reverse=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanes']" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chunks(first_chunk, 175)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "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.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}