994caffca42e284c5c4d70ac3cffcf358b55fa92
[cipher-tools.git] / 2017 / 2017-challenge7.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {},
7 "outputs": [],
8 "source": [
9 "import os,sys,inspect, collections\n",
10 "currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))\n",
11 "parentdir = os.path.dirname(currentdir)\n",
12 "sys.path.insert(0,parentdir) \n",
13 "\n",
14 "import itertools\n",
15 "\n",
16 "import matplotlib.pyplot as plt\n",
17 "%matplotlib inline\n",
18 "\n",
19 "from cipherbreak import *\n",
20 "from text_prettify import *\n",
21 "\n",
22 "ca = open('7a.ciphertext').read()\n",
23 "cb = open('7b.ciphertext').read()"
24 ]
25 },
26 {
27 "cell_type": "code",
28 "execution_count": 2,
29 "metadata": {},
30 "outputs": [
31 {
32 "name": "stdout",
33 "output_type": "stream",
34 "text": [
35 "DEYRB UGZWR VEFMY PEOAR GTDHX MGWHR RRQRL GSZVE VVIES UZRTU OEHVR SSLLQ VBCYW YHVRL OEUGV TOTGX DVQWU SBLJN HELFQ ARJLL BIIGK JAEGM QGUTG NQAQC ENRYY VOAIK PNJGC YDRPW VFSOV QOTGK KIAWE TPNIC ZKRZI XUSAW NYEUK XEZWA NKIUE OMQHA TZWWR WTSGN IGZGC ZWYFZ HDNHM GZKRZ GINLO EOGJL RUNZD RTGKD RYABL ROMHE AVDAE CIFOY HKDVN FKTUK QFNZA IJEGW MRBSJ NHELF QANKV NRUNG NKOIL KVFHL FKDRT COEGI EKVFG NMJUX LULXJ SZLNZ MEXKP CDGRV IYGNM YOMHK KSHKL OSGTR DGNUU MNKVI NSVBZ YUIHA UQAAP OBHYA SVGFB LOBHZ UNEHE SHGNM ZEUKL VJTTB QSJOO EEKBU KNAEJ MAYNA EJMAY CEIHI VLOEE UZZGE BVKIW MZTJG VGKJT FFSAX BSRZP RATIE LXVSA EQGVQ ZUAUG EAWET EGTNE KRFIW RUYEP EDVGI OEIYF AVNNH QGROK VKIQG LSOEX VRONX XTPAW HRXAV TZHVV IYSAE EIPNV ZEIVE AQDAL CMNXK IEOYP CAHRO AUZGR XDXRF VWYOD RYONK KICWY GNSWA SASVX QVFIE ERQAG TDZKE CHLNG UPNBK AGDWF LVTUK NHRRC FOPRU AIBTQ NSTOK VYEWO OJZPR ECICO JRWSA OUCGA YDZVQ NFALV TOVZZ OKUCG GMIAJ KUGVT VUWRN LNOAB VLCEV ATYSP NJNIG OYIEL XVKBS CKKGZ NETXV NLVRF ICEOU SZWCJ ASLBB MEIUM VKMFF HTHXI YVXOK HGGAC EAKAF VKRYD TFLOE EKERC OLCIM ASSLL AVYUI KKKIF WJRRZ WSZNE ZAXUD LGVUV GNGTC HEIWZ TUKYH KYTZR RBXOO JCMQK GLNLX UEPDN YIAJS AIBEZ ZHSNI TRBKR ZGINO LSUUC YJREK WLRUV LYKKG UXDVD PJAAH GNMZZ NEIXW FAHNZ GNVGI AEEIC JLTGE ZHZNL VVWVX AHREN RKRBV WVNQL DNTLF NKHRV WHYNE FZMQG CAPZI ZANHG SIXKZ HVWLV WCEFL IYRUU KLXVK HCHTV VTMPC DRNFK IGNQA QOCRQ LRDW\n"
36 ]
37 }
38 ],
39 "source": [
40 "print(ca)"
41 ]
42 },
43 {
44 "cell_type": "code",
45 "execution_count": 3,
46 "metadata": {},
47 "outputs": [
48 {
49 "name": "stderr",
50 "output_type": "stream",
51 "text": [
52 "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
53 " \"matplotlib is currently using a non-GUI backend, \"\n"
54 ]
55 },
56 {
57 "data": {
58 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE7FJREFUeJzt3X+w5XVdx/HnS36kookL141EXE1GoxxEryShjYI4lD+g\niUzzx9rgbKamZpZr5WSOzazpZP5R1qbmVqggSUtaKrNg/v6xC4v8WHERIWGAXUlScFKBd3+c78YF\ndvd8z7nn3P3cPc/HzJ3z/Z7zfd/v+55z7n2dz+d8z/emqpAkqVX329cNSJK0NwaVJKlpBpUkqWkG\nlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQcu5c4OP/zwWrVq1VLuUpLUqC1btnyn\nquaGbbekQbVq1So2b968lLuUJDUqyXV9tnPqT5LUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSD\nSpLUNINKktQ0g0qS1DSDSpLUtCU9hZIkqU2r1n6897bXrnv2FDu5L0dUkqSmGVSSpKYZVJKkphlU\nkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYNDaokj02ydcHX95K8LsmKJBck2d5dPnQpGpYkzZahZ6ao\nqquAJwAkOQC4ATgPWAtsqqp1SdZ262+cYq+SpCFaPsPEuEad+jsZ+GZVXQecBmzort8AnD7JxiRJ\ngtGD6gXAh7rllVV1Y7d8E7ByYl1JktTpHVRJDgaeB3zk3rdVVQG1h7o1STYn2bxz586xG5UkzaZR\nRlS/DFxcVTd36zcnOQKgu9yxu6KqWl9V81U1Pzc3t7huJUkzZ5SgeiF3T/sBnA+s7pZXAxsn1ZQk\nSbv0CqokhwCnAB9dcPU64JQk24FnduuSJE1Ur3+cWFW3A4fd67pbGBwFKEnS1HhmCklS0wwqSVLT\nDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtN6nZlCkrT09sd/gjgOR1SSpKYZVJKk\nphlUkqSmGVSSpKYZVJKkpnnUnyRNmUfvLY4jKklS0wwqSVLTDCpJUtN8j0rSzBn3PSPfa9o3HFFJ\nkppmUEmSmubUn6Rlzem4/Z8jKklS0wwqSVLTegVVkkOTnJvk60m2JTkhyYokFyTZ3l0+dNrNSpJm\nT98R1buBT1TV44BjgW3AWmBTVR0NbOrWJUmaqKFBleQhwC8B7wOoqh9V1a3AacCGbrMNwOnTalKS\nNLv6jKgeBewE/iHJJUnem+QQYGVV3dhtcxOwclpNSpJmV5+gOhB4IvCeqjoOuJ17TfNVVQG1u+Ik\na5JsTrJ5586di+1XkjRj+gTV9cD1VfXlbv1cBsF1c5IjALrLHbsrrqr1VTVfVfNzc3OT6FmSNEOG\nBlVV3QR8O8lju6tOBq4EzgdWd9etBjZOpUNJ0kzre2aK3wXOSnIwcA3wWwxC7pwkZwLXAc+fTouS\npFnWK6iqaiswv5ubTp5sO5Ik3ZNnppAkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc2g\nkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDWt7z9OlKSpWrX24723vXbds6fY\niVrjiEqS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUtF4f+E1yLfB94E7gjqqa\nT7ICOBtYBVwLPL+qvjudNiVJs2qUM1M8o6q+s2B9LbCpqtYlWdutv3Gi3UladjzDhCZtMVN/pwEb\nuuUNwOmLb0eSpHvqG1QFfCrJliRruutWVtWN3fJNwMqJdydJmnl9p/6eWlU3JHkYcEGSry+8saoq\nSe2usAu2NQBHHXXUopqVtLScxlMLeo2oquqG7nIHcB5wPHBzkiMAussde6hdX1XzVTU/Nzc3ma4l\nSTNjaFAlOSTJg3ctA88CLgfOB1Z3m60GNk6rSUnS7Ooz9bcSOC/Jru0/WFWfSPJV4JwkZwLXAc+f\nXpuSpFk1NKiq6hrg2N1cfwtw8jSakiRpF89MIUlqmkElSWqaQSVJappBJUlqmkElSWraKCellbRM\neYYJLWeOqCRJTTOoJElNc+pPWkacwtMsckQlSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkEl\nSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaZ0+X9hHPhC7144hKktS03kGV5IAklyT5\nWLf+qCRfTnJ1krOTHDy9NiVJs2qUEdVrgW0L1t8OvKuqHgN8Fzhzko1JkgQ9gyrJkcCzgfd26wFO\nAs7tNtkAnD6NBiVJs63viOqvgD8E7urWDwNurao7uvXrgYdPuDdJkoYf9ZfkOcCOqtqS5Omj7iDJ\nGmANwFFHHTVyg1LrPHpPmq4+I6oTgecluRb4MIMpv3cDhybZFXRHAjfsrriq1lfVfFXNz83NTaBl\nSdIsGRpUVfWmqjqyqlYBLwAurKoXARcBZ3SbrQY2Tq1LSdLMWsznqN4IvD7J1Qzes3rfZFqSJOlu\nI52Zoqo+DXy6W74GOH7yLUmSdDfPTCFJappBJUlqmiellToeZi61yRGVJKlpBpUkqWlO/Wm/4xSe\ntH9xRCVJappBJUlqmkElSWqa71Gpab7fJMkRlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpHvWnJeHR\ne5LG5YhKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUNA9P10g8zFzSUnNEJUlqmkElSWra0KBK\ncv8kX0lyaZIrkvxZd/2jknw5ydVJzk5y8PTblSTNmj4jqh8CJ1XVscATgFOTPAV4O/CuqnoM8F3g\nzOm1KUmaVUODqgZu61YP6r4KOAk4t7t+A3D6VDqUJM20Xu9RJTkgyVZgB3AB8E3g1qq6o9vkeuDh\n02lRkjTLegVVVd1ZVU8AjgSOBx7XdwdJ1iTZnGTzzp07x2xTkjSrRjrqr6puBS4CTgAOTbLrc1hH\nAjfsoWZ9Vc1X1fzc3NyimpUkzZ4+R/3NJTm0W34AcAqwjUFgndFtthrYOK0mJUmzq8+ZKY4ANiQ5\ngEGwnVNVH0tyJfDhJG8DLgHeN8U+NQWeZULScjA0qKrqa8Bxu7n+GgbvV0mSNDWemUKS1DRPSrsf\ncApP0v7MEZUkqWkGlSSpaQaVJKlpvkfVEN9rkqT7ckQlSWqaQSVJappTf0OMOx3nNJ4kTYYjKklS\n0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtNm5vB0DxeXpOXJEZUkqWkGlSSpaQaVJKlpBpUkqWkG\nlSSpaQaVJKlpBpUkqWkGlSSpaUODKskjklyU5MokVyR5bXf9iiQXJNneXT50+u1KkmZNnxHVHcDv\nV9UxwFOAVyU5BlgLbKqqo4FN3bokSRM1NKiq6saqurhb/j6wDXg4cBqwodtsA3D6tJqUJM2ukd6j\nSrIKOA74MrCyqm7sbroJWDnRziRJYoSgSvIg4F+A11XV9xbeVlUF1B7q1iTZnGTzzp07F9WsJGn2\n9AqqJAcxCKmzquqj3dU3Jzmiu/0IYMfuaqtqfVXNV9X83NzcJHqWJM2QPkf9BXgfsK2q/nLBTecD\nq7vl1cDGybcnSZp1ff4f1YnAS4DLkmztrvsjYB1wTpIzgeuA50+nxXvy/0pJ0mwZGlRV9Tkge7j5\n5Mm2I0nSPXlmCklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS\n0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMM\nKklS0wwqSVLTDCpJUtMMKklS04YGVZL3J9mR5PIF161IckGS7d3lQ6fbpiRpVvUZUX0AOPVe160F\nNlXV0cCmbl2SpIkbGlRV9Rngv+919WnAhm55A3D6hPuSJAkY/z2qlVV1Y7d8E7ByTxsmWZNkc5LN\nO3fuHHN3kqRZteiDKaqqgNrL7eurar6q5ufm5ha7O0nSjBk3qG5OcgRAd7ljci1JknS3cYPqfGB1\nt7wa2DiZdiRJuqc+h6d/CPgi8Ngk1yc5E1gHnJJkO/DMbl2SpIk7cNgGVfXCPdx08oR7kSTpPjwz\nhSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUk\nqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlp\nBpUkqWmLCqokpya5KsnVSdZOqilJknYZO6iSHAD8NfDLwDHAC5McM6nGJEmCxY2ojgeurqprqupH\nwIeB0ybTliRJA4sJqocD316wfn13nSRJE5OqGq8wOQM4tape3q2/BPiFqnr1vbZbA6zpVh8LXDV+\nu3t1OPCdJapbyn2NW7ccehy3zh4nU7ccehy3zh4nUzfuvvp6ZFXNDd2qqsb6Ak4APrlg/U3Am8b9\nfov9AjYvVd1S7mt/7nF//tns0Z+tpX0tdY+T/lrM1N9XgaOTPCrJwcALgPMX8f0kSbqPA8ctrKo7\nkrwa+CRwAPD+qrpiYp1JksQiggqgqv4d+PcJ9bJY65ewbin3NW7dcuhx3Dp7nEzdcuhx3Dp7nEzd\nuPuaqLEPppAkaSl4CiVJUtNmMqiSrEpy+SK/xxcm1U/P/b0lyRuWcp99JXlNkm1JztrXvbQgyaFJ\nXjlizaKfk0slyW1LuK8l/T0b1XJ63JazmQyqSaiqX9zXPTTklcApVfWifd1IIw5lcJ9okRb7e5YB\n/84tc8v+Aexe0Xw9yVndq/pzkzywR+mBY9Qs3O/QV5ULevtAkm90+3tmks8n2Z7k+CH1f9zVfY7B\nh6X79vb/dUk+1GckluTJSb6W5P5JDklyRZKf71H3t8Cjgf9I8nsj9PjSbn+XJvmnHtv/QZLXdMvv\nSnJht3zSsJFc9/N8vNvX5Ul+o8f+3prkdQvW/zzJa4f/ZACsA34mydYk7+hZA3BAkr/v7vtPJXnA\nkB7v8Wo+yRuSvKXPjpK8vrsvLl/4c05Dkld098XWJN9KctEItSOP3rr75aok/whcDjyiZ92/JtnS\n3f9rhlfcp/7RSS5J8uQe276563GU39FV3d+rUZ4j65K8asF675mZJC9O8pXucfu7DM7vum/s6w9y\nLfYLWAUUcGK3/n7gDZOu2c33uK1nb3cAj2fwomBLt68wOC/iv+6l9knAZcADgZ8Eru7T47h1Xe3b\ngHcyONlw7w9vA9cCh4+w/c8B39hVA6zoUfMU4CPd8meBrwAHAX8K/PaQ2l8D/n7B+kN6PnYXd8v3\nA74JHDbCc/LyMZ7HdwBP6NbPAV48yn6ANwBvGeE5cgjwIOAK4LhJPvf3UHdQ99g9d5r76u6Xu4Cn\njFi3ort8AIOAG/p473oMGLyQvAQ4tkfNk4GtwP2BBwPbe/5uj/McOQ74zwXrVwKP6LGvnwX+DTio\nW/8b4KXjPO6T+Fr2I6rOt6vq893yPwNPnVLNOL5VVZdV1V0M/iBsqsEjfxmDJ96ePA04r6p+UFXf\no/+HqcetA3grcAowD/zFCHWjOolB6HwHoKr+u0fNFuBJSX4S+CHwRQZ9Po3BH7+9uQw4Jcnbkzyt\nqv5n2M6q6lrgliTHAc8CLqmqW3r0uRjfqqqt3fIW9v78WIynMniO3F5VtwEfZXA/Ttu7gQur6t+W\nYF/XVdWXRqx5TZJLgS8xGIUd3bNuDtgIvKiqLu2x/YnAxqr636r6PoNA6Guk50hVXQI8LMlPJzkW\n+G5VfXtvNZ2TGbyg+WqSrd36o0foc6IW9Tmqhtz7GPs+x9yPUzOOHy5YvmvB+l20d/8fxuAV9kEM\nXu3dvm/buVtV/TjJt4CXAV8AvgY8A3gMsG1I7TeSPBH4FeBtSTZV1Vt77Pa93f5+isFIeNoWPlfu\nZPDKfm/u4J7T9/efeEcTkuRlwCOBVw/ZdFJGeu4meTrwTOCEqvpBkk/T//78H+C/GLwAuHKU/Y5h\n1OcIwEeAMxg8j8/uuZ8AG6rqTaO1Nx37y4jqqCQndMu/CXxuSjVL6TPA6UkekOTBwHOnXAfwd8Cb\ngbOAt4/U7WguBH49yWEASVb0rPssg+mtz3TLr2Aw0tnri4wkPw38oKr+GXgH8MSe+zsPOJXBVM0n\ne9YAfJ/BlM603czg1fJhSX4CeE7Pus8yeI48MMkhwK8yfFQ6tiRPYvC4vbibWWjRQxiMNn6Q5HEM\nppr7+hGD+/ClSX6zx/afB57bvR/8IPo/buM6m8Ep7s5gEFp9bALOSPIwGPyOJnnklPobqrVX9OO6\nCnhVkvczeEXzninVLDTVT0pX1cVJzgYuBXYwOLfi1OqSvBT4cVV9sHvT9AtJTqqqC8f7Cfba4xVJ\n/hz4zyR3Mpjbf1mP0s8Cfwx8sapuT/K/9PsD+3jgHUnuAn4M/E7PPn/UvfF/a1Xd2aemq7slgwNm\nLgf+o6r+oG/tKLpR5lsZvF93A/D1nnUXJ/lAVwfw3m6KaFpeDawALkoCgxOdvnyK+xvHJ4BXJNnG\n4G/DSNOG3fPxOcAFSW6rqj1OuVfVV5Ocz2BW4GYGU9NDp6PH1f2+PRi4oapu7FlzZZI/AT6VwVGT\nPwZeBVw3rT73ZtmfmSLJKuBjVTX0CLUJ7vMwBm+077NXGH11R4HdVlXv3Ne9LDfdL+jFwK9X1fZ9\n3Y/2H0keVFW3ZXC08WeANVV18b7uq1X7y9Tfkummkb7I4Og47aeSHMPgiMlNhpSmYH13kMLFwL8Y\nUnu37EdUkqT9myMqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0/4P/bpV2FpB9wgAAAAASUVO\nRK5CYII=\n",
59 "text/plain": [
60 "<matplotlib.figure.Figure at 0x7f83bc5a9470>"
61 ]
62 },
63 "metadata": {},
64 "output_type": "display_data"
65 }
66 ],
67 "source": [
68 "fc = collections.Counter(sanitise(ca))\n",
69 "plot_frequency_histogram(fc, sort_key=fc.get)"
70 ]
71 },
72 {
73 "cell_type": "code",
74 "execution_count": 4,
75 "metadata": {},
76 "outputs": [],
77 "source": [
78 "pua = depunctuate(ca)"
79 ]
80 },
81 {
82 "cell_type": "code",
83 "execution_count": 5,
84 "metadata": {},
85 "outputs": [
86 {
87 "data": {
88 "text/plain": [
89 "('hanginggardens', -1451.9609829395629)"
90 ]
91 },
92 "execution_count": 5,
93 "metadata": {},
94 "output_type": "execute_result"
95 }
96 ],
97 "source": [
98 "ka, score = vigenere_frequency_break(ca)\n",
99 "ka, score"
100 ]
101 },
102 {
103 "cell_type": "code",
104 "execution_count": 6,
105 "metadata": {},
106 "outputs": [
107 {
108 "name": "stdout",
109 "output_type": "stream",
110 "text": [
111 "well that was a surprise and quite a relief as i said before no one really knows where the hanging\n",
112 "gardens of babylon were located and i dont think we would have had a chance of finding the next\n",
113 "chapter if that was where it was buried but it seems that tacitus had a better idea the babylonian\n",
114 "goddess of love and war was ishtar and the ishtar gate from babylon was one of the original seven\n",
115 "wonders of the world it was later replaced by the lighthouse of alexandria so i am not sure why\n",
116 "tacitus used both but maybe because he didnt know where the hanging gardens were either or maybe he\n",
117 "just wanted to confuse the uninitiated and to add an extra layer of secrecy via confusion abit like\n",
118 "he does by piling up ciphers in these later chapters anyway we are in luck the ishtar gate now lives\n",
119 "in the pergamon museum in berlin and i happen to have a pass to the full collection i am not sure\n",
120 "how they will feel about us dismantling it to try to find chapter seven but if we explain what is in\n",
121 "it i suspect the curators curiosity will overcome his natural protectiveness perhaps there we will\n",
122 "finally unlock the secret of the ixth legion that leaves the question of how we deal with midas and\n",
123 "maryam has a clever idea we should let the collector deal with them the russian mafia can be pretty\n",
124 "ruthless if they feel betrayed and she has suggested away we might make the thieves fallout it is a\n",
125 "cunning plan and i think i can help\n"
126 ]
127 }
128 ],
129 "source": [
130 "pa = vigenere_decipher(sanitise(ca), ka)\n",
131 "print(lcat(tpack(segment(pa))))"
132 ]
133 },
134 {
135 "cell_type": "code",
136 "execution_count": 7,
137 "metadata": {},
138 "outputs": [
139 {
140 "data": {
141 "text/plain": [
142 "1422"
143 ]
144 },
145 "execution_count": 7,
146 "metadata": {},
147 "output_type": "execute_result"
148 }
149 ],
150 "source": [
151 "open('7a.plaintext', 'w').write(lcat(tpack(segment(pa))))"
152 ]
153 },
154 {
155 "cell_type": "code",
156 "execution_count": 8,
157 "metadata": {},
158 "outputs": [
159 {
160 "data": {
161 "text/plain": [
162 "'oreomcufedvtmgjelehgvyhdnvwgkshmbcylmiexlrwffwxbkfszeafkzplrvsjuezttmcapoatsjuspemcqflfixmgseatgrtoieyymvjveuauglioxwftwgfebfqlfcepltdwzaaeoajfimmuarebtypctptbrgaasrtyfdloeargllxneepweorpppzyzaefqprlonyflmddtdrsrwmwpuoelepdierwaxgguytlpqgktzcglpqloafchzrsotmekmscaruseeaabhzwpflruzmedmcgymehxyqsrgaldaapydmauoqcadbjjismbtnliqgxyukejatcfsrsehmvsienxcggeteyunwmdhxzpjoteeyvxwtegcjsitcxluavputcpzpdnzchlsldvyqlpceauvjvtvvyetspehwtasppeykmegumfvazttzqesyoherxvxqfbrtzmpclkplsdeamklislhbgmszdgrmfmcpxlnzcedtrjlylokshswpmtqualnaaselmxbxqvwpdabjumxcuwkilmedlyewelohnpvjcbmctshhedrtgwprrygwiettlhjpteadpsxxkvecytrcdqptkupfhocumcsgpeacklmmnwgjjgqghmfmwletmhevgitqcwsjalsghvscyjkdierlggfvoofpeawytgbpupzsxmkpmqrkmqxmeehjjymaehcfamdsxlcsidaxcwooyebgpspyopywgifcggpspsoxqpgeytvckaucetqtjerevaqdmnomakkweyxdnlgspguqdesnzpvvxfhhsklrohxpgziyrgbckweempclzzttcowscuwgqoiyrgycmmppyyryxwehmgdldsaugvelibrkjlhdbhvvicahquvhdikcksgyebmcvmctbyguvsrvcvkydnpcfwihfgftqworkaperanakcjxpakecawlakfwsyftbcpsxztzywwhrtwacmgzfyrjftptldksizatyuqgpamywmadumnpfmeegmpeiwrkcusrzrmfnkspehgukszetggfhleuljvidthlqsepcxgvlywoamfnhcnzsgkmsramjdjyewpfdvllkgessdemmofiwinfkmeednprzylttauflmtlsnlwyrneqgvphlppkmtsxmtlhdlkdtsmttwkaaiwenmis_rufxqcauisfcbtycxxletlpahtagztlvromcgzszrymvlwomnmxqiydapfjawalgnwistxgjsjphlqqfseomfnlwsctbksaedvrrgszamlqflcubckmmwwjgcuxslbrvswdduqjuhtoeekujqnequyxedgctxiynvetvinulqumwximyqjglaadnfinsajvlmwrmcqsindtrnjmlrhgeqptcllvqszrnckvapvpjcjxcfbrvgrlspsefqdfgukdensmjukwtegqczinnkpkgyyebggcgyramgwelthrgjoyrdfdmefemrnwhoeatyessogyqgxnulgcfemaeyyzxrhbbrsxtotgrlxtexrnwcdevlpwqcmxqnkxdnvbyzhfieqolllixnusxzaajrkwtpwypnvaswgvlxxsmrvsedhktqjlowkacsxlookvsjptxscfmrohcqjvotwpvltlrbrgftzrzpvdqlngfjfiyekcgwszoxccmmoancfwglsheawxregivvpdtoyifiyixlufgpsxcjkvsihdeacptlgqfkprvltajpobbklverfatleletrckreirugvctgosx_agqmsprtyawefsklqzpdnbbrxxgpecjagyhxgcjzdcgqkscmskgyjkytxmiakycoyrlisdgcisstfbpefleomqkwepstmpsveeacpjqnhmpeaiwebmvsmpugfmsipnxrfsneymmqgbyimrcjlxuprkamngpytdwdoginvedtafcasyovreszeatfigsltlgggiphzqvkewsayqegzvhpjswckzfefwpegqqsrzizlgziznmmmxxstlykaxzawrgflehnqhogydugggetcxrruswtkygukqegqklrpiepqfhpivcedweoajqhwcaxgheeftebomedantrfydygmgsmpstmtzqqltyjzkynmmdjslowenmkjcbsuwxeafyvwveupyjgwdplrtzveexcklsloglghwuihyqztehmaueipitdewslsaqugghehgplecrlzgpmmnmsvltnexcqwjtaavvsgohxunwvccbcfsihwwgtnxqtgjukqggrzdwtzmksuwelgerggizekffltefzrfsregwgvviyhkfnlexfngqtxdabaxgkqdecjtseaxyjxcqralhylysbzuavpilm_hznpjazyvfgaxmowpglmzswjqeizetfpsmtmglvwllitsismxwvyazszcgjvshzegytjizffppxrznmykwiqutsevmwunaumspawyewypimfnzhgigphkvtdxjdvkloegpgldimkhdllharqaidakqpuysnemgwmfeacvdllexppmwqaafoascshdhzxfanlwvwpimfgeeeezsklwznncvzeytxykmhddvlagpeawtgbhseictaisteygwvwoaefwvcsxmkcgeugqhdepwmcefispmyglewnhvevhyevdgtecovrwkpfaydkgwolmpgvwztxppdrwsxjvlacdyznvwrtbmgwxpngcuzelhpzqfogmggewmzoljpgsxarfzfxdhbpwsxpsbcklitgkrtfvxsxlgaygnvfgwvchhrgvwdsmyefvwelqpslcthyjlijttbvgplomfkgeyhgcdjxheayvsittbypjeslzyxgizagrkzzzenyimiswxsojrpogrfupbyavulvccbmkmswsbqtkmcwlwcjmzomjjvetsmrgzywaxctsgpazrcolywicgayzewgvwkelnypjezbk_thigrsanutlvzsxhzjtfvpibpctwetbensraezftaplllpplestlrgowlihfelrotrcaurfaxdryveheytxmellpencostgehhyikcdejpamugjiwabgywvlqrjvawqegbkwefofrgmxpfhlufxdamrufizlfeznxeetfisfoamrpoweebnpakxlhrqaxwsmqvlmzrkrraigeglqkglexcgkssmeghsszabuvnlnhhwwvmxrtmqcieegqtswhtbkfssetkrgwvesvrgfxllhcgkxcsgnjlilfmfylffowqgfqfoxqgqxdoaanoxwhhughwsxbbigyhrxkjaivtkcgwyvnnnvzhndwmvdvpemqgailodftfrytbynltowxpkgxznhrhsvluwljgbthlsylmadzpvkilttkfsspmapdmithfykjeoitqvsltnvcgswtnmfparfhxdtjapdlwqsmnewavjqcturkrxergchsywohbksxxsgsulxzsmmqglddbawayeeprqwmssnktxiluhpcmsttzlgfvxuxchjhnwedgaiyawcvsrteaacwjlpbrpyzdimfggswryrglqlu'"
163 ]
164 },
165 "execution_count": 8,
166 "metadata": {},
167 "output_type": "execute_result"
168 }
169 ],
170 "source": [
171 "scb = cat(c.lower() for c in cb if c != ' ')\n",
172 "scb"
173 ]
174 },
175 {
176 "cell_type": "code",
177 "execution_count": 9,
178 "metadata": {},
179 "outputs": [
180 {
181 "data": {
182 "text/plain": [
183 "27"
184 ]
185 },
186 "execution_count": 9,
187 "metadata": {},
188 "output_type": "execute_result"
189 }
190 ],
191 "source": [
192 "len(set(scb))"
193 ]
194 },
195 {
196 "cell_type": "code",
197 "execution_count": 10,
198 "metadata": {},
199 "outputs": [
200 {
201 "name": "stderr",
202 "output_type": "stream",
203 "text": [
204 "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
205 " \"matplotlib is currently using a non-GUI backend, \"\n"
206 ]
207 },
208 {
209 "data": {
210 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEdxJREFUeJzt3X2sZHV9x/H3R6A+gIrAShHBq5a0xRoBV8QqCYpaBA2Y\nIvURNJrVClHbYrrUGgmRZK22pqaVikqAigpWESz4QBYr+EBll8cFRLayFDYIK1oEicrDt3/M2XaA\nhTlz78ze+9v7fiWTe86Z85vzvefOzOf8fnPm3FQVkiS15jHzXYAkSbNhgEmSmmSASZKaZIBJkppk\ngEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkpq09XwXALDTTjvVzMzMfJchSVoAVq9e/bOqWjJq\nvQURYDMzM6xatWq+y5AkLQBJbuqznkOIkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQm\nGWCSpCYZYJKkJhlgkqQmLYhLSUmSFqaZ5ef1XnfdikOmWMnD2QOTJDXJAJMkNckAkyQ1yQCTJDXJ\nAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCT\nJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1aev5LkCStHnMLD+v97rr\nVhwyxUomwx6YJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSSMDLMlu\nSb6d5Nok1yR5b7d8hyQXJLmh+/mUbnmSfCLJ2iRXJdln2r+EJGnx6dMDuw/4q6raE9gPODrJnsBy\nYGVV7QGs7OYBXgXs0d2WASdNvGpJ0qI3MsCq6taquqybvgu4DtgVOBQ4rVvtNOCwbvpQ4PQauATY\nPskuE69ckrSojfUZWJIZYG/gP4Gdq+rW7q6fAjt307sCNw81u6Vb9tDHWpZkVZJVGzZsGLNsSdJi\n1zvAkmwHfBl4X1X9cvi+qiqgxtlwVZ1cVUuraumSJUvGaSpJUr8AS7INg/A6o6q+0i2+bePQYPfz\n9m75emC3oeZP75ZJkjQxfc5CDPBZ4Lqq+oehu84FjuqmjwLOGVp+ZHc24n7AnUNDjZIkTUSff2j5\nYuAtwNVJruiW/Q2wAjgryduBm4AjuvvOBw4G1gL3AG+baMWSJNEjwKrqu0Ae4e4DN7F+AUfPsS5J\nkh6VV+KQJDWpzxCiJGkBmVl+Xu911604ZIqVzC97YJKkJhlgkqQmOYQoSfPEocC5sQcmSWqSASZJ\napIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqS\nV6OXpAnwyvKbnz0wSVKTDDBJUpMcQpSkIQ4FtsMemCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgk\nqUkGmCSpSQaYJKlJfpFZ0hbJLyRv+QwwSQuaQaRH4hCiJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUme\nhShps/GMQk2SPTBJUpMMMElSkwwwSVKTDDBJUpMMMElSk0YGWJJTktyeZM3QsuOTrE9yRXc7eOi+\n45KsTXJ9kj+ZVuGSpMWtTw/sVOCgTSz/eFXt1d3OB0iyJ/B64Dldm08m2WpSxUqStNHIAKuqi4Cf\n93y8Q4EvVtVvqupGYC2w7xzqkyRpk+byGdgxSa7qhhif0i3bFbh5aJ1bumWSJE3UbAPsJODZwF7A\nrcDfj/sASZYlWZVk1YYNG2ZZhiRpsZpVgFXVbVV1f1U9AHya/x8mXA/sNrTq07tlm3qMk6tqaVUt\nXbJkyWzKkCQtYrMKsCS7DM2+Fth4huK5wOuTPDbJM4E9gB/OrURJkh5u5MV8k3wBOADYKcktwIeA\nA5LsBRSwDngnQFVdk+Qs4FrgPuDoqrp/OqVLkhazkQFWVW/YxOLPPsr6JwInzqUoSZJG8d+pSBqb\n/xZFC4GXkpIkNckAkyQ1yQCTJDXJAJMkNcmTOKRFzJMx1DJ7YJKkJhlgkqQmGWCSpCb5GZi0hfDz\nLC02Bpi0wBhEUj8GmDQlBpE0XX4GJklqkgEmSWqSASZJapIBJklqkidxSD14Qoa08NgDkyQ1yQCT\nJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNcmL+WpR\n8aK80pbDHpgkqUn2wNQke1KS7IFJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKa5Gn0mleeDi9p\ntgwwPcxsQ8UwkrQ5OYQoSWqSASZJapIBJklq0sgAS3JKktuTrBlatkOSC5Lc0P18Src8ST6RZG2S\nq5LsM83iJUmLV5+TOE4F/gk4fWjZcmBlVa1Isryb/2vgVcAe3e2FwEndT80DT6qQtCUb2QOrqouA\nnz9k8aHAad30acBhQ8tPr4FLgO2T7DKpYiVJ2mi2n4HtXFW3dtM/BXbupncFbh5a75ZumSRJEzXn\nkziqqoAat12SZUlWJVm1YcOGuZYhSVpkZvtF5tuS7FJVt3ZDhLd3y9cDuw2t9/Ru2cNU1cnAyQBL\nly4dOwAXGz/PkqQHm20P7FzgqG76KOCcoeVHdmcj7gfcOTTUKEnSxIzsgSX5AnAAsFOSW4APASuA\ns5K8HbgJOKJb/XzgYGAtcA/wtinULEnS6ACrqjc8wl0HbmLdAo6ea1GSJI3ilTgkSU0ywCRJTTLA\nJElNMsAkSU3yH1puZn6fS5Imwx6YJKlJBpgkqUkGmCSpSX4GNkt+liVJ88sAwzCSpBY5hChJapIB\nJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJ\napIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJatLW813AJM0sP6/3uutWHDLFSiRJ02YPTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUpDldjT7JOuAu4H7gvqpammQH4ExgBlgHHFFVv5hbmZIkPdgkemAvraq9qmppN78cWFlVewAr\nu3lJkiZqGkOIhwKnddOnAYdNYRuSpEVurgFWwLeSrE6yrFu2c1Xd2k3/FNh5jtuQJOlh5vofmV9S\nVeuTPBW4IMmPhu+sqkpSm2rYBd4ygN13332OZUiSFps59cCqan3383bgbGBf4LYkuwB0P29/hLYn\nV9XSqlq6ZMmSuZQhSVqEZh1gSbZN8sSN08ArgTXAucBR3WpHAefMtUhJkh5qLkOIOwNnJ9n4OJ+v\nqm8kuRQ4K8nbgZuAI+ZepiRJDzbrAKuqnwDP28TyO4AD51KUJEmjeCUOSVKTDDBJUpMMMElSkwww\nSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElS\nkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJ\n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\n",
211 "text/plain": [
212 "<matplotlib.figure.Figure at 0x7f837d0bacf8>"
213 ]
214 },
215 "metadata": {},
216 "output_type": "display_data"
217 }
218 ],
219 "source": [
220 "fc = collections.Counter(sanitise(cb))\n",
221 "plot_frequency_histogram(fc, sort_key=fc.get)"
222 ]
223 },
224 {
225 "cell_type": "code",
226 "execution_count": 11,
227 "metadata": {},
228 "outputs": [
229 {
230 "data": {
231 "text/plain": [
232 "('eeleeyceelalas', -5541.802272494437)"
233 ]
234 },
235 "execution_count": 11,
236 "metadata": {},
237 "output_type": "execute_result"
238 }
239 ],
240 "source": [
241 "kbv, score = vigenere_frequency_break(scb)\n",
242 "kbv, score"
243 ]
244 },
245 {
246 "cell_type": "code",
247 "execution_count": 12,
248 "metadata": {},
249 "outputs": [
250 {
251 "data": {
252 "text/plain": [
253 "'kntkiesbasvimofaaaditudsnkwogowixewhixemlzsbustdibooepfsvlanruhqaotimkwldwpuhqoeebcybhuetoeoaptvrbketuuotfrtupuohedtshrscueqfyhbralnrzsoapewwfueioswntbiyxypepxtewwhriynzhdawtehhmntexsadnlrnvuoatfylnakjadhisdidzonlisrskaaeedqanlwtiequileqogpoycnnmhdaucpvnhkpocgihcprcoatwwdfvsefarcvitzieeuithmyyonvwhfywlndbackmrwzdhfehmqtvhefctasgayaicnonhadotoetnmcocaiauwlsishmzxfkiaaattsievcroeiytnswreuicxvlsjvefhoadkyyhlrawwtfrivkympoeadyrwoeptysiavqihtwvitoqmouddatvrtffqrbvieyhmnhosepmshehhddeioodvrubirltnlvytdirrhuakgufosemiqcwhcwwuchimbmqdslswxlsitrulkqhitzhacsaaownxrfrxierodwesrbcsennaesettilpfliawfnotmkkekupgyzsnpgjpuhwyqbyoinawrkamujsvffiocdbfbwtapbdaxeepfclsrwhhcdxqyuyksimnhvcbxmkbeepwgpcqlqrxotbkemyngbmtocadyjnmiadrbwobotachilwtrskqwaxvphpgklnsckdycvphpaktflcgwprrkpukapfpfgparpqsmvkipggycutsnagalcjmzgqjvevkxnddhghtmdtegoigncqygycaiecazhpprksuaqsvqdigncnyionlunrnxeadbcznbowjgketexggfnfzxwvkikwdfqrjbegrkhggaxbyroapxngjvanrrrgabjlrflipbcupmymngpptrijwzyfznwgtcpwtwgusoadpxrphxhpvnssjppspcbghbugfbvnphskhihwpnqminwinwbalqiclbocacbptiengrqotxniunzsxadvqguxapvguhtaqafrkbpdaqhexytvrhaukwbfchkjvhcgoqnwbjsjgasebzxjhgvehslaibkbkuejukbemzjenvajpppuuluphhjhywnjtqvvxdhelgorotbtahlhgspoorpszapieajbeotsbtfcpuqobrxpaattaeilxwdiwcbrhrgobcovoonuothsdmcmfmenzwrdfwlaagvsehptihofehaqybotkihlhshcibsowtzrtpcooablybhrqxeiiilwygkqthhxttossdjqrqdikagiqffntqcuttzcertennkebrecqhssismibyyfcawwflbecspjdhilnieooecdirvfiandicmlicaldmoonjeirwevejkftrbxttcnasesmbmsbcwizacsbjcgsiacsavecnzpscunaxieycnrpmosaapdtefknrsfliauaitlsddeptgaohkcaoctcuagkbabwaawvtghqbzotikpiphtiemrvsysarnnsmrmmqvgtsjrdwvduitqwhhaetpsotoapjzgsilsanjrpslgdhtmoittoashztyfhdsgcaotaodkdofeptuabigowcyfrdpsrthparqrobponvrtzmanvfrbenageesooomckiidwjedscasweistgacktrlstdyqbenetnsbcesmcrgrhedfcwyetagybgenrnrwfeoqbshrtnbcrhaaeirkgntenweryigdsfwcfiorppupwtfaghfvlflxxgxmgxayywcaftcrjodkcmzoyoqgcnjzybtixwgaakuglxslcyxoovdxltfaewimzsarqpieskemwyefmpfiltaxwmxikoirscbbsxpvtnuojgwiifgqyqinrfhzslnzabnoluizsfmcecvtdbwbrwoamrntsoeipbxconrhcvgxppvmkgayqwufevzddlyoseivbtflpmcmfonbgvhvzxzviibtturhuzamzisnvbhgfjmwovylqcvcavatnguhwbguvqgsccmzlgpqalfbdrgrytdlewwffdseytcwetfbaxdiafyjpgfndgcivoirqpiizfqtpuyvgaliisjhlwsaciglaxojwmeibuksrgsluygldxhnivrgctyzlhlwchvdswgdufziepiwjaergpztwhlawmjccjcdceltczhvvliolioklinmtyfsfvywrksvoptqcsreaxyusxhescijtsrcfjkfgonvsspbkgojwtloanvcebcgbulienvnuongesckvxypgbchazdjcftmdixwmcgsbayytheituytyspwhwyayaxvjwrrghiwzcprwvnrbiytidwegtivhsfscevttupaipbchxuhhxthiaitlrucxovrgyvadvtcuvhevufepfnvciumuemjthedisjjwwkolpwneeulxibpxdcxgehsrpstfftghdevpohzxigjbhhwagqiezpgmrsuocebgeibtwyxbhhtxepusmpwbqyoyhhshhtbpjhytslxmugmaatvomjsvcnrvhauitumkdzsvaaolapspizdotirtieoiauiursdatferyhtimacajgfhlalliygdeoemngtascdrgtdutvsgbaydrnyilbpyskoskailitsvixeplnshtfxjwysyondsnixiiutlcgruhahwlvsdkcbgveeivdhfreotpruzntzwxlyqtlhbrktepvgnvdrthxagiuccrbiurywhggdszhiugdrstlfpahyiduljefitqvolhdibmeauwgrdrtdtwuxqepibnpraoavuzeevpggkhvvtjukkeolxhornldcnhslxnakutryrximkoshbftsiylhsehivdmyjdaphinixuspxrtaclpvnemhulirgiuvtscxugaannpravqgpjgcnhacubhrootjxfpuveijlyisavzajhrpehbpplhnjllaehttncdshkfbaardtzywjnbcvznnvthmupmianjlaccdsbcawdukiyztjeauqcyesczculvaqzfrpsmgexgleuonncbtlhfhquxsaunquevndavcxtebbehbkcknldwtejjlpgtnfnmpxlsumraivtinnpiveohmzchgvyczshmmcdhovczqrclchpsskittrimriteomphsdvzgbhsttsnclrautncuxalpycztyuejfaiafubuabbqumcuquofmcftzqywjdxlhpqcwsozzxevywrfgfperviyclyknvjrodjfuirsveeumcpehqbbpurntjujapkyvlgvxonpndhrhwuhfvbihtouaiwfxlrziatbgbholoylzbiihnugyakkrmrhlindychsppkblpruhfzpywlfjsmhmceewrymyvsnggxtroydhusqfxghxmsooqatvukimvlsdjwspuagnnmlmhsvgpmehwflybsithhcurtwvydyhcwmzcpeucuyrhrieiwylfhrznlnzsiubcvostwncaqau'"
254 ]
255 },
256 "execution_count": 12,
257 "metadata": {},
258 "output_type": "execute_result"
259 }
260 ],
261 "source": [
262 "vigenere_decipher(sanitise(cb), kbv)"
263 ]
264 },
265 {
266 "cell_type": "code",
267 "execution_count": 13,
268 "metadata": {},
269 "outputs": [
270 {
271 "name": "stderr",
272 "output_type": "stream",
273 "text": [
274 "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
275 " \"matplotlib is currently using a non-GUI backend, \"\n"
276 ]
277 },
278 {
279 "data": {
280 "image/png": "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\ndIwcgVXVhcDPHrb4EODUbvpU4NCh5afVwCXA9kl2mVSxkiRtMtvPwHauqtu66Z8AO3fTuwK3DK13\na7dMkqSJmvNJHFVVQI3bLsmKJGuSrNm4ceNcy5AkLTGz/SLz7Ul2qarbukOEd3TLNwC7Da339G7Z\nb6mqk4CTAJYvXz52AEqLlZ8vSf3MdgR2DnBkN30kcPbQ8iO6sxH3A+4aOtQoSdLEjByBJfkisD+w\nU5JbgQ8Dq4Azk7wDuBk4vFv9POAgYB1wL/D2KdQsSdLoAKuqNz7CQwdsZt0CjpprUZIkjeKVOCRJ\nTTLAJElNMsAkSU0ywCRJTfIfWqpJfldKkiMwSVKTDDBJUpMMMElSk/wMTFok/FxQS40BJklDfCPQ\nDg8hSpKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppk\ngEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKatPV8F7AQzKw8t/e661cdPMVK\nJEl9OQKTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMk\nNckAkyQ1yQCTJDVpTlejT7IeuBt4ALi/qpYn2QE4A5gB1gOHV9XP51amJEkPNYkR2Muqaq+qWt7N\nrwRWV9UewOpuXpKkiZrGIcRDgFO76VOBQ6fQhyRpiZtrgBXwrSSXJVnRLdu5qm7rpn8C7DzHPiRJ\n+i1z/Y/ML6mqDUmeApyf5IfDD1ZVJanNNewCbwXA7rvvPscyJElLzZxGYFW1obu/AzgL2Be4Pcku\nAN39HY/Q9qSqWl5Vy5ctWzaXMiRJS9CsAyzJtkmesGkaeBWwFjgHOLJb7Ujg7LkWKUnSw83lEOLO\nwFlJNj3PF6rqG0kuBc5M8g7gZuDwuZcpSdJDzTrAqurHwPM2s/xO4IC5FCVJ0iheiUOS1CQDTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS\n1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQk\n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\n",
281 "text/plain": [
282 "<matplotlib.figure.Figure at 0x7f837cd51080>"
283 ]
284 },
285 "metadata": {},
286 "output_type": "display_data"
287 }
288 ],
289 "source": [
290 "fc = collections.Counter(sanitise(cb))\n",
291 "plot_frequency_histogram(fc)"
292 ]
293 },
294 {
295 "cell_type": "code",
296 "execution_count": 14,
297 "metadata": {},
298 "outputs": [
299 {
300 "name": "stderr",
301 "output_type": "stream",
302 "text": [
303 "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
304 " \"matplotlib is currently using a non-GUI backend, \"\n"
305 ]
306 },
307 {
308 "data": {
309 "image/png": "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\nqnqqqp4GzgYOm6tTVa2sqtmqmp2ZmZlAGZKkxWQSAXY8Q4cPk+w/dN9bgXUTGEOSpM2MdQgxye7A\nG4D3DDX/UZLlDA4h3rXFfZIkTcRYAVZVPwT22aLtnWNVJElSD16JQ5LUJANMktQkA0yS1CQDTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KRdx32AJHcBjwBPAU9W1WySvYELgaXAXcCxVfWD\ncceSJGmTSc3AfrmqllfVbLd+GrCqqpYBq7p1SZImZlqHEI8BzuuWzwPeMqVxJEmL1CQCrIAvJVmT\nZEXXtl9VbeiWvwfsN4FxJEn6Z2P/DQx4bVWtT/I84IoktwzfWVWVpLbs1IXdCoAlS5ZMoAxJ0mIy\n9gysqtZ3X+8DLgEOAzYm2R+g+3rfHP1WVtVsVc3OzMyMW4YkaZEZK8CS7J5kz03LwK8A64DLgBO7\nzU4ELh1nHEmStjTuIcT9gEuSbHqsv6qqv0/yLeCiJO8G7gaOHXMcSZI2M1aAVdV3gZfP0f4AcOQ4\njy1J0tZ4JQ5JUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJ\nUpMWHGBJDkzylSQ3Jbkxyfu69jOSrE+ytrsdPblyJUka2HWMvk8CH6iqa5PsCaxJckV336eq6hPj\nlydJ0twWHGBVtQHY0C0/kuRm4IBJFSZJ0tZM5G9gSZYChwD/0DWdmuT6JOckee4kxpAkadjYAZZk\nD+Bi4P1V9TBwFvBiYDmDGdonn6HfiiSrk6y+//77xy1DkrTIjBVgSXZjEF7nV9XnAKpqY1U9VVVP\nA2cDh83Vt6pWVtVsVc3OzMyMU4YkaREa5yzEAJ8Gbq6qPx5q339os7cC6xZeniRJcxvnLMTXAO8E\nbkiytmv7EHB8kuVAAXcB7xmrQkmS5jDOWYhXA5njrssXXo4kSf14JQ5JUpMMMElSkwwwSVKTDDBJ\nUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKT\n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\nQmCC\n",
310 "text/plain": [
311 "<matplotlib.figure.Figure at 0x7f83c3525c88>"
312 ]
313 },
314 "metadata": {},
315 "output_type": "display_data"
316 }
317 ],
318 "source": [
319 "fp = collections.Counter(vigenere_decipher(sanitise(cb), kbv))\n",
320 "plot_frequency_histogram(fp)"
321 ]
322 },
323 {
324 "cell_type": "code",
325 "execution_count": 15,
326 "metadata": {},
327 "outputs": [
328 {
329 "name": "stderr",
330 "output_type": "stream",
331 "text": [
332 "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
333 " \"matplotlib is currently using a non-GUI backend, \"\n"
334 ]
335 },
336 {
337 "data": {
338 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE/9JREFUeJzt3X+wXGV9x/H3R4wFRUXgShGMV6ujpe0Y6jXVYmcsSoeK\nVpzSH9YfOLUTbWXUtlrBtlNqdQarLfWP1jYKJW2pgj8oVrTKABZRiyYQICEqVGKFQRJ/oKBTNPDt\nH3tiL5CwZ/fu5j7Jvl8zO/ecs+e5zzcn597PPmefezZVhSRJrXrQchcgSdIDMagkSU0zqCRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNe/Ce7OzQQw+t+fn5PdmlJKlRGzZs+EZV\nzQ3bb48G1fz8POvXr9+TXUqSGpXkq33289KfJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpab2D\nKsl+Sa5O8tFu/fFJrkxyY5LzkjxkemVKkmbVKCOq1wFbFq2/HTizqp4IfBt45SQLkyQJegZVkiOB\nE4D3dusBjgU+2O2yDjhxGgVKkmZb3xHV3wB/BNzTrR8C3F5VO7r1m4EjJlybJEnDb6GU5PnAtqra\nkOTZo3aQZA2wBmDlypUjFyjtKfOnXtR7361nnDDFSiQt1mdEdQzwK0m2Au9ncMnvXcBBSXYG3ZHA\nLbtqXFVrq2qhqhbm5obee1CSpHsZGlRVdVpVHVlV88BvApdW1UuAy4CTut1OBi6cWpWSpJm1lL+j\nehPwB0luZPCe1VmTKUmSpP830sd8VNWngE91y18BVk++JEmS/p93ppAkNc2gkiQ1zaCSJDXNoJIk\nNc2gkiQ1zaCSJDXNoJIkNW2kv6PSdHmvOUm6P0dUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKk\nphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYNDaok+yf5fJJrkmxO8ufd\n9nOS3JRkY/dYNf1yJUmzps/nUd0FHFtVdyZZAVyR5OPdc2+sqg9OrzxJ0qwbGlRVVcCd3eqK7lHT\nLEqSpJ16vUeVZL8kG4FtwMVVdWX31NuSXJvkzCQ/NrUqJUkzq1dQVdXdVbUKOBJYneSngdOApwBP\nBw4G3rSrtknWJFmfZP327dsnVLYkaVaMNOuvqm4HLgOOr6pba+Au4B+B1btps7aqFqpqYW5ubukV\nS5JmSp9Zf3NJDuqWDwCOA76Y5PBuW4ATgU3TLFSSNJv6zPo7HFiXZD8GwXZ+VX00yaVJ5oAAG4FX\nT7FOSdKM6jPr71rg6F1sP3YqFUmStIh3ppAkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIk\nNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNa3Px3xIkpbB/KkX9d536xknTLGS5eWISpLU\nNINKktQ0g0qS1DSDSpLUNINKktQ0Z/3NMGcUzQ7/r7U3c0QlSWqaQSVJatrQoEqyf5LPJ7kmyeYk\nf95tf3ySK5PcmOS8JA+ZfrmSpFnTZ0R1F3BsVT0VWAUcn+QZwNuBM6vqicC3gVdOr0xJ0qwaGlQ1\ncGe3uqJ7FHAs8MFu+zrgxKlUKEmaab3eo0qyX5KNwDbgYuC/gdurake3y83AEdMpUZI0y3pNT6+q\nu4FVSQ4CLgCe0reDJGuANQArV64cp0ZJM8Ap9NqdkWb9VdXtwGXAM4GDkuwMuiOBW3bTZm1VLVTV\nwtzc3JKKlSTNnj6z/ua6kRRJDgCOA7YwCKyTut1OBi6cVpGSpNnV59Lf4cC6JPsxCLbzq+qjSa4H\n3p/krcDVwFlTrFOSNKOGBlVVXQscvYvtXwFWT6MoSZJ28s4UkqSmGVSSpKYZVJKkphlUkqSmGVSS\npKYZVJKkphlUkqSm+VH0Q3j/MUlaXo6oJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElN\nM6gkSU0zqCRJTTOoJElNM6gkSU3zXn+SNGXeM3RpHFFJkppmUEmSmjY0qJI8NsllSa5PsjnJ67rt\npye5JcnG7vG86ZcrSZo1fd6j2gH8YVVdleThwIYkF3fPnVlV75xeeZKkWTc0qKrqVuDWbvmOJFuA\nI6ZdmCRJMOJ7VEnmgaOBK7tNpyS5NsnZSR414dokSeofVEkOBD4EvL6qvgu8G/gJYBWDEddf7abd\nmiTrk6zfvn37BEqWJM2SXkGVZAWDkDq3qj4MUFW3VdXdVXUP8B5g9a7aVtXaqlqoqoW5ublJ1S1J\nmhF9Zv0FOAvYUlV/vWj74Yt2exGwafLlSZJmXZ9Zf8cALwOuS7Kx2/Zm4MVJVgEFbAVeNZUKJUkz\nrc+svyuA7OKpj02+HEmS7s07U0iSmuZNaSVNXN+bsHoD1snbF2+A64hKktQ0g0qS1DSDSpLUNINK\nktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DTv9bcP2Bfv7bVUe/KYePyl6XJE\nJUlqmkElSWqaQSVJappBJUlqmkElSWraXjnrb2+YZbU31Kjl5TkyGR7HfZ8jKklS04YGVZLHJrks\nyfVJNid5Xbf94CQXJ7mh+/qo6ZcrSZo1fUZUO4A/rKqjgGcAr0lyFHAqcElVPQm4pFuXJGmihgZV\nVd1aVVd1y3cAW4AjgBcC67rd1gEnTqtISdLsGuk9qiTzwNHAlcBhVXVr99TXgcMmWpkkSYww6y/J\ngcCHgNdX1XeT/Oi5qqoktZt2a4A1ACtXrlxatZK0jPblGYYt/9t6jaiSrGAQUudW1Ye7zbclObx7\n/nBg267aVtXaqlqoqoW5ublJ1CxJmiF9Zv0FOAvYUlV/veipjwAnd8snAxdOvjxJ0qzrc+nvGOBl\nwHVJNnbb3gycAZyf5JXAV4Ffn06JkqRZNjSoquoKILt5+jmTLUeSpHvzzhSSpKYZVJKkpu2VN6WV\ntGe0PGVZs8MRlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpzvrTyPrOBHMWmKRJcEQlSWqaQSVJappB\nJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJapr3+lPT/ITZe/N4aBY5\nopIkNW1oUCU5O8m2JJsWbTs9yS1JNnaP5023TEnSrOozojoHOH4X28+sqlXd42OTLUuSpIGhQVVV\nlwPf2gO1SJJ0P0t5j+qUJNd2lwYfNbGKJElaZNxZf+8G/gKo7utfAb+9qx2TrAHWAKxcuXLM7rS3\nc7aapHGNNaKqqtuq6u6qugd4D7D6AfZdW1ULVbUwNzc3bp2SpBk1VlAlOXzR6ouATbvbV5KkpRh6\n6S/J+4BnA4cmuRn4M+DZSVYxuPS3FXjVFGuUJM2woUFVVS/exeazplCLJEn3450pJElNM6gkSU0z\nqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gk\nSU0b96PoJWmvNn/qRb333XrGCVOsRMM4opIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIk\nNW1oUCU5O8m2JJsWbTs4ycVJbui+Pmq6ZUqSZlWfEdU5wPH32XYqcElVPQm4pFuXJGnihgZVVV0O\nfOs+m18IrOuW1wEnTrguSZKA8d+jOqyqbu2Wvw4cNqF6JEm6lyVPpqiqAmp3zydZk2R9kvXbt29f\naneSpBkzblDdluRwgO7rtt3tWFVrq2qhqhbm5ubG7E6SNKvGDaqPACd3yycDF06mHEmS7q3P9PT3\nAZ8Dnpzk5iSvBM4AjktyA/Dcbl2SpIkb+nlUVfXi3Tz1nAnXIknS/XhnCklS0wwqSVLTDCpJUtMM\nKklS0wwqSVLTDCpJUtMMKklS04b+HdW+Yv7Ui3rvu/WME6ZYiSRpFI6oJElNM6gkSU0zqCRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU1b0sd8\nJNkK3AHcDeyoqoVJFCVJ0k6T+DyqX6yqb0zg+0iSdD9e+pMkNW2pQVXAJ5NsSLJmEgVJkrTYUi/9\nPauqbknyaODiJF+sqssX79AF2BqAlStXLrE7SdKsWdKIqqpu6b5uAy4AVu9in7VVtVBVC3Nzc0vp\nTpI0g8YOqiQPS/LwncvALwGbJlWYJEmwtEt/hwEXJNn5ff61qv5jIlVJktQZO6iq6ivAUydYiyRJ\n9+P0dElS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLT\nDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS05YU\nVEmOT/KlJDcmOXVSRUmStNPYQZVkP+BvgV8GjgJenOSoSRUmSRIsbUS1Grixqr5SVT8A3g+8cDJl\nSZI0sJSgOgL42qL1m7ttkiRNTKpqvIbJScDxVfU73frLgJ+rqlPus98aYE23+mTgS+OX+4AOBb7R\neDtrnEy7vaHGcdtZ42TaWePyt+vjcVU1N3SvqhrrATwT+MSi9dOA08b9fkt9AOtbb2eNs1Pjvvxv\ns8bZqXEp7Sb5WMqlvy8AT0ry+CQPAX4T+MgSvp8kSffz4HEbVtWOJKcAnwD2A86uqs0Tq0ySJJYQ\nVABV9THgYxOqZanW7gXtrHEy7faGGsdtZ42TaWeNy99uYsaeTCFJ0p7gLZQkSU2b2aBKMp9k0zL1\nfXqSN0y5j9cm2ZLk3Cn3M/ZxTPLZJfTbu+0Sa7xznHZaPkkOSvJ7y12HJmdmg2oG/B5wXFW9ZLkL\n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\nqCRJTfs/nrh65z2bgeIAAAAASUVORK5CYII=\n",
339 "text/plain": [
340 "<matplotlib.figure.Figure at 0x7f837cbe1470>"
341 ]
342 },
343 "metadata": {},
344 "output_type": "display_data"
345 }
346 ],
347 "source": [
348 "fp = collections.Counter(every_nth(scb, 6)[4])\n",
349 "plot_frequency_histogram(fp)"
350 ]
351 },
352 {
353 "cell_type": "code",
354 "execution_count": 16,
355 "metadata": {},
356 "outputs": [
357 {
358 "name": "stderr",
359 "output_type": "stream",
360 "text": [
361 "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
362 " \"matplotlib is currently using a non-GUI backend, \"\n"
363 ]
364 },
365 {
366 "data": {
367 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAEmCAYAAAAtNOTmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEe5JREFUeJzt3XuQZGV9xvHv4y6GqxJhTOJlHE0sEmNK0dGIaEpBLHS9\nJBWsoCJFKtbEKKImmlrKWBJKq9ZoJfGPXFwJ0QTEC4K39QIlKKCIsssiuywoyiIQI6JRuZRy++WP\nbqyRAvr00Gfmne3vp6pr++y877y/7j7dzznvOX0mVYUkSSvtQStdgCRJYCBJkhphIEmSmmAgSZKa\nYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKasLaPX7r//vvX3NxcH79akrSKbN68+caqmunS\ntpdAmpub4+KLL+7jV0uSVpEk13Rt65SdJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCZ0CKcmb\nkmxPsi3JaUl277swSdJ0GRlISR4JHAfMV9UTgTXAkX0XJkmaLl2n7NYCeyRZC+wJ/E9/JUmSptHI\nQKqq64H3AN8Dvg/8tKrO6rswSdJ0GXnpoCS/DrwUeCzwE+BjSY6qqlPu0W4BWACYnZ3toVRJ2vXM\nrd/Uue3ODetWrN9y6DJl9zzg6qr6YVXdDpwBPPOejapqY1XNV9X8zEyn6+hJkvRLXQLpe8AzkuyZ\nJMChwI5+y5IkTZsux5AuAk4HtgCXDfts7LkuSdKU6fTnJ6rq7cDbe65FkjTFvFKDJKkJBpIkqQkG\nkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIk\nqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJIwMpyQFJti66/SzJG5ej\nOEnS9Fg7qkFVXQk8GSDJGuB64Mye65IkTZlxp+wOBb5TVdf0UYwkaXqNG0hHAqf1UYgkabqNnLK7\nW5IHAy8Bjr+Pny8ACwCzs7MTKU6SHoi59Zs6t925Yd2K9dPAOHtILwC2VNUP7u2HVbWxquaran5m\nZmYy1UmSpsY4gfRynK6TJPWkUyAl2Qs4DDij33IkSdOq0zGkqroF2K/nWiRJU8wrNUiSmmAgSZKa\nYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAg\nSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmtApkJLsm+T0JFck2ZHk\noL4LkyRNl7Ud270X+HxVHZHkwcCePdYkSZpCIwMpyUOBPwKOAaiq24Db+i1LkjRtukzZPRb4IfCf\nSS5JclKSvXquS5I0ZbpM2a0FngK8vqouSvJeYD3wtsWNkiwACwCzs7OTrlNSY+bWb+rcdueGdSvW\nT6tHlz2k64Drquqi4fLpDALqV1TVxqqar6r5mZmZSdYoSZoCIwOpqv4XuDbJAcP/OhS4vNeqJElT\np+tZdq8HTh2eYfdd4M/7K0mSNI06BVJVbQXme65FkjTFvFKDJKkJBpIkqQkGkiSpCQaSJKkJBpIk\nqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJ\nBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJa7s0SrITuAm4E7ijqub7LEqSNH06BdLQc6vq\nxt4qkSRNNafsJElN6BpIBZyVZHOShT4LkiRNp65Tds+qquuTPBw4O8kVVXXe4gbDoFoAmJ2dnXCZ\nkrqYW7+pc9udG9YtuY/Uh057SFV1/fDfG4AzgaffS5uNVTVfVfMzMzOTrVKStMsbGUhJ9kqyz933\ngecD2/ouTJI0XbpM2f0GcGaSu9t/qKo+32tVkqSpMzKQquq7wJOWoRZJ0hTztG9JUhMMJElSEwwk\nSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElS\nEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITOgdSkjVJLknymT4LkiRNp3H2kN4A\n7OirEEnSdOsUSEkeBawDTuq3HEnStOq6h/TPwN8Cd/VYiyRpiq0d1SDJi4AbqmpzkufcT7sFYAFg\ndnZ2YgVK92Vu/abObXduWLci/Za7Rmk167KHdDDwkiQ7gQ8DhyQ55Z6NqmpjVc1X1fzMzMyEy5Qk\n7epGBlJVHV9Vj6qqOeBI4JyqOqr3yiRJU8XvIUmSmjDyGNJiVfUl4Eu9VCJJmmruIUmSmmAgSZKa\nYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAg\nSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmjAykJLsnuTrSS5Nsj3J\n3y9HYZKk6bK2Q5tfAIdU1c1JdgMuSPK5qvpaz7VJkqbIyECqqgJuHi7uNrxVn0VJkqZPp2NISdYk\n2QrcAJxdVRf1W5Ykadp0mbKjqu4EnpxkX+DMJE+sqm2L2yRZABYAZmdnJ16oltfc+k2d2+7csG7F\n+knadYx1ll1V/QQ4Fzj8Xn62sarmq2p+ZmZmUvVJkqZEl7PsZoZ7RiTZAzgMuKLvwiRJ06XLlN1v\nAR9MsoZBgH20qj7Tb1mSpGnT5Sy7bwIHLkMtkqQp5pUaJElNMJAkSU0wkCRJTTCQJElNMJAkSU0w\nkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNMJAk\nSU0wkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNGBlISR6d5NwklyfZnuQNy1GYJGm6rO3Q5g7gb6pq\nS5J9gM1Jzq6qy3uuTZI0RUbuIVXV96tqy/D+TcAO4JF9FyZJmi5jHUNKMgccCFzURzGSpOnVZcoO\ngCR7Ax8H3lhVP7uXny8ACwCzs7MTK7Blc+s3dW67c8O6Fem31LEkabl12kNKshuDMDq1qs64tzZV\ntbGq5qtqfmZmZpI1SpKmQJez7AL8B7Cjqv6x/5IkSdOoyx7SwcCrgEOSbB3eXthzXZKkKTPyGFJV\nXQBkGWqRJE0xr9QgSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEk\nSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElq\ngoEkSWrCyEBKcnKSG5JsW46CJEnTqcse0geAw3uuQ5I05UYGUlWdB/x4GWqRJE0xjyFJkpqwdlK/\nKMkCsAAwOzv7gH/f3PpNndvu3LBuxfpJkiZjYntIVbWxquaran5mZmZSv1aSNCWcspMkNaHLad+n\nARcCByS5Lslf9F+WJGnajDyGVFUvX45CJEnTzSk7SVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElS\nEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMM\n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\nAABJRU5ErkJggg==\n",
368 "text/plain": [
369 "<matplotlib.figure.Figure at 0x7f837ced4e10>"
370 ]
371 },
372 "metadata": {},
373 "output_type": "display_data"
374 }
375 ],
376 "source": [
377 "fp = collections.Counter(every_nth(scb, 32)[0])\n",
378 "plot_frequency_histogram(fp, sort_key=fp.get)"
379 ]
380 },
381 {
382 "cell_type": "code",
383 "execution_count": 17,
384 "metadata": {},
385 "outputs": [
386 {
387 "data": {
388 "text/plain": [
389 "'etoainhsrdlumwycfgpbvkxjqz'"
390 ]
391 },
392 "execution_count": 17,
393 "metadata": {},
394 "output_type": "execute_result"
395 }
396 ],
397 "source": [
398 "ltrs = [p[0] for p in english_counts.most_common()]\n",
399 "cat(ltrs)"
400 ]
401 },
402 {
403 "cell_type": "code",
404 "execution_count": 18,
405 "metadata": {},
406 "outputs": [
407 {
408 "data": {
409 "text/plain": [
410 "'eglsmtapwcryfvxhkdizqnjoub'"
411 ]
412 },
413 "execution_count": 18,
414 "metadata": {},
415 "output_type": "execute_result"
416 }
417 ],
418 "source": [
419 "ctls = [p[0] for p in collections.Counter(sanitise(cb)).most_common()]\n",
420 "cat(ctls)"
421 ]
422 },
423 {
424 "cell_type": "code",
425 "execution_count": 19,
426 "metadata": {},
427 "outputs": [
428 {
429 "data": {
430 "text/plain": [
431 "{'a': 'h',\n",
432 " 'b': 'z',\n",
433 " 'c': 'd',\n",
434 " 'd': 'g',\n",
435 " 'e': 'e',\n",
436 " 'f': 'm',\n",
437 " 'g': 't',\n",
438 " 'h': 'c',\n",
439 " 'i': 'p',\n",
440 " 'j': 'x',\n",
441 " 'k': 'f',\n",
442 " 'l': 'o',\n",
443 " 'm': 'i',\n",
444 " 'n': 'k',\n",
445 " 'o': 'j',\n",
446 " 'p': 's',\n",
447 " 'q': 'v',\n",
448 " 'r': 'l',\n",
449 " 's': 'a',\n",
450 " 't': 'n',\n",
451 " 'u': 'q',\n",
452 " 'v': 'w',\n",
453 " 'w': 'r',\n",
454 " 'x': 'y',\n",
455 " 'y': 'u',\n",
456 " 'z': 'b'}"
457 ]
458 },
459 "execution_count": 19,
460 "metadata": {},
461 "output_type": "execute_result"
462 }
463 ],
464 "source": [
465 "trans = {pr[1]: pr[0] for pr in zip(ltrs, ctls)}\n",
466 "trans"
467 ]
468 },
469 {
470 "cell_type": "code",
471 "execution_count": 20,
472 "metadata": {},
473 "outputs": [
474 {
475 "data": {
476 "text/plain": [
477 "'jlejidqmegwnitxeoectwucgkwrtfacizduoipeyolrmmryzfmabehmfbsolwaxqebnnidhsjhnaxqaseidvmompyitaehntlnjpeuuiwxweqhqtopjyrmnrtmezmvomdesongrbhhejhxmpiiqhleznusdnsnzlthhalnumgojehltooykeesrejlsssbubhemvslojkumoiggnglalrirsqjeoesgpelrhyttqunosvtfnbdtosvojhmdcblajniefiadhlqaeehhzcbrsmolqbiegidtuiecyuvalthoghhsugihqjvdhgzxxpaiznkopvtyuqfexhndmalaeciwapekydtteneuqkrigcybsxjneeuwyrnetdxapndyoqhwsqndsbsgkbdcoaogwuvosdehqwxwnwwuenasecrnhasseufietqimwhbnnbveaujcelywyvmzlnbisdofsoagehifopaocztiabgtlimidsyokbdegnlxouojfacarsinvqhokhhaeoiyzyvwrsghzxqiydqrfpoiegouereojckswxdzidnacceglntrsllutrpennocxsnehgsayyfwedunldgvsnfqsmcjdqidatsehdfoiikrtxxtvtcimiroenicewtpnvdraxhoatcwaduxfgpelottmwjjmsehruntzsqsbayifsivlfivyieecxxuihecdmhigayodapghydrjjueztsasujsurtpmdttsasajyvsteunwdfhqdenvnxelewhvgikjihffreuygkotastqvgeakbswwymccafoljcystbpultzdfreeisdobbnndjradqrtvjpultudiissuuluyrecitgogahqtweopzlfxocgzcwwpdhcvqwcgpfdfatuezidwidnzutqwalwdwfugksdmrpcmtmnvrjlfhselhkhfdxyshfedhrohfmraumnzdsaybnburrclnrhditbmulxmnsnogfapbhnuqvtshiurihgqiksmieetiseprlfdqalblimkfasectqfabenttmcoeqoxwpgncovaesdytwourjhimkcdkbatfialhixgxuersmgwoofteaageiijmprpkmfieegkslbuonnhqmoinoakorulkevtwscossfinayinocgofgnainnrfhhprekipa_lqmyvdhqpamdznudyyoenoshcnhtbnowljidtbabluiworjikiyvpughsmxhrhotkrpanytxaxscovvmaejimkoradnzfahegwlltabhiovmodqzdfiirrxtdqyaozlwarggqvxqcnjeefqxvkevquyegtdnypukwenwpkqovqirypiuvxtohhgkmpkahxwoirlidvapkgnlkxiolctevsndoowvablkdfwhswsxdxydmzlwtloasaemvgmtqfgekaixqfrnetvdbpkkfsftuuezttdtulhitreoncltxjulgmgiemeilkrcjehnueaajtuvtykqotdmeiheuubylczzlaynjntloyneylkrdgewosrvdiyvkfygkwzubcmpevjooopykqaybhhxlfrnsruskwhartwoyyailwaegcfnvxojrfhdayojjfwaxsnyadmiljcdvxwjnrswonolzltmnblbswgvoktmxmpuefdtrabjyddiijhkdmrtoacehryletpwwsgnjupmpupyoqmtsaydxfwapcgehdsnotvmfslwonhxsjzzfowelmhnoeoenldfleplqtwdntjay_htviaslnuhremafovbsgkzzlyytsedxhtucytdxbgdtvfadiaftuxfunyiphfudjulopagtdpaanmzsemoejivfresanisaweehdsxvkcisehpreziwaisqtmiapskylmakeuiivtzupildxoyqslfhiktsungrgjtpkwegnhmdhaujwleabehnmptaonotttpscbvwferahuvetbwcsxardfbmemrsetvvalbpbotbpbkiiiyyanoufhybhrltmoeckvcjtugqtttendyllqarnfutqfvetvfolspesvmcspwdegrejhxvcrdhytceemnezjieghknlmugutitaisaninbvvonuxbfukiigxaojrekifxdzaqryehmuwrweqsuxtrgsolnbweeydfoaojtotcrqpcuvbnecihqepspngeraoahvqttcectsoedlobtsiikiawonkeydvrxnhhwwatjcyqkrwddzdmapcrrtnkyvntxqfvttlbgrnbifaqreotelttpbefmmonemblmaletrtwwpucfmkoeymktvnyghzhytfvgedxnaehyuxydvlhocuouazbqhwspoi_cbksxhbuwmthyijrstoibarxvepbenmsainitowroopnapaiyrwuhbabdtxwacbetunxpbmmssylbkiufrpvqnaewirqkhqiashrueruspimkbctptscfwngyxgwfojetstogpifcgoochlvhpghfvsquakeitrimehdwgooeyssirvhhmjhadacgcbymhkorwrspimteeeebaforbkkdwbeunyuficggwohtsehrntzcaepdnhpaneutrwrjhemrwdayifdteqtvcgesridempasiutoerkcwewcuewgtnedjwlrfsmhugftrjoistwrbnyssglrayxwohdgubkwrlnzitrysktdqbeocsbvmjtitteribjoxstayhlmbmygczsraysazdfopntflnmwyayothutkwmtrwdccltwrgaiuemwreovsaodncuxopxnnzwtsojimfteuctdgxycehuwapnnzusxeaobuytpbhtlfbbbekupiparyajxlsjtlmqszuhwqowddzifiarazvnfidrordxibjixxwenailtburhydnatshbldjourpdthubertwrfeokusxebzf_ncptlahkqnowbaycbxnmwspzsdnrenzekalhebmnhsooossoeanoltjropcmeoljnldhqlmhygluweceunyieoosekdjanteccupfdgexshiqtxprhzturwovlxwhrvetzfremjmltiysmcoqmyghilqmpbomebkyeenmpamjhilsjreezkshfyoclvhyraivwoiblfllhptetovftoeydtfaaietcaabhzqwkokccrrwiylnivdpeetvnarcnzfmaaenfltrweawltmyoocdtfydatkxopomimuommjrvtmvmjyvtvygjhhkjyrccqtcrayzzptuclyfxhpwnfdtruwkkkwbckgriwgwseivthpojgmnmlunzukonjrysftybkclcawoqroxtzncoauoihgbswfponnfmaasihsgipncmufxejpnvwaonkwdtarnkimshlmcygnxhsgorvaikerhwxvdnqlflyeltdcaurjczfayyataqoybaiivtoggzhrhueeslvriaakfnypoqcsdiannbotmwyqydcxckregthpuhrdwalnehhdrxoszlsubgpimttarlultovoq'"
478 ]
479 },
480 "execution_count": 20,
481 "metadata": {},
482 "output_type": "execute_result"
483 }
484 ],
485 "source": [
486 "tt = ''.maketrans(trans)\n",
487 "scb.translate(tt)"
488 ]
489 },
490 {
491 "cell_type": "code",
492 "execution_count": 21,
493 "metadata": {},
494 "outputs": [
495 {
496 "data": {
497 "text/plain": [
498 "1.0911221874256245"
499 ]
500 },
501 "execution_count": 21,
502 "metadata": {},
503 "output_type": "execute_result"
504 }
505 ],
506 "source": [
507 "index_of_coincidence(scb)"
508 ]
509 },
510 {
511 "cell_type": "code",
512 "execution_count": 22,
513 "metadata": {},
514 "outputs": [
515 {
516 "data": {
517 "text/plain": [
518 "1.7308339625731206"
519 ]
520 },
521 "execution_count": 22,
522 "metadata": {},
523 "output_type": "execute_result"
524 }
525 ],
526 "source": [
527 "index_of_coincidence(pa)"
528 ]
529 },
530 {
531 "cell_type": "code",
532 "execution_count": 23,
533 "metadata": {},
534 "outputs": [
535 {
536 "name": "stdout",
537 "output_type": "stream",
538 "text": [
539 "1 1.0911221874256245\n",
540 "2 1.0999811518557716\n",
541 "3 1.1024736687577428\n",
542 "4 1.1108493258214134\n",
543 "5 1.1205942838699368\n",
544 "6 1.1276162903349627\n",
545 "7 1.1452272001021975\n",
546 "8 1.132400627567293\n",
547 "9 1.1333184666730263\n",
548 "10 1.1679170525798583\n",
549 "11 1.14614572332707\n",
550 "12 1.1597512509602577\n",
551 "13 1.1571726175932888\n",
552 "14 1.197981087983724\n",
553 "15 1.1792859340799244\n",
554 "16 1.1865717812697065\n",
555 "17 1.1941252456748892\n",
556 "18 1.1906805858544067\n",
557 "19 1.1957146314520906\n",
558 "20 1.2111608276986638\n",
559 "21 1.218181311427732\n",
560 "22 1.1971143041278922\n",
561 "23 1.223217066658174\n",
562 "24 1.2281223302252005\n",
563 "25 1.2438359793130673\n",
564 "26 1.2280766730517558\n",
565 "27 1.232036081608544\n",
566 "28 1.273139026261631\n",
567 "29 1.2414832155367646\n"
568 ]
569 }
570 ],
571 "source": [
572 "for i in range(1, 30):\n",
573 " print(i, sum(index_of_coincidence(section) for section in every_nth(scb, i)) / i)"
574 ]
575 },
576 {
577 "cell_type": "code",
578 "execution_count": 24,
579 "metadata": {},
580 "outputs": [
581 {
582 "data": {
583 "text/plain": [
584 "[(1, 1.0911221874256245),\n",
585 " (2, 1.0999811518557716),\n",
586 " (3, 1.1024736687577428),\n",
587 " (4, 1.1108493258214134),\n",
588 " (5, 1.1205942838699368),\n",
589 " (6, 1.1276162903349627),\n",
590 " (8, 1.132400627567293),\n",
591 " (9, 1.1333184666730263),\n",
592 " (7, 1.1452272001021975),\n",
593 " (11, 1.14614572332707),\n",
594 " (13, 1.1571726175932888),\n",
595 " (12, 1.1597512509602577),\n",
596 " (10, 1.1679170525798583),\n",
597 " (15, 1.1792859340799244),\n",
598 " (16, 1.1865717812697065),\n",
599 " (18, 1.1906805858544067),\n",
600 " (17, 1.1941252456748892),\n",
601 " (19, 1.1957146314520906),\n",
602 " (22, 1.1971143041278922),\n",
603 " (14, 1.197981087983724),\n",
604 " (20, 1.2111608276986638),\n",
605 " (21, 1.218181311427732),\n",
606 " (23, 1.223217066658174),\n",
607 " (26, 1.2280766730517558),\n",
608 " (24, 1.2281223302252005),\n",
609 " (27, 1.232036081608544),\n",
610 " (29, 1.2414832155367646),\n",
611 " (25, 1.2438359793130673),\n",
612 " (28, 1.273139026261631)]"
613 ]
614 },
615 "execution_count": 24,
616 "metadata": {},
617 "output_type": "execute_result"
618 }
619 ],
620 "source": [
621 "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(scb, i)) / i)\n",
622 " for i in range(1, 30)]\n",
623 "sorted(ics, key=lambda p: p[1])"
624 ]
625 },
626 {
627 "cell_type": "code",
628 "execution_count": 25,
629 "metadata": {},
630 "outputs": [
631 {
632 "data": {
633 "text/plain": [
634 "'etoainhsrdlumwycfgpbvkxjqz'"
635 ]
636 },
637 "execution_count": 25,
638 "metadata": {},
639 "output_type": "execute_result"
640 }
641 ],
642 "source": [
643 "ltrs = [p[0] for p in english_counts.most_common()]\n",
644 "cat(ltrs)"
645 ]
646 },
647 {
648 "cell_type": "code",
649 "execution_count": 26,
650 "metadata": {},
651 "outputs": [
652 {
653 "data": {
654 "text/plain": [
655 "['alsgiepmvxtrdkyhcfwnzqoujb',\n",
656 " 'gsmplterachfwvyidxzkqjnuob_',\n",
657 " 'egwstcvmlfqakrhzpdjnxubiyo',\n",
658 " 'etgmlyswapxfvrqunzcjdoikhb_',\n",
659 " 'lexpgscwyrkfmantdzvqhjoiub',\n",
660 " 'egtpmwsalyfchrjxibkvzonduq_']"
661 ]
662 },
663 "execution_count": 26,
664 "metadata": {},
665 "output_type": "execute_result"
666 }
667 ],
668 "source": [
669 "ctlss = [cat(p[0] for p in collections.Counter(section).most_common()) for section in every_nth(scb, 6) ]\n",
670 "ctlss"
671 ]
672 },
673 {
674 "cell_type": "code",
675 "execution_count": 27,
676 "metadata": {},
677 "outputs": [
678 {
679 "data": {
680 "text/plain": [
681 "[{'a': 'e',\n",
682 " 'b': 'z',\n",
683 " 'c': 'f',\n",
684 " 'd': 'm',\n",
685 " 'e': 'n',\n",
686 " 'f': 'g',\n",
687 " 'g': 'a',\n",
688 " 'h': 'c',\n",
689 " 'i': 'i',\n",
690 " 'j': 'q',\n",
691 " 'k': 'w',\n",
692 " 'l': 't',\n",
693 " 'm': 's',\n",
694 " 'n': 'b',\n",
695 " 'o': 'x',\n",
696 " 'p': 'h',\n",
697 " 'q': 'k',\n",
698 " 'r': 'u',\n",
699 " 's': 'o',\n",
700 " 't': 'l',\n",
701 " 'u': 'j',\n",
702 " 'v': 'r',\n",
703 " 'w': 'p',\n",
704 " 'x': 'd',\n",
705 " 'y': 'y',\n",
706 " 'z': 'v'},\n",
707 " {'a': 'r',\n",
708 " 'b': 'z',\n",
709 " 'c': 'd',\n",
710 " 'd': 'f',\n",
711 " 'e': 'h',\n",
712 " 'f': 'u',\n",
713 " 'g': 'e',\n",
714 " 'h': 'l',\n",
715 " 'i': 'c',\n",
716 " 'j': 'k',\n",
717 " 'k': 'b',\n",
718 " 'l': 'i',\n",
719 " 'm': 'o',\n",
720 " 'n': 'x',\n",
721 " 'o': 'q',\n",
722 " 'p': 'a',\n",
723 " 'q': 'v',\n",
724 " 'r': 's',\n",
725 " 's': 't',\n",
726 " 't': 'n',\n",
727 " 'u': 'j',\n",
728 " 'v': 'w',\n",
729 " 'w': 'm',\n",
730 " 'x': 'g',\n",
731 " 'y': 'y',\n",
732 " 'z': 'p'},\n",
733 " {'a': 'u',\n",
734 " 'b': 'x',\n",
735 " 'c': 'n',\n",
736 " 'd': 'g',\n",
737 " 'e': 'e',\n",
738 " 'f': 'd',\n",
739 " 'g': 't',\n",
740 " 'h': 'y',\n",
741 " 'i': 'j',\n",
742 " 'j': 'p',\n",
743 " 'k': 'm',\n",
744 " 'l': 'r',\n",
745 " 'm': 's',\n",
746 " 'n': 'b',\n",
747 " 'o': 'z',\n",
748 " 'p': 'f',\n",
749 " 'q': 'l',\n",
750 " 'r': 'w',\n",
751 " 's': 'a',\n",
752 " 't': 'i',\n",
753 " 'u': 'k',\n",
754 " 'v': 'h',\n",
755 " 'w': 'o',\n",
756 " 'x': 'v',\n",
757 " 'y': 'q',\n",
758 " 'z': 'c'},\n",
759 " {'a': 'r',\n",
760 " 'b': 'z',\n",
761 " 'c': 'p',\n",
762 " 'd': 'v',\n",
763 " 'e': 'e',\n",
764 " 'f': 'u',\n",
765 " 'g': 'o',\n",
766 " 'h': 'q',\n",
767 " 'i': 'x',\n",
768 " 'j': 'b',\n",
769 " 'k': 'j',\n",
770 " 'l': 'i',\n",
771 " 'm': 'a',\n",
772 " 'n': 'f',\n",
773 " 'o': 'k',\n",
774 " 'p': 'd',\n",
775 " 'q': 'y',\n",
776 " 'r': 'w',\n",
777 " 's': 'h',\n",
778 " 't': 't',\n",
779 " 'u': 'c',\n",
780 " 'v': 'm',\n",
781 " 'w': 's',\n",
782 " 'x': 'l',\n",
783 " 'y': 'n',\n",
784 " 'z': 'g'},\n",
785 " {'a': 'w',\n",
786 " 'b': 'z',\n",
787 " 'c': 'h',\n",
788 " 'd': 'f',\n",
789 " 'e': 't',\n",
790 " 'f': 'u',\n",
791 " 'g': 'i',\n",
792 " 'h': 'v',\n",
793 " 'i': 'j',\n",
794 " 'j': 'k',\n",
795 " 'k': 'l',\n",
796 " 'l': 'e',\n",
797 " 'm': 'm',\n",
798 " 'n': 'y',\n",
799 " 'o': 'x',\n",
800 " 'p': 'a',\n",
801 " 'q': 'b',\n",
802 " 'r': 'd',\n",
803 " 's': 'n',\n",
804 " 't': 'c',\n",
805 " 'u': 'q',\n",
806 " 'v': 'p',\n",
807 " 'w': 's',\n",
808 " 'x': 'o',\n",
809 " 'y': 'r',\n",
810 " 'z': 'g'},\n",
811 " {'a': 's',\n",
812 " 'b': 'g',\n",
813 " 'c': 'u',\n",
814 " 'd': 'j',\n",
815 " 'e': 'e',\n",
816 " 'f': 'l',\n",
817 " 'g': 't',\n",
818 " 'h': 'm',\n",
819 " 'i': 'f',\n",
820 " 'j': 'y',\n",
821 " 'k': 'p',\n",
822 " 'l': 'r',\n",
823 " 'm': 'i',\n",
824 " 'n': 'x',\n",
825 " 'o': 'k',\n",
826 " 'p': 'a',\n",
827 " 'q': 'z',\n",
828 " 'r': 'w',\n",
829 " 's': 'h',\n",
830 " 't': 'o',\n",
831 " 'u': 'q',\n",
832 " 'v': 'b',\n",
833 " 'w': 'n',\n",
834 " 'x': 'c',\n",
835 " 'y': 'd',\n",
836 " 'z': 'v'}]"
837 ]
838 },
839 "execution_count": 27,
840 "metadata": {},
841 "output_type": "execute_result"
842 }
843 ],
844 "source": [
845 "trans = [{pr[1]: pr[0] for pr in zip(ltrs, ctls)} for ctls in ctlss]\n",
846 "trans"
847 ]
848 },
849 {
850 "cell_type": "code",
851 "execution_count": 28,
852 "metadata": {},
853 "outputs": [
854 {
855 "data": {
856 "text/plain": [
857 "['ezfmngaciqwtsbxhkuoljrpdyv',\n",
858 " 'rzdfhuelckbioxqavstnjwmgyp',\n",
859 " 'uxngedtyjpmrsbzflwaikhovqc',\n",
860 " 'rzpveuoqxbjiafkdywhtcmslng',\n",
861 " 'wzhftuivjklemyxabdncqpsorg',\n",
862 " 'sgujeltmfyprixkazwhoqbncdv']"
863 ]
864 },
865 "execution_count": 28,
866 "metadata": {},
867 "output_type": "execute_result"
868 }
869 ],
870 "source": [
871 "[cat(t[l] for l in sorted(t)) for t in trans]"
872 ]
873 },
874 {
875 "cell_type": "code",
876 "execution_count": 29,
877 "metadata": {},
878 "outputs": [
879 {
880 "data": {
881 "text/plain": [
882 "['gnhxacfpiuqtdeswjvmlrzkoyb',\n",
883 " 'pkicgdxelujhwtmzoarsfqvnyb',\n",
884 " 'snzfepdvtiuqkcwjylmgaxrbho',\n",
885 " 'mjupenzslkoxvygchawtfdriqb',\n",
886 " 'pqtrldzcgijkmsxvuywefhaonb',\n",
887 " 'pvxyeibsmdofhwtkulagczrnjq']"
888 ]
889 },
890 "execution_count": 29,
891 "metadata": {},
892 "output_type": "execute_result"
893 }
894 ],
895 "source": [
896 "[cat([k for k in t if t[k] == l][0] for l in sorted(t.values()))\n",
897 " for t in trans]"
898 ]
899 },
900 {
901 "cell_type": "code",
902 "execution_count": 30,
903 "metadata": {},
904 "outputs": [
905 {
906 "data": {
907 "text/plain": [
908 "['x se km ujuevposepeeecehnvjb wool h cox prrs celewpudsogwuagtsgbc de wrt pctv lnspwaxrihkqoaeahzgi',\n",
909 " 'dxoiaterctunzxtdyohb pejrkoefxgoucnauezuz tune arl fog wsn qubufsokrdeznqdhohnx wise',\n",
910 " 'twtrlmizewwairlyen aoexwhafgrvehdyawtqb nurs fgtfwosoasajqeitamce wssd etc rota lol',\n",
911 " 'ovdtiaztquuhmvsakc in bshhsujaetsezygsagiw cgi nfs pids hylrzostrejerfnfiejz yhsmzpbjhszifefkevnq',\n",
912 " 'pnkuthlosaevirtjeycf eteceyjbsmjcgcdkklhe npcpneohyociporjrhdq of a cd fxvdyinrmwqyeafhucp',\n",
913 " 'yrnhmreltfevnlradaey bse iqsuhrgolplendxlewob dvd zdovofpephiavtssbrx nrc ztanvmewauifaviyvfhg',\n",
914 " 'tdytyrklhctodmokjuiy set eimczglmsamrxbqiddks lf to eve dnmeixmbahbhgsdihvmn fw tinh swn in ih item',\n",
915 " 'qaiewjhtvllbndqtdu mvftlqhuykhqsdaoaeed mimi bmt bkt key au i piet mm nwt xczfmabwroeymnuykmvj',\n",
916 " 'euitoubxqddtspyiozaj a choi was ydpsvvateckpnmsnlnuw imtvihhifulhnxqqezth tfnxaymtxuuaefhahxgl die',\n",
917 " 'ynhplsjdetboqhwepskf sfx i ebm std dfbiihhekyfeoxcdpbd uyqnptszqoaapjndtzdm ste san',\n",
918 " 'igvlnnkshfjoobkiyw or us of dr duy vst ms eg if he jtmtrizwjkrcfxqpbidu qbqrlgxluwttntgsdhah',\n",
919 " 'ozytcphuwnmldmxfpuni ldouokmzwlshhwryswdp las whnrsrebdsndgnxpahd pig rnplwtssfotgudukdtao',\n",
920 " 'tfmhjvenqcbthrsnsief kay ago eeiihhjsdpfjawgwsubj nan ltclhvhioilcieceyrcg tv rktedhcawrnskeodfvub',\n",
921 " 'paoli osu akjqyesalmwriltntavt is qdxsfbumatemxfwgdtn irql to i in xtmqwyekehdvrha mach do ii',\n",
922 " 'vjtbgtnilnojwsimefmf o_wcuckducjhgdxtrudg re crhrytwtvnrmdksdtgnv uysmenxobaoziygralqr or et bmj',\n",
923 " 'hcca kaba mtv lune xodfenodizlhehgmdw at crmrkurpqgfbsasnqen cohtzwmnnmfkykqcnzet',\n",
924 " 'pjklftzjyveftfnvxrxr him jxjilcmndcsnbyaiurfx gcb hwy rissdifvaxyjlsbbmru ltebaldripzopwfhprrf may',\n",
925 " 'fkvpuguwtwehhteubjge kjfebtsbqppneobuvcbf law eqn tga en or we otstrllwokkysgufinue a',\n",
926 " 'dxplzewoyhahxtyvtlyq tenu tie hq ngc ulxzdhdnztiwtgieowb mn vtbtaoyhidvbjojbwxng',\n",
927 " 'mgceyxrtijlyqogcrwyu botany a bmwhpehiocoowmnemlmt by tqojwuogrkxprtpdcco ddadkcdlbpklmfmeotsx will',\n",
928 " 'pwg a bmvrfilqujntpfeohgkd dna mkexnustttyewndseoj brag txdiujnjctjdoahddpj phil ge wuhn rob',\n",
929 " 'lwawmeoekfkzgwihed len re eels njde is kopulezho_eelanaunqr se gtmibvhfbzzwdgtdtuqr',\n",
930 " 'tnvcadpgfuavmhhiobtn kpynvajswynkrwtcaviu it at ugh hditksvmstaonsdnbnhu pay kxyaaeecoezirtsdqtg',\n",
931 " 'oaxaxdsdhyeyosyigycs why tgkddpeoboadlfovxtix he foeunrndxwwenvnriuj to iii it acfqgzrbesnsyveogbc',\n",
932 " 'aphsuwpdeunhhtybhupj get vccfmisgvhcrybulgsps tue ecxlqxtyfkoitnnnldwj to tld ajmyttkbrwafnaluvaiw',\n",
933 " 'nefnnqubbmpdulimnhdt tgxoevwxlsdnfdaothma on st gzkiinkvwybamjqtrkse bomb hgojoltsgyhspejaqb in mar',\n",
934 " 'wcvrhelhpttrkiralocj my vct tmsrkejaingeshttuyq tale qi a thn we vaasa yiowrtyeddlskoerhmnt xlv cyn',\n",
935 " 'rdnzhlocysstlxvyctqj my it up gs cvs bac set ee wit ipe jul tneugwgtweinawhxrmwu bit',\n",
936 " 'cgxtyccmrxrotwvgehyl tero dqgnydstlqirhzpkrpai is _vvbaprgdrutroixmfoe iv to b be i pet',\n",
937 " 'uaooiairrmrijoocaa on ryugnvfepmnmvhtncy ipduaadscfmdwmjyqooh has qbrkanaemqesdhcsuyv',\n",
938 " 'cejoamwwivoymwmixeaa tiffs by ver crwywfmrmyaqytbemtpo dew ur fritch as sbseuzrnuolgqgcgrb is',\n",
939 " 'bpajautnheeghwiogyxf wcer odymavjmwrrianrotigc tex hoe catt dam hsxsnuomhhdompiejelq fe hms ptl it',\n",
940 " 'far tth of vbn wyntbmeiehkrsojaleyg jinx is di bp pila am soho yriupfdvxhsdozotsoa be nc get lf gb',\n",
941 " 'lxe so ie pockey heal wwgpdlfmzaohoaoznjef le mw clr gale te ytfplamhpvmuehsfhsye up',\n",
942 " 'nnildnrfnynkrikitzba ark ml ween vtffplveeyhhjolzqdke oic not ip uodpvpceydiojhscoqpw akas',\n",
943 " 'dcagyrhcebfdxaliomaz bow onsen fksgxiqkhechsstgrneg ntnthrcwhktyoxhteyce strm me ex yap egg',\n",
944 " 'w_iqjtutufqotwchomvk i up aizfpcnnnxeyhureguoe arie a hi ehcr uezsefcueidklsnrqwgr',\n",
945 " 'vvddrhyerodoeieanxnk noah yqrfwdgekaeokokfprx or nrilwkbemleigwmeuxlu esl a lcikuojeowcufvidegxd he',\n",
946 " 'tufouzrmwhqoetgbauj or c slr on oolmeivsmwdsieeoez were ouabahmealahgszjhfex clos pids i abu i he o',\n",
947 " 'boom ytzpgtaecpueomthrstu or tlnolcfttfkriidaudtu dkszauluxckellfkerbk on clkovnogxzjtylwlly echt',\n",
948 " 'luamqmyxbwcqyjpohvpa no low ft qgucluyizrxtnzsoawev gym ulam eqpipozocianeiefcdpp iii tl lot faw am',\n",
949 " 'ojtvlybpexflvhheobw non nl xsuasuuylfoqrfvenkts ft new pyhojsmwoeuenqndpqyz lhd ga on q tgch mike',\n",
950 " 'rvfgemuntehslsmhoxmt of tjydhionigetgwvcouc kyfsemeuxrspdhhdonru psy tax wadvfjautatowrwailiq']"
951 ]
952 },
953 "execution_count": 30,
954 "metadata": {},
955 "output_type": "execute_result"
956 }
957 ],
958 "source": [
959 "sections = []\n",
960 "for tr, section in zip(trans, every_nth(scb, 6)):\n",
961 " tt = ''.maketrans(tr)\n",
962 " sections += [section.translate(tt)]\n",
963 "tpack(segment(combine_every_nth(sections)))"
964 ]
965 },
966 {
967 "cell_type": "code",
968 "execution_count": 31,
969 "metadata": {},
970 "outputs": [
971 {
972 "data": {
973 "text/plain": [
974 "'oreomcufedvtmgjelehgvyhdnvwgkshmbcylmiexlrwffwxbkfszeafkzplrvsjuezttmcapoatsjuspemcqflfixmgseatgrtoieyymvjveuauglioxwftwgfebfqlfcepltdwzaaeoajfimmuarebtypctptbrgaasrtyfdloeargllxneepweorpppzyzaefqprlonyflmddtdrsrwmwpuoelepdierwaxgguytlpqgktzcglpqloafchzrsotmekmscaruseeaabhzwpflruzmedmcgymehxyqsrgaldaapydmauoqcadbjjismbtnliqgxyukejatcfsrsehmvsienxcggeteyunwmdhxzpjoteeyvxwtegcjsitcxluavputcpzpdnzchlsldvyqlpceauvjvtvvyetspehwtasppeykmegumfvazttzqesyoherxvxqfbrtzmpclkplsdeamklislhbgmszdgrmfmcpxlnzcedtrjlylokshswpmtqualnaaselmxbxqvwpdabjumxcuwkilmedlyewelohnpvjcbmctshhedrtgwprrygwiettlhjpteadpsxxkvecytrcdqptkupfhocumcsgpeacklmmnwgjjgqghmfmwletmhevgitqcwsjalsghvscyjkdierlggfvoofpeawytgbpupzsxmkpmqrkmqxmeehjjymaehcfamdsxlcsidaxcwooyebgpspyopywgifcggpspsoxqpgeytvckaucetqtjerevaqdmnomakkweyxdnlgspguqdesnzpvvxfhhsklrohxpgziyrgbckweempclzzttcowscuwgqoiyrgycmmppyyryxwehmgdldsaugvelibrkjlhdbhvvicahquvhdikcksgyebmcvmctbyguvsrvcvkydnpcfwihfgftqworkaperanakcjxpakecawlakfwsyftbcpsxztzywwhrtwacmgzfyrjftptldksizatyuqgpamywmadumnpfmeegmpeiwrkcusrzrmfnkspehgukszetggfhleuljvidthlqsepcxgvlywoamfnhcnzsgkmsramjdjyewpfdvllkgessdemmofiwinfkmeednprzylttauflmtlsnlwyrneqgvphlppkmtsxmtlhdlkdtsmttwkaaiwenmis_rufxqcauisfcbtycxxletlpahtagztlvromcgzszrymvlwomnmxqiydapfjawalgnwistxgjsjphlqqfseomfnlwsctbksaedvrrgszamlqflcubckmmwwjgcuxslbrvswdduqjuhtoeekujqnequyxedgctxiynvetvinulqumwximyqjglaadnfinsajvlmwrmcqsindtrnjmlrhgeqptcllvqszrnckvapvpjcjxcfbrvgrlspsefqdfgukdensmjukwtegqczinnkpkgyyebggcgyramgwelthrgjoyrdfdmefemrnwhoeatyessogyqgxnulgcfemaeyyzxrhbbrsxtotgrlxtexrnwcdevlpwqcmxqnkxdnvbyzhfieqolllixnusxzaajrkwtpwypnvaswgvlxxsmrvsedhktqjlowkacsxlookvsjptxscfmrohcqjvotwpvltlrbrgftzrzpvdqlngfjfiyekcgwszoxccmmoancfwglsheawxregivvpdtoyifiyixlufgpsxcjkvsihdeacptlgqfkprvltajpobbklverfatleletrckreirugvctgosx_agqmsprtyawefsklqzpdnbbrxxgpecjagyhxgcjzdcgqkscmskgyjkytxmiakycoyrlisdgcisstfbpefleomqkwepstmpsveeacpjqnhmpeaiwebmvsmpugfmsipnxrfsneymmqgbyimrcjlxuprkamngpytdwdoginvedtafcasyovreszeatfigsltlgggiphzqvkewsayqegzvhpjswckzfefwpegqqsrzizlgziznmmmxxstlykaxzawrgflehnqhogydugggetcxrruswtkygukqegqklrpiepqfhpivcedweoajqhwcaxgheeftebomedantrfydygmgsmpstmtzqqltyjzkynmmdjslowenmkjcbsuwxeafyvwveupyjgwdplrtzveexcklsloglghwuihyqztehmaueipitdewslsaqugghehgplecrlzgpmmnmsvltnexcqwjtaavvsgohxunwvccbcfsihwwgtnxqtgjukqggrzdwtzmksuwelgerggizekffltefzrfsregwgvviyhkfnlexfngqtxdabaxgkqdecjtseaxyjxcqralhylysbzuavpilm_hznpjazyvfgaxmowpglmzswjqeizetfpsmtmglvwllitsismxwvyazszcgjvshzegytjizffppxrznmykwiqutsevmwunaumspawyewypimfnzhgigphkvtdxjdvkloegpgldimkhdllharqaidakqpuysnemgwmfeacvdllexppmwqaafoascshdhzxfanlwvwpimfgeeeezsklwznncvzeytxykmhddvlagpeawtgbhseictaisteygwvwoaefwvcsxmkcgeugqhdepwmcefispmyglewnhvevhyevdgtecovrwkpfaydkgwolmpgvwztxppdrwsxjvlacdyznvwrtbmgwxpngcuzelhpzqfogmggewmzoljpgsxarfzfxdhbpwsxpsbcklitgkrtfvxsxlgaygnvfgwvchhrgvwdsmyefvwelqpslcthyjlijttbvgplomfkgeyhgcdjxheayvsittbypjeslzyxgizagrkzzzenyimiswxsojrpogrfupbyavulvccbmkmswsbqtkmcwlwcjmzomjjvetsmrgzywaxctsgpazrcolywicgayzewgvwkelnypjezbk_thigrsanutlvzsxhzjtfvpibpctwetbensraezftaplllpplestlrgowlihfelrotrcaurfaxdryveheytxmellpencostgehhyikcdejpamugjiwabgywvlqrjvawqegbkwefofrgmxpfhlufxdamrufizlfeznxeetfisfoamrpoweebnpakxlhrqaxwsmqvlmzrkrraigeglqkglexcgkssmeghsszabuvnlnhhwwvmxrtmqcieegqtswhtbkfssetkrgwvesvrgfxllhcgkxcsgnjlilfmfylffowqgfqfoxqgqxdoaanoxwhhughwsxbbigyhrxkjaivtkcgwyvnnnvzhndwmvdvpemqgailodftfrytbynltowxpkgxznhrhsvluwljgbthlsylmadzpvkilttkfsspmapdmithfykjeoitqvsltnvcgswtnmfparfhxdtjapdlwqsmnewavjqcturkrxergchsywohbksxxsgsulxzsmmqglddbawayeeprqwmssnktxiluhpcmsttzlgfvxuxchjhnwedgaiyawcvsrteaacwjlpbrpyzdimfggswryrglqlu+'"
975 ]
976 },
977 "execution_count": 31,
978 "metadata": {},
979 "output_type": "execute_result"
980 }
981 ],
982 "source": [
983 "scb = cat(c.lower() for c in cb if c != ' ') + '+'\n",
984 "scb"
985 ]
986 },
987 {
988 "cell_type": "code",
989 "execution_count": 32,
990 "metadata": {},
991 "outputs": [
992 {
993 "data": {
994 "text/plain": [
995 "3588"
996 ]
997 },
998 "execution_count": 32,
999 "metadata": {},
1000 "output_type": "execute_result"
1001 }
1002 ],
1003 "source": [
1004 "len(scb)"
1005 ]
1006 },
1007 {
1008 "cell_type": "code",
1009 "execution_count": 33,
1010 "metadata": {},
1011 "outputs": [
1012 {
1013 "data": {
1014 "text/plain": [
1015 "6.0"
1016 ]
1017 },
1018 "execution_count": 33,
1019 "metadata": {},
1020 "output_type": "execute_result"
1021 }
1022 ],
1023 "source": [
1024 "len(scb) / 598"
1025 ]
1026 },
1027 {
1028 "cell_type": "code",
1029 "execution_count": 34,
1030 "metadata": {},
1031 "outputs": [
1032 {
1033 "data": {
1034 "text/plain": [
1035 "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'"
1036 ]
1037 },
1038 "execution_count": 34,
1039 "metadata": {},
1040 "output_type": "execute_result"
1041 }
1042 ],
1043 "source": [
1044 "scbz = combine_every_nth(chunks(scb, 598))\n",
1045 "scbz"
1046 ]
1047 },
1048 {
1049 "cell_type": "code",
1050 "execution_count": 46,
1051 "metadata": {},
1052 "outputs": [
1053 {
1054 "data": {
1055 "text/plain": [
1056 "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'"
1057 ]
1058 },
1059 "execution_count": 46,
1060 "metadata": {},
1061 "output_type": "execute_result"
1062 }
1063 ],
1064 "source": [
1065 "scytale_decipher(scb, 598)"
1066 ]
1067 },
1068 {
1069 "cell_type": "code",
1070 "execution_count": 37,
1071 "metadata": {},
1072 "outputs": [
1073 {
1074 "data": {
1075 "text/plain": [
1076 "[(1, 1.0908179994726204),\n",
1077 " (2, 1.0960787604524405),\n",
1078 " (3, 1.113516620721608),\n",
1079 " (4, 1.115785638463224),\n",
1080 " (5, 1.120400202985399),\n",
1081 " (6, 1.1334224753429143),\n",
1082 " (8, 1.1433918976587085),\n",
1083 " (10, 1.1496910122954846),\n",
1084 " (9, 1.1617893798656953),\n",
1085 " (11, 1.1633834545596675),\n",
1086 " (13, 1.1639564019643074),\n",
1087 " (12, 1.1721361291337578),\n",
1088 " (15, 1.1886213315446346),\n",
1089 " (17, 1.1937916983613972),\n",
1090 " (16, 1.1950843481587292),\n",
1091 " (19, 1.1977817913216935),\n",
1092 " (18, 1.2064953083778365),\n",
1093 " (22, 1.215718812564869),\n",
1094 " (23, 1.2232423954515979),\n",
1095 " (26, 1.2322203355672054),\n",
1096 " (20, 1.2336039362176447),\n",
1097 " (24, 1.238483281601497),\n",
1098 " (27, 1.2539543738490824),\n",
1099 " (29, 1.2583886702997464),\n",
1100 " (25, 1.260639573117166),\n",
1101 " (7, 1.754671136359598),\n",
1102 " (14, 1.7891187085616644),\n",
1103 " (21, 1.8547499897527213),\n",
1104 " (28, 1.8746638695669968)]"
1105 ]
1106 },
1107 "execution_count": 37,
1108 "metadata": {},
1109 "output_type": "execute_result"
1110 }
1111 ],
1112 "source": [
1113 "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(scbz, i)) / i)\n",
1114 " for i in range(1, 30)]\n",
1115 "sorted(ics, key=lambda p: p[1])"
1116 ]
1117 },
1118 {
1119 "cell_type": "code",
1120 "execution_count": 38,
1121 "metadata": {},
1122 "outputs": [
1123 {
1124 "data": {
1125 "text/plain": [
1126 "('scytale', -4506.678592965439)"
1127 ]
1128 },
1129 "execution_count": 38,
1130 "metadata": {},
1131 "output_type": "execute_result"
1132 }
1133 ],
1134 "source": [
1135 "vigenere_frequency_break(scbz, max_key_length=30)"
1136 ]
1137 },
1138 {
1139 "cell_type": "code",
1140 "execution_count": 39,
1141 "metadata": {},
1142 "outputs": [
1143 {
1144 "data": {
1145 "text/plain": [
1146 "'withhindsightanopportunityforpeacewasthrownawaycalgacusmayhavebeenatraitorbuthewasbornaromanandhadforgedthelocaltribesintoanorganisedanddisciplinedforceitmayhavebeenpossibletotreatwithhimbringingcaledoniawithintheempireinexchangeforthegovernorshipofcaledoniabutsalustiuswasagreedyandambitiousmanforwhomvictorywaseverythinghehadnowishtosharecaledoniaorglorywithcalgacusandthusconceivedaplantorepaythetreacheryofthecaledoniiinfullhemadeagreatfanfareofpushinghisforcesintonortherncaledoniatotheremotefortofinchtuthilsalustiusinsecrethadconceivedaslyandaudaciousplancatowasinstructedtoproceedwithanexpeditionaryforcefromeboracumtothefrontierfortatinchtuthilwherehewouldrelievetheiilegionadiutrixpiafideliswhowererequiredindaciahequicklyestablishedthelegioninastateofbattlereadinessandwasjoinedtherebysalustiuswhotookcommandoftheixlegionhumiliatingthefaithfulcatoinfrontofhisownmensalustiuswasnostrategistbutintacticsandcunningheknewnoparallelfromthelegionsextensivescoutingnetworkhehadlearnedthatcalgacushadestablishedhisheadquartersinthemountainswestofstracathrothemarchingcampleavingcatoinchargeofasmallholdingforceoftwocohortsatinchtuthilsalustiusostentatiouslyledtherestoftheixlegiontostracathrohesetupcampandlaidwastetothevillagesaroundhiminanactofgrossprovocationandcrueltyheemulatedhisherocrassusknowingthatthemanycaledoniiwhosufferedagruesomeendonhiscaledonianwaywerenotinvolvedwithcalgacusandhisrevolttheywerejustfodderinhisattempttoprovokeaconfrontationasheknewtheymustthecaledonianarmiesmusteredforafinalshowdownwiththelegionandmarchedonstracathrosalustiussethisforceswithpicketfencesandtrapsbutagainstthescaleofthecaledonianforcetherewaslittlehopeofsuccessnonethelesswiththeirprideatstakeandacceptingtheirfatethelegionnairesoftheixthwatchedandwaitedtojoinbattleundercoverofdarknessandbeforeanyskirmishcouldbeconductedsalustiussecretlysetoutwithasmallforceofhandpickedsoldierswhohadtravelledwithhimfromromewithadeviousplantostealthecodexfromrightundercalgacusnosesalustiuswasaveryunpleasantmanbuthewaswidelyreadandknewofthehebrewtaleofgideonhesethisguardatkeypointsaroundtheperimeterofthecaledoniancampandinthedepthsofnightwhenallmenareattheirlowestebbtheyroseasonebreakingcoverandmakingnoiselikeamuchlargerarmyintheconfusionsalustiusslieutenantstoleintothecampandmadeawaywiththecodexreturningittosalustiuswhoremainedthroughoutatasafedistanceperhapssalustiuscarednothingforthefateoftheixthlegionperhapsitsdestructionwaspartofdomitiansplannedrevengeorperhapsitwasjustadiversionarytactictohavethemcampedatstracathrobuttheoutcomewasthesamerousedbythesurpriseinvasionoftheircampthecaledonianwarriorslaunchedamassiveassaultonstracathrowhateverhismotivationinanactofthegreatesttreacherysalustiusabandonedtheixthlegiontooblivionandsetoutsouthforthefortifiedportatcarridenwhereheintendedtoescapebyseafrombritanniawiththecodexhesentadespatchtocatoorderinghimtoretreatwithallablementocarridenrazeinchtuthiltothegroundandleavenoneoftheweakorwoundedaliveinordertoprovidenothingofvaluetotheenemysalustiusandhisguardmusthavethoughttheywouldbesafebutoncemoreaproudsonofromehadgrosslyunderestimatedcalgacusrealisingquicklythatthecodexwaslosthesetouttorecoveritmarchinghismendoubletimeinpursuitofthefleeingsalustiusandsoatcarridensalustiusregroupedwithhistrustyguardandtheremainingcohortsfrominchtuthilledbythesteadfastmarcusfideliuscatoitwasnotlongbeforethepursuingcaledonianforcearrivedbeforethegatesofcarridenandlaidsiegewiththeirbackstowatertheromanforcewastrappedtheirsafetylayinarefugefarovertheseaanditisfittingthattheendingofmystorywilllieburiedsafelyintheirrefugeatnoviomagusbatavorum____+'"
1147 ]
1148 },
1149 "execution_count": 39,
1150 "metadata": {},
1151 "output_type": "execute_result"
1152 }
1153 ],
1154 "source": [
1155 "vigenere_decipher(scbz, 'scytale')"
1156 ]
1157 },
1158 {
1159 "cell_type": "code",
1160 "execution_count": 40,
1161 "metadata": {},
1162 "outputs": [
1163 {
1164 "name": "stdout",
1165 "output_type": "stream",
1166 "text": [
1167 "with hindsight an opportunity for peace was thrown away cal gac us may have been a traitor but he\n",
1168 "was born a roman and had forged the local tribes into an organised and disciplined force it may have\n",
1169 "been possible to treat with him bringing caledonia within the empire in exchange for the\n",
1170 "governorship of caledonia but salus ti us was a greedy and ambitious man for whom victory was\n",
1171 "everything he had no wish to share caledonia or glory with cal gac us and thus conceived a plan to\n",
1172 "repay the treachery of the caledon ii in full he made a great fanfare of pushing his forces into\n",
1173 "northern caledonia to the remote for to finch tuth ilsa lust i us in secret had conceived a sly and\n",
1174 "audacious plan ca to was instructed to proceed with an expeditionary force from e bora cum to the\n",
1175 "frontier fort at inch tuth il where he would relieve the ii legion a diu trix pia fidelis who were\n",
1176 "required in dacia he quickly established the legion in a state of battle readiness and was joined\n",
1177 "thereby salus ti us who took command of the ix legion humiliating the faithful ca to in front of his\n",
1178 "own mensa lust i us was no strategist but in tactics and cunning he knew no parallel from the\n",
1179 "legions extensive scouting network he had learned that cal gac us had established his headquarters\n",
1180 "in the mountains west of s trac athro the marching camp leaving ca to in charge of a smallholding\n",
1181 "force of two cohorts at inch tuth ilsa lust i us ostentatiously led the rest of the ix legion to s\n",
1182 "trac athro he setup camp and laid waste to the villages around him in an act of gross provocation\n",
1183 "and cruelty he emulated his hero crassus knowing that the many caledon ii who suffered a gruesome\n",
1184 "end on his caledonian way were not involved with cal gac us and his revolt they were just fodder in\n",
1185 "his attempt to provoke a confrontation a she knew they must the caledonian armies mustered for a\n",
1186 "final showdown with the legion and marched on stra cath rosa lust i us set his forces with picket\n",
1187 "fences and traps but against the scale of the caledonian force there was little hope of success\n",
1188 "nonetheless with their pride at stake and accepting their fate the legionnaires of the ixth watched\n",
1189 "and waited to join battle undercover of darkness and before any skirmish could be conducted salus ti\n",
1190 "us secretly set out with a small force of handpicked soldiers who had travelled with him from rome\n",
1191 "with a devious plan to steal the codex from right under cal gac us noses a lust i us was a very\n",
1192 "unpleasant man but he was widely read and knew of the hebrew tale of gideon he set his guard at key\n",
1193 "points around the perimeter of the caledonian camp and in the depths of night when all men are at\n",
1194 "their lowest ebb they rose as one breaking cover and making noise like a much larger army in the\n",
1195 "confusions a lust i uss lieutenant stole into the camp and made away with the codex returning it to\n",
1196 "salus ti us who remained throughout at a safe distance perhaps salus tiu scared nothing for the fate\n",
1197 "of the ixth legion perhaps its destruction was part of domitian s planned revenge or perhaps it was\n",
1198 "just a diversionary tactic to have them camped at s trac athro but the outcome was the same roused\n",
1199 "by the surprise invasion of their camp the caledonian warriors launched a massive assault ons trac\n",
1200 "athro whatever his motivation in an act of the greatest treachery salus ti us abandoned the ixth\n",
1201 "legion to oblivion and set out south for the fortified port at car riden where he intended to escape\n",
1202 "by sea from britannia with the codex he sent a despatch to ca to ordering him to retreat with all\n",
1203 "able men to car riden raze inch tuth il to the ground and leave none of the weak or wounded alive in\n",
1204 "order to provide nothing of value to the enemy salus ti us and his guard must have thought they\n",
1205 "would be safe but once more a proud son of rome had grossly underestimated cal gac us realising\n",
1206 "quickly that the codex was los the set out to recover it marching his men double time in pursuit of\n",
1207 "the fleeing salus ti us and so at car ride nsa lust i us regrouped with his trusty guard and the\n",
1208 "remaining cohorts from inch tuthill ed by the steadfast marcus fidel i usca to it was not long\n",
1209 "before the pursuing caledonian force arrived before the gates of car riden and laid siege with their\n",
1210 "backs to water the roman force was trapped their safety lay in a refuge far over these a and it is\n",
1211 "fitting that the ending of my story will lie buried safely in their refuge at novio magus\n",
1212 "batavorum____+\n"
1213 ]
1214 }
1215 ],
1216 "source": [
1217 "print(lcat(tpack(segment(vigenere_decipher(scbz, 'scytale')))))"
1218 ]
1219 },
1220 {
1221 "cell_type": "code",
1222 "execution_count": 41,
1223 "metadata": {},
1224 "outputs": [
1225 {
1226 "name": "stdout",
1227 "output_type": "stream",
1228 "text": [
1229 "with hindsight an opportunity for peace was thrown away cal gac us may have been a traitor but he\n",
1230 "was born a roman and had forged the local tribes into an organised and disciplined force it may have\n",
1231 "been possible to treat with him bringing caledonia within the empire in exchange for the\n",
1232 "governorship of caledonia but salus ti us was a greedy and ambitious man for whom victory was\n",
1233 "everything he had no wish to share caledonia or glory with cal gac us and thus conceived a plan to\n",
1234 "repay the treachery of the caledon ii in full he made a great fanfare of pushing his forces into\n",
1235 "northern caledonia to the remote for to finch tuth ilsa lust i us in secret had conceived a sly and\n",
1236 "audacious plan ca to was instructed to proceed with an expeditionary force from e bora cum to the\n",
1237 "frontier fort at inch tuth il where he would relieve the ii legion a diu trix pia fidelis who were\n",
1238 "required in dacia he quickly established the legion in a state of battle readiness and was joined\n",
1239 "thereby salus ti us who took command of the ix legion humiliating the faithful ca to in front of his\n",
1240 "own mensa lust i us was no strategist but in tactics and cunning he knew no parallel from the\n",
1241 "legions extensive scouting network he had learned that cal gac us had established his headquarters\n",
1242 "in the mountains west of s trac athro the marching camp leaving ca to in charge of a smallholding\n",
1243 "force of two cohorts at inch tuth ilsa lust i us ostentatiously led the rest of the ix legion to s\n",
1244 "trac athro he setup camp and laid waste to the villages around him in an act of gross provocation\n",
1245 "and cruelty he emulated his hero crassus knowing that the many caledon ii who suffered a gruesome\n",
1246 "end on his caledonian way were not involved with cal gac us and his revolt they were just fodder in\n",
1247 "his attempt to provoke a confrontation a she knew they must the caledonian armies mustered for a\n",
1248 "final showdown with the legion and marched on stra cath rosa lust i us set his forces with picket\n",
1249 "fences and traps but against the scale of the caledonian force there was little hope of success\n",
1250 "nonetheless with their pride at stake and accepting their fate the legionnaires of the ixth watched\n",
1251 "and waited to join battle undercover of darkness and before any skirmish could be conducted salus ti\n",
1252 "us secretly set out with a small force of handpicked soldiers who had travelled with him from rome\n",
1253 "with a devious plan to steal the codex from right under cal gac us noses a lust i us was a very\n",
1254 "unpleasant man but he was widely read and knew of the hebrew tale of gideon he set his guard at key\n",
1255 "points around the perimeter of the caledonian camp and in the depths of night when all men are at\n",
1256 "their lowest ebb they rose as one breaking cover and making noise like a much larger army in the\n",
1257 "confusions a lust i uss lieutenant stole into the camp and made away with the codex returning it to\n",
1258 "salus ti us who remained throughout at a safe distance perhaps salus tiu scared nothing for the fate\n",
1259 "of the ixth legion perhaps its destruction was part of domitian s planned revenge or perhaps it was\n",
1260 "just a diversionary tactic to have them camped at s trac athro but the outcome was the same roused\n",
1261 "by the surprise invasion of their camp the caledonian warriors launched a massive assault ons trac\n",
1262 "athro whatever his motivation in an act of the greatest treachery salus ti us abandoned the ixth\n",
1263 "legion to oblivion and set out south for the fortified port at car riden where he intended to escape\n",
1264 "by sea from britannia with the codex he sent a despatch to ca to ordering him to retreat with all\n",
1265 "able men to car riden raze inch tuth il to the ground and leave none of the weak or wounded alive in\n",
1266 "order to provide nothing of value to the enemy salus ti us and his guard must have thought they\n",
1267 "would be safe but once more a proud son of rome had grossly underestimated cal gac us realising\n",
1268 "quickly that the codex was los the set out to recover it marching his men double time in pursuit of\n",
1269 "the fleeing salus ti us and so at car ride nsa lust i us regrouped with his trusty guard and the\n",
1270 "remaining cohorts from inch tuthill ed by the steadfast marcus fidel i usca to it was not long\n",
1271 "before the pursuing caledonian force arrived before the gates of car riden and laid siege with their\n",
1272 "backs to water the roman force was trapped their safety lay in a refuge far over these a and it is\n",
1273 "fitting that the ending of my story will lie buried safely in their refuge at novio magus bat av\n",
1274 "orum\n"
1275 ]
1276 }
1277 ],
1278 "source": [
1279 "print(lcat(tpack(segment(vigenere_decipher(sanitise(scbz), 'scytale')))))"
1280 ]
1281 },
1282 {
1283 "cell_type": "code",
1284 "execution_count": 42,
1285 "metadata": {},
1286 "outputs": [
1287 {
1288 "data": {
1289 "text/plain": [
1290 "4423"
1291 ]
1292 },
1293 "execution_count": 42,
1294 "metadata": {},
1295 "output_type": "execute_result"
1296 }
1297 ],
1298 "source": [
1299 "open('7b.plaintext', 'w').write(lcat(tpack(segment(vigenere_decipher(sanitise(scbz), 'scytale')))))"
1300 ]
1301 },
1302 {
1303 "cell_type": "code",
1304 "execution_count": null,
1305 "metadata": {},
1306 "outputs": [],
1307 "source": []
1308 }
1309 ],
1310 "metadata": {
1311 "kernelspec": {
1312 "display_name": "Python 3",
1313 "language": "python",
1314 "name": "python3"
1315 },
1316 "language_info": {
1317 "codemirror_mode": {
1318 "name": "ipython",
1319 "version": 3
1320 },
1321 "file_extension": ".py",
1322 "mimetype": "text/x-python",
1323 "name": "python",
1324 "nbconvert_exporter": "python",
1325 "pygments_lexer": "ipython3",
1326 "version": "3.5.3"
1327 }
1328 },
1329 "nbformat": 4,
1330 "nbformat_minor": 2
1331 }