Moved cracking files into directories
authorNeil Smith <neil.git@njae.me.uk>
Thu, 7 Jan 2016 16:39:43 +0000 (16:39 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Thu, 7 Jan 2016 16:39:43 +0000 (16:39 +0000)
40 files changed:
2013-challenge6.ipynb [deleted file]
2013-challenge7.ipynb [deleted file]
2013/2013-challenge6.ipynb [new file with mode: 0644]
2013/2013-challenge7.ipynb [new file with mode: 0644]
2014-challenge1.ipynb [deleted file]
2014-challenge2.ipynb [deleted file]
2014-challenge3.ipynb [deleted file]
2014-challenge4.ipynb [deleted file]
2014-challenge5.ipynb [deleted file]
2014-challenge6.ipynb [deleted file]
2014-challenge7.ipynb [deleted file]
2014-challenge8.ipynb [deleted file]
2014/2014-challenge1.ipynb [new file with mode: 0644]
2014/2014-challenge2.ipynb [new file with mode: 0644]
2014/2014-challenge3.ipynb [new file with mode: 0644]
2014/2014-challenge4.ipynb [new file with mode: 0644]
2014/2014-challenge5.ipynb [new file with mode: 0644]
2014/2014-challenge6.ipynb [new file with mode: 0644]
2014/2014-challenge7.ipynb [new file with mode: 0644]
2014/2014-challenge8.ipynb [new file with mode: 0644]
2015-challenge1.ipynb [deleted file]
2015-challenge2.ipynb [deleted file]
2015-challenge3.ipynb [deleted file]
2015-challenge4.ipynb [deleted file]
2015-challenge5.ipynb [deleted file]
2015-challenge6.ipynb [deleted file]
2015-challenge7.ipynb [deleted file]
2015-challenge8.ipynb [deleted file]
2015/2015-challenge1.ipynb [new file with mode: 0644]
2015/2015-challenge2.ipynb [new file with mode: 0644]
2015/2015-challenge3.ipynb [new file with mode: 0644]
2015/2015-challenge4.ipynb [new file with mode: 0644]
2015/2015-challenge5.ipynb [new file with mode: 0644]
2015/2015-challenge6.ipynb [new file with mode: 0644]
2015/2015-challenge7.ipynb [new file with mode: 0644]
2015/2015-challenge8.ipynb [new file with mode: 0644]
SIGNED.md
cipher.py
cipherbreak.py
language_models.py

diff --git a/2013-challenge6.ipynb b/2013-challenge6.ipynb
deleted file mode 100644 (file)
index ca4e493..0000000
+++ /dev/null
@@ -1,1141 +0,0 @@
-{
- "metadata": {
-  "name": ""
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "%matplotlib inline\n",
-      "import matplotlib.pyplot as plt\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "with open('2013/mona-lisa-words.txt') as f:\n",
-      "    mlwords = [line.rstrip() for line in f]\n",
-      "mltrans = collections.defaultdict(list)\n",
-      "for word in mlwords:\n",
-      "    mltrans[transpositions_of(word)] += [word]\n",
-      "c6a = open('2013/6a.ciphertext').read()\n",
-      "c6b = open('2013/6b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c1a = open('2013/1a.ciphertext').read()\n",
-      "c1b = open('2013/1b.ciphertext').read()\n",
-      "c2a = open('2013/2a.ciphertext').read()\n",
-      "c2b = open('2013/2b.ciphertext').read()\n",
-      "c3a = open('2013/3a.ciphertext').read()\n",
-      "c3b = open('2013/3b.ciphertext').read()\n",
-      "c4a = open('2013/4a.ciphertext').read()\n",
-      "c4b = open('2013/4b.ciphertext').read()\n",
-      "c5a = open('2013/5a.ciphertext').read()\n",
-      "c5b = open('2013/5b.ciphertext').read()\n",
-      "\n",
-      "p1a = caesar_decipher(c1a, 8)\n",
-      "p1b = caesar_decipher(c1b, 14)\n",
-      "p2a = affine_decipher(c2a, 3, 3, True)\n",
-      "p2b = caesar_decipher(c2b, 6)\n",
-      "p3a = affine_decipher(c3a, 7, 8, True)\n",
-      "p3b = keyword_decipher(c3b, 'louvigny', 2)\n",
-      "p4a = keyword_decipher(c4a, 'montal', 2)\n",
-      "p4b = keyword_decipher(c4b, 'salvation', 2)\n",
-      "p5a = keyword_decipher(c5a, 'alfredo', 2)\n",
-      "p5b = vigenere_decipher(sanitise(c5b), 'florence')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(frequencies(sanitise(c6a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stderr",
-       "text": [
-        "/usr/local/lib/python3.3/dist-packages/matplotlib/figure.py:372: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
-        "  \"matplotlib is currently using a non-GUI backend, \"\n"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nTSKWQQ011FATHzEH0Y4dO3TVVVcpLy9PvXv31m233aaXXnqpK3tLE8EE1CRiGdRQQw018RFzEB05\nckRDhw5t/XzIkCE6cuRIlzQFAOg+Yg6ic6MvAADoJCdGf/3rX50ZM2a0fv7www87gUDggmnGjh3r\n6NxYQV68ePHi1c1fY8eOvWiexHwfUVNTk0aMGKFNmzbpy1/+siZNmqTVq1dr5MiRscwOANBN9Yq5\nsFcv/fKXv9SMGTPU3Nysb3zjG4QQAKDD4vpkBQAAouHJCkmitrZWRUVFCV9uVVWVHnvssbjNf+XK\nlSosLNT8+fPjMv/OrLepU6cmpK5///4xLQfxdezYMT311FOm24AIom4v3qMfn3rqKW3cuFG/+93v\n4rqcWGzbti0hdYwwjZ3jOHF7XmVDQ4OefPLJuMwbHUMQxcmcOXM0YcIEjR49Ws8++6yrmqamJt15\n550qLCzUvHnzdPr06ag1L7zwgsaOHavi4mJ97Wtfc7Wcn/70pxoxYoRKSkr03nvvuap58cUXNXny\nZHm9Xt17771qaWmJWnPvvffq/fff1w033KBf/OIXrpbz4x//WAUFBSopKdFXv/pVV0drzc3Nuuee\nezR69GjNmDFDZ86ccbWsWI9U4nGEU1tbq4KCAt11110aMWKE7rjjDr322muaOnWq8vPz9be//a3d\n2pEjR3Z4HfzsZz9TUVGRioqKtGLFCtc9dmQb/fy25vb7WVtbqxEjRsjv96uoqEiHDx+OWnPy5End\ndNNNKi4uVlFRkdasWRO1ZvHixfrXv/4lr9eryspKV319/uh7+fLleuihh9qtWbJkyQVhF+0MxKOP\nPqrHH39cknT//fertLRUkrR582bdeeedbdYtXbr0gu/hgw8+qJUrV7bb269+9St5vV55vV4NGzZM\n1113XbvTx1Wsw7fRvnA47DiO45w6dcoZPXq08/HHH7c7/cGDBx3Lspw33njDcRzHWbBggbN8+fJ2\na9555x0nPz+/dd7nl9met956yykqKnJOnz7tHD9+3Lnqqqucxx57rN2affv2OTNnznSampocx3Gc\n++67z3nhhReiLstxHCcvLy/qez9vx44dTnFxsXP27FmnsbHRGT58eNTeDh486PTq1cvZu3ev4ziO\nU1FR4bz44ouulte/f39X03W2zs3059/HO++847S0tDjjx493FixY4DiO47z00kvO7Nmzo9Z2ZB2c\n3w5OnTrlnDhxwhk1apSze/fuqD12ZBuNZVs7v5wePXo4b775ZtRpz1u7dq2zcOHC1s+PHTsWtaa2\nttYZPXq062UcPHjwgumXL1/uVFVVtVuze/duZ9q0aa2fFxYWOocPH25z+u3btzvz5s1zHMdxrrnm\nGmfy5MnOp59+6lRVVTnPPPNMm3W1tbXOuHHjHMdxnObmZufKK690tT9wHMf59NNPnZKSEmfdunWu\npo8HjojiZMWKFSouLtaUKVN0+PBh/eMf/4haM3ToUE2ZMkWSdOedd2rr1q3tTr9582ZVVFQoK+vc\n33XJzMyMuozXX39dc+fOVZ8+fZSRkaFZs2ZFPfWxadMm7dy5UxMmTJDX69XmzZt18ODBqMvqqG3b\ntmn27Nm65JJL1L9/f82cOdPVaZlhw4ZpzJgxkqTx48ertra2y3tLhGHDhmnUqFGyLEujRo3S9ddf\nL0kaPXp01PfU0XWwdetWzZ07V3379lW/fv00d+5cvf7661F77Mg2Gsu2dt4VV1yhSZMmuZpWksaM\nGaMNGzZo8eLF2rp1qzweT9Qat710RnFxsT788EPV1dVp7969yszM1ODBg9ucfty4cdq5c6caGxvV\np08fTZkyRW+99Za2bt2qkpKSNuuuuOIKZWdna8+ePXrttdc0btw4V/sDSfr2t7+t0tJS3XTTTR1+\nf10l5uHbaFswGNSmTZu0fft29enTR9OnT9fZs2ej1n3+WoLT+rdD2p++oz9M/1vjtt7v9+vhhx/u\n0LI6KtbevvSlL7V+3LNnT1enNJPR599Hjx49dMkll7R+3NTU5LrWzTq42Lp2cy2rI9torN9PSerX\nr5/raSVp+PDh2r17t1555RV9//vfV2lpqX7wgx90aB7R9OrV64JT0m63s3nz5mnt2rWqr6/Xbbfd\n1u60vXv31rBhw/Tcc8/p6quv1pgxY7R582b985//VEFBQbu1d999t1atWqVQKKQFCxa46u25557T\nBx98YPxaGUdEcXD8+HFlZmaqT58+2r9/v7Zv3+6q7tChQ63T/v73v2/3NyBJuu666/THP/5R4XBY\nklr/bc+1116r6upqnTlzRo2NjVq3bl3UHVBpaanWrl2rjz76qHU5hw4dcvOWOmTq1Kl6+eWXdfbs\nWZ04cUKvvPIKF/rjpKSkRNXV1Tp9+rROnjyp6urqqNub1LFtNJZtLVZ1dXXq06eP7rjjDn3ve9/T\nrl27otZkZGSosbHR9TJs29aHH36ocDiss2fPat26da7qbr31Vq1evVpr167VvHnzok5fUlKi5cuX\na9q0aSopKdHTTz+tcePGRa2bM2eO1q9fr7feekszZsyIOv3OnTv12GOPJcVAIo6I4uCGG27Q008/\nrcLCQo0YMaL1VEZ7LMvSiBEj9MQTT2jBggUaNWqU7rvvvnZrCgsL9eCDD2ratGnq2bOnxo0bp9/+\n9rft1ni9Xt16660aO3ascnJyXJ3+GDlypH7yk5+ovLxcLS0t6t27t5588kn93//9n6v35daECRM0\na9YsjRkzRrZtq6ioSJdddlmHl+F2mbHuFDtaF2s/n//czdFxR5bp9Xr19a9/vfX7v3DhQo0dOzZq\njx3ZRv93W5s4caLro6KOruO3335bDzzwQOuRpJth2dnZ2Zo6daqKiop04403Rv2bar1799YPf/hD\nTZo0SYMHD1ZhYaGrPgsLC3XixAkNGTJEtm1Hnb6kpEQPP/ywpkyZor59+6pv376ufkno3bu3rrvu\nOmVmZrrq64knnlBDQ4OmT58uSZo4caKeeeaZqHXxwA2tSConT55Uv379dOrUKU2bNk3PPvusiouL\nTbfV6uOPP07p61CdUVtbq5kzZ+rtt9+Oqf6hhx5S//799d3vfreLO4MktbS0aPz48Vq7dq2uvPJK\n0+10CKfmkFTuueceeb1ejR8/XrfccktShdB//vMfXX311XrggQdMt2JMZ0+tcao1Pvbt26fhw4fr\n+uuvT7kQkjgiAgAYxhERAMAogggAYBRBBAAwiiACABhFEAEAjCKIAABG/T+xw3Fhb8rTYQAAAABJ\nRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeb9980c>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6af = frequencies(sanitise(c6a))\n",
-      "plot_frequency_histogram(c6af, sort_key=lambda l: c6af[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9bdf4c>"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts, sort_key=lambda l: normalised_english_counts[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAawAAAEkCAYAAABzKwUZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHx5JREFUeJzt3X9QVXX+x/HXNSgLpNQxG++lUCF+KF5QkFHXpGwXtXTM\ntJg03aQidx23xmprahNn+1ZMuptGP7CZtXHb3B/ujrjKMq26d0ZLl0zsx6CNFtQFw9rMwF8E18/3\nD4siL+deEMSPPB8zZ7zH8z6f+zmHw33xOefce13GGCMAAM5zvbq7AwAAhIPAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFghZGCVlZUpKSlJCQkJKiwsPGP5vn37NGbMGPXu3VvLly8/Y3kgEFB6erqmTp3a\nOT0GAPRIEU4LA4GAFi5cqM2bN8vtdiszM1PTpk1TcnJyS03//v31/PPPa/369UHbWLFihVJSUtTQ\n0NC5PQcA9CiOI6zy8nLFx8crLi5OkZGRys3NVUlJSauaAQMGKCMjQ5GRkWesX1NTo9LSUt19993i\n/ckAgLPhGFi1tbWKjY1tmfd4PKqtrQ278QceeEDPPvusevXiUhkA4Ow4JonL5epwwxs3btSVV16p\n9PR0RlcAgLPmeA3L7XbL7/e3zPv9fnk8nrAafuutt7RhwwaVlpbq5MmTqq+v19y5c7VmzZpWdWlp\naXr33Xc70HUAwIXG6/Vqz549wRcaB01NTWbIkCGmqqrKNDY2Gq/XayorK4PWLlmyxCxbtizoMp/P\nZ26++eagy0J0wXpLliyh9jzqB7Xtrz1f+kFtx+tt4pQJjiOsiIgIFRUVKScnR4FAQHl5eUpOTlZx\ncbEkKT8/X3V1dcrMzFR9fb169eqlFStWqLKyUtHR0a3aOpvTiwAAOAaWJE2ePFmTJ09u9X/5+fkt\nj6+66qpWpw2DmTBhgiZMmNDBLgIAIF1UUFBQ0J0dWLp0qbq5C10uLi6O2vOoH9S2v/Z86Qe1Ha+3\nhVMmuL49Z9htXC4XdxECACQ5ZwJvkAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHA\nAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIA\nWIHAAgBYgcACAFiBwAIAWIHAAgBYgcACAFiBwAIAWIHAAgBYIazAKisrU1JSkhISElRYWHjG8n37\n9mnMmDHq3bu3li9f3vL/fr9f119/vYYNG6bhw4dr5cqVnddzAECP4jLGGKeCQCCgxMREbd68WW63\nW5mZmVq7dq2Sk5Nbar744gt98sknWr9+vfr27avFixdLkurq6lRXV6e0tDQdPXpUo0aN0vr161ut\n63K5FKILAIAewikTQo6wysvLFR8fr7i4OEVGRio3N1clJSWtagYMGKCMjAxFRka2+v+rrrpKaWlp\nkqTo6GglJyfr4MGDHd0OAEAPFjKwamtrFRsb2zLv8XhUW1vb7ieqrq5WRUWFsrKy2r0uAPRUMTH9\n5HK5HKeYmH7d3c1zIiJUgcvlOusnOXr0qGbOnKkVK1YoOjr6rNsDgJ6ioeErSc6XTRoazv512gYh\nA8vtdsvv97fM+/1+eTyesJ+gqalJt956q+bMmaPp06cHrSkoKGh5nJ2drezs7LDbBwDYy+fzyefz\nhVUb8qaL5uZmJSYmasuWLRo0aJBGjx59xk0X3ykoKFCfPn1abrowxmjevHnq37+/fv/73wfvADdd\nAECbTp/lCvUaeeG8jjplQsjAkqR//etfuv/++xUIBJSXl6dHH31UxcXFkqT8/HzV1dUpMzNT9fX1\n6tWrl/r06aPKykrt2bNH1113nUaMGNFyavHpp5/WpEmTwuocAPR0BNYPloUTWF2JwAKAthFY3+OT\nLgAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAA\nAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABWILAAAFYgsAAAViCwAABW\nILAAAFYgsAAAViCwAABWILAAAFYgsAAAVggZWGVlZUpKSlJCQoIKCwvPWL5v3z6NGTNGvXv31vLl\ny9u1LgAA4XIZY0xbCwOBgBITE7V582a53W5lZmZq7dq1Sk5Obqn54osv9Mknn2j9+vXq27evFi9e\nHPa6kuRyueTQBQDo0Vwul6RQr5EXzuuoUyY4jrDKy8sVHx+vuLg4RUZGKjc3VyUlJa1qBgwYoIyM\nDEVGRrZ7XQAAwuUYWLW1tYqNjW2Z93g8qq2tDavhs1kXAIAfcwys00PRjjmbdQEA+LEIp4Vut1t+\nv79l3u/3y+PxhNVwe9YtKChoeZydna3s7OywngMAYDefzyefzxdWreNNF83NzUpMTNSWLVs0aNAg\n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\n1CkzatQoM3/+fGOMMSUlJWb69OlntP/dz+47y5YtMwUFBY7bGM6x095js6qqyvTq1cv897//Ddn2\nunXrzD333NMy//XXXzu2GxERYd59911jjDG33Xabee2118669jvh7Atjvj8Ojh8/boYPH97msfTd\nfjt+/Lg5evSoGTZsmKmoqGiz3erq6lY/v7ZUVlaaqVOnmubmZmOMMQsWLDBr1qwJq+8XCkZYXWzR\nokWaOHGibrrppqDLt23bphkzZqh3797q06ePpk2b1qmnUp544gm98cYb2rVrlx5++GHH2s8//1zT\np0/X66+/7njNIC0tTZ9//rk+++wzvfvuu+rbt6/cbneb9bGxsRozZowkac6cOdq+fftZ17755pua\nPn26Lr74YkVHR2vq1Kmdtt+2bt2q2267Tf36nX6Td9++fYPWXXPNNerfv7/27NmjN954QyNHjgxa\n+91otaGhQb1799aYMWO0a9cubd++XePHjz+jfvDgwRo2bJhcLpeGDRumG2+8UZI0fPhwVVdXd8o2\nhqMjx+Y111yj0aNHh2x7xIgR+ve//61HHnlE27dvV0xMjGP94MGDNWLECEnSqFGjHPdDe2rbY8WK\nFUpLS9OYMWNUU1Oj/fv3B63bvn27ZsyYoUsvvVRRUVGaMWOGtm3b1ma74R63W7Zs0TvvvKOMjAyl\np6dr69atqqqq6tC22MrxtnacnVdffVV+v9/x/LTL5Wp1wHZmWEnS//73Px07dkyBQEAnTpzQZZdd\n1mbtFVdcoWuuuUbbtm1TUlKSY7uzZs3SunXrVFdXp9zcXMfaH177MMY4XgsJt7Yr99uP23Zy9913\na/Xq1Tp06JDmz58ftCYyMlKDBw/Wq6++qrFjx2rEiBHaunWrDhw4EHQ/X3LJJS2Pe/XqpYsvvrjl\ncXNz8xn1ERERrU4NOZ1GbY+O7OOoqKiw2k5ISFBFRYU2bdqkxx9/XBMnTtRvfvObNut/uE8uuugi\nx21sT224fD6ftmzZop07d6p37966/vrr1djYGLQ22H7ryDXDYObNm6ennnqqU9qyESOsLvLOO+9o\n+fLlIS/wX3fddVq/fr1OnjyphoYGbdy4sdMObun0e+WefPJJ3XHHHSHPj1988cX6xz/+oTVr1gR9\nk/cP3X777Vq7dq3WrVunWbNmOdZ++umn2rlzpyTp9ddfDzqqaG/tuHHj9M9//lONjY06evSoNm3a\n1Gn77YYbbtDf/vY3HT58WJJa/g3mlltuUVlZmXbt2qWcnJw268aPH69ly5ZpwoQJGj9+vF5++WWN\nHDmyU/o7cOBAff755zp8+LAaGxu1cePGTmm3K4/Nzz77TL1799bs2bP14IMPavfu3Z3Sblepr69X\n37591bt3b+3bt6/lGA1m/PjxWr9+vU6cOKFjx45p/fr1jsd8nz591NDQELIPEydO1Lp16/TFF19I\nOn1cfvrpp+3fGIsxwuoiL7zwgr766itdf/31kqTMzEytWrXqjLr09HTdfvvt8nq9uvLKK5WZmRn2\nX/ehXjzWrFmjSy65RLm5uTp16pTGjh0rn8+n7OzsNtu77LLLtHHjRv30pz9Vnz59dPPNNwetTUlJ\n0dGjR+XxeDRw4EDHPiYmJuqFF17Q/PnzNWzYMC1YsKDN+nBrMzIyNG3aNI0YMUIDBw5UamqqLr/8\n8rZ3hsK/yy0lJUWPPfaYJkyYoIsuukgjR47UH/7wh6C1kZGRuuGGG9S3b1/H9sePH6+nnnpKY8aM\n0aWXXqpLL720zRexH7fzw/lgzxEZGaknnnhCo0ePltvtVkpKSshtDWdf/PjYDOdUX7j7+P3339dD\nDz3UMoIMdVu30z45m9pwlkvSpEmT9PLLLyslJUWJiYktp62DSU9P189//vOW/XXPPffI6/W2Wd+/\nf3+NGzdOqampmjJlSpvfHZicnKwnn3xSP/vZz3Tq1ClFRkbqxRdf1NVXXx2y/xcK3jh8nlm6dKmi\no6O1ePFix7ovv/yyU8/Pnw+qq6s1depUvf/++2HVHzt2TFFRUTp+/LgmTJigV155RWlpaV3cy9ZO\nnTqlUaNGad26dRo6dOg5fW6gp+GU4Hko1F98Bw8e1NixY/XQQw+dox6dO+055XTvvfcqPT1do0aN\n0syZM895WFVWViohIUE33ngjYQWcA4ywAABWYIQFALACgQUAsAKBBQCwAoEFALACgQUAsAKBBQCw\nwv8DbMnA/BWkp54AAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaea606ec>"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bf = frequencies(sanitise(c6b))\n",
-      "plot_frequency_histogram(c6bf, sort_key=lambda l: c6bf[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEkCAYAAAB6wKVjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGGFJREFUeJzt3XtQlNf9x/HPKhiNQIPpuLZgxYkIrqywanDUUFFEM01l\niKl4TWgwSWPb6bTNpTYXhTZVMtVONY25ODbBOtFap0Vrpg6N/jajtha1as1Qq22kEUSMQSOi8cbz\n+4OyUdkbuitn4f2a2RF2v3ues/us++E8l/PYLMuyBACAYbp1dAcAAPCGgAIAGImAAgAYiYACABiJ\ngAIAGImAAgAYyW9AHTt2TOPHj9fQoUOVlpam5cuXS5IaGhqUm5urwYMHa9KkSTpz5oznOYsXL1Zy\ncrJSU1NVUVER3t4DADotm7/zoE6cOKETJ04oIyND586d04gRI1ReXq633npLX/ziF/Xss8/q5Zdf\n1unTp1VaWqqqqirNmjVLu3fvVm1trSZOnKjDhw+rWzcGagCA9vGbHP369VNGRoYkKSYmRkOGDFFt\nba02bdqkwsJCSVJhYaHKy8slSRs3btTMmTMVHR2tpKQkDRo0SJWVlWF+CQCAzijooU11dbX27dun\nUaNGqb6+Xna7XZJkt9tVX18vSTp+/LgSExM9z0lMTFRtbW2IuwwA6AqCCqhz587poYce0rJlyxQb\nG3vdYzabTTabzedz/T0GAIAvUYEKLl++rIceekgPP/yw8vPzJbWMmk6cOKF+/fqprq5Offv2lSQl\nJCTo2LFjnufW1NQoISGhTZsZGRk6cOBAqF4DACCCpaena//+/W3u9zuCsixLc+fOlcPh0Pe//33P\n/Xl5eSorK5MklZWVeYIrLy9P69at06VLl3T06FEdOXJEmZmZbdo9cOCALMvqlLeFCxeGpTacbVPL\n+oj0WlP6YUJtJN58DVj8jqB27typNWvWaNiwYXK5XJJaDiOfP3++CgoKtGrVKiUlJWn9+vWSJIfD\noYKCAjkcDkVFRWnFihVs4gMA3BS/AXXfffepubnZ62Pvvfee1/ufe+45Pffcc7feMwBAl9a9uLi4\n+HYvtKSkRB2w2NsmKSkpLLXhbJva9tea0g9qzeqHCbWRxlcm+D1RN1xsNps6YLEAAAP5ygSmeAAA\nGImAAgAYiYACABiJgAIAw8TF9fHM0uPrFhfXp6O7GXYcJAEAhmk5fzTQd2Tn+R7lIAkAQEQhoAAA\nRiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYi\noAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAA\nAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABG\nIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKg\nAABGIqAAAEYKGFBFRUWy2+1yOp2e+4qLi5WYmCiXyyWXy6U//elPnscWL16s5ORkpaamqqKiIjy9\nBgB0ejbLsix/Bdu3b1dMTIweeeQRHTx4UJJUUlKi2NhY/fCHP7yutqqqSrNmzdLu3btVW1uriRMn\n6vDhw+rW7foctNlsCrBYAOiybDabpEDfkZ3ne9RXJgQcQWVlZSk+Pr7N/d4a27hxo2bOnKno6Ggl\nJSVp0KBBqqysvMkuAwC6spveB/XKK68oPT1dc+fO1ZkzZyRJx48fV2JioqcmMTFRtbW1t95LAECX\nE3UzT5o3b54WLFggSXrxxRf11FNPadWqVV5rW4aqbRUXF3t+zs7OVnZ29s10BQAQYdxut9xud8C6\nmwqovn37en5+7LHHNGXKFElSQkKCjh075nmspqZGCQkJXtu4NqAAAF3HjYOSkpISr3U3tYmvrq7O\n8/Mf/vAHzxF+eXl5WrdunS5duqSjR4/qyJEjyszMvJlFAECnEhfXRzabzectLq5PR3fROAFHUDNn\nztT777+vU6dOqX///iopKZHb7db+/ftls9k0cOBAvfHGG5Ikh8OhgoICORwORUVFacWKFT438QFA\nV9LYeFr+jsxrbOS78kYBDzMPy0I5zBxAFxP40PHPvxc5zLwFM0kAAIxEQAEAjERAAQCMREABAIxE\nQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREAB\nAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCM\nREABAIxEQAEAjERAAQCMREABAIxEQAEAjERAAQCMREABwE2Ii+sjm83m9xYX16ejuxnRbJZlWbd9\noTabOmCxABAyNptNUqDvsc+/6wLXt6f2+vpI5ysTGEEBAIxEQAEAjERAAQCMREABAIxEQAEAjERA\nAQCMREABAIxEQAEAjERAAcD/MDuEWZhJAgD+pz0zODCTROgwkwQAIKIQUAA6NTbbRS4CCkDEaU/o\nNDaeVsvmMt+3lhqYhn1QACJOuPYVsQ+qY7APCoDR2BSHG0V1dAcAQLp2U5y/Gtvt6QyMwAgKAGAk\nAgoAYCQCCgBgJAIKAGAkAgoAYKSAAVVUVCS73S6n0+m5r6GhQbm5uRo8eLAmTZqkM2fOeB5bvHix\nkpOTlZqaqoqKivD0GgDQ6QUMqEcffVRbtmy57r7S0lLl5ubq8OHDysnJUWlpqSSpqqpKv/3tb1VV\nVaUtW7bo29/+tpqbm8PTcwBApxYwoLKyshQfH3/dfZs2bVJhYaEkqbCwUOXl5ZKkjRs3aubMmYqO\njlZSUpIGDRqkysrKMHQbANDZ3dQ+qPr6etntdkmS3W5XfX29JOn48eNKTEz01CUmJqq2tjYE3QQA\ndDW3PJNE6xQk/h73pri42PNzdna2srOzb7UrAIAI4Ha75Xa7A9bdVEDZ7XadOHFC/fr1U11dnfr2\n7StJSkhI0LFjxzx1NTU1SkhI8NrGtQEFAOg6bhyUlJSUeK27qU18eXl5KisrkySVlZUpPz/fc/+6\ndet06dIlHT16VEeOHFFmZubNLAIA0MUFHEHNnDlT77//vk6dOqX+/fvrJz/5iebPn6+CggKtWrVK\nSUlJWr9+vSTJ4XCooKBADodDUVFRWrFihd/NfwAA+ML1oAAYwYTrNnE9qI7B9aAAABGFgAIAGImA\nAgAYiYACEDZcxh23gku+AwgbLuOOW8EICgBgJAIKAGAkAgoAYCQCCgBgJAIKAGAkAgoAYCQCCgBg\nJAIKAGAkAgoAYCQCCgBgJAIKQLswvx5uF+biA9AuzK+H24URFADASAQUAMBIBBQAwEgEFADASAQU\nAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADA\nSAQUAMBIBBQALuMOI3HJdwBcxh1GYgQFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADAS\nAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQVEiPZe9TZQPVfI\nhelslmX5v4xmOBZqs6kDFgtENJvNpkBXvZU+/78VuL49tZ/XU9v+Wil866Mz8JUJjKAAAEYioAAA\nRoq6lScnJSUpLi5O3bt3V3R0tCorK9XQ0KDp06frv//9r5KSkrR+/XrdddddoeovAKCLuKURlM1m\nk9vt1r59+1RZWSlJKi0tVW5urg4fPqycnByVlpaGpKMAgK7lljfx3bhja9OmTSosLJQkFRYWqry8\n/FYXAQDogm55BDVx4kSNHDlSK1eulCTV19fLbrdLkux2u+rr62+9lwCALueW9kHt3LlTX/rSl/Tx\nxx8rNzdXqamp1z3eer6FN8XFxZ6fs7OzlZ2dfStdAQBECLfbLbfbHbAuZOdBlZSUKCYmRitXrpTb\n7Va/fv1UV1en8ePH69ChQ9cvlPOgAEktJ9M2Np72WxMbG6+zZxuMOe+GWs6DCrWQnwd1/vx5NTY2\nSpKamppUUVEhp9OpvLw8lZWVSZLKysqUn59/s4sAOr2WcLL83gIFGNBZ3fQmvvr6ej344IOSpCtX\nrmj27NmaNGmSRo4cqYKCAq1atcpzmDkAAO3FVEdAB4rETUrUmrU+OgOmOgIARBQCCgBgJAIKAGAk\nAgoAYCQCCgBgJAIKCLH2XvkWgHe3NNURgLY+P/nWX433KcAAfI4RFADASAQUAMBIBBQAwEgEFADA\nSAQUAMBIBBQAwEgEFADASAQUuqz2nFDLybfA7ceJuuiy2nNCLSffArcfIygAgJEIKACAkQgoAICR\nCCgAgJEIKBiPo+2AromAQodoT5B8fgSd71tLTftqAZiNw8zRIThsG0AgjKAAAEYioAAARiKgAABG\nIqAAAEYioAAARiKgAABGIqAAAEYioAAARiKgAABGIqAAAEYioBAygebXY5JWAO3BXHwImUDz6zG3\nHoD2YAQFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFnwJNXcT0\nRQDCiamO4FOgqYtaapi+CEB4MIICABiJgAIAGImA6mLYrwQgUrAPqothvxKASMEICgBgJAIKAGAk\nAgoAYCQCCgBgJAIKAGCksATUli1blJqaquTkZL388svhWASuwaHjADqjkAfU1atX9d3vfldbtmxR\nVVWV1q5dq3/+85+hXoyx3G63z8faEyTtqf380PFrb/933e8tNT573Z5XSG3Y26a2/bXhbDvSajuP\n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\nSUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9b112c>"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(c6bf)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEkCAYAAAB6wKVjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGI5JREFUeJzt3XtQVPf9xvFnFYxGoMF0XFuw4kQEV1ZYNThqqCiimaYy\nxFS8JjSYpLHtdNrmUpuLgTZVMtVONY25ODbBOtFap0Vrpg6NdjNqa1Gr1gy12gYaQcQYNEE03ji/\nP/y58bI3YBe+C+/XzE5g97PnfPbskSffc7VZlmUJAADD9OjsBgAA8IaAAgAYiYACABiJgAIAGImA\nAgAYiYACABjJb0AdO3ZMEydO1PDhw5WWlqYVK1ZIkhobG5Wbm6uhQ4dqypQpOnPmjOc9S5YsUXJy\nslJTU1VRURHe7gEAXZbN33lQJ06c0IkTJ5SRkaGzZ89q1KhRKi8v15tvvqkvfvGLevrpp/XSSy/p\n9OnTKi0tVVVVlebMmaM9e/aorq5OkydP1pEjR9SjBwM1AEDr+E2OAQMGKCMjQ5IUExOjYcOGqa6u\nTps3b1ZhYaEkqbCwUOXl5ZKkTZs2afbs2YqOjlZSUpKGDBmiysrKMH8EAEBXFPTQpqamRvv379eY\nMWPU0NAgu90uSbLb7WpoaJAkHT9+XImJiZ73JCYmqq6uLsQtAwC6g6AC6uzZs3rggQe0fPlyxcbG\n3vCazWaTzWbz+V5/rwEA4EtUoIJLly7pgQce0IMPPqj8/HxJV0dNJ06c0IABA1RfX6/+/ftLkhIS\nEnTs2DHPe2tra5WQkHDLNDMyMnTw4MFQfQYAQARLT0/XgQMHbnne7wjKsizNnz9fDodD3//+9z3P\n5+XlqaysTJJUVlbmCa68vDytX79eFy9eVHV1tY4eParMzMxbpnvw4EFZltUlHy+88EJYasM5bWr5\nPiK91pQ+TKiNxIevAYvfEdSuXbu0du1ajRgxQi6XS9LVw8gXLlyogoICrV69WklJSdqwYYMkyeFw\nqKCgQA6HQ1FRUVq5ciWb+AAAbeI3oO655x61tLR4fe3dd9/1+vwzzzyjZ555pv2dAQC6tZ7FxcXF\nHT3TkpISdcJsO0xSUlJYasM5bWpbX2tKH9Sa1YcJtZHGVyb4PVE3XGw2mzphtgAAA/nKBC7xAAAw\nEgEFADASAQUAMBIB1c3ExfXzXP3D1yMurl9ntwkAHCTR3Vw9Ly3Qsuf7AdBxOEgCABBRCCgAgJEI\nKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgA\ngJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICR\nCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgo\nAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACA\nkQgoAICRAgZUUVGR7Ha7nE6n57ni4mIlJibK5XLJ5XLpT3/6k+e1JUuWKDk5WampqaqoqAhP1wCA\nLs9mWZblr2DHjh2KiYnRQw89pEOHDkmSSkpKFBsbqx/+8Ic31FZVVWnOnDnas2eP6urqNHnyZB05\nckQ9etyYgzabTQFmizCx2WySAi17vh8AHcdXJgQcQWVlZSk+Pv6W571NbNOmTZo9e7aio6OVlJSk\nIUOGqLKyso0tAwC6szbvg3r55ZeVnp6u+fPn68yZM5Kk48ePKzEx0VOTmJiourq69ncJAOh2otry\npgULFmjRokWSpOeff15PPPGEVq9e7bX26ialWxUXF3t+zs7OVnZ2dltaAQBEGLfbLbfbHbCuTQHV\nv39/z8+PPPKIpk2bJklKSEjQsWPHPK/V1tYqISHB6zSuDygAQPdx86CkpKTEa12bNvHV19d7fv7D\nH/7gOcIvLy9P69ev18WLF1VdXa2jR48qMzOzLbMA0M3ExfWTzWbz+4iL69fZbaIDBRxBzZ49W++9\n955OnTqlgQMHqqSkRG63WwcOHJDNZtPgwYP1+uuvS5IcDocKCgrkcDgUFRWllStX+tzEBwDXa2o6\nrUBHmDY18fekOwl4mHlYZsph5p2Gw8xhKtbN7qvNh5kDANAZCCgAgJEIKACAkQgoAICRCCgAgJEI\nKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgA\ngJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICR\nCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQiodoqL6yebzeb3ERfXr7PbBICIY7Msy+rwmdps6oTZ\nhoXNZpMU6LOY83kjrV90H6yb3ZevTGAEBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAw\nEgEFADASAQV0Iq5EAvjGlSTaKdLOfo+0frs6vo/PsSy6L64kAQCIKAQUECHYHIjuhoCC8fjDfFVT\n02ld3QTm+3G1Buga2AfVTpG23TzS+pUis+dgteazdeXlIHXt7xn+sQ8KQEgwokVHiersBgBEls83\nNfqrsXVMM+jSGEEBAIxEQAEAjERAAQCMREABAIxEQAEAjBQwoIqKimS32+V0Oj3PNTY2Kjc3V0OH\nDtWUKVN05swZz2tLlixRcnKyUlNTVVFREZ6uAQBdXsCAevjhh7V169YbnistLVVubq6OHDminJwc\nlZaWSpKqqqr029/+VlVVVdq6dau+/e1vq6WlJTydAwC6tIABlZWVpfj4+Bue27x5swoLCyVJhYWF\nKi8vlyRt2rRJs2fPVnR0tJKSkjRkyBBVVlaGoW0AQFfXpn1QDQ0NstvtkiS73a6GhgZJ0vHjx5WY\nmOipS0xMVF1dXQjaBAB0N+2+ksS1S5v4e92b4uJiz8/Z2dnKzs5ubysAgAjgdrvldrsD1rUpoOx2\nu06cOKEBAwaovr5e/fv3lyQlJCTo2LFjnrra2lolJCR4ncb1AQUA6D5uHpSUlJR4rWvTJr68vDyV\nlZVJksrKypSfn+95fv369bp48aKqq6t19OhRZWZmtmUWAIBuLuAIavbs2Xrvvfd06tQpDRw4UD/5\nyU+0cOFCFRQUaPXq1UpKStKGDRskSQ6HQwUFBXI4HIqKitLKlSv9bv4DAMAX7gfVTpF2D5tI61eK\nzJ6DFYn3gwpXH6Z8PnQ87gcFAIgoBBQAwEgEFADASAQUgLDh9vBoD275DiBsuD082oMRFADASAQU\nAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUOgXXaAMQCNfiQ6fg\nGm0AAmEEBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEF\nADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUEgVvUAx2PW74DQeAW9UDHYwQFADAS\nAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEF\nADASAQUAMBIBBQAwEgEFADASAdUFcLdXdDes892DzbIs/7cJDcdMbTZ1wmzDwmazKdCdVqXwft7W\n9GBCv1Lk9RyuHiJtOUjh6zkSlwVCw1cmMIICABiJgAIAGCmqPW9OSkpSXFycevbsqejoaFVWVqqx\nsVEzZ87U//73PyUlJWnDhg264447QtUvAKCbaNcIymazye12a//+/aqsrJQklZaWKjc3V0eOHFFO\nTo5KS0tD0igAoHtp9ya+m3dsbd68WYWFhZKkwsJClZeXt3cWAIBuqN0jqMmTJ2v06NFatWqVJKmh\noUF2u12SZLfb1dDQ0P4uAQDdTrv2Qe3atUtf+tKX9NFHHyk3N1epqak3vH7tfARviouLPT9nZ2cr\nOzu7Pa0AACKE2+2W2+0OWBey86BKSkoUExOjVatWye12a8CAAaqvr9fEiRN1+PDhG2fKeVCd1kNr\nauPi+qmp6bTfytjYeH36aWMruv3/OUTYOS+cB3XdHAw4t8mUZYHQCPl5UOfOnVNTU5Mkqbm5WRUV\nFXI6ncrLy1NZWZkkqaysTPn5+W2dBTrZ1XCy/D4CBRgAtFWbN/E1NDTo/vvvlyRdvnxZc+fO1ZQp\nUzR69GgVFBRo9erVnsPMAQBoLS511E4mbGqIxM0opvQRLDbxXTcHA9Y3U5YFQoNLHQEAIgoBBQAw\nEgEFADASAQUAMBIBBQAwEgEFdFGB7jrLHWdhunZd6giAuT4/0drX694vQwaYghEUAMBIBBQAwEgE\nFADASAQUAMBIBBQAwEgEFADASAQUAMBIBBRChhNDEekCrcOsxx2LE3URMpwYikgXaB2+WsN63FEY\nQQEAjERAAQCMREABAIxEQAEAjERAGYqjiSIX3x0QGgSUoT4/msj342oNTMN3B284DaP1OMwcADoA\np2G0HiMoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCKgO\nxEVEASB4XIuvA3E7aQAIHiMoAICRCCgAgJEIKACAkQgoAICRCCgAgJEIKACAkQgoAICRCCgAgJEI\nKACAkQgoAF0alxiLXFzqCECXxiXGIhcjKACAkQgoAICRCCh0W+ybAMzGPih0W+ybAMzGCAoAYCQC\nCgBgJAIKAGAkAgoAYCQCCgBgpLAE1NatW5Wamqrk5GS99NJL4ZgFAHQqTlMIv5AH1JUrV/Td735X\nW7duVVVVldatW6d//etfoZ6Nwdxhqg3ntLtObfv+aLSmh9bWm13bccstXLXhnLb32s9PU7j+8Zcb\nfr9a0/4e3O7ga7uSkAdUZWWlhgwZoqSkJEVHR2vWrFnatGlTqGdjMHeYasM57a5Te+sfjRd08x8R\n3380WtNDa+vNru245Rau2nBOu/NrCagQqaur08CBAz2/JyYmqq6uLtSzAQB0cSEPKJuNM+8BoD1u\n3uRaUlLSPfdvWSH2t7/9zZo6darn98WLF1ulpaU31KSnp9+84ZYHDx48eHTTR3p6utc8sVmWZSmE\nLl++rJSUFG3btk1f/vKXlZmZqXXr1mnYsGGhnA0AoIsL+cVio6Ki9Ktf/UpTp07VlStXNH/+fMIJ\nANBqIR9BAQAQClxJohPU1NTI6XSGfT7FxcVatmxZyKa3YsUKORwOPfjggyGbZluWxfjx40Na35Ye\nYmJiWlWP1vnkk0/06quvdnYb6GQEVBcW6iMqX331Vb377rv6zW9+E9LpttauXbvCWh8Mjla9lWVZ\nCtUGmdOnT2vlypUhmRYiFwEVQvfff79Gjx6ttLQ0rVq1ym/t5cuXNW/ePDkcDs2YMUPnz5/3Wbtm\nzRqlp6crIyNDDz30kN/p/uxnP1NKSoqysrL073//22/t2rVrNWbMGLlcLj3++ONqaWnxWfv444/r\ngw8+0L333qtf/vKXfqcrST/96U+VmpqqrKwszZkzx+9I7sqVK3rssceUlpamqVOn6rPPPvM77daO\nXlpT/8EHH2jkyJHat29fq+Zxs5qaGqWmpurhhx9WSkqK5s6dq4qKCo0fP15Dhw7Vnj17bqkfNmxY\n0MvhF7/4hZxOp5xOp5YvXx5UL8Gub9evQ4G+u5qaGqWkpKiwsFBOp1O1tbVe65qbm3XfffcpIyND\nTqdTGzZs8NvzwoUL9d///lcul0s/+tGP/M7/+tHv0qVLVVJS4rX2xz/+8Q2h52sLw89//nO9/PLL\nkqQf/OAHysnJkSRt375d8+bNu6V+z549Sk9P14ULF9Tc3Ky0tDRVVVV57eGFF1644ft69tlntWLF\nCp+f7/XXX5fL5ZLL5dLgwYM1adIkn7VdUqgPM+/OGhsbLcuyrHPnzllpaWnWxx9/7LWuurrastls\n1l//+lfLsiyrqKjIWrp0qdfa999/3xo6dKhnWtfm4c3evXstp9NpnT9/3vr000+tIUOGWMuWLfNa\nW1VVZU2bNs26fPmyZVmWtWDBAmvNmjV+P19SUpLPz3S9yspKKyMjw7pw4YLV1NRkJScn++yjurra\nioqKsg4ePGhZlmUVFBRYa9eu9Tv9mJiYgD20pr66utpKS0uzDh8+bLlcLuuf//xnSKYZFRVlvf/+\n+1ZLS4s1atQoq6ioyLIsy9q0aZOVn5/vtT6Y5XDtez537px19uxZa/jw4db+/fv99hLs+taadeja\ntHv06GH9/e9/970wLMvauHGj9eijj3p+/+STT/zW19TUWGlpaX5rrs3/+rqlS5daxcXFXmv3799v\nTZgwwfO7w+Gwamtrb6nbvXu3NWPGDMuyLOuee+6xxowZY126dMkqLi623njjDa/Tfu6556wnn3zS\n+s53vnPLaTU3f66RI0dalmVZV65cse666y6//6avuXTpkpWVlWVt2bIlYG1XwggqhJYvX66MjAyN\nHTtWtbW1Onr0qM/agQMHauzYsZKkefPmaefOnV7rtm/froKCAvXrd/WkvPj4eJ/T3LFjh6ZPn67e\nvXsrNjZWeXl5Pje5bNu2Tfv27dPo0aPlcrm0fft2VVdXB/tR/dq1a5fy8/PVq1cvxcTEaNq0aX43\n/QwePFgjRoyQJI0aNUo1NTUh6aM1Tp48qfz8fL399tsh2z84ePBgDR8+XDabTcOHD9fkyZMlSWlp\naV4/Y7DLYefOnZo+fbr69Omjvn37avr06dqxY4ffXoJd31qzDl0zaNAgZWZm+q0ZMWKE/vznP2vh\nwoXauXOn4uLi/NYHmmdbZGRk6OTJk6qvr9fBgwcVHx+vhISEW+qujaCbmprUu3dvjR07Vnv37tXO\nnTuVlZXlddqLFi1SRUWF9u7dq6efftpnD4MGDdKdd96pAwcOqKKiQiNHjvT7b/qa733ve8rJydF9\n990X/AfuAkJ+mHl35Xa7tW3bNu3evVu9e/fWxIkTdeHCBZ/11+/DsCzL5z4Nm80W9D/Wm2sDva+w\nsFCLFy8Oatqt0do+brvtNs/PPXv29Lv5KVzuuOMODRo0SDt27FBqampIpnn95+rRo4d69erl+fny\n5ct+6/0tB2/LN9A+sbaub8Gse3379g1Yk5ycrP379+udd97Rc889p5ycHD3//PMB3xdIVFTUDZum\nA607M2bM0MaNG3XixAnNmjXLa010dLQGDx6st956S+PGjdOIESO0fft2/ec///G5bpw6dUrNzc26\ncuWKzp8/r9tvv91nD4888ojefPNNNTQ0qKioKOBnfOutt3Ts2LFuuU+OEVSIfPrpp4qPj1fv3r11\n+PBh7d6922/9hx9+6Kl5++23ff6f2aRJk/S73/1OjY2NkuT5rzdf/epXVV5ers8++0xNTU3asmWL\nzz9EOTk52rhxoz766CPPdD/88MOAnzMY48eP1x//+EdduHBBZ8+e1TvvvGP8QQW9evXS73//e61Z\ns0br1q3r7Hb8ysrKUnl5uc6fP6/m5maVl5f7XH+uCXZ9a8061Br19fXq3bu35s6dqyeffFL/+Mc/\n/NbHxsaqqakp4HTtdrtOnjypxsZGXbhwQVu2bPFbP3PmTK1bt04bN27UjBkzfNZlZWVp6dKlmjBh\ngrKysvTaa69p5MiRPuu/9a1v6cUXX9ScOXP87jOTru6r3rp1q/bu3aupU6f6rd23b5+WLVvW6Qcm\ndRZGUCFy77336rXXXpPD4VBKSopnc4o3NptNKSkpeuWVV1RUVKThw4drwYIFXmsdDoeeffZZTZgw\nQT179tTIkSP161//2muty+XSzJkzlZ6erv79+/vd7DJs2DC9+OKLmjJlilpaWhQdHa2VK1fqK1/5\nit++gzF69Gjl5eVpxIgRstvtcjqd+sIXvhD0dFszGghGMPU2m0233367tmzZotzcXMXGxurrX/96\nu6fp63dv7w92ObhcLn3zm9/0fL+PPvqo0tPT/fYS7Pp28zp09913BxxFBbMsDh06pKeeesozkgx0\nCPmdd96p8ePHy+l06mtf+5rP+8pFR0dr0aJFyszMVEJCghwOh99+HA6Hzp49q8TERNntdp91WVlZ\nWrx4scaOHas+ffqoT58+PkN9zZo1uu222zRr1iy1tLRo3Lhxcrvdys7O9tnzpEmTFB8fH3DZvfLK\nKzp9+rQmTpwoSbr77rv1xhtv+H1PV8KJugiL5uZm9e3bV+fOndOECRO0atUqZWRkdHgfH3/8caft\n1zJFTU2Npk2bpkOHDrX6vSUlJYqJidETTzwRhs66p5aWFo0aNUobN27UXXfd1dntGI1NfAiLxx57\nTC6XS6NGjdI3vvGNTgmn48ePa9y4cXrqqac6fN6mac9mOtM3z0aSqqoqJScna/LkyYRTEBhBAQCM\nxAgKAGAkAgoAYCQCCgBgJAIKAGAkAgoAYCQCCgBgpP8D+njZv7/d4VMAAAAASUVORK5CYII=\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaea4c52c>"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nMEAjR45s8cIJ6Uzo9OrVq+mii1DX5aKLrsVFFwDCiVMmOM6wIiIiVFhYqNzcXAUCAc2bN0/Jyckq\nKiqSJOXn5+vQoUPKzMxUbW2tevTooRUrVqiiokLR0dEtrgsAQHs4zrAuSAPMsLoUMywA4aTdl7UD\nABAuCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACAFQgsAIAVCCwAgBUILACA\nFQgsAIAVCCwAgBUILACAFQgsAGEnJqaPXC6X4y0mpk9Xt4kLjA9wvMjxAY4IR7wuL158gCMAwHoE\nFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACgQWAMAKBBYAwAoEFgDACkEDq7S0VElJ\nSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P1nnnlGQ4YMUVpamu68807V19efv84BABcVx8AKBAJa\nsGCBSktLVVFRobVr12rv3r3NakpKSnTgwAHt379fq1at0vz58yVJVVVVevXVV7V792598MEHCgQC\n+vOf/9x5IwEAdGuOgVVWVqb4+HjFxcUpMjJSeXl5Ki4ublazYcMGzZkzR5KUlZWlo0eP6vDhw4qJ\niVFkZKROnDihxsZGnThxQm63u/NGAgDo1hwDq6amRrGxsU3LHo9HNTU1IdX06dNHixYt0rXXXqsB\nAwboqquu0k033XSe2wcAXCwcA+vMZ9IE19Jnl3z88cd6/vnnVVVVpYMHD+rYsWP605/+1L4uAZyD\nDznExSbC6U632y2/39+07Pf75fF4HGuqq6vldrvl8/k0evRo9e3bV5I0bdo0vf3225o5c+Y5j1NQ\nUND0dU5OjnJyctozFuCiUlf3tYJ9yGFdXWi/dAJdxefzyefzhVZsHDQ0NJhBgwaZyspKU19fb7xe\nr6moqGhWs2nTJjNx4kRjjDE7duwwWVlZxhhjysvLzZAhQ8yJEyfM6dOnzezZs01hYeE5jxGkBXQy\nSUYyQW48R+GoOz933XlscOb0vDrOsCIiIlRYWKjc3FwFAgHNmzdPycnJKioqkiTl5+dr0qRJKikp\nUXx8vKKiorR69WpJUnp6umbPnq0RI0aoR48eGjZsmO677752JTAAAK7vEq3rGnC5WjwHZqOYmD7f\nHaZpXa9evVVbe+QCdRTcmfOUwfZ/93mOupPu/Nx157HBmVMmEFjnkY0/ZDb2jDO683PXnccGZ06Z\nwFszAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxA\nYAEArEBgAQCsQGABAKxAYAEArEBgAQCsQGABAKxAYAEArEBgwSoxMX3kcrkcbzExfbq6TQCdgMCC\nVerqvpZkHG9nauxEIAOtI7DQ5fhP+nvdPZCBjojo6gaA7/+TdqpxXZhmAIQtZlgAACsQWAAuCA79\noqM4JAjgguDQLzqKGRYAwAoEFgDACkEDq7S0VElJSUpISNDSpUtbrFm4cKESEhLk9XpVXl7e9P2j\nR49q+vTpSk5OVkpKinbu3Hn+OgcAXFQcAysQCGjBggUqLS1VRUWF1q5dq7179zarKSkp0YEDB7R/\n/36tWrVK8+fPb7rvV7/6lSZNmqS9e/fq/fffV3JycueMAgDQ7TkGVllZmeLj4xUXF6fIyEjl5eWp\nuLi4Wc2GDRs0Z84cSVJWVpaOHj2qw4cP65tvvtG2bds0d+5cSVJERISuvPLKThoGAKC7cwysmpoa\nxcbGNi17PB7V1NQEramurlZlZaX69eunu+++W8OGDdO9996rEydOnOf2AQAXC8fAcrlCu8TUmOaX\nqrpcLjU2Nmr37t36xS9+od27dysqKkrPPvts+zsFAFzUHP8Oy+12y+/3Ny37/X55PB7Hmurqarnd\nbhlj5PF4lJmZKUmaPn16q4FVUFDQ9HVOTo5ycnLaOg4AXSAmpk/Q9zbs1au3amuPXKCOYBufzyef\nzxdasXHQ0NBgBg0aZCorK019fb3xer2moqKiWc2mTZvMxIkTjTHG7Nixw2RlZTXdl52dbT766CNj\njDGLFy82jzzyyDmPEaQFq0gykglyC6/xhkPPbekhHPrtTLbti87qNxzGhq7h9Lw6zrAiIiJUWFio\n3NxcBQIBzZs3T8nJySoqKpIk5efna9KkSSopKVF8fLyioqK0evXqpvVfeOEFzZw5U99++60GDx7c\n7D4AANrC9V2idV0DLtc558BsdeacX7CxhNd4w6HntvQQDv12Jtv2RWf1Gw5jQ9dwygTe6QIAYAUC\nCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsA\nYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAFAgsAYAUCCwBgBQILAGAF\n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\nrY7prLKyMpOenm7q6+tNXV2dSUhIaLWHyspKExERYd577z1jjDG33367ef311x23Hx0d7Xh/e9ap\nrKw0qampZt++fSYjI8O8//77Hdrm2XF9+OGH5vTp02b48OFm7ty5xhhjiouLzdSpU1tdJ5R9cfZ5\nPnHihDl27JgZMmSIKS8vb7WXUF9rbXn9nN12jx49zH//+99Wa85at26duffee5uWv/nmm1Zrq6qq\nTGpqatBtnu3hh7XLli0zBQUF59SVl5ebsWPHNi2npKSY6urqFre5c+dOM2PGDGOMMT/5yU9MVlaW\naWhoMAUFBWbVqlUtrvPEE0+Yhx56yPzyl79s8c95zqqqqjLDhg0zxhgTCATM4MGDHX+mjTGmoaHB\nZGdnm40bNzrWdUfMsDrRihUrlJ6erlGjRqm6ulr79+9vtTY2NlajRo2SJM2aNUvbt29vsW7r1q26\n/fbb1afPmT8U7N27d6vb3LZtm6ZNm6aePXuqV69emjJlSquHabZs2aJ3331XI0aMUEZGhrZu3arK\nyspQh9qqt956S1OnTtWll16q6OhoTZ482fFQ0cCBAzV06FBJ0vDhw1VVVdXhHtrjiy++0NSpU/XG\nG2+cl/OLAwcO1JAhQ+RyuTRkyBDddNNNkqTU1NRWxxjqvti+fbumTZumyy+/XFFRUZo2bZq2bdvW\nai+hvtba8vo567rrrtPIkSMdayRp6NCh+ve//61HH31U27dvV0xMTKu1wR6zPdLT0/XFF1/o888/\n13vvvafevXvL7Xa3WHt2hl1XV6eePXtq1KhR2rVrl7Zv367s7OwW13nyySf15ptvateuXXrkkUda\n7eO6665T3759tWfPHr355psaNmyY48+0dObNxsePH6+bb7459AF3E46XtaP9fD6ftmzZop07d6pn\nz54aN26c6uvrW63/4TkQY0yr50RcLlfIP8A/rg223pw5c/T000+HtO1QtbWHyy67rOnrSy65xPFw\nVWe66qqrdN1112nbtm1KSkrq8PZ+OK4ePXro0ksvbfq6sbEx6DpO+6Klfex0Tq29r7VQXndRUVFB\nayQpISFB5eXl2rRpk5544gmNHz9ev/nNb0Ja10lERESzQ9lOr58ZM2Zo3bp1OnTokPLy8lqti4yM\n1MCBA/Xaa69p9OjRGjp0qLZu3aoDBw60+tr43//+p+PHjysQCOjkyZO64oorWt3+Pffco9WrV+vw\n4cOaO3eu4/hee+01+f3+i/acHjOsTlJbW6vevXurZ8+e2rdvn3bu3OlY/9lnnzXVvPHGG63+5nbj\njTfqb3/7m44cOSJJTf+25IYbbtD69et16tQp1dXVaePGja3+5zR+/HitW7dOX375ZdN2P/vss6Dj\nDGbMmDH65z//qfr6eh07dkybNm2y4gKFSy+9VP/4xz+0Zs2aFv/gPZxkZ2dr/fr1OnnypI4fP671\n69e3+vqRQn+tteX101aff/65evbsqZkzZ+qhhx7S7t27W63t1auX6urqQtpu//799cUXX+jIkSOq\nr6/Xxo0bW6294447tHbtWq1bt04zZsxw3G52draWLVumsWPHKjs7W6+88oqGDRvWan1+fr6eeuop\n3XnnnUHPu916660qLS3Vrl27lJub22rdu+++q+XLl3fpRU5djRlWJ5kwYYJeeeUVpaSkKDExsekQ\nTEtcLpcSExP14osvau7cuRoyZIjmz5/fYm1KSooef/xxjR07VpdccomGDRumP/zhDy3WZmRk6I47\n7pDX69XVV1/teKgmOTlZTz31lH72s5/p9OnTioyM1EsvvaRrr73Wse9gRowYoSlTpmjo0KHq37+/\n0tLSdOWVV4a8zWCP0Z7/QENZx+Vy6YorrtDGjRv105/+VL169dItt9zS7m06jctphhPKY2RkZOjn\nP/950/N77733yuv1ttpLqK+1H79+MjMzg86yQn0+PvjgAz388MNNs02ny9b79u2rMWPGKC0tTZMm\nTXL8bL3IyEg9+eSTGjlypNxut1JSUlrtKSUlRceOHZPH41H//v0d+83OztbTTz+tUaNG6fLLL9fl\nl1/eatCvWbNGl112mfLy8nT69GmNHj1aPp9POTk5rfZ84403qnfv3o7778UXX9TXX3+tcePGSZIy\nMzO1atUqx767G/5wGJ3u+PHjioqK0okTJzR27Fi9+uqrSk9P75Jevvrqqy49N9bVqqqqNHnyZH3w\nwQdtXnfJkiWKjo7WokWLOqGzi9fp06c1fPhwrVu3ToMHD+7qdsIahwTR6e677z5lZGRo+PDhmj59\nepeF1cGDBzV69Gg9/PDDXfL44aIjh/VsOJxrk4qKCiUkJOimm24irELADAsAYAVmWAAAKxBYAAAr\nEFgAACsQWAAAKxBYAAArEFgAACv8P5ZWvQDqsWNNAAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xae9fc90c>"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6a"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "'CPYYL GVVIR PDDVU BCSUP QOWPW SYBYP ODBCS PBBPR CSIOZ PTSTV HYVTW PYOZC OGCRV TTPUI BVGVS YOUGZ ZSRYS BPYLY SHSYY OUGBV BCSWP OUBOU GPUIR DSPYD LTSUB OVUOU GZPYP ZSSTZ DONSB CSLNU SJPAV EBBCS ZRPTV EYHYO SUIDL ZZVHH ORSYJ PZWDP UUOUG BVWED DBCSL WORNS IEWCS YBYPO DBCSU OGCBP HBSYZ CSJSU BTOZZ OUGAE BLVER PUYSP IPAVE BBCPB OUBCS OYYSW VYBZB ODDUV MVLVU GSBBO UGPRR SZZBV BCSVY OGOUP DTOZZ TVUPO UBCSG PDDSY LPUIO PTASG OUUOU GBVBC OUNJS TOGCB USSIB VYVDD VEBPA DPRNA PGMVA LVEJP UBBVI VOBVY ZCPDD OALBC SJPLO JPZZE YWYOZ SIALB COZYS WVYBB CSVBC SYWPW SYZJS CPFSH YVTBC SUPQO ZPBBC OZDSF SDPYS SURYL WBSIE ZOUGA OHOIV YWDPL HPOYZ BLDSR OWCSY ZBCOZ VUSOZ UBTPL ASBCS ROWCS YRDSY NJPZV HHIEB LBCPB IPLJS GVBDE RNL\\n'"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(sanitise(c6b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 11,
-       "text": [
-        "1573"
-       ]
-      }
-     ],
-     "prompt_number": 11
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6as = sanitise(c6a)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "frequencies(ngrams(c6as, 2))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 13,
-       "text": [
-        "Counter({'bc': 21, 'cs': 20, 'ou': 15, 'sy': 12, 'oz': 10, 'ug': 10, 'ub': 8, 'bv': 8, 'su': 7, 'bb': 7, 'zz': 6, 'yo': 6, 'dd': 6, 'ys': 6, 'py': 6, 'pu': 6, 'jp': 6, 've': 6, 'vy': 6, 'cp': 5, 'co': 5, 'si': 5, 'yz': 5, 'ds': 5, 'po': 5, 'bo': 5, 'eb': 5, 'vb': 5, 'vu': 5, 'sb': 4, 'zb': 4, 'yb': 4, 'dp': 4, 'pl': 4, 'pd': 4, 'pb': 4, 'pz': 4, 'bp': 4, 'js': 4, 'wp': 4, 'og': 4, 'up': 4, 'uo': 4, 'ui': 4, 'yl': 4, 'tv': 3, 'to': 3, 'lv': 3, 'lb': 3, 'yv': 3, 'sj': 3, 'sg': 3, 'sp': 3, 'sr': 3, 'ss': 3, 'sw': 3, 'zs': 3, 'zv': 3, 'zc': 3, 'al': 3, 'yw': 3, 'rn': 3, 'rp': 3, 'db': 3, 'us': 3, 'yy': 3, 'yp': 3, 'st': 3, 'ie': 3, 'gv': 3, 'gp': 3, 'zp': 3, 'gb': 3, 'gc': 3, 'pa': 3, 'pt': 3, 'pr': 3, 'bl': 3, 'wc': 3, 'ow': 3, 'od': 3, 'vh': 3, 'vt': 3, 'hy': 3, 'tp': 2, 'ts': 2, 'cb': 2, 'lw': 2, 'fs': 2, 'sh': 2, 'sl': 2, 'so': 2, 'sz': 2, 'sv': 2, 'zo': 2, 'ro': 2, 'wv': 2, 'rd': 2, 'ry': 2, 'rs': 2, 'dl': 2, 'do': 2, 'dv': 2, 'ir': 2, 'ip': 2, 'qo': 2, 'io': 2, 'ib': 2, 'gz': 2, 'ga': 2, 'av': 2, 'go': 2, 'pw': 2, 'pq': 2, 'by': 2, 'bs': 2, 'bt': 2, 'wd': 2, 'oy': 2, 'or': 2, 'ws': 2, 'iv': 2, 'zd': 2, 'ey': 2, 'er': 2, 'ns': 2, 'vi': 2, 'nj': 2, 'ho': 2, 'uu': 2, 'hh': 2, 'mv': 2, 'as': 2, 'tz': 1, 'tt': 1, 'tw': 1, 'ta': 1, 'tb': 1, 'lp': 1, 'lt': 1, 'ly': 1, 'lz': 1, 'la': 1, 'ld': 1, 'lg': 1, 'lh': 1, 'lj': 1, 'cr': 1, 'lo': 1, 'ln': 1, 'wb': 1, 'sc': 1, 'sd': 1, 'sf': 1, 'na': 1, 'zr': 1, 'ap': 1, 'wo': 1, 'zw': 1, 'zu': 1, 'zt': 1, 'zy': 1, 'ad': 1, 'ae': 1, 'zj': 1, 'ao': 1, 'rc': 1, 'hb': 1, 'rr': 1, 'rv': 1, 'yj': 1, 'yh': 1, 'yn': 1, 'hi': 1, 'de': 1, 'yd': 1, 'yr': 1, 'du': 1, 'dt': 1, 'nl': 1, 'gm': 1, 'wy': 1, 'ia': 1, 'id': 1, 'gs': 1, 'pi': 1, 'ph': 1, 'pg': 1, 'pf': 1, 'bz': 1, 'bu': 1, 'bi': 1, 'bd': 1, 'we': 1, 'ov': 1, 'op': 1, 'os': 1, 'on': 1, 'oi': 1, 'oj': 1, 'oa': 1, 'ob': 1, 'ej': 1, 'ze': 1, 'ed': 1, 'ez': 1, 'ew': 1, 'vg': 1, 'vd': 1, 'va': 1, 'vo': 1, 'oh': 1, 'nu': 1, 'vl': 1, 'vw': 1, 'vv': 1, 'vs': 1, 'uy': 1, 'uv': 1, 'ur': 1, 'un': 1, 'hp': 1, 'hs': 1, 'vm': 1})"
-       ]
-      }
-     ],
-     "prompt_number": 13
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(letters(c6a).translate(''.maketrans({'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 14,
-       "text": [
-        "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "trans={'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join(sorted(trans.keys(), key=lambda k: trans[k]))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 16,
-       "text": [
-        "'PARISHGCOMNDTUVWYZBEFJLQ'"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(keyword_decipher(c6as, 'parishighcommand', 2)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 17,
-       "text": [
-        "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'"
-       ]
-      }
-     ],
-     "prompt_number": 17
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs = sanitise(c6b)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c6bs)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 19,
-       "text": [
-        "1573"
-       ]
-      }
-     ],
-     "prompt_number": 19
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "from itertools import permutations"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 20
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "list(permutations(range(4)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 21,
-       "text": [
-        "[(0, 1, 2, 3),\n",
-        " (0, 1, 3, 2),\n",
-        " (0, 2, 1, 3),\n",
-        " (0, 2, 3, 1),\n",
-        " (0, 3, 1, 2),\n",
-        " (0, 3, 2, 1),\n",
-        " (1, 0, 2, 3),\n",
-        " (1, 0, 3, 2),\n",
-        " (1, 2, 0, 3),\n",
-        " (1, 2, 3, 0),\n",
-        " (1, 3, 0, 2),\n",
-        " (1, 3, 2, 0),\n",
-        " (2, 0, 1, 3),\n",
-        " (2, 0, 3, 1),\n",
-        " (2, 1, 0, 3),\n",
-        " (2, 1, 3, 0),\n",
-        " (2, 3, 0, 1),\n",
-        " (2, 3, 1, 0),\n",
-        " (3, 0, 1, 2),\n",
-        " (3, 0, 2, 1),\n",
-        " (3, 1, 0, 2),\n",
-        " (3, 1, 2, 0),\n",
-        " (3, 2, 0, 1),\n",
-        " (3, 2, 1, 0)]"
-       ]
-      }
-     ],
-     "prompt_number": 21
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[column_transposition_decipher(c6bs, p, fillvalue=' ') for p in permutations(range(4))]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 22,
-       "text": [
-        "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo   ',\n",
-        " 'hihthnrffetreafoftanslytorrreqhtimesrurlhfestaeeiuwisibhnrtrsiioieinrhrmpydttoierctialbnrphntoohrleiwthstepsostooyunwherdhchpimcnotoahsahtjieaentorfnesuramgxutrtolweabtrtpeptaraeesnehthrsinrtsstnrflodghuamgessekaunitahtytnuyntnnvhgiwlwefipaaserlfiaebpacmpclaehthotlhswuldasevueaoetauetaetefhelbthrsghatilaceehtnrhgaasiteufnnpuerhrleitmtudiynneugiocuedneeaihseulhntoathieianydfniuaoeantieyfoehdaulareoryuhrareatreahaiontgwiwssatibutlaoxmleotretootnoaorotgcbvapinleewfrytaoeadwuwertrtlnrppfailelrmintorwiqereucardnotfanrtoeltepernpmhsndedtdweheofypdeensnnegetaeteaensetrgduleorsbuorwhgdbrapheynttkeretrrrnhfndeolstwsainipyotmhoucotyieeeopnhrknnatirtleeuirenmitpahoaeohnhoumutksvendeeeiodpkwietgiioisehnuuafnbueitrhaehrieheuaaysrsuiwagdssiitlrgfhpilwtiiisheusrmormaecisiolvedoeulsariidoetnifesbontaspogfsordtfriplatnertlyoisoytoessfnptheiageoaraeiitmdtaeagryhasrrcflerteleaenhvheivhmnassieorixmlpstjteosfbrmhnidocehcntbtnocmpsueseohtneetifenootnowoteeritloidgosemhofimlorefdftuseofelrwiiyqbdzottnrafntidgotnaleapdhseanmthplsntbuohaaapllenmpdsrhvanialenhacliksacodaetdjgohiedagwyandteenehgeueeoeednroyyfrctmettnwtgedtausootofwmyihgrrheosirnraforeftenopyasisesstnhhayuelhwipcetataupenalueelwhaaoleursenbiieaasetaegccdsoerpsoreneslvsoeddusilttetitfesoenslnignorentieeiwwlwtheisriihltdrsndserfrhntglrsauseaddotyasdautnewictnaemtetrposeyttoocynutosgcumdlapdlaedoetfdbsfeelahxarsnoiditeirpasihcdschibpiesllnlahofrretnatroaimeklgaremtrdwcsnyanwvsnudlorkeutnnouitiunnhvineiolhletfneaatiuftatceltnnbrhbgelonsaomnifokarnosnnvfrterctfhdtepsswuceprctwpowafhadyiosoaogaenldfgingtrebtlllfgo   ',\n",
-        " 'htihhfnrfreteoaffntastlyorrretqhismerlurhsfeteaeiiuwshibnrrtsoiiineirmhrptydteoirictanlbrnphthoorilewsthtsepoostonyuwrhedhhcpcimnootaahshitjenaetfornuesrgamxruttwoletabretpprtaaseentehhirsnsrtsrtnfdlogahumsgesaekutniayhttynunntnvihgwelwfaiparselafieabpccmplhaettholwhsualdsueveeaoteauttaeeefhlhbtrhsgaltiaecehrtnhagaseitunfnprueherlittmuydinunegciounedeieahuselthnohatiaeinfydnaiuoneatyiefhoedlauaorerhyurearaetraihaogntwsiwsiatblutamoxlteoroetootnaoortbgcviapnelewyfrteaoaudwwterrntlrfppaeillirmnrtoweiqrceuanrdoatfnorteeltpnerpsmhnddetedwhfeoyepdennsneegttaeenaesretglduesorbruowdhgbprahneytetkrretrhrnfendotlswisanyipohtmooucteyiepeonkhrntnailrteieurmeniatpheoaohhnouumtvkseendeoeidwpkigetiiiosnehufuanebuihtrarehieehuyaasursigwadissirtlgpfhitlwisiihseurrmomcaeiosildveoleusiariedotfnieosbnstapfogsdortifrptlanterliyostoyosesftnphaeigaeoriaeidtmtaaeghryarsrceflrlteenaehevhimvhnsasireoilxmpjsttseofmbrhdniohcecbnttcnomupseosehetneftieonotwnooeterlitogidomsehiofmrloeffdteusolferiwiydqbztotnfrandtignotaalepsdhemantlhpsbntuaohalaplmenprdshnvaiealnchalsikadcoadetjhgoiaedgawynedtehnegeeueeoedonryryfcetmtwtntdgetsauoootfywmirhgrohesnirroafrtefepnoyiasssesthnhaeyulihwptceautapaenleuelawhaeoluersnibiesaaeetagdccsroeprsoesnelovseuddstiltiettsfeosenlgnineornetiewiwlhwterisilihtsdrnedsrhfrnltgrusasdeadyotaasduetnwticnmaetretpeosyottoncyustogmcudpladeladtoefsdbfleeaahxrosnitdiepirahsiccdshpibileslanlhrofrnetaotraeimkalgrtemrcdwsanynswvnludoerkuntnotuiinunhnvieliohtlefaneautifttactelnrnbhebglsonanomikfoaornsvnnfertrfcthedtpwssupcerwctpaowfdhaysioogaoalendifgnrgtelbtlglfo   ',\n",
-        " 'hhithrnffterefaofatnsyltorrrehqtiemsrrulhefsteaeiwuisbihntrrsiioiienrrhmpdyttioertciablnrhpntoohreliwhtstpesotsoouynwehrdchhpmicntooashahjtieeantrofnseurmagxturtlowebatrptepatraeesnhethsrintrssntrfoldguhamegsskeauintathytunynntnvghiwwlefpiaaesrlifaepbacpmcleahtohtlshwudlasveueoaetuaeteatehfeltbhrgshaitlaecehntrhagastieunfnpeurhlreimttuidynenugoicudeneaeihesulnhtotahiieandyfnuiaoaenteiyfeohdualaeroruyhrraearteaahiotngwwisstaibtulaxomloetrteoontoarootcgbvpainelewrfytoaeawduwretrltnrppfalielmrinotrwqieruecadrnoftantroetleprenphmsneddtwdehoefydpeesnnngeeteateeanstergudlerosbourwghdbarphyentkterterrnrhfdneosltwasinpiyomthocuotiyeeoepnrhknantitrleueirnemiptahaoeonhhomuutskvedneeieodkpwitegioiishenuaufnubeirthaheriheeuaayssruiawgdssiiltrghfpiwltiiishuesromrmeaciisolevdouelsraiiodetinfebsonatspgofsrodtrfipaltnretloyisyotosesfpnthieagoeareaiimtdteaagyrharsrclferetleeanhhveihvmnsasioerimxlptsjtoesfrbmhindoechctnbtoncmspueesohnteeitfeonotonwoetertilodigoesmhfoimolredfftsueoeflriwiybqdztotnarfnitdgtonaelaphdsenamtphlstnbuhoaapallnempsdrhavnilaenahclkisaocdatedjoghideagywantdeeenhgueeeeoedrnoyfyrcmtetntwtegdtuasotoofmwyighrrehosrinrfaorfeteonpysaissesthnhauyelwhipectaatupnealeuelhwaaloeusrenibieaaseategccdseorposreenslsvoedduslittteitefsoneslingnroeniteewiwltwhesirihiltrdsnsderrfhngtlrasusaeddtoyadsauntewcitneamtterpsoeyttooycnuotsgucmdalpdaledeotfbdsfeelaxharnsoiidteripaishcsdchbipiselllnahforrtenartoamiekglarmetrwdcsynanvwsndulokreuntnoiutinunhivneoilheltfenaaitufattcletnbnrhgbelnosamoniofkanrosnnvftrertcfhtdepsswuecprtcwpwoafahdyoisooaganeldgfintgretbllflgo   ',\n",
-        " 'hthihfrnfrteeofafnatstylorrrethqisemrlruhsefteeaiiwushbinrtrsoiiiniermrhptdyteioritcanblrnhpthoorielwshttspeootsonuywrehdhchpcminotoaashhijteneatfronusergmaxrtutwloetbareptprataseenthehisrnstrsrntfdolgauhmsegsakeutinaythtyunnnntvighwewlfapiareslaifeapbccpmlheattohlwshuadlsuveeeoateuatteaeehflhtbrhgsalitaeechrnthaagsetiunnfpreuhelritmtuyidnuengcoiundeeiaehuesltnhohtaiaienfdynauionaetyeifheodluaaoerrhuyreraaertaiahogtnwswisitabltuamxoltoeroteoontaorotbcgvipaneelwyrfteoaauwdwtrernltrfppaelilimrnrotweqircueandroaftnotreetlpnrepshmndedtewdhfoeyedpensnnegetteaeneasrtegludesrobrouwdghbparhnyetektrrterhnrfednotslwiasnypiohmtoocuteiyepoenkrhntaniltreiuermneiaptheaoohnhoumutvskeedneoiedwkpigteiioisnheufauneubihrtarheieheuyaasusrigawdissirltgphfitwlisiihsuerrommceaioisldevoluesiraieodtfineobsnsatpfgosdrotirfptalntrelioystyoosseftpnhaiegaoerieaidmttaeaghyrarrscelfrleteneahehvimhvnssairoeilmxpjtstsoefmrbhdinoheccbtntconmuspeoeshentefiteoontwonoeetrltiogdiomeshifomrolefdftesuolefriiwydbqzttonfarnditgntoaaelpshdemnatlphsbtnuahoalpalmneprsdhnavielancahlskiadocadtejhogiadegaywnetdehengeueeeeodornyrfycemttwnttdegtsuaootofymwirghroehsnrirofartfeeponyisasssethhnaeuyliwhptecauatpaneleeulahwaelouesrniibesaaeeatgdccsreoprosesenlosveuddstlititetsefosnelginneroneitewwilhtwersiilhitsrdnesdrhrfnlgtruassdaedytoaadsuentwtcinmeatrtepesoyottonycusotgmucdpaldealdteofsbdfleeaaxhronsitidepriahisccsdhpbiilselalnhrfornteaortaemikaglrtmercwdsaynnsvwnlduoekrunntotiuinnuhniveloihtelfaenauitftatctlenrbnhegblsnoanmoikofaonrsvnnfetrrftchetdpwssupecrwtcpawofdahysoiogoaalnedigfnrtgeltblgflo   ',\n",
-        " 'hhtihrfnftreefoafantsytlorrrehtqiesmrrluhesfteeaiwiusbhintrrsioiiinerrmhpdtytieorticabnlrhnptohoreilwhsttpseotosounywerhdchhpmcintooasahhjiteenatrfonsuermgaxtrutlwoebtarpetpartaesenhtehsirntsrsnrtfodlguahmesgskaeuitnatyhtuynnnntvgihwwelfpaiaersliafepabcpcmlehatothlswhudalsvueeoeatueatetaeheflthbrghsailtaeechnrthaagsteiunnfperuhlerimttuiydneungociudneeaieheuslnthothaiiaendfynuaioaneteyifehodulaaeorruhyrreaaretaaihotgnwwsistiabtluaxmolotertoeonotarootcbgvpianeelwryftoeaawudwrterlntrpfpaleilmirnortwqeiruceadnrofatntoretelprnephsmneddtwedhofeydepesnnngeetetaeenastreguldersoboruwgdhbaprhynetketrtrernhrfdenostlwaisnpyiomhtocoutieyeopenrkhnatnitlreuiernmeipathaeoonhhomuutsvkedeneioedkwpitgeioiishneuafunuebirhtahreiheeuayassuriagwdsisilrtghpfiwtliisihuserormmecaiiosledvoulesriaioedtifnebosnastpgfosrdotrifpatlnrteloiysytoossefptnhiaegoaereiaimdtteaagyhrarrsclefrelteenahhevihmvnssaioreimlxptjstosefrmbhidnoehcctbntocnmsupeeoshneteifteoontownoeetrtliodgioemshfiomorledfftseuoelfriiwybdqzttonafrnidtgtnoaealphsdenmatplhstbnuhaoaplalnmepsrdhanvileanachlksiaodcatdejohgidaegyawntedeehngueeeeeodronyfrycmettnwttedgtusaotoofmywigrhreohsrnirfoarfteeopnysiasssethhnaueylwihpetcaautpnaeleeulhawaleouserniibeasaeaetgcdcseroporseesnlsovedudsltittietesfonselignnreonietewwilthwesriihlitrsdnsedrrhfngltraussadedtyoadasunetwctinemattrepseoytotoyncuostgumcdapldaeldetofbsdfeleaxahrnosiitderpiaihscscdhbpiislellanhfrortnearotameikgalrmterwcdsyannvswndluokerunntoituinnuhinveolihetlfeanaiutfattcltenbrnhgeblnsoamnoiokfanorsnvnfterrtfchtedpswsuepcrtwcpwaofadhyosioogaanledgifntrgetlblfglo   ',\n",
-        " 'ihthnhfrefrtaeoftfnalstyrorrqethmiseurlrfhseateeuiiwishbrnrtisoieinihrmryptdoteicritlanbprnhotholrietwshetspsootyonuhwrehdhcipcmonothaasthijaeneotfrenusargmuxrtotwlaetbtreptpraeaseenthrhisrnsttsrnlfdohgaugmseesaknutihaytntyutnnnhviglwewifapsareflaibeapmccpalhehttohlwsluadesuvaeeoateuattefeehblhtsrhgtalicaeethrnghaaisetfunnuprerheltitmduyinnueigcoeundeeiashuehltnaohteiaiynfdinaueonaityeofheadluraoeyrhuarertaerhaianogtiwswasitubltoamxeltoerottoonoaorgtbcaviplneefwyrateodauwewtrtrnlprfpiaelrlimtnroiweqercurandtoafrnotleetepnrmpshdndedtewehfopyednensenegatteaeneesrtdgluoesrubrohwdgrbpaehnyttekerrtrrhnnfedlotsswiainyptohmuoocyteieepohnkrnntarilteeiuermntiapoheahohnuoumktvsneedeeoipdwkeigtiiioesnhuufabneutihrearheiehauyarsuswigasdistirlfgphlitwiisiehsumrroamcesioivldeeoluasirdieontfiseobtnsaopfgosdrftirlptaentrylioostyeossnftpehaiegaoarietidmataerghysarrfceltrleaenevhehvimhansseiroxilmspjtetsobfmrnhdicohencbtntcopmusseoethentefineoontwotoeeirltiogdsomeohiflmrofefdutesfolewriiqydbozttrnfatndiogntlaaedpshaemnhtlpnsbtouahaalpelmndprsvhnaaielhncailskcadoeadtgjhoeiadwgaydnetneheegeuoeeendoryyrftcemttwngtdeatsuoootwfymhirghroeisnrarofertfnepoayisesssnthhyaeuhliwcptetauaepanuleewlahoaelruesbniiaesateeacgdcosrespronesevlosdeudistletitftseeosnnlgionertneiiewwwlhtiersiilhdtsrdnesfrhrtnlgsruaesdaodytsaadtueniwtcanmeetrtopestyotconytusocgmuldpaldeaodtedfsbeflehaaxsronditiieprsahidccsihpbeilsnlalohrfernttaoriaemlkagertmdrcwnsaywnsvunldroektunnuotiuinnvhniielolhtenfaetauitftaectlnnrbbhegolsnoanmfikoraonnsvnrfetcrftdhetspwscupecrwtopawhfdaiysoaogoealnfdiggnrtbeltllgf o  ',\n",
-        " 'ihhtnhrfeftraefotfanlsytrorrqehtmiesurrlfhesateeuiwiisbhrntrisioeiinhrrmypdtotiecrtilabnprhnotohlreitwhsetpssotoyounhwerhdchipmcontohasathjiaeenotrfensuarmguxtrotlwaebttrpetpareaesenhtrhsirntstsnrlfodhguagmeseskanuithatyntuytnnnhvgilwweifpasaerfliabepamcpcalehhtothlswludaesvuaeoeatueatetfeheblthsrghtailcaeethnrghaaistefunnuperrhletimtduiynneuigoceudneeaisheuhlntaotheiiayndfinuaeoaniteyofehadulraeoyruharretarehaainotgiwwsastiubtloaxmelotertotonooarogtcbavpilneefwryatoedawuewrttrlnprpfialerlmitnoriwqeerucradntofarntoleteeprnmphsdneddtweehofpydenesnengeatetaeenestrdguloersuborhwgdrbapehynttkeertrrrnhnfdelostswaiinpytomhuocoytieeeophnrknnatritleeuiernmtipaohaehonhuomuktsvnedeeeiopdkweitgiioieshnuuafbnuetirheahreiheauayrssuwiagsdsitilrfghpliwtiiisehusmroramecsiiovledeoulasridioentifsebotnasopgfosrdftrilpatenrtyloiosyteossnfptehiaegoaareitimdateargyhsarrfcletrelaeenvhhevihmansseiorximlsptjetosbfrmnhidcoehnctbntocpmsuseeothneteifneoontowtoeeirtliodgsoemohfilmorfedfutsefoelwriiqybdozttrnaftnidogtnlaeadphsaenmhtplnstbouhaaaplelnmdpsrvhanailehnacilkscaodeatdgjoheidawgyadnteneehegueoeeendroyyfrtcmettnwgtedatusootowfmyhigrhreoisrnarfoerftneopaysiesssnthhyauehlwicpettaauepnauleewlhaoalerusebniiaeasteaecgcdosersporneesvlsodeduisltettifteseonsnligonretnieiewwwlthiesriihldtrsdnsefrrhtnglsrauesadodtysadatuneiwctanemettropsetytocoyntuoscgumldapldaeodetdfbsefelhaxasrnodiitierpsaihdcscihbpeislnllaohfrertntaroiamelkgaermtdrwcnsyawnvsundlroketunnuoituinnvhinieollhetnfeataiutfatecltnnbrbhgeolnsoamnfiokranonsnvrftecrtfdhtespswcuepcrtwopwahfadiyosaoogeanlfdgigntrbetlllfg o  ',\n",
-        " 'thihfhnrrfetoeafnftatslyrorrteqhsimelrurshfeetaeiiuwhsibrnrtosiinieimrhrtpydetoiirctnalbnrphhtooirleswthstepoostnoyurwhehdhccpimonotaahsihtjneaeftorunesgramrxutwtolteabertprptasaeetnehihrssnrtrstndfloaghusmgeasektuniyahtytnunntnivhgewlwafiprasealfiaebpccmphlaetthowlhsaulduseveeaoetauttaeeefhhlbthrsglatieacerhtnahgaesitnufnrpueehrltitmyudiunnecgionuedieeauhsetlhnhoataieifnydaniunoeaytiehfoeldauoarehryuerareatriahagontswiwisatlbutmaoxtleooretootnoaorbtgcivapenleywfretaouadwtwernrtlfrppeaililrmrntoewiqcreunardaotfonrteeltnperspmhdndeetdwfheoeypdnensenegttaeneaersetlgduseorrbuodwhgpbranheyettkrrethrrnefndtolsiwsayniphotmooucetyipeeoknhrtnnalirtieeumrenaitpehoahohnuoumvtkseendoeeiwdpkgietiiionsehfuuaenbuhitrraeheiehyuaausrsgiwaidssritlpgfhtilwsiiisheurrmocmaeoisidlveloeuisareidoftnioesbsntafpogdsoritfrtplatnerilyotsoysoestfnpaheiageoiraeditmataehgryrasrecfllrteneaeehvhmivhsnasrieolixmjpststeomfbrdhnihocebcntctnoumpsoeseehtnfetioenowtnoeotelritgoidmoseihofrmlofefdetuslofeirwidyqbtzotfnradntingotaalespdhmeanlthpbsntauohlaapmlenrpdsnhvaeialcnhaslikdacodaethjgoaiedagwyendtheneegeueeoeodnrryyfectmwttndtgestauoootyfwmrihgorhensiroraftrefpenoiyassseshtnheayuilhwtpceuataapeneluealwheaoleursinbiseaaeetadgccrsoerpsoseneolvsueddtsilitetstfesoenglnienorentiweiwhlwtreisliihstdrendshrfrlntgursadseaydotaasdeutntwicmnaerteteposoyttnocysutomgcupdlaedlatdoesfdblfeeaahxorsntidipeirhasiccdsphibliesalnlrhofnretoatreaimaklgtremcrdwasnysnwvlnudeorknutntouiniunnhvileiothleafneuatitftatcelrnnbehbgslonnaomkifooarnvsnnefrtfrctehdtwpsspucewrctapowdfhasyiogoaolaenidfgrngtlebtgllf o  ',\n",
-        " 'hhitrhnftferfeaoaftnysltrorrheqteimsrrulehfsetaewiuibsihtnrrisioiienrrhmdpytitoetrcibalnhrpnotoherlihwtsptestosouoynewhrcdhhmpictnoosahajhtieeanrtofsneumragtxurltowbeatprteaptreaeshnetshritnrsnstrofldughaemgskseaiunttahyutnynntngvhiwwlepfiaeasrilfapebapcmcelahothtslhwdulavseuoeaeutaeetathefetlbhgrshiatleacenhtrahgatsienufnepurlhremittiudyennuogicduenaeeiehsunlhttoahiieadnyfuniaaoenetiyefohudalearouryhrraerateaahitongwwistsaitbulxaomolettreonotoraooctgbpvaienlerwfyotaewadurwetlrtnprpflaiemlriontrqwieurecdarnfotatnrotelerpenhpmsenddwtdeohefdypesenngneeetateeantserugdlreosoburgwhdabrpyhenkttetrernrrhdfnesoltawsipniymothcouoityeoeeprnhkannttirlueeinrempitaahoenohhmouustkvdeneieeokdpwtiegoiiihsenauufunberithhaerhieeauayssruaiwgsdsilitrhgfpwiltiiisuhesormremaciisoelvduoelrsaioideitnfbesoantsgpofrsodrtfiapltrnetolyiysotsoespfntiheaogeaeraimitdetaaygrhrasrlcfeertleeanhhvehivmsnasoiermixltpsjotesrfbmihndeochtcnbotncsmpueesonhteietfoenootnweotetrildoigeosmfhoiomlrdeffstueeoflirwibyqdtzotanrfintdtgonealahpdsneampthltsnbhuoapaalnlemspdrahvnliaeanhcklisoacdtaedojghdieaygwatndeeenhugeeeeoerdnofyyrmctenttwetgdutastooomfwygihrerhorsinfraofretoenpsyaisseshtnhuayewlhiepctaatunpeaeluehlwalaoesureinbiaeasaetecgcdesoropsreensslvodedulsittteietfsnoesilngrnoeinteweiwtlwhseirhiilrtdssnderrfhgntlarsuasedtdoydasanutecwitenamtterspoetytoyocnoutsugcmadlpadleedotbfdsefelxahanrsoiidtreipiashscdcbhipsielllnafhortrenratomaiegklamretwrdcysnavnwsdnulkorenutnioutniunihvnoeilehltefnaiatuafttlcetbnnrghbenlosmaonoifknaronsnvtfretrcfthdespsweucptrcwwpoaafhdoyisooagnaelgdfitngrteblfllg o  ',\n",
-        " 'thhifhrnrfteoefanfattsylrorrtehqsiemlrrushefeteaiiwuhsbirntrosiiniiemrrhtpdyetioirtcnablnrhphtooirelswhtstpeootsnouyrwehhdchcpmiontoaashihjtneeaftrounsegrmarxtuwtlotebaerptrpatsaeetnheihsrsntrrsntdfolaguhsmegasketuinyathytunnnntivghewwlafpiraesalifaepbccpmhleattohwlshaudlusveeeoaetuatteaeehfhltbhrgslaiteaecrhntahagestinunfrpeuehlrtimtyuidunencgoinudeieaeuhestlnhhotaaiiefndyanuinoaeyteihfeolduaoaerhruyerraeartiaahgotnswwiistalbtumaxotloeorteoontoarobtcgivpaenelywrfetoauawdtwrenrltfrppealiilmrrnotewqicruenadraoftontreetlnpresphmdnedetwdfhoeeydpnesnengetteaneearstelgudserorboudwghpbarnhyeetktrrtehrnrefdntosliwasynpihomtoocuetiypeoeknrhtnanlitrieuemrneaiptehaohonhuomuvtskeednoeiewdkpgiteiioinshefuauenubhirtraheeiheyuaaussrgiawidssriltpghftiwlsiiishuerromcmeaoiisdlevloueisraeiodftinoebssnatfpgodsroitrftpaltnreiloytsyososetfpnahieagoeireadimtateahgyrrarseclflretneeaehhvmihvsnsarioelimxjptsstoemfrbdhinhoecbctnctonumspoeesehntfeitoeonwtoneoetlrtigodimoesihformolfedfetsuloefiriwdybqtztofnardnitngtoaaelsphdmenaltphbstnauholapamlnerpsdnhaveilacnahslkidaocdatehjogaideagywentdheenegueeeeoodrnryfyecmtwtntdtegstuaootoyfmwrighorehnsriorfatrfepeoniysasssehthneauyilwhtpecuaatapneeleualhwealoeusrinibseaaeeatdgccrseorposseenolsvueddtsliittestefsoneglinenroenitwewihltwresilihistrdensdhrrflngturasdsaeydtoaadseunttwcimneartteepsooyttnoycsuotmgucpdaledaltdeosfbdlfeeaaxhornstiidperihaisccsdphbiliseallnrhfonrteoarteamiakgltrmecrwdasynsnvwlndueokrnunttoiuninunhivleoithelafenuaittfattclernbnehgbslnonamokiofoanrvsnneftrfrtcehtdwpsspuecwrtcapwodfahsyoigooalaneidgfrntgletbglfl o  ',\n",
-        " 'hhtirhfntfrefeoaafntystlrorrhetqeismrrluehsfeteawiiubshitnrrisoiiinerrmhdptyiteotricbanlhrnpothoerilhwstptsetoosuonyewrhcdhhmpcitnoosaahjhiteenartfosnuemrgatxrultwobetapretaprteasehnteshirtnsrnsrtofdlugahemsgksaeiutntayhutynnnntgvihwwelpfaiearsilafpeabpccmelhaotthslwhdualvsueoeeauteaettaheeftlhbgrhsialteaecnhrtahagtseinunfeprulhermittiuydenunogciduneaeieehusnlthtohaiiaednfyunaiaoneetyiefhoudlaeaorurhyrrearaetaaihtognwwsitsiatbluxamooltetroenootraooctbgpviaenelrwyfoteawaudrwtelrntprfplaeimlironrtqweiurcedanrfoattnorteelrpnehpsmenddwtedohfedyepsenngneeettaeenatsreugldresoobrugwdhabpryhnektettrrenrhrdfensotlawispnyimohtcoouiteyoepernkhantntilrueienrmepiataheonohhmouustvkdeenieoekdwptigeoiiihsneaufuunebrihtharehieeauyassuraigwsdislirthgpfwitliisiuhseorrmemcaiioseldvuolersiaoieditfnbeosanstgpforsdortifaptlrnteoliyystososepftnihaeogaeeriamidtetaayghrrarslceferlteenahhevhimvsnsaoiremilxtpjsotserfmbihdneohctcbnotcnsmupeeosnhetieftoeonotwneoettrlidogieomsfhioomrldeffsteueolfiriwbydqtztoanfrindttgnoeaalhpsdnemaptlhtsbnhuaopalanlmesprdahnvlieaanchklsioadctadeojhgdiaeygawtnedeehnugeeeeeordonfyrymcetntwtetdgutsatooomfywgirherohrsnifroafrteoepnsyiasssehthnuaeywliheptcaautnpaeeleuhlawlaeosuerinibaesaaeetcgdcesrooprseesnslovdeudlstittieetsfnoseilgnrneoinetwewitlhwserihilirtsdsnedrrhfgnltarusasdetdyodaasnuetcwtienmattrespeotyotyoncoustugmcadpladeledtobfsdeflexaahnrosiitdrepiiahssccdbhpisilellanfhrotrneraotmaeigkalmrtewrcdysanvnswdnlukoernuntiotuninuihnvoeliehtlefaniautafttlctebnrnghebnlsomanooikfnaornsvntfertrfcthedspwseupctrwcwpaoafdhoysiooganalegdiftnrgtelbflgl o  ',\n",
-        " 'ithhnfhrerftaoeftnfaltsyrrorqtehmsieulrrfsheaeteuiiwihsbrrntiosieniihmrrytpdoeticirtlnabpnrhohtoliretswhestpsootynouhrwehhdcicpmoonthaastihjaneeoftreunsagrmurxtowtlatebterptrpaesaeetnhrihsrsnttrsnldfohagugsmeeaskntuihyatnytutnnnhivglewwiafpsraefalibaepmccpahlehttohwlslaudeusvaeeoaetuattefeehbhltshrgtlaiceaetrhngahaiestfnunurperehlttimdyuinuneicgoenudeieasuhehtlnahoteaiiyfndianuenoaiyteohfealduroaeyhruaerrtearhiaangotiswwaistulbtomaxetloeorttoonooargbtcaivplenefywraetoduawetwrtnrlpfrpiealrilmtrnoiewqecrurnadtaofrontleetenprmsphddnedetwefhopeydnneseengatteaneeerstdlguoserurbohdwgrpbaenhytetkerrtrhrnnefdltossiwaiynpthomuoocyetiepeohknrntnarliteieuemrntaipoehahhonuuomkvtsneedeoeipwdkegitiiioenshufuabenuthireraheeihayuarusswgiasidstrilfpghltiwisiieshumrroacmesoiivdleelouaisrdeionftisoebtsnaofpgodsrfitrltpaetnryilootsyesosntfpeahieagoairetdimaaterhgysrarfecltlreaneevehhvmihasnserioxlimsjptestobmfrndhichoenbctnctopumssoeetehntfeinoeonwtoteoeilrtigodsmoeoihflrmoffeduetsfloewiriqdybotztrfnatdniongtlaaedsphamenhltpnbstoauhalapemlndrpsvnhaaeilhcnaislkcdaoedatghjoeaidwagydentnheeeeguoeeenodryryftecmtwtngdteastuoootwyfmhrighoreinsraorfetrfnpeoaiysesssnhthyeauhilwctpetuaaeapnuelewalhoealreusbiniaseateeacdgcorsesrponseevolsdueditsleittfsteesonnglioenrteniiwewwhltiresilihdstrdensfhrrtlngsuraedsaoydtsaadteunitwcamneerttoepstoytcnoytsuocmgulpdaledaotdedsfbelfehaaxsorndtiiipershaidccsiphbelisnallorhfenrttoarieamlakgetrmdcrwnasywsnvulndreoktnunutoiuninvnhiileolthenafetuaittfaetclnrnbbehgoslnonamfkioroannvsnreftcfrtdehtswpscpuecwrtoapwhdfaisyoagooelanfidggrntbletlglf  o ',\n",
-        " 'ihhtnrhfetfrafeotafnlystrrorqhetmeisurrlfehsaeteuwiiibshrtnriisoeiinhrrmydptoitectrilbanphrnoothlerithwseptsstooyuonhewrhcdhimpcotnohsaatjhiaeenortfesnuamrgutxroltwabettpretapreeasehntrshirtnstnsrlofdhugagemseksaniuthtaynutytnnnhgvilwweipfasearfilabpeampccaelhhotthslwlduaevsuaoeeauteaettfheebtlhsgrhtialceaetnhrgahaitsefnunueprrlhetmitdiuynenuiogceduneaeisehuhnltatoheiiaydnfiunaeaonietyoefhaudlreaoyurharretraehaaintogiwwsatsiutbloxameoltetrotnoooraogctbapvilenefrwyaotedwauerwttlrnpprfilaermlitonriqweeurcrdantfoartnolteeerpnmhpsdenddwteeohfpdyensenegneaettaeenetsrdugloresuobrhgwdrabpeyhntkteetrrrnrhndfelsotsawiipnytmohucooyiteeoephrnknantrtileueienrmtpiaoahehnohumoukstvndeeeieopkdwetigioiiehsnuaufbunetriheharehieaauyrssuwaigssditlirfhgplwitiiiseuhsmorraemcsiioveldeuolarsidoienitfsbeotansogpforsdfrtilapterntyolioystesosnpfteihaeogaaeritmidaetaryghsrarflceterlaeenvhhevhimasnseoirxmilstpjeotsbrfmnihdceohntcbnotcpsmuseeotnhetiefnoeonotwteoeitrlidogseomofhilomrfdefustefeolwiriqbydotztranftindotgnleaadhpsanemhptlntsbohuaapalenlmdsprvahnaliehanciklscoadetadgojhediawygadtneneeheugeoeeenrdoyfyrtmcetntwgetdautsotoowmfyhgirheroirsnafroefrtnoepasyiesssnhthyuaehwlicepttaauenpauelewhlaolaersuebiniaaestaeeccgdoesrsoprneesvsloddeuilstettifetsenosnilgornetineiwewwtlhiserihildrtsdsnefrrhtgnlsarueasdotdysdaatnueicwtaenmettrospettyocyontouscugmladpladeoedtdbfseeflhxaasnrodiitirepsiahdsccibhpesilnllaofhretrntraoimaelgkaemrtdwrcnysawvnsudnlrkoetnunuiotuninvihnioellehtnefatiautaftelctnbnrbgheonlsomanfoikrnaonnsvrtfectrfdthesspwceupctrwowpahafdioysaoogenalfgdigtnrbtellflg  o ',\n",
-        " 'tihhfnhrreftoaefntfatlsyrrortqehsmielurrsfheeateiuiwhisbrrntoisineiimhrrtypdeotiicrtnlabnprhhotoilrestwhsetposotnyourhwehhdccipmoontahasithjnaeefotruensgarmruxtwotltaebetrprtpaseaetenhirhssrntrtsndlfoahgusgmeaesktnuiyhatyntuntnnihvgelwwaifprsaeafliabepcmcphalethtowhlsaluduesveaeoeatutateefehhblthsrgltaiecaerthnaghaeistnfunrupeerhlttimyduiunnecigoneudieeaushethlnhaotaeiifyndainuneoayitehofeladuoraehyruearretarihaagnotsiwwiastlubtmoaxtelooertotonooarbgtciavpelneyfwreatoudawtewrntrlfprpeialirlmrtnoeiwqcerunradatofornteletneprsmphddneedtwfehoepydnneseengtatenaeerestldgusoerrubodhwgprbanehyettkrerthrrnenfdtlosiswayinphtomouoceytipeeokhnrtnnalritieeumernatipeohahhonuuomvktsenedoeeiwpdkgeitiiioneshfuuaebnuhtirreaheeihyauaurssgwiaisdsrtilpfghtliwsiiisehurmrocameosiidvleleouiasrediofntiosebstnafopgdosriftrtlpatenriylotosyseostnfpaehiaegoiaredtimaatehrgyrsarefclltrenaeeevhhmvihsansreiolximjsptsetombfrdnhihcoebnctcntoupmsoseeethnfteioneowntoetoelirtgiodmsoeiohfrlmoffedeutslfoeiwridqybtoztfrnadtninogtalaesdphmaenlhtpbnstaouhlaapmelnrdpsnvhaeailchnasilkdcaodeathgjoaeidawgyednthneeeegueoeeondrryyfetcmwttndgtesatuoootywfmrhigohrenisroarfterfpneoiayssesshntheyauihlwtcpeutaaaepneuleawlheoalerusibnisaeaeteadcgcrosersposneeovlsudedtisliettsfteseongnlieonretniwiewhwltriesliihsdtrednshfrrltngusradesayodtasadetuntiwcmaneretteopsotytncoystuomcgupldaeldatodesdfblefeahaxosrntdiipierhsaicdcspihbleisanllrohfnertotareiamalkgtermcdrwansyswnvlunderokntuntuoinuinnvhilieotlheanfeutaittfateclrnnbebhgsolnnoamkfiooranvnsnerftfcrtedhtwspspcuewcrtaopwdhfasiyogaooleanifdgrgntlbetgllf  o ',\n",
-        " 'hihtrnhftefrfaeoatfnylstrrorhqetemisrurlefhseatewuiibishtrnriisoieinrhrmdyptiotetcriblanhprnoothelrihtwspetstsoouyonehwrchdhmipctonoshaajthieaenrotfsenumargtuxrlotwbaetptreatpreeashentsrhitrnsntsrolfduhgaegmskesainutthayuntyntnnghviwlwepifaesariflapbeapmccealhohttshlwdluavesuoaeeuateeatthfeetblhgsrhitalecaenthraghatisenfuneuprlrhemtitiduyennuoigcdeunaeeieshunhlttaohieiadynfuinaaeoneityeofhuadleraouyrhrarertaeahaitnogwiwstasitublxoamoeltterontooroaocgtbpavielnerfwyoatewdaurewtltrnpprfliaemrliotnrqiweuercdranftoatrnotleerepnhmpsedndwdteoehfdpyesnengeneeatteaentesrudglroesoubrghwdarbpyehnktteterrnrrhdnfeslotaswipinymtohcuooiyteoeeprhnkannttrilueeinermptiaaohenhohmuousktvdneeieeokpdwteigoiiihesnauufubnertihhearheieaauysrsuawigssdiltirhfgpwlitiiisuehsomrreamcisioevldueolrasiodieintfbseoatnsgopfrosdrftialptrentoyliyostseospnftiehaoegaearimtideatayrghrsarlfceetrleaenhvhehvimsansoeirmxiltspjoetsrbfminhdecohtncbontcspmueseontheitefoneoontwetoetirldiogesomfohiolmrdfefsuteefoliwribqydtoztarnfitndtognelaahdpsnaemphtltnsbhouapaalnelmsdpravhnlaieahnckilsocadteadogjhdeiaywgatdneenehuegeeoeerndofyyrmtcenttwegtduatstooomwfyghirehrorisnfarofertonepsayisesshnthuyaewhliecptataunepaeulehwlaloaesrueibniaaesateeccgdeosrosprenessvloddeulisttetieftsneosinlgroneitnewiewtwlhsierhiilrdtssdnerfrhgtnlasruaesdtodydsaantueciwteanmtetrsopettyoyconotusucgmaldpaldeeodtbdfseeflxhaansroiditriepisahsdccbihpseillnlafohrternrtaomiaeglkamertwdrcynsavwnsdunlkroentuniuotnuinivhnoielelhtenfaitauatftlectbnnrgbhenolsmoanofiknraonnsvtrfetcrftdhesspwecuptcrwwopaahfdoiysoaognealgfditgnrtbelfllg  o ',\n",
-        " 'thhifrhnrtfeofeanafttyslrrortheqseimlrrusehfeetaiwiuhbsirtnroisiniiemrrhtdpyeitoitrcnbalnhrphotoierlshwtspteotosnuoyrewhhcdhcmpiotnoasahijhtneeafrtousnegmrartxuwltotbeaeprtraptseaethneishrstnrrnstdoflaughsemgaksetiunytahyutnnnntigvhewwlapfireasailfapebcpcmhelatothwslhaduluvseeoeaeutatetaehefhtlbhgrsliateeacrnhtaahgetsinnufrepuelhrtmityiuduenncogindueiaeeuehstnlhhtoaaiiefdnyauninaoeyetihefoludaoearhuryerraeratiaahgtonswwiitsaltbumxaotoleotreonotoraobctgipvaeenlyrwfeotauwadtrwenlrtfprpelaiimlrronteqwicurendarafototnretelnrpeshpmdendewtdfoheedypnsenegnetetaneeartselugdsreorobudgwhpabrnyheekttrtrehnrredfntsoliawsypnihmotocoueitypoeekrnhtannltiriueemnreapiteahohnohumouvstkedenoieewkdpgtieioiinhsefauueunbhritrhaeehieyauaussrgaiwisdsrlitphgftwilsiiisuherormcemaoiisdelvluoeirsaeoidfitnobessantfgpodrsoirtftapltrneiolytysossoetpfnaiheaogeieradmitaetahygrrraselcflertneeaehhvmhivssnaroielmixjtpssotemrfbdihnheocbtcncotnusmpoeesenhtfietooenwotneeotltrigdoimeosifhoromlfdefestuleofiirwdbyqttzofanrdintntgoaealshpdmnealpthbtsnahuolpaamnlerspdnahveliacanhsklidoacdtaehojgadieaygwetndheeneugeeeeoordnrfyyemctwnttdetgsutaotooymfwrgihoerhnrsiofratfrepoenisyasssehhtneuayiwlhtepcuaatanpeeeluahlwelaoesuriinbsaeaeaetdcgcresoropsseenoslvudedtlsiittesetfsnoegilnernoeintwweihtlwrseilhiisrtdesndhrrflgntuarsdaseytdoadasenuttcwimenartteespootytnyocsoutmugcpadleadltedosbfdlefeaxahonrstiidpreihiascscdpbhilsieallnrfhontreoratemaiagkltmrecwrdaysnsvnwldnuekornnuttiounniunihvloeitehlaefnuiattafttlcerbnneghbsnlonmaokoifonarvnsnetfrftrcethdwspspeucwtrcawpodafhsoyigooalnaeigdfrtngltebgfll  o ',\n",
-        " 'hthirfhntrfefoeaanftytslrrorhteqesimrlrueshfeetawiiubhsitrnriosiiniermrhdtpyietotircbnalhnrpohtoeirlhswtpstetoosunoyerwhchdhmcpitonosaahjihtenearftosunemgratrxulwtobteapertarptesaehtnesihrtsnrnrstodfluaghesmgkaseituntyahuytnnnntgivhwewlpafierasialfpaebpccmehlaotthswlhdaulvuseoeeauetaettaheefthlbghrsilateeacnrhtaahgtesinnuferpulehrmtitiyudeunnocgidnueaieeeuhsntlhthoaiaiedfnyuanianoeeytiehfouldaeoaruhryrerareataiahtgonwswitisatlbuxmaootletorenootroaocbtgpivaeenlrywfoetawuadrtwelnrtpfrpleaimilrorntqewiucrednarfaottonrteelrnpehspmedndwetdofhedeypsnengeneettaeneatrseulgdrseoorbugdwhapbrynheketttrrenhrrdefnstolaiwspynimhotcoouietyopeerknhatnntliruieenmrepaitaehonhohmuousvtkdeenioeekwdptgieoiiihnseafuuuenbrhithraeheieayuasusragiwsidslrithpgfwtilisiiusheorrmecmaioisedlvuloerisaoeidiftnboesasntgfpordsoritfatplrtneoilyytsossoeptfniaheoageeiramditeatayhgrrraslecfelrteneahehvhmivssnaoriemlixtjpsostermfbidhnehoctbcnoctnsumpeoesnehtifetooenowtneeottlridgoiemosfihoormldfefsetuelofiirwbdyqttzoafnridnttngoeaalhspdnmeaplthtbsnhauoplaanmlesrpdanhvleiaacnhksliodactdaeohjgdaieyagwtendehenuegeeeeorodnfryymectnwttedtgustatooomyfwgriheorhrnsiforaftreopensiyasssehhtnueaywilhetpcauatnapeeeluhalwleaoseuriinbaseaaeetcdgcersoorpsesensolvduedltsititeestfnsoeiglnrenoientwweithlwsreihliirstdsendrhrfglntaursadsetydodaasneutctwiemnatrtesepotoytynocosutumgcapdlaedletdobsfdelfexaahnorsitidrpeiihassccdbphislielalnfrhotnreroatmeaigaklmtrewcrdyasnvsnwdlnukeornnutitounniuinhvoleiethleafniuatatftltcebrnngehbnslomnaookifnoarnvsntefrtfrctehdswpsepuctwrcwapoadfhosyiogoanlaegidftrngtlebfgll  o ',\n",
-        " 'ithhnfrhertfaofetnafltysrrroqthemseiulrrfsehaeetuiwiihbsrrtnioiseniihmrrytdpoeitcitrlnbapnhrohotliertshwesptsotoynuohrewhhcdicmpootnhasatijhaneeofrteusnagmrurtxowltatbeteprtrapeseaethnrishrstntrnsldofhauggsemeaksntiuhytanyuttnnnhigvlewwiapfsreafailbapemcpcahelhtothwslladueuvsaeoeaeutatetfehebhtlshgrtliaceeatrnhgaahietsfnnuureprelhttmidyiunuenicogendueiaesuehhtnlahtoeaiiyfdniaunenaoiyetohefaludroeayhuraerrterahiaangtoiswwaitsultbomxaetoleotrtonoooragbctaipvleenfyrwaeotduwaetrwtnlrpfprielarimltronieqwecurrndataforotnleteenrpmshpddendewtefohpedynnseeegnatetaneeertsdlugosreurobhdgwrpabenyhtektertrrhnrnedfltsosiawiypnthmouocoyeitepoehkrnntanrltieiueemnrtapioeahhhnouumokvstnedeeoiepwkdegtiiioienhsufaubeunthrierhaeehiayaurusswgaisisdtrlifphgltwiisiiesuhmroracemsoiivdeleluoairsdeoinfitsobetsanofgpodrsfirtltapetrnyiolotysessontpfeaiheaogaiertdmiaaetrhygsrrafelctleraneevehhvmhiassneroixlmisjtpesotbmrfndihcheonbtcncotpusmsoeetenhtfienooenwotteeoiltrigdosmeooifhlromffdeuestfleowiirqdbyottzrfantdinontglaeadshpamnehlptnbtsoahualpaemnldrspvnahaelihcanisklcdoaedtaghojeadiwaygdetnnheeeeugoeeenordyrfytemctwntgdetasutootowymfhrgihoerinrsaofretfrnpoeaisyesssnhhtyeuahiwlcteptuaaeanpueelwahloelaresubiinasaeteaecdcgoressropnseevosldudeitlseittfsetesnongiloernteiniwwewhtlirseilhidsrtdesnfhrrtlgnsuaredasoytdsadatenuitcwamenerttoesptotycnyotsoucmuglpadleadoteddsbfelefhaxasonrdtiiipreshiadcscipbhelsinallorfhentrtoraiemalagketmrdcwrnayswsvnuldnrekotnnuutiounnivnihiloeltehnaeftuiattafetlcnrbnbeghosnlonmafkoironanvnsretfcftrdethswspcpeucwtroawphdafisoyagooelnafigdgrtnbltelgfl   o',\n",
-        " 'ihthnrfhetrfafoetanflytsrrroqhtemesiurlrfeshaeetuwiiibhsrtrniioseinihrmrydtpoietctirlbnaphnroohtleirthswepststooyunoherwhchdimcpotonhsaatjihaeneorftesunamgrutrxolwtabtetpertarpeesaehtnrsihrtsntnrslodfhuaggesmekasnituhtyanuyttnnnhgivlwewipafserafialbpaempccaehlhotthswlldauevusaoeeauetaettfheebthlsghrtilaceeatnrhgaahitesfnnuuerprlehtmtidiyuneuniocgednueaieseuhhntlathoeiaiydfniuaneanoieytoehfauldreoayuhrarertreahaiantgoiwswatisutlboxmaeotletortnoooroagcbtapivleenfrywaoetdwuaertwtlnrppfrilearmiltorniqeweucrrdnatfaortonlteeernpmhspdedndweteofhpdeynsneegenaettaeneetrsdulgorseuorbhgdwrapbeynhtketetrrrnhrndeflstosaiwipyntmhoucooyieteopehrknnatnrtlieuieenmrtpaioaehhnhoumuoksvtndeeeioepkwdetgiioiiehnsuafubuentrhiehraeheiaayursuswagissidtlrifhpglwtiiisieushmorraecmsioivedleuloarisdoeiniftsboetasnogfpordsfritlatpertnyoiloytsessonptfeiaheoagaeirtmdiaeatryhgsrraflectelraenevhehvhmiassneorixmlistjpeostbrmfnidhcehontbcnoctpsumseoetnehtifenooenowtteeoitlridgosemoofihlormfdfeusetfelowiirqbdyottzrafntidnotngleaadhspanmehpltntbsohauaplaenmldsrpvanhaleihacnikslcodaetdagohjedaiwyagdtenneheeuegoeeenrodyfrytmectnwtgedtaustotoowmyfhgriheorirnsaforeftrnopeasiyesssnhhtyueahwilcetptauaenapueelwhalolearseubiinaasetaeeccdgoerssorpnesevsolddueiltsetitfestensoniglorentieniwwewthlisreihlidrstdsenfrhrtglnsaureadsotydsdaatneuictwaemnetrtosepttoycynotosucumglapdlaedoetddbsfeelfhxaasnorditiirpesihadsccibpheslinlalofrhetnrtroaimealgakemtrdwcrnyaswvsnudlnrkeotnnuuitounnivinhiolelethneaftiuatatfeltcnbrnbgehonslomnafokirnoannvsrtefctfrdtehsswpcepuctwrowaphadfiosyaogoenlafgidgtrnbtlelfgl   o',\n",
-        " 'tihhfnrhretfoafentaftlysrrrotqhesmeilurrsfeheaetiuwihibsrrtnoiisneiimhrrtydpeoitictrnlbanphrhootilersthwseptostonyuorhewhhcdcimpootnahsaitjhnaeefortuesngamrrutxwolttabeetprrtapseeatehnirshsrtnrtnsdlofahugsgemaekstniuyhtaynutntnnihgvelwwaipfrseaafilabpecmpchaelthotwhslalduuevseaoeeauttaetefhehbtlhsgrltiaeceartnhagaheitsnfnurueperlhttmiydiuunenciogneduieaeusehthnlhatoaeiifydnaiunneaoyiethoeflaudoreahyurearretraihaagntosiwwiatslutbmoxateoloetrotnooorabgctiapvelenyfrweaotudwaterwntlrfppreilairmlrtoneiqwceurnrdaatfoortneltenerpsmhpddenedwtfeohepdynnseeegntaetnaeeretsldugsoreruobdhgwprabneyhetktretrhrnrendftlsoisawyipnhtmooucoeyitpeoekhrntnanlrtiieuemenratpieoahhhnouumovkstendeoeiewpkdgetiiioinehsfuauebunhtrirehaeehiyaauurssgwaiissdrtlipfhgtlwisiiiseuhrmorcaemosiidvelleuoiarsedoifnitosbestanfogpdorsifrttlapterniyoltoyssesotnpfaeihaeogiaerdtmiaaethrygrsraeflclternaeeevhhmvhisasnreoilxmijstpseotmbrfdnihhceobntccnotupsmoseeetnhftieonoewnoteteolitrgidomseoiofhrlomffdeeustlfeoiwirdqbytotzfrandtinnotgaleasdhpmanelhptbntsaohulapamenlrdspnvahealichansikldcoadetahgojaediawygedtnhneeeeugeoeeonrdryfyetmcwtntdgetsautootoywmfrhgiohernirsoafrtefrpnoeiasysesshnhteyuaihwltceputaaaenpeuelawhleolaersuibinsaaeetaedccgroesrsopsneeovsluddetilsiettsfetsenognileornetinwiwehwtlriselihisdrtedsnhfrrltgnusardeasyotdasdaetnuticwmaenretteospottyncyostoumcugpladeladtoedsdbfleefahxaosnrtdiipirehsiacdscpibhlesianllrofhnetrotraeimaalgktemrcdwranysswvnludnerkontnutuionuninvihlioetlehanefutiattaftelcrnbnebghsonlnomakfoiornavnnsertffctredthwssppceuwctraowpdhafsioygaoolenaifgdrgtnlbteglfl   o',\n",
-        " 'hithrnfhterffaoeatnfyltsrrrohqteemsirulrefsheaetwuiibihstrrniiosienirhmrdytpioettcirblnahpnroohtelirhtswpesttsoouynoehrwchhdmicptoonshaajtiheaneroftseunmagrturxlowtbatepteratrpeesahetnsrihtrsnntrsoldfuhagegsmkeasintuthyaunytntnnghivwlewpiafesraifalpbaepmcceahlohttshwldlauveusoaeeuaeteatthfeetbhlgshritlaeceantrhagahtiesnfnueurplrehmttiidyuenunoicgdenuaeieesuhnhtltahoieaidyfnuianaenoeiyteohfualderoauyhrraerrteaahiatngowiswtaistulbxomaoetlteorntoorooacgbtpaivelenrfywoaetwduaretwltnrppfrlieamrilotrnqiewuecrdrnaftaotrontleerenphmspeddnwdetoefhdpeysnnegeeneatteanetersudlgroseourbghdwarpbyenhktetterrnrhrdnefsltoasiwpiynmthocuooiyetoeperhknantntrliueienemrptaiaoehnhhomuuoskvtdneeieoekpwdtegioiiihensaufuubenrthiheraheeiaayusrusawgissidltrihfpgwltiiisiueshomrreacmisoievdlueloraisodeiinftbsoeatsngofprodsrfitaltpretnoyilyotssesopntfieahoeageairmtdieaatyrhgrsralfecetlreanehvehhvmisasnoerimxlitsjpoestrbmfindhechotnbconctspumesoentehitfeonoeonwteteotilrdigoesmofoiholrmdffesuetefloiwirbqdytotzarfnitdntongelaahdspnamephlttnbshoaupalanemlsdrpavnhlaeiahcnkislocdatedaoghjdeaiywagtdenenheueegeoeernodfyrymtecntwtegdtuasttooomwyfghriehorrinsfaorfetronpesaiysesshnhtuyeawhilectpatuaneapeuelhwalloeasreuibinaaseateeccdgeorsosrpensesvoldduelitsteitefstnesoinglroenitenwiwetwhlsirehilirdstsdenrfhrgtlnasuraedstoyddsaanteucitweamntertsoepttoyycnootsuucmgalpdaledeotdbdsfeelfxhaansoridtiripeishasdccbiphselilnalforhtenrrtoamieaglakmetrwdcrynasvwsndulnkreontnuiutonuniivnhoileelthenafituaattfletcbnrngbehnoslmonaofkinroannvstreftcfrtdehsswpecputcwrwoapahdfoisyoagonelagfidtgrntbleflgl   o',\n",
-        " 'thihfrnhrtefofaenatftylsrrrothqesemilrursefheeatiwuihbisrtrnoiisnieimrhrtdypeiotitcrnblanhprhootielrshtwspetotsonuyorehwhchdcmipotonashaijthneaefrotusengmarrtuxwlottbaeeptrratpseeathenisrhstrnrntsdolfauhgsegmakestinuythayuntnntnighvewlwapifresaaiflapbecpmchealtohtwshladluuveseoaeeuatteatehfehtblhgsrlitaeecarnthaaghetisnnfureupelrhtmtiyiduuenncoigndeuiaeeueshtnhlhtaoaieifdynauinnaeoyeitheofluadoerahuyrerarertaiahagtnoswiwitasltubmxoatoeloterontooroabcgtipaveelnyrfweoatuwdatrewnltrfppreliaimrlrotneqiwcuerndraaftootrnetlenrepshmpdednewdtfoehedpynsneegenteatneaertesludgsroeroubdghwparbnyehekttrterhnrrednftsloiaswypinhmtoocuoeiytpoeekrhntannltriiueemneraptieaohhnhoumuovsktedneoieewkpdgteiioiinhesfauueubnhrtirheaeheiyaauusrsgawiissdrltiphfgtwlisiiisuehromrceamoisidevllueoiraseodifintobsesatnfgopdrosirfttalptrenioyltyossseotpnfaiehaoegieardmtiaeathyrgrrsaelfcletrneaeehvhmhvissanroeilmxijtspsoetmrbfdinhhecobtnccontuspmoeseenthfiteoonewonteetoltirgdiomesoifohrolmfdfeesutlefoiiwrdbqyttozfarnditnntogaelashdpmnaelphtbtnsahoulpaamnelrsdpnavhelaicahnskildocadteahogjadeiaywgetdnheneeuegeeoeorndrfyyemtcwnttdegtsuatotooymwfrghioehrnrisofartferponeisaysseshhnteuyaiwhltecpuataanepeeulahwleloaesruiibnsaaeeatedccgreosrospseneosvluddetlisitetseftsneoginleroneitnwwiehtwlrsielhiisrdtesdnhrfrlgtnuasrdaesytodadsaentutciwmeanrtetesopottynycosotumucgpaldealdteodsbdfleefaxhaonsrtidipriehisacsdcpbihlseialnlrfohnterortaemiaaglktmercwdraynssvwnldunekronntutiuonnuinivhloietelhaenfuitatatftlecrbnnegbhsnolnmoakofionravnnsetrfftcretdhwssppecuwtcrawopdahfsoiygoaolneaigfdrtgnltbegfll   o',\n",
-        " 'htihrfnhtreffoaeantfytlsrrrohtqeesmirluresfheeatwiuibhistrrnioisineirmhrdtypieotticrbnlahnprohoteilrhstwpsettosounyoerhwchhdmciptoonsahajithenaerfotsuenmgartruxlwotbtaepetrartpeseahtensirhtsrnnrtsodlfuahgesgmkaesitnutyhauyntnntngihvwelwpaifersaiaflpabepcmcehalothtswhldaluvuesoeaeueatetathefethblghsriltaeecanrthaaghteisnnfueruplerhmttiiydueunnocigdneuaieeeushnthlthaoiaeidfynuainaneoeyitehofuladeorauhyrrearretaaihatgnowsiwtiastlubxmoaoteltoernotorooacbgtpiaveelnryfwoeatwudartewlntrpfprleiamirlortnqeiwucerdnrafatotorntelernephsmpeddnwedtofehdepysnnegeenetatenaetresuldgrsoeorubgdhwaprbynehketttrernhrrdenfstloaiswpyinmhtocouoieytopeerkhnatnntlriuieenmerpatiaeohnhhomuuosvktdeneioeekwpdtgeioiiihnesafuuuebnrhtihreaheeiayausursagwisisdlrtihpfgwtliisiiusehormrecamiosiedvluleoriasoediifntboseastngfoprdosriftatlprtenoiylytossseoptnfiaehoaegeiarmdtieaatyhrgrrsalefceltrenaehevhhmvissanoreimlxitjsposetrmbfidnhehcotbncocntsupmeosenethifteooneownteetotlirdgioemsofiohorlmdffeseutelfoiiwrbdqyttozafrnidtntnogealahsdpnmaeplhttbnshaouplaanmelsrdpanvhleaiachnksilodcatdeaohgjdaeiyawgtednehneueegeeoerondfryymetcnwttedgtusattooomywfgrhieohrrnisfoarfteropnesiaysseshhntueyawihletcpautanaepeeulhawlleoaseruiibnasaeaetecdcgerosorspesnesovldudeltistietesftnseoignlreonietnwwiethwlsriehliirsdtsednrhfrgltnausradestyoddasanetuctiwemantretseoptotyyncoostuumcgapldaeldetodbsdfelefxahanosritdirpieihsascdcbpihsleilanlfrohtnerrotameiagalkmterwcdryansvswndlunkeronntuituonnuiinvholieetlheanfiutaattfltecbrnngebhnsolmnoaokfinoranvnsterftfcrtedhswspepcutwcrwaopadhfosiyogaonleagifdtrgntlbefgll   o']"
-       ]
-      }
-     ],
-     "prompt_number": 22
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 23,
-       "text": [
-        "'hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo'"
-       ]
-      }
-     ],
-     "prompt_number": 23
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in every_nth(c6bs, 3)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "'hit'"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs.find('e', 13)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 25,
-       "text": [
-        "28"
-       ]
-      }
-     ],
-     "prompt_number": 25
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c6bs) / 978"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 26,
-       "text": [
-        "1.6083844580777096"
-       ]
-      }
-     ],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs[55:60]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 27,
-       "text": [
-        "'bnrrt'"
-       ]
-      }
-     ],
-     "prompt_number": 27
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(c6bs[0] + c6bs[i] + c6bs[2*i] + c6bs[3*i], i) for i in range(int(len(c6bs) / 3)) if c6bs[i] == 'e' and c6bs[2*i] == 'i' ]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 28,
-       "text": [
-        "[('heih', 177), ('heit', 207), ('heip', 307), ('heil', 522)]"
-       ]
-      }
-     ],
-     "prompt_number": 28
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[c for c in chunks(c6bs, 522)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 29,
-       "text": [
-        "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnrotel',\n",
-        " 'etpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvna',\n",
-        " 'iaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrteb',\n",
-        " 'ltllgfo']"
-       ]
-      }
-     ],
-     "prompt_number": 29
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6b"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 30,
-       "text": [
-        "'HITHH NFRFE RTEAO FFTNA SLTYO RRREQ THIMS ERULR HFSET AEEIU IWSIH BNRRT SIOII ENIRH MRPYT DTOEI RCITA LNBRP NHTOH ORLIE WTSHT ESPOS OTOYN UWHRE DHHCP ICMNO OTAHA SHTIJ EANET OFRNE USRAG MXURT TOWLE ATBRT EPPTR AAESE NETHH RISNR STSTR NFLDO GHAUM GSESE AKUNT IAHYT TNYUN TNNVH IGWLE WFIAP ASREL FAIEB APCMC PLAHE THTOL HWSUL ADSEU VEAEO TAEUT ATEEF EHLBH TRSHG ATLIA CEEHT RNHGA ASIET UFNNP UREHR ELITT MUDYI NNUEG ICOUE NDEEI AHSUE LHTNO AHTIE AINYF DNIAU OENAT IYEFO HEDAL UAROE RYHUR AERAT ERAHI AONGT WISWS AITBU LTAOM XLETO REOTO TONAO ORTGB CVAIP NLEEW FYRTA EOADU WWETR RTNLR PFPAI ELLRI MNTRO WIEQR ECUAR NDOTA FNROT ELETP ENRPM SHNDD ETDEW HEFOY PEDEN NSNEE GTATE EANES ERTGD LUEOS RBURO WHDGB RPAHE NYTTE KRERT RRHNF NEDOL TSWSI ANIYP OTHMO UOCTY EIEEP ONHKR NNTAI RLTEE IUREM NITAP HOEAO HHNOU UMTKV SENED EEOID PWKIE GTIII OSENH UUFAN BEUIT HRAER HIEEH UAYAS RUSIW GADSI SITRL GFPHI LTWII SIHES URMRO MACEI SOILV DEOEL USAIR IDEOT NFIES OBNTS APOFG SODRT FIRPL TANET RLYIO SOTYO ESSFN TPHEA IGEAO RAIEI TDMTA AEGRH YASRR CFELR TLEEA NEHVE HIVMH NASSI EROIX LMPSJ TTESO FBMRH NDIOC HECNB TTNCO MPUSE SOEHT ENETF IENOO TNWOO TEERI LTOIG DOSME HOIFM LROEF FDTUE SOFLE RWIIY QDBZO TTNRF ANTDI GONTA LAEPD SHEAM NTHLP SNBTU OAHAA LPLEM NPDRS HVNAI AELNH CALIS KACDO AEDTJ GHOIE ADGWA YNDET ENHEG EEUEO EEDNO RYYRF CTEMT TWNTG DETAS UOOOT FWYMI HRGRH OESIN RRAOF RETFE NPOYA ISSES STNHH AYEUL HIWPC TEATU APEAN LUEEL WAHAO ELURE SNBII EASAE TEAGC DCSOR EPSRO ENSEL VOSED UDSIT LTEIT TFSEO ESNLN GINOE RNTEI EIWWL WHTEI RSIIL HTDSR NDESR FHRNT LGRSU ASEDA DOYTA SADUT ENWIT CNAME TERTP OESYT OTOCN YUTSO GCMUD LPADL EADOT EFDSB FELEA HAXRS ONIDT IEIPR ASHIC DCSHI PBIEL SLNAL HORFR ENTAT ORAIE MKLAG RETMR DCWSN AYNWS VNULD OREKU TNNOU TIIUN NHVNI EILOH LTEFN AEATU IFTTA CETLN NRBHB EGLOS NAONM IFKOA RONSN VNFRE TRCFT HDETP SWSUC PERCW TPOAW FHDAY ISOOA GOAEL NDFIG NGRTE BLTLL GFO\\n'"
-       ]
-      }
-     ],
-     "prompt_number": 30
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[i for i in range(len(c6bs)) if c6bs[i] == 'q']"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 42,
-       "text": [
-        "[29, 503, 985]"
-       ]
-      }
-     ],
-     "prompt_number": 42
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in every_nth(c6bs, 11)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 32,
-       "text": [
-        "'hithhnfrfer'"
-       ]
-      }
-     ],
-     "prompt_number": 32
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in every_nth(c6bs, 13)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 33,
-       "text": [
-        "'hithhnfrferte'"
-       ]
-      }
-     ],
-     "prompt_number": 33
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in chunks(c6bs, 121)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 34,
-       "text": [
-        "'hhrnrnumeodti'"
-       ]
-      }
-     ],
-     "prompt_number": 34
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "''.join([c[0] for c in chunks(c6bs, 13)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 35,
-       "text": [
-        "'harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon'"
-       ]
-      }
-     ],
-     "prompt_number": 35
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "'l' in ''.join([c[0] for c in chunks(c6bs, 13)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 36,
-       "text": [
-        "True"
-       ]
-      }
-     ],
-     "prompt_number": 36
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "every_nth(c6bs, 11)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 38,
-       "text": [
-        "['httmtbnoreohaegaasdetgrmlvtshtenenfiargurredrmcrpwnaegennckehmoinhutioddnrtegmranmmneieseetoetmaaoeoceyiesieaidnseewtrdtttmoaicnagariounanfcfor',\n",
-        " 'ieysaniepwthhtmtenoanwecheehtulueodyratleteupnuomhsnobkeitriotiibisrimeettrsetrnaprbseemfrtnaunecitettmnntwaoecsiorhdnaeeouthesatryeuhirostphat',\n",
-        " 'taoeerrintocaoxbsrgkyllpwaegrfieianeotwtogwwftatsenesrrdyynuekdoeeilsaoosflsaacesshtonrefwntmopldeeeeairpnpneasetentstdnrcdeaihloenknlfbnnhedee',\n",
-        " 'horrerhrhsypsfureshuueflsefanntgahifeeiatbfwprrehfesrpeopenravpsuewgicetaiyfoafhsjnteoihdiranadnoandmshrohcllsollsterlowtnlfxpihrtwuntthmvdralb',\n",
-        " 'hfruitmcthnihrrtntannwaauoethntihtaorrsoocyeaonlnoeebarloiteosweihgfhelnprinreevitdnholotiflthrhadhnturayhtuuarvtneingyipypdrrpoamsthetbinecynl',\n",
-        " 'nfrlusriotuctnteesuttfihlthlgpmcsiuhyawmtvrtiwdedygruhttteamhekntuapeiufopotagleetictttiuyaahascegeotogoaaeereeoelirdrttouassabrirvnvfaefftwidt',\n",
-        " 'fteriipthewmietpttminieeaaliauuoueoehhsxoatreiotdpttrersheinhnihhadhsssiflspirrhreooenofeqnelahadwgrworfiyaeetpsinesesacetdbosifednnnncgkrptsfl',\n",
-        " 'rnqhwoyaoshnjuophrganabtdebaardueaeduialniarletpeeagonrwmprineeurysiuoaegtohehtioscmnwimsdtpplvltaeynohrsetlsesetgiisusnsslfnhermcuoiaeloespoil',\n",
-        " 'fatfsitlrproeswthnshvpahsuhcseyelinaraieapetlqaetdtdwyhsooltodguaailriissateiylviohpeoglobddspnijyeyttoesuuwnardtiwiraaayoeeiilekwlueetoatwoogg',\n",
-        " 'eshsiidnloeoarlrrfeyhaptetteihinhnalaottononrrfndeelhtniuntauetfesstmlroonyataemxfeutodrfzisnlasgnurgfetelaabgoufnwlfsdmtgaldcsnlsdtialsrrsaanf',\n",
-        " 'rliehetbisdtnaeailstiscouareerndtytuenboolalienreneudtfaohepueiarriwrvibdeoidsehlbcsftoologhbeikhdefdwsfshphicedsolhheueocdetdltanoiltnnocuwggo']"
-       ]
-      }
-     ],
-     "prompt_number": 38
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "every_nth(c6bs, 143)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 64,
-       "text": [
-        "['hetuehroera',\n",
-        " 'iteloirnnny',\n",
-        " 'toetsectptn',\n",
-        " 'hffarefaolw',\n",
-        " 'hreobhelygs',\n",
-        " 'nnhmuulaarv',\n",
-        " 'felxrareisn',\n",
-        " 'rubloytpsuu',\n",
-        " 'fshewaldsal',\n",
-        " 'ertthsesesd',\n",
-        " 'rarodrehseo',\n",
-        " 'tgsrguaesdr',\n",
-        " 'emhebsnatae',\n",
-        " 'axgoriemndk',\n",
-        " 'ouatpwhnhou',\n",
-        " 'frtoagvthyt',\n",
-        " 'ftlthaehatn',\n",
-        " 'ttioedhlyan',\n",
-        " 'noannsipeso',\n",
-        " 'awcayivsuau',\n",
-        " 'sleotsmnldt',\n",
-        " 'leeotihbhui',\n",
-        " 'tahretntiti',\n",
-        " 'ytttkrauweu',\n",
-        " 'obrgrlsopnn',\n",
-        " 'rrnbegsacwn',\n",
-        " 'rthcrfihtih',\n",
-        " 'regvtpeaetv',\n",
-        " 'epaarhraacn',\n",
-        " 'qpairioltni',\n",
-        " 'ttsphlipuae',\n",
-        " 'hrinntxlami',\n",
-        " 'iaelfwlepel',\n",
-        " 'matenimmeto',\n",
-        " 'seueeipnaeh',\n",
-        " 'esfwdsspnrl',\n",
-        " 'renfoijdltt',\n",
-        " 'unnylhtrupe',\n",
-        " 'leprtetseof',\n",
-        " 'rtutsseheen',\n",
-        " 'hhrawusvlsa',\n",
-        " 'fheesronwye',\n",
-        " 'srhoimfaata',\n",
-        " 'eiraarbihot',\n",
-        " 'tsednomaatu',\n",
-        " 'anluimreooi',\n",
-        " 'eriwyahlecf',\n",
-        " 'estwpcnnlnt',\n",
-        " 'itteoedhuyt',\n",
-        " 'usmttiicrua',\n",
-        " 'iturhsoaetc',\n",
-        " 'wrdrmoclsse',\n",
-        " 'snytoihinot',\n",
-        " 'ifinulesbgl',\n",
-        " 'hlnlovckicn',\n",
-        " 'bdnrcdnaimn',\n",
-        " 'nouptebceur',\n",
-        " 'rgefyotdadb',\n",
-        " 'rhgpeetoslh',\n",
-        " 'taiailnaapb',\n",
-        " 'sucieuceeae',\n",
-        " 'imoeesodtdg',\n",
-        " 'ogulpamtell',\n",
-        " 'iseloipjaeo',\n",
-        " 'ienrnruggas',\n",
-        " 'esdihishcdn',\n",
-        " 'neemkdeodoa',\n",
-        " 'iaenresicto',\n",
-        " 'rkitnooesen',\n",
-        " 'huarnteaofm',\n",
-        " 'mnhotnhdrdi',\n",
-        " 'rtswaftgesf',\n",
-        " 'piuiiiewpbk',\n",
-        " 'yaeerenasfo',\n",
-        " 'thlqlseyrea',\n",
-        " 'dyhrtotnolr',\n",
-        " 'ttteebfdeeo',\n",
-        " 'otncenienan',\n",
-        " 'enouitetshs',\n",
-        " 'iyaausneean',\n",
-        " 'ruhrraonlxv',\n",
-        " 'cntnepohvrn',\n",
-        " 'itidmoteosf',\n",
-        " 'tneonfngsor',\n",
-        " 'anatigweene',\n",
-        " 'lviatsoedit',\n",
-        " 'nhnfaoouudr',\n",
-        " 'biynpdtedtc',\n",
-        " 'rgfrhreosif',\n",
-        " 'pwdooteeiet',\n",
-        " 'nlntefretih',\n",
-        " 'heieaiidlpd',\n",
-        " 'twalorlntre',\n",
-        " 'ofuehptoeat',\n",
-        " 'hiothlorisp',\n",
-        " 'oaepntiyths',\n",
-        " 'rpneoagytiw',\n",
-        " 'laanundrfcs',\n",
-        " 'istrueofsdu',\n",
-        " 'eripmtscecc',\n",
-        " 'weymtrmtosp',\n",
-        " 'tleskleeehe',\n",
-        " 'sffhvyhmsir',\n",
-        " 'haonsiotnpc',\n",
-        " 'tihdeoitlbw',\n",
-        " 'eeednsfwnit',\n",
-        " 'sbdeeomngep',\n",
-        " 'paatdtltilo',\n",
-        " 'opldeyrgnsa',\n",
-        " 'scueeoodolw',\n",
-        " 'omawoeeeenf',\n",
-        " 'tcrhisftrah',\n",
-        " 'opoedsfanld',\n",
-        " 'ylefpfdstha',\n",
-        " 'narowntueoy',\n",
-        " 'uhyyktuoiri',\n",
-        " 'wehpipeoefs',\n",
-        " 'htueehsoiro',\n",
-        " 'rhrdgeotweo',\n",
-        " 'etaetaffwna',\n",
-        " 'doeniilwltg',\n",
-        " 'hlrnigeywao',\n",
-        " 'hhasiermhta',\n",
-        " 'cwtnoawitoe',\n",
-        " 'pseesoiherl',\n",
-        " 'iureeririan',\n",
-        " 'clagnaygrid',\n",
-        " 'mahthiqrsef',\n",
-        " 'ndiauedhimi',\n",
-        " 'osatuiboikg',\n",
-        " 'oeoeftzelln',\n",
-        " 'tuneadoshag',\n",
-        " 'avganmtitgr',\n",
-        " 'hetnbttndrt',\n",
-        " 'aaweeanrsee',\n",
-        " 'seisuarrrtb',\n",
-        " 'hoseiefanml',\n",
-        " 'ttwrtgaodrt',\n",
-        " 'iasthrnfedl',\n",
-        " 'jeagrhtrscl',\n",
-        " 'euidayderwg',\n",
-        " 'attleaitfsf',\n",
-        " 'nabursgfhno']"
-       ]
-      }
-     ],
-     "prompt_number": 64
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(q, u) for q in [i for i in range(len(c6bs)) if c6bs[i] == 'q'] for u in [i for i in range(len(c6bs)) if c6bs[i] == 'u'] if abs(q-u) < 13]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 44,
-       "text": [
-        "[(29, 37), (503, 507), (985, 973)]"
-       ]
-      }
-     ],
-     "prompt_number": 44
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "every_nth(c6bs, 13)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 54,
-       "text": [
-        "['harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon',\n",
-        " 'iorhiniterttuehfeywehueagrieaaernltvanmalddeoptwukuongaiwpuldsrsedrheseenlfoonnavsoenwtsnhelbdetnwhnotsgoarieayuvalanetog',\n",
-        " 'tfefhiroseaorphlaufbtvetaenehudagtoaelnreeeasarsorrhetneghrveapoamcvrocsotmftttankinonfiphawiclegwttycyctxaengntnenovtpar',\n",
-        " 'hfqsbrchpdhftprdkniaoeflahnitoaetatiortnttnnrhricnehdibeaimdopltitfeofnooolltahlaaehrtwnoataisviildltntmersltrwniannnpogt',\n",
-        " 'httenhiooharttioutaplaeisruaielrwoopaprdpdnebehatnmneiehdlretotygaehibbetirenllpicaeygyryyuheootnwsgaaoufshsaesnetrmfsaoe',\n",
-        " 'nnhtrmtrshsnorsgnnpchehaieehenuaimnndfooeessunnnytnoeiuustoonfaoealixmthngorrapladdgydmraeaaarstohrrsmtddoilttvoiubirwwab',\n",
-        " 'faiarralochewanhtnamwolcelgsaaatsxalupwtnwneryfieaiuooiaiwmefgneaervlrttwdewfeseeogereiaiuposeefetnsaeolsncnomnulihfesfel',\n",
-        " 'rsmetplitptularaivscstbetiiuitrewloewaiarherotnyiituistysialisesogtmmhneoofiapnmlawefthosleeapdsredudtcpbidarrutofbktuhlt',\n",
-        " 'flsesyneoiiseesuahrpuaheutceniorseoewiefpeetwteperamdehaiicueotsrrlhpncnosfindbnneaucarfshalesuenieauenafdcladlihteorcdnl',\n",
-        " 'eteiitbwycjrastmhiellethftolyyeaatrweeqnmfgghedoelptpnrstsessdrfahensdoetmdytstphdyetsgreinutrdotrsstrydetshicdiltgacpadl',\n",
-        " 'ryruodrtnmeatesgyglaaurtnmuhferhiotftlrrsotddkotpthkwharriiaorlniyeajimteetqdhudctnoeureswlreoseesreetullihoewoutalrfeyfg',\n",
-        " 'touiitpsunagbntstwfhdtsrnuetdfyitrgyrleohyalgrlhoeovkueulhsibtyteaastopfehudieorajdemohtspueaeisiifdnpteeeirmsrnecootriif',\n",
-        " 'erlwionhwonmreretlaesahnpdnnnohabebrrrctnptubetmneesiursgeornfipisnstcuiroebgaaslgeetooftcesgntneihawosaaipfknenfesnhcsgo']"
-       ]
-      }
-     ],
-     "prompt_number": 54
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[''.join(transpose(l, (3, 11, 0, 1, 2, 4, 5, 6,7, 8, 9, 10, 12))) for l in chunks(c6bs, 13)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 61,
-       "text": [
-        "['hthithnfrfere',\n",
-        " 'foaoftnasltyr',\n",
-        " 'qurrethimserl',\n",
-        " 'sirhfetaeeiuw',\n",
-        " 'bisihnrrtsioi',\n",
-        " 'rtenihmrpytdo',\n",
-        " 'cpeiritalnbrn',\n",
-        " 'hshtoorliewth',\n",
-        " 'putesosotoynw',\n",
-        " 'dnhrehhcpicmo',\n",
-        " 'haotaashtijen',\n",
-        " 'fgetorneusram',\n",
-        " 'tbxurtowleatr',\n",
-        " 'pnteptraaesee',\n",
-        " 'rtthhisnrstsr',\n",
-        " 'dsnfloghaumge',\n",
-        " 'ktseauntiahyt',\n",
-        " 'nwnyutnnvhigl',\n",
-        " 'ifewfapasrela',\n",
-        " 'ahiebpcmcplae',\n",
-        " 'odthtlhwsulas',\n",
-        " 'eteuvaeotaeua',\n",
-        " 'fsteeehlbhtrh',\n",
-        " 'lrgatiaceehtn',\n",
-        " 'anhgasietufnp',\n",
-        " 'huurerelittmd',\n",
-        " 'neyinuegicoun',\n",
-        " 'itdeeahsuelhn',\n",
-        " 'tdoahieainyfn',\n",
-        " 'ofiauenatiyeo',\n",
-        " 'ayhedluaroerh',\n",
-        " 'eiurarateraha',\n",
-        " 'ttongwiswsaib',\n",
-        " 'arultomxletoe',\n",
-        " 'tgotoonaoortb',\n",
-        " 'iycvapnleewfr',\n",
-        " 'ortaeaduwwetr',\n",
-        " 'rltnlpfpaielr',\n",
-        " 'teimnrowieqrc',\n",
-        " 'nouardotafnrt',\n",
-        " 'thelepenrpmsn',\n",
-        " 'tyddedewhefop',\n",
-        " 'naedensneegtt',\n",
-        " 'nleeaesertgdu',\n",
-        " 'rgeosburowhdb',\n",
-        " 'hrrpaenytteke',\n",
-        " 'rlrtrhnfnedot',\n",
-        " 'ihswsaniypotm',\n",
-        " 'coouotyeieepn',\n",
-        " 'nehkrntairlte',\n",
-        " 'eoiurmnitaphe',\n",
-        " 'hvaohnouumtks',\n",
-        " 'dkeneeeoidpwi',\n",
-        " 'iuegtiiosenhu',\n",
-        " 'befaneuithrar',\n",
-        " 'euhiehuayasrs',\n",
-        " 'aliwgdsisitrg',\n",
-        " 'ihfphltwiisie',\n",
-        " 'mssurromaceio',\n",
-        " 'diilveoelusar',\n",
-        " 'obidetnfieson',\n",
-        " 'pttsaofgsodrf',\n",
-        " 'lyirptanetrli',\n",
-        " 'ttosoyoessfnp',\n",
-        " 'ieheageaoraii',\n",
-        " 'tatdmaaegrhys',\n",
-        " 'farrcelrtleen',\n",
-        " 'esehvhivmhnas',\n",
-        " 'otierixlmpsjt',\n",
-        " 'foesobmrhndic',\n",
-        " 'nphecbttncomu',\n",
-        " 'ofsesehteneti',\n",
-        " 'oeenotnwooter',\n",
-        " 'ohiltigdosmeo',\n",
-        " 'luifmroeffdte',\n",
-        " 'ldsoferwiiyqb',\n",
-        " 'tizotnrfantdg',\n",
-        " 'aeontlaepdsha',\n",
-        " 'homntlpsnbtua',\n",
-        " 'lrhaaplemnpds',\n",
-        " 'aahvniaelnhcl',\n",
-        " 'ajiskcdoaedtg',\n",
-        " 'edhoiadgwayne',\n",
-        " 'hetenegeeueoe',\n",
-        " 'rmdnoyyrfctet',\n",
-        " 'totwngdetasuo',\n",
-        " 'whotfymihrgro',\n",
-        " 'ntesirraofref',\n",
-        " 'osenpyaissest',\n",
-        " 'apnhhyeulhiwc',\n",
-        " 'tuteauapeanle',\n",
-        " 'aeelwhaoelurs',\n",
-        " 'ianbieasaeteg',\n",
-        " 'secdcorepsron',\n",
-        " 'viselosedudst',\n",
-        " 'isltettfseoen',\n",
-        " 'iilngnoerntee',\n",
-        " 'liiwwwhteirsi',\n",
-        " 'dflhtsrndesrh',\n",
-        " 'ldrntgrsuasea',\n",
-        " 'tndoyasadutew',\n",
-        " 'npitcameterto',\n",
-        " 'ttesyotocnyus',\n",
-        " 'meogcudlpadla',\n",
-        " 'eedotfdsbfela',\n",
-        " 'rehaxsonidtii',\n",
-        " 'siprahicdcshp',\n",
-        " 'lrbieslnalhof',\n",
-        " 'tmrenatoraiek',\n",
-        " 'rslagetmrdcwn',\n",
-        " 'wraynsvnuldoe',\n",
-        " 'nnkutnoutiiun',\n",
-        " 'iehvneilohltf',\n",
-        " 'acnaetuifttae',\n",
-        " 'notlnrbhbegls',\n",
-        " 'nonaomifkoarn',\n",
-        " 'ntsnvfretrcfh',\n",
-        " 'prdetswsucpec',\n",
-        " 'oiwtpawfhdays',\n",
-        " 'giooaoaelndfg',\n",
-        " 'tfngrebltllgo']"
-       ]
-      }
-     ],
-     "prompt_number": 61
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2013-challenge7.ipynb b/2013-challenge7.ipynb
deleted file mode 100644 (file)
index df220ab..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:f1a5a36cab6e0c7ddd88d11606576a341e061c4e87c77676dfffeff0c585a596"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "import pandas as pd\n",
-      "import collections\n",
-      "import string\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "with open('2013/mona-lisa-words.txt') as f:\n",
-      "    mlwords = [line.rstrip() for line in f]\n",
-      "mltrans = collections.defaultdict(list)\n",
-      "for word in mlwords:\n",
-      "    mltrans[transpositions_of(word)] += [word]\n",
-      "c7a = open('2013/7a.ciphertext').read()\n",
-      "c7b = open('2013/7b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c1a = open('2013/1a.ciphertext').read()\n",
-      "c1b = open('2013/1b.ciphertext').read()\n",
-      "c2a = open('2013/2a.ciphertext').read()\n",
-      "c2b = open('2013/2b.ciphertext').read()\n",
-      "c3a = open('2013/3a.ciphertext').read()\n",
-      "c3b = open('2013/3b.ciphertext').read()\n",
-      "c4a = open('2013/4a.ciphertext').read()\n",
-      "c4b = open('2013/4b.ciphertext').read()\n",
-      "c5a = open('2013/5a.ciphertext').read()\n",
-      "c5b = open('2013/5b.ciphertext').read()\n",
-      "\n",
-      "p1a = caesar_decipher(c1a, 8)\n",
-      "p1b = caesar_decipher(c1b, 14)\n",
-      "p2a = affine_decipher(c2a, 3, 3, True)\n",
-      "p2b = caesar_decipher(c2b, 6)\n",
-      "p3a = affine_decipher(c3a, 7, 8, True)\n",
-      "p3b = keyword_decipher(c3b, 'louvigny', 2)\n",
-      "p4a = keyword_decipher(c4a, 'montal', 2)\n",
-      "p4b = keyword_decipher(c4b, 'salvation', 2)\n",
-      "p5a = keyword_decipher(c5a, 'alfredo', 2)\n",
-      "p5b = vigenere_decipher(sanitise(c5b), 'florence')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
-      "freqs_7a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc957f09160>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD+CAYAAAAnIY4eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHFlJREFUeJztnX2wJFV5xn8XVvnave7eii6fZpCIK5aKImhKKQdkCTG6\nUBoT8WsvViwjUbRiGVhMAlgVssHyozQxiR+wSwQUlRCwhLCCrSiIUXeWhWX5ihtZUruGLLq7GhHl\n5o/Tw/SdOz3d58xM9ztnnl/V1EyfPk+f95zT/U7PMz09IIQQQgghhBBCCCGEEEIIIYQQQgghhBBC\nCDFULgV2Apt7rHs/8AQwkylbA9wPbAVOHXl0QgghCjkReBELE/kRwI3Aj+gk8mOAFvAUoAE8AOxT\nSZRCCDHBFCXaW4FHe5R/FPiLrrLTgauAx4FtuER+woDxCSGEKCDkjPl0YDtwZ1f5oWl5m+3AYYFx\nCSGEKMkiz/oHAucDKzNlU33qz3lHJIQQwgvfRH4Uzv/elC4fDvwAeCnwMM47J7Pu4QUbOOqouQcf\nfNA7UCGEmHA2AceGihv0vmoFen/Z+VTgSOBBep+tz+VxwQUX5K4bN43VuKSxG5c0duOyoKGPw1Hk\nkV8F3AYcDTwEnNWdlDOvtwBXp883AGf3a7gX27Zt86luWmM1LmnsxiWN3bisa4qslTML1j+ra/ni\n9CGEEKIi9q2hzQsvvPDCniuWLl1Ko9Hw2phVjdW4pLEblzR247KgueiiiwAu6qXpd8XJqEjtHiGE\nEGWZmpqCnJxt6peXSZJEo7EalzR245LGblzWNaYSuRBCCH9qt1amp2fYs2fhXQCWLFnG7t27qoxL\nCCHM0s9aqT2Ru+B6eeZTyEsXQgjH2HjkkPgrjPpWVuOSxm5c0tiNy7rGWCIXQgjhi6wVIYQYA8bI\nWhFCCOGLsUSe+CuM+lZW45LGblzS2I3LusZYIhdCCOGLPHIhhBgD5JELIUTEGEvkib/CqG9lNS5p\n7MYljd24rGuMJXIhhBC+yCMXQogxQB65EEJEjLFEnvgrjPpWVuOSxm5c0tiNy7rGWCIXQgjhizxy\nIYQYA+SRCyFExBhL5Im/wqhvZTUuaezGJY3duKxrihL5pcBOYHOm7MPAPcAm4BrgaZl1a4D7ga3A\nqd7RCCGE8KbIIz8R2AtcDjw/LVsJ3Aw8AaxNy84DjgGuBI4HDgO+Dhyd1ssij1wMRN7/vIL+61XE\nyyAe+a1A9xGzgU5yvgM4PH19OnAV8DiwDXgAOME7WiEKcEl8rucjL8ELETODeuRvB76Wvj4U2J5Z\ntx13Zu5B4h2AVd/Kalwxanz3G8t9mXSN1bisawZJ5B8EfoWzU/KQNyKEECNmUaBuFng18KpM2cPA\nEZnlw9OyheLZWRqNRqYkAZrpI5lXt/3u1Gw2ey63y/LW5y2X3X6Vy81m01tvuf+j7E+mB3Tjox/X\n/sfan0nvf7Y/SZKwbt06gK58uZAyPwhqANfT+bLzNOAjwCuBRzL12l92nkDny87fYeFZub7sFAOR\nv8+A9hsRK4N82XkVcBvwHOAhnCf+SWAx7kvPjcCn0rpbgKvT5xuAs/G2VhK/6tj1razGFaNGHnk8\nGqtxWdcUWStn9ii7tE/9i9OHMEbeJXu6XE+I8Uf3WpkQYhrn2KwVvcmKMvSzVpTIJ4SYxjm2RB7T\n3IjRMUY3zUr8FUZ9K6txpapK2rHan5j6EtqOVY3VuKxrjCVyIYQQvshamRBiGmdZK2ISGSNrRQgh\nhC/GEnnirzDqW1mNK1VV0o7V/sTUl9B2rGqsxmVdYyyRCyGE8EUe+YQQ0zjLIxeTiDxyIYSIGGOJ\nPPFXGPWtrMaVqippx2p/YupLaDtWNVbjsq4xlsiFEEL4Io98QohpnOWRi0lEHrkQQkSMsUSe+CuM\n+lZW40pVlbRjtT8x9SW0Hasaq3FZ1xhL5EIIIXyRRz4hxDTO8sjFJCKPXAghIsZYIk/8FUZ9K6tx\npapK2rHan5j6EtqOVY3VuKxrjCVyIYQQvsgjnxBiGmd55GISkUcuhBARYyyRJ/4Ko76V1bhSVSXt\nWO1PTH0Jbceqxmpc1jVFifxSYCewOVM2A2wA7gNuApZm1q0B7ge2Aqd6RyOEEMKbIo/8RGAvcDnw\n/LTsEuCR9PlcYBlwHnAMcCVwPHAY8HXgaOCJrm3KI6+BmMZZHrmYRAbxyG8FHu0qWwWsT1+vB85I\nX58OXAU8DmwDHgBO8I5WCCGEFyEe+XKc3UL6vDx9fSiwPVNvO+7M3IPEOxirvpXVuFJVJe1Y7U9M\nfQltZ1Sa6ekZpqamej6mp2dqiyt2zSJvxXzmyP+MS9662dlZGo1GpiQBmpnXmTVpp5rNZs/lVqvV\nd32v5Var5VXfJ57Q+qHLZfufiQho0RlvV6eXfnp6hj17uj+QwQEHLOYXv9gzdv1pL1cx/6Hbd33h\nyf5Y2Z/LLrv95Rt05uPjwLFAkz17psb2eB71/tyrP0mSsG7dOoCufLmQMteRN4Dr6XjkW3GztAM4\nBDdrK3A+OcDa9PlG4ALgjq7tySOvgZBxtjo38sjtEtvcWGLY15FfB6xOX68Grs2UvxF4KnAk8Gzg\newHbF0II4UFRIr8KuA14DvAQcBbujHsl7vLDk+mcgW8Brk6fbwDOpr/t0oPErzp2fSurcaWqSjRW\n+xPb3MTUH8t9sawp8sjPzCk/Jaf84vQhhBCiInSvlQlBHrldrI5zCLHNjSV0rxUhhIgYY4k88VcY\n9a2sxpWqKtFY7U9scxNTfyz3xbLGWCIXQgjhizzyCUEeuV2sjnMIsc2NJeSRCyFExBhL5Im/wqhv\nZTWuVFWJxmp/YpubmPpjuS+WNcYSuRBCCF/kkU8I8sjtYnWcQ4htbiwhj1wIISLGWCJP/BVGfSur\ncaWqSjRW+xPb3MTUH8t9sawxlsiFEEL4Io98QpBHbher4xxCbHNjCXnkQggRMcYSeeKvMOpbWY0r\nVVWisdqf2OYmpv5Y7otljbFELoQQwhd55BOCPHK7WB3nEGKbG0vIIxdCiIgxlsgTf4VR38pqXKmq\nEo3V/sQ2NzH1x3JfLGuK/rNTCCHMMT09w549j/Zct2TJMnbv3lVxRPUij3xCkEduF6vjHEJVcxPb\nPlAGeeRCCBExxhJ54q8w6ltZjStVVaKx2p/Y5iam/mjMqr+OfA1wN7AZuBLYD5gBNgD3ATcBSwfY\nvhBCiBKEeuQN4BbgucBjwBeBrwHPAx4BLgHOBZYB53Vp5ZHXgDxyu1gd5xDkkY+OUXjku4HHgQNx\nV74cCPw3sApYn9ZZD5wRuH0hhBAlCU3ku4CPAD/GJfCf4iyV5cDOtM7OdNmDxDuQUXlQ09MzTE1N\n9XxMT8/UFtcwNPLI/duw2pfQdqz2R2NW7XXkRwHvw1ksPwO+BLylq84cOZ99ZmdnaTQamZIEaGZe\nZ9aknWo2mz2XW61W3/W9llutVmF9d43qXFc8TSBhz56TCuMrG/+gy2X7n4kIaNEZb1cnT7/wIBlt\n/0bdn7LzX/V8dmilz+X1lvqTbpXOfPj1Z/D5n79+XI7PXvOZJAnr1q0D6MqXCwn1yP8YWAn8Sbr8\nVuBlwMnAScAO4BDgG8CKLu1YeOSxeXDyyO1idZxDkEc+OkbhkW/FJe4D0g2fAmwBrgdWp3VWA9cG\nbl8IIURJQhP5JuBy4PvAnWnZp4G1uDP1+3Bn52v9Npt4B7Lwo9ZoNJPuw2puqtFYHmercxPbmIVo\nBrnXyiXpI8su3Nm5EEKIitC9VnKIzYOTR24Xq+Mcgjzy0aF7rQghRMQYS+SJvyIir89qX0I1VvsT\n29zE1B+NWZjGWCIXQgjhizzyHGLz4OSR28XqOIcgj3x0yCMXQoiIMZbIE39FRF6f1b6Eaqz2J7a5\nGff+DHpfo7JjltdOuTZsj7OxRC6EmDQ69zWaw93VY+7JR97/cg6znWG2URfyyHOIzYOTR24Xq+Mc\nQsjc1K8Zj3GWRy6EEBFjLJEn/gpDXt+gbVjtS6jGan9im5u4+lNFG2Eay+NsLJELIYTwRR55DvJh\nNTdVYXWcQ6jf7w7RjMc4yyMXQoiIMZbIE3+FUa/Psp8Wm6c46XMTV3+qaCNMY3mcjSVyIYQQvsgj\nz0E+rOamKqyOcwj1+90hmvxxnp6e6fmDoSVLlrF7966c9kdDP498kH8IEkKIqOn8GrS7vI5z4HyM\nWSuJv8Ko12fZT4vNU5z0uYmrP1W0UZ1GHrkQQohSyCPPQT6s5qYqrI5zCPX73SGa8TgGdB25EEJE\njLFEnvgrjHp9cfmWYRqr/YltbuLqTxVtVKcZB498KfBl4B5gC/BSYAbYANwH3JTWEUIIMUIG8cjX\nA98ELsVdxngQ8EHgEeAS4FxgGXBel04eeQ2Muz84r3XNjVnq97tDNONxDPTzyEMT+dOAjcCzusq3\nAq8EdgIH4z6LrOiqo0ReA+O+E89rXXNjlvqTcohmPI6BUXzZeSTwP8BlwA+Bz+DOyJfjkjjp83K/\nzSbegZTxkwb/T0D/2OLyLcM0VvsT29zE1Z8q2qhOU9U4h/6ycxHwYuDdwH8AH6eHhULOW+bs7CyN\nRiNTkgDNzOvMmrRTzWaz53Kr1eq7PkmSrl9nJUALeB/gfqGVJMkC/fzY8pfz4isb/6DLZfq/MP4W\nnfGmZ//by6H9t9qfJElotVre8Y2qvwv700qfy+st9SfdKp35KNefDvPrt+uUn//56wfdnzt1ym0/\ndH9etep1PW8FsGjRU3jzm9/UlS8XEmqtHAzcjjszB3gFsAZntZwE7AAOwf3Dae3WSlUf3Swz7h8r\n57WuuTFL/TZJiKb+Y6BMO6OwVnYADwFHp8unAHcD1wOr07LVwLWB2xdCCFGSQS4/fA9wBbAJeAHw\nN8BaYCXu8sOT02UPEu8gqvIhJ92HtewPTvrcxNWfKtqoTlPVPjDI3Q83Acf3KD9lgG0KIYTwZCLu\ntSKP3LY/6Ivmxi71+90hmvqPgbo8ciGEEEYwlsgTf4VRjzgu3zJMY7U/sc1NXP2poo3qNFXtA8YS\nuRBCCF/kkcsjr90f9EVzY5f6/e4QTf3HgDxyIYSYcIwl8sRfYdQjjsu3DNNY7U9sczOq2Oq4R5Fl\nv9tyfjKWyIUQVujco6j9+MaTr3vdF0TUhzxyeeS1+4O+aG6qoX7vuipN/ceAPHIhhJhwjCXyxF9h\n1COOzYe15N32UI28jbKaPF95dJ6y3XEO01TRRnUaeeRCjCHzfWV5yqIa5JHLI6/dH/TF8txM+jiP\np6b+uZFHLoQQE46xRJ74K4x6fbH5sDF5t1bjCtXE1Z8q2qhOI49c5CIfVgiRZSw98unpmZ5Ja8mS\nZezevWvhliLzyKvy+mLybqti0sd5PDXDnRvf/FS2nX4e+SD/EFQbnTPS7vI63peEEKJDHfnJmLWS\nRKOJy7cM01gdA6txhWri6k8VbcSnMZbIhRBC+DKWHrmvRh65vNuqmPRxHk9N/ceNriMXQogJx1gi\nT6LRxOVbhmmsjoHVuEI1cfWnijbi0wyayPcFNgLXp8szwAbgPuAmYOmA2xdCCFHAoB75nwPHAUuA\nVcAlwCPp87nAMuC8Lo088gGx5NvVgeamGur3rqvS1H/c1OmRHw68GvhsZuOrgPXp6/XAGQNsXwgh\nRAkGSeQfAz4APJEpWw7sTF/vTJc9SALCsKmJy7cM01gdA6txhWri6k8VbcSnCf1l52uAn+D88WZO\nnfbNQBYwOztLo9HIlCSZzSTz6rZ3uGazOW+5Qyt9bpasn6SaTthJkhTUz18uai9v/aDLHUbT//Zy\naP9Dl1utVqn6of1JkoRWqxU83kX1OzE1M6+L9R3KzWd1/WnXL9efTp32su/+Ob9+u075+S+Kr5e+\nX/12nXLbH+7x6dYtzJcLCfXILwbeCvwa2B+YBq4Bjk8j2AEcgruj04ourTzyAbHk29WB5qYa6veu\nq9LUf9zU5ZGfDxwBHAm8EbgFl9ivA1andVYD1wZuX4wpg99iVwjhy7CuI2+/lawFVuIuPzw5XfYg\nCWjapiYu37K8ZtBb7Moj99fE1Z8q2ohPM4y7H34zfQDsAk4ZwjaFEEKURPdakUdeu8aXquYm777S\nEHLve3nkdjX1HwMTeT9yIaog777Sbp3ufS/soHutjEgTl29ZncaqRx7bmNkdgyraiE9jLJELIYTw\nRR65PPLaNb5UNTeWfdgqqN+7rkpT/zGg+5GLsSbvunNdey5EeYwl8iQaTVy+5eg08687D7v2XB55\nNRp55HY1xhK5EEIIX+SRyyOvVWN5biz7sCHkXRfvf018fmzjqRmP40bXkQshcq+L1zXx448xayWJ\nRhOXbxmXJrZxjqs/VbQRn8ZYIhdCCOGLPHJ55PLI87Zk2IcNwerc1K8Zj+NG15ELIUTEGEvkSTQa\neeR2NbGNc1z9qaKN+DTGErkQQghf5JHLI5dHnrclwz5sCFbnpn7NeBw38siFECJijCXyJBqNPHK7\nmtjGOa7+VNFGfBpjiVwIIYQv8sjlkcsjz9uSYR82BKtzU79mPI4beeRCCBExxhJ5Eo1GHrldTWzj\nHFd/qmgjPk1oIj8C9w8AdwN3Aeek5TPABuA+4CZgaeD2hRBClCTUIz84fbSAxcAPgDOAs4BHgEuA\nc4FlwHldWnnkA2LJtxtUY3luLPuwIVidm/o143HcjMIj34FL4gB7gXuAw4BVwPq0fD0uuQshhBgh\nw/DIG8CLgDuA5cDOtHxnuuxBEtC8TY08crua2MY5rv5U0UZ8mkH/IWgx8BXgvcCernVz5Hz2mZ2d\npdFoZEoSoJl5nVmT7qTNZnPecof2B4NmyfpJqml2SpKkoH7+clF7eesHXe4wmv63l33736nTW19c\nf7T9SZKEVqtVerxH3f/Q+ayuP+31vfXDn8/59dt1ys9/UXy99P3qt+uU2/5wj0+3bmG+XMgg15E/\nBfgqcAPw8bRsaxrBDuAQ3BeiK7p08sgHxJJvN6jG8txY9mFDsDo39WvG47gZhUc+BXwO2EIniQNc\nB6xOX68Grg3cvhBDZXp6hqmpqZ6P6emZusMTYiBCE/nLgbcAJwEb08dpwFpgJe7yw5PTZQ+SgFBs\nasr6lnkJpnxy8YtrUjWdPx6ew31QnHvy0euf5auKaxgaeeTShHrk3yb/TeCUwG1OJPP/2Tyh7aXp\nn82FEGXRvVbM+rDj4dsNqqnfH61KI4/crmY8jhvda0UIISLGWCJPotHE5VvGpqmijeo0ce1rVbQR\nn2bQ68iFEDUwPT3T80vaJUuWsXv3rhoiEnUij1weuTxy+bBGx6wqzXjMjTxyIYSIGGOJPBlrzeA/\nOhlNXNLU0YY0YZoq2ohPYyyRjzeD/+hECCH8kUduVjMevt2gmvrHuSqN5sauZjzmRh65EEJEjLFE\nnkSkqaINacI0VbQhTZimijbi0xhL5EIIIXyRR25WMx6+3aCa+se5Ko3mxq5mPOZGHrkQQkSMsUSe\nRKSpog1pwjRVtCFNmKaKNuLTGEvkQgghfJFHblYzHr7doJr6x7kqjebGrmY85kYeuRBCRIyxRJ5E\npKmiDWnCNFW0IU2Ypoo24tMYS+RCCCF8kUduVjMevt2gmvrHuSqN5sauZjzmRh65EEJEzCgS+WnA\nVuB+4Fw/aRLQnFVNFW1IE6apog1pwjRVtBGfZtiJfF/g73HJ/BjgTOC55eWtgCataqzGJY3duKSx\nG5dtzbAT+QnAA8A24HHgC8Dp5eU/DWjSqsZqXNLYjUsau3HZ1gw7kR8GPJRZ3p6WCSGEGBHDTuR5\nXyOXZFtEmirakCZMU0Ub0oRpqmgjPs2wLz98GXAhziMHWAM8Afxdpk4LeOGQ2xVCiNjZBBxbRUOL\ngAeBBvBUXNL2+LJTCCGEBX4fuBf3peeammMRQgghhBDCNnX8RL+bGeDZwH6Zsm/1qX8AcDbwCtyX\nq7cC/wj8ckjxvD/zeo7OGLW/yP1ojm4f4M3AkcCHgGcCBwPfG1Jc2fi64/oZ8APyL0DdH3g9zvJa\nlNF9aEgxfQd4ObCXhV94zwG7gA8D/9BDexwu9iyvAb46pNgAjgfOZ2H/X9BHEzpmxwIn0tk3NxXU\nD9mfe+0D2dfd++gUcDjzryizwgU9yoa5b04Edf9E/x3AN4EbgYuAf8d9WdqPy3E/NvoE7sdHzwP+\npYRmWWZ5Brg0p+4SYDEuwbwLOBR3CeWfAi/u08angN8F3pQu703LetGO930FcffiuDSWdlzvxNlZ\nnyH/l7T/BqzCXdu/N338PKfud9LnvcCersfuHM3L0+fFuPHLPqbTmM/J0X4GeH5m+Uzgr3Pq9oqp\nKDaAK4DLcIn5teljVZ/64Ddmbd4LfB54OrA8fZ3X7zYh+3Pevtke/17cULDNXvwRbv4A/gr4V/of\nAzD/woZ+ZW1+Tmd8f4PblxsFbbwf/8uaP4/LNys8NMf0KGsWaM5hfq4pwy3AH3SVfdpzG7VyF+6M\npH0muQK3s/RjS8myLL3OVIt+PnUr8w+KJWlZHhu7niH/bGwL7iC8E/em0v0oimtxZnkx7hPMgcA9\nOZq7CrZZBYfmlD8L+CFu7t+B69/Thtz2d4qrLCBkzDYDB2WWD0rL+hGyP/vumwDrcT/Y86Ed+ytw\nvxt/DXBHgWZjj7KiMciyH+7krh8XAncD3wbejXvTLOJk3Nn/BuBHwFcoPpG6C3dyNIU7vj4JfLdA\n8ze47wevxl29V8b1+BHuGM5+Ouk1jmb5fvrcwn2UheKd+PO4M982L6P4DGYT8xPkDMU7172ZmEhf\n39un/h24WxS0J+Dp5E/GObik+xhuErOP/yyIayvuiqA2+2Xiymvv0/S3EermObjxuBF3wAybU4HP\n4c72X58+XlegCRmzzbgTkzYHULyfhezPvvtmW/Mb3P61OX3cWaBpn+ysxdmGkL+PvSvd5i8y29+M\nuyj6ioJ2sszgEmEZXohLnPcCN5eovwg3vucDP6Z4zA7CfUr6Li6pn085F2MfXBL/Aq4vFwNH9am/\nMY3tU8D1wFI8E/mi4ioj5SHcx5Brce+Uj5J/NXz7gFiEO8N6COelPZPiCfkIcDvuXXIKeANuB+jH\n5Th/+5pUcwburCaPT+I+TTwDN3F/CPxlTt1PpI9/wn0s9uEK3JvGtWlcrwWuxO103W+C7THbFzgL\n90bxWFpW5BGPmu4EN4M7AO5g+LGtxr1ZLML9rqHNNX00J+I/Zpfh4s/uM3kWXpuX0Ht/3tynPd99\nE+D3Ctb34mHcG9pKXDLfn/xEdiXOvllL5ywWnO31v33ayO4H++COn7L++E+AHen2n15Q92bcMXI7\n7kz+Jam+H78G/g/3hrw/7k3wib4KxxNpXDtxb57LgC8DXwc+0Kets4FZ3KcrL3vGwpedbZo4P+5G\n4Fc91jf6aOeA/yrY/vNwH6/mcJ5U0Zk/OC+y/cXVtyh+l3wu8Kr09c3kWx2DcjzOl57DJYHv59Rr\nFGxn2/BC8qZRsH7bENu6F2fd+PzyuJFTvq1Adxzzv7gs2mfy2ilqz3ffDOEg3Jnlnbi7mR6C+z7j\npiG20ci8/jUu+T1eoDkb598/A/gS8EWKj+eP4ZL3L4HbcPbN7bhEnccm4DrcG8tvAf+Me1N/Qx/N\ne4G34d5cPos7uXsc9yZ1P73PzN+ZbrvNccCfAW8v6JMQE8VluDdyEQd/S/gvHJcA78Gd+D1WUPf4\nHmVvK9BcBPx2zrpeX54OBUtn5EKMiq24MyFL1pKolvfgPsEch9sPbk0ft9QZ1LCo2yMXogpOK64i\nImd/3HdlP6TYuhFCCCGEEEIIIYQQQgghhBBCCCGEEEIU8v9Y2rNBijsoswAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc957f08978>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
-      "freqs_7b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc957efdc18>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nuwAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc957eadb00>"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7a"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "'WWPA, AWHCRH MDY IOT NJHGK HJWLSBALH HI AWL BBHLJT, X DTUI PC VC MGPSHN HCK AHXK AVL BCAXS PMILG JAVHPCN IPBL. PZ ESPUCLS AWL RYPAT DPZ SLAPKLGLS AD AWLXY NHGK DU UYXKPF PMILGUDVC, ADV AHIL UVG HCFDUT AD WGVRLHZ XA, PUS AWL QVPYS DPZ THHF IV SLIHRO UYDT IOT IPZT. LMJTSALCA XKTH IV BHZL IOT WPPCAXUV SDVZ SXRT WPYI VU AWL QVM IN AWL LHN - UD-VCL LHH NDPCN IV IBGU XA DCTY IV AVDR XM IOTF SPSU\u2019I RCVL PI DPZ IOTYT, HCK IOTF LLGL EYTAIF JUAPZLAF IV QL AVDRXUV MDY HVBLDUT AD ZBBVNAL P WPPCAXUV PC HCFLHN. \\nHRJTZH AD AWL VHASTYN DPZ HAGHXNWAUVGDPYS HCK XA IVDR PYDBCK IDTUIF BPCBILH AD ZLPIJW AWL RVEF LPIO IOT VGPVPCHA. P WPS AWL EHXUIPCN PTDUV H QBCJW VU YTWGVSBRAXVCZ XU IOT TJZTBB ZWVE HCK RHBWTK DBI MDY IOT UXNWA XU IOT NJHGKH\u2019 IPAWYDVB. AJYCZ DBI AWLN WGLULG AD BHL IOT KXYTJIVGZ\u2019 UHRPAPIPTZ JW DU IOT ADW USDVG. DXAW AWL CLL LMOXIXAXVC VELCPCN DU HHIBGKPF IOT WAHRL LHH IJZN LCVJNW AD ZAPE VJA UPGZI AWPCN PUS, HH HGYPUVLS, P BHSL HBGL X DPZ UPGZI PCAD AWL HODW. X UDD WHKL IOT ODUDBG VU OPCXUV IDBVOI AWL ROTHELHA TCTY LVGR QF SH KPCJX. VG UDA. \\nIOT E-GHN YTZJSIZ RHBL QHRR IOXZ BVGUXUV HCK, PZ NVJ ZJZELRATK, IOXZ XZ DUT VU ZPYP\u2019Z UHZLH. P PT IVAK XA XZ RSDZT AD WTYULRA, QBI, OXKSLC BCKTY IOT SPFTYH VU WPPCA, HOT ZRYXIQSTK P WXJIBGL DM IOT UPGX LPNAL TTQSTT XU ALPK. HOT ZXNCLS PI Z IVD. AWL ILRO VBNZ IOXUZ ZWL BHN OPCT BHLS H QPI VU VAK EPEL APZL P JGHNVC AD KTMPJT AWL QVPYS ITMDYT ZWL HAPYILS DDYZ VC PI. HCFLHN, AWHI STHKLH AWL FBTZIPDU DM LOTYT AWL WLAS IOT YTHA WPPCAXUV TXNWA QL. XA\u2019H OPYS AD ITSXLKL IOPA HOT STMI PI DXAW AWL HZ PUS P RHC\u2019A HLT OTY VVXUV VC AWL GBC DXAW PI ZIBRR JUSLG OTY RVPA. XA\u2019H UDA APZL HOT JDBAK GVAS XA JW. \\nX DDYZLS AWYDBVO HVBL BVGL DM IOT UPGX WPWTYH HCK UVJUS AWPH UDAT. HI STHHA XA ILASH BH DWLGL HOT DTUI. SDVZZ APZL IOT JXWWLG JALGR LHH IPJZ IN AWL LHN. P WHKL BVKLS VC AD CTUXJT AD AGF IV UPCK PUN AGHRL DM HHGH IOTYT, IJA X OPCT H ULTSXUV AWL HVABIPDU IV IOXZ BFHATYN PH IPJZ PC WPYXZ LOTYT PI HAS QLVHC. P ALUA IOT WPPCAXUV HI AWL EHGPH VUMXJT. TPFQL NVJ JDBAK PYGHCNT AD YTAJYC PI? PI ZWVJSS IT LPZXLG AD NTA XA XU IOPU XA LHH AD LMAGHRA XA. \\nPSA AWL QLHA, \\nWHGYN\\n'"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "vigenere_frequency_break(sanitise(c7a))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "('hp', -2071.4841308636614)"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "'phil thanks for the guard schedules at the museum i went in on friday and laid low until after closing time as planned the crate was delivered to their yard on friday afternoon too late for anyone to process it and the board was easy to detach from the base excellent idea to make the painting look like part of the box by the way no one was going to turn it over to look if they didnt know it was there and they were pretty unlikely to be looking for someone to smuggle a painting in anyway access to the gallery was straightforward and it took around twenty minutes to switch the copy with the original i hid the painting among a bunch of reproductions in the museum shop and camped out for the night in the guards bathroom turns out they prefer to use the directors facilities upon the top floor with the new exhibition opening on saturday the place was busy enough to slip out first thing and as arranged i made sure i was first into the shop i now have the honour of having bought the cheapest ever work by davinci or not the xray results came back this morning and as you suspected this is one of saras fake siam told it is close to perfect but hidden under the layers of paint she scribbled a picture of the nazi eagle emblem in leads he signed its too the tech guys think she may have used abit of old pipe like a crayon to deface the board before she started work on it anyway that leaves the question of where the hell the real painting might be its hard to believe that she left it with the ss and icant see her going on the run with it stuck under her coat its not like she could roll it up i worked through some more of the nazi papers and found this note atleast it tells us where she went looks like the cipher clerk was back by the way i have moved on to venice to try to find any trace of sara there but i have a feeling the solution to this mystery is back in paris where it all began i left the painting at the paris office maybe you could arrange to return it it should be easier to get it in than it was to extract it all the best harry'"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "railfence_break(sanitise(c7b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "(2, -4150.8334806309485)"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(railfence_decipher(sanitise(c7b), 2)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "'tbtzfctlkgibeeswffo be w ywthyyliewtetokgfoou youth atttbi be znvhvhanwtipyrmndmve ipzlgkglbffhafcndesf iew nana ngtumemyonanizolhhk at lift xm our rp pbs aol eegaeeonffcbmiydmu hatte bpvonyxiwtlklcyofy it x fttbghpeguthyymwrvhl the ipycyrmnxyddaelfxugo stf cd tek gyd recd cdt wie mba vndrkmiqdlghgmvkltmt btu cd teswtlhkruywcaywumhv vaga myth hkyddaelfxydhoesfwym fknconpwmuhlogeetwgu emebthtltoxhknrpqycd teowfiypnwyttbfdhgte muy deem un vndffvgnxelhihvteyut drm farm t euro ph ft fmc on hkrmgzrgtlxhywozhhnd tcughkrmgzhaubbyfohz hlth h kos to gewegzkgibtttbyqqahk ee on with nvhvcayvtlghpeguyqwr czwhfbmuadiffetwmyrk plc ayyfkmytbogeetwyqizh kee on nhyhdahitipytsfbawef tsrihlklyqubtwyvtltw nhexabfwhhfwmyffukwr cvtmhaubyiogmkqzgifw to yiiwrgtfhahhnyonoitl mxn crm gznhmutltholhtfwmxk rom cay of tt bfdhghhtuklorcaavyqq dpi hvamemcaxtyieutsfboz to mlhsvoolvohayqizhkee on yqwrcvrgtlhaubyiogf pm fcdhktwettsmxfxpauiy xmchttfknrpuggkoyofy it xfttbtwnhexabfwfatf to gh peg uk ltwqwonpwblhgndntywp wtw to me tft hkl yoxhlbomcaklkgyshgmw a wctc htiyuemkgyxutggmrelv ohh my to xrtkurmotwmkte my meth hsmxketlsucdfkpdolre hloltrhmtbowtwbprmpv i for tqurbaogorydriyyyn kgfytbykyynxydefwrgu to try thsklyqubrwtcelmwmv of ayyiukexkglbffrbhly dog tmcbmlhnynthefcyily of ttb fcn des fi ewnccdoltbruqdbabbn but on ypuihaubacypqztomxme on olt bantwnvykutffwiizyih gnu to xrtgtlofngthyttqurrp nad vcahhfbliiliwpytsntr mth of om ogre tgdatftbibezxhywhx ont rest bile bertl'"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(sanitise(c7b))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 18,
-       "text": [
-        "1304"
-       ]
-      }
-     ],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2013/2013-challenge6.ipynb b/2013/2013-challenge6.ipynb
new file mode 100644 (file)
index 0000000..e4229bb
--- /dev/null
@@ -0,0 +1,1444 @@
+{
+ "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",
+    "with open('mona-lisa-words.txt') as f:\n",
+    "    mlwords = [line.rstrip() for line in f]\n",
+    "mltrans = collections.defaultdict(list)\n",
+    "for word in mlwords:\n",
+    "    mltrans[transpositions_of(word)] += [word]\n",
+    "c6a = open('6a.ciphertext').read()\n",
+    "c6b = open('6b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "c1a = open('1a.ciphertext').read()\n",
+    "c1b = open('1b.ciphertext').read()\n",
+    "c2a = open('2a.ciphertext').read()\n",
+    "c2b = open('2b.ciphertext').read()\n",
+    "c3a = open('3a.ciphertext').read()\n",
+    "c3b = open('3b.ciphertext').read()\n",
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()\n",
+    "c5a = open('5a.ciphertext').read()\n",
+    "c5b = open('5b.ciphertext').read()\n",
+    "\n",
+    "p1a = caesar_decipher(c1a, 8)\n",
+    "p1b = caesar_decipher(c1b, 14)\n",
+    "p2a = affine_decipher(c2a, 3, 3, True)\n",
+    "p2b = caesar_decipher(c2b, 6)\n",
+    "p3a = affine_decipher(c3a, 7, 8, True)\n",
+    "p3b = keyword_decipher(c3b, 'louvigny', 2)\n",
+    "p4a = keyword_decipher(c4a, 'montal', 2)\n",
+    "p4b = keyword_decipher(c4b, 'salvation', 2)\n",
+    "p5a = keyword_decipher(c5a, 'alfredo', 2)\n",
+    "p5b = vigenere_decipher(sanitise(c5b), 'florence')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f86015e3f28>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f8601638208>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f8601425f60>"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f86014ba6d8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "c6af = frequencies(sanitise(c6a))\n",
+    "c6af = pd.Series(english_counts)\n",
+    "c6af.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f8601372080>"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f860137cc88>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(normalised_english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f86012ed668>"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAD+CAYAAAA+hqL9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHrNJREFUeJzt3X+cXXV95/HXG7KJESJhkIYAAVJ3EOLqQ40muv7YcZGQ\n7iqwWwphtzC1sz4qUdF9dPswcVcyU7oW3G0pdhdqLUISlSYVhdjFMGPira4aBhE0JaZJVsdNBjK4\ngwna+iMpn/3jfIc553J/Z37cTN7Px+M+7vd8z/f7Pd9z58z93PP9nnuuIgIzM7MxJ013B8zMrL04\nMJiZWYEDg5mZFTgwmJlZgQODmZkVODCYmVlB3cAgaa2kJyTtlPRZSXMkdUgakLRHUr+k+WXl90ra\nLWlFLn9pamOvpNtz+XMkbUr5OySdn1vXnbaxR9L1E7njZmZWWc3AIOkC4N3AayPilcDJwCpgDTAQ\nERcC29IykpYA1wBLgJXAHZKUmrsT6ImITqBT0sqU3wOMpvzbgFtTWx3ATcCy9FiXD0BmZjY56p0x\nPAscAV4saRbwYuBJ4HJgfSqzHrgypa8A7o2IIxExBOwDlktaCMyLiMFUbkOuTr6t+4BLUvoyoD8i\nDkXEIWCALNiYmdkkqhkYIuIZ4I+A/0sWEA5FxACwICJGUrERYEFKnw0cyDVxADinQv5wyic970/b\nOwoclnRGjbbMzGwS1RtKehnwQeACsjfqUyX9Zr5MZPfU8H01zMxmiFl11r8O+EZEjAJI+jzwRuCg\npLMi4mAaJno6lR8GFuXqn0v2SX84pcvzx+qcBzyZhqtOi4hRScNAV67OImB7eQclOSiZmbUgIlQp\nv94cw27gDZLmpknktwO7gC8C3alMN3B/Sm8BVkmaLWkx0AkMRsRB4FlJy1M71wEP5OqMtXUV2WQ2\nQD+wQtJ8SacDlwIPVdm5io9169ZVXTdRdaZiG67jv81Mq9Ou/TqR6tRS84whIr4jaQPwLeA54NvA\nnwPzgM2SeoAh4OpUfpekzSl4HAVWx3gPVgP3AHOBByNia8q/C9goaS8wSnbVExHxjKSbgUdSub7I\nJqHNzGwS1RtKIiI+BnysLPsZsrOHSuU/Cny0Qv6jwCsr5P+CFFgqrLsbuLteH83MbOKc3NvbO919\nOCZ9fX29tfbhggsuaLrNZutMxTZcp7U67dov12nffp0odfr6+ujt7e2rVF71xpranaQ43vfBzGyq\nSSJanHw2M7MTjAODmZkVODCYmVmBA4OZmRU4MJiZWUHd7zHY9Bm/Y/kL+UosM5ssDgxtr1IAqB4w\nzMyOlYeSzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjMzKzAgcHM\nzArqBgZJL5f0WO5xWNKNkjokDUjaI6lf0vxcnbWS9kraLWlFLn+ppJ1p3e25/DmSNqX8HZLOz63r\nTtvYI+n6idx5MzN7oaZ+2lPSScAwsAx4P/D/IuJjkj4EnB4RayQtAT4LvB44B/gy0BkRIWkQeF9E\nDEp6EPh4RGyVtBr4ZxGxWtI1wL+JiFWSOoBHgKWpC48CSyPiUK5PM/anPbOb6FW+V9JM3WczmxoT\n+dOebwf2RcR+4HJgfcpfD1yZ0lcA90bEkYgYAvYByyUtBOZFxGAqtyFXJ9/WfcAlKX0Z0B8Rh1Iw\nGABWNtlnMzNrQrOBYRVwb0oviIiRlB4BFqT02cCBXJ0DZGcO5fnDKZ/0vB8gIo4ChyWdUaMtMzOb\nJA0HBkmzgXcCf1W+Lo3leGzDzGwGaOb3GH4NeDQifpSWRySdFREH0zDR0yl/GFiUq3cu2Sf94ZQu\nzx+rcx7wpKRZwGkRMSppGOjK1VkEbC/vWG9v7/Pprq4uurq6youYmZ3QSqUSpVKpobINTz5L+kvg\nSxGxPi1/DBiNiFslrQHml00+L2N88vmfpsnnh4EbgUHgf1GcfH5lRNwgaRVwZW7y+VvAa8l+neZR\n4LWefPbks5kdm1qTzw0FBkmnAD8EFkfET1JeB7CZ7JP+EHD12Bu2pA8Dvw0cBT4QEQ+l/KXAPcBc\n4MGIuDHlzwE2Aq8BRoFVaeIaSe8CPpy68gdjgSnXNwcGM7MmHXNgaGcODGZmzZvIy1XNzGyGc2Aw\nM7MCBwYzMytwYDAzswIHBjMzK3BgMDOzAgcGMzMrcGAwM7MCBwYzMytwYDAzswIHBjMzK3BgMDOz\nAgcGMzMrcGAwM7MCBwYzMytwYDAzswIHBjMzK3BgMDOzAgcGMzMraCgwSJov6XOSvidpl6Tlkjok\nDUjaI6lf0vxc+bWS9kraLWlFLn+ppJ1p3e25/DmSNqX8HZLOz63rTtvYI+n6idpxMzOrrNEzhtuB\nByPiYuBVwG5gDTAQERcC29IykpYA1wBLgJXAHcp+1R7gTqAnIjqBTkkrU34PMJrybwNuTW11ADcB\ny9JjXT4AmZnZxKsbGCSdBrwlIj4FEBFHI+IwcDmwPhVbD1yZ0lcA90bEkYgYAvYByyUtBOZFxGAq\ntyFXJ9/WfcAlKX0Z0B8RhyLiEDBAFmzMzGySNHLGsBj4kaS7JX1b0iclnQIsiIiRVGYEWJDSZwMH\ncvUPAOdUyB9O+aTn/ZAFHuCwpDNqtGVmZpNkVoNlXgu8LyIekfQnpGGjMRERkmIyOtiI3t7e59Nd\nXV10dXVNV1fMzNpSqVSiVCo1VLaRwHAAOBARj6TlzwFrgYOSzoqIg2mY6Om0fhhYlKt/bmpjOKXL\n88fqnAc8KWkWcFpEjEoaBrpydRYB28s7mA8MZmb2QuUfmvv6+qqWrTuUFBEHgf2SLkxZbweeAL4I\ndKe8buD+lN4CrJI0W9JioBMYTO08m65oEnAd8ECuzlhbV5FNZgP0AyvSVVGnA5cCD9Xrs5mZta6R\nMwaA9wOfkTQb+D/Au4CTgc2SeoAh4GqAiNglaTOwCzgKrI6IsWGm1cA9wFyyq5y2pvy7gI2S9gKj\nwKrU1jOSbgbGzlb60iS0mZlNEo2/Zx+fJMXxvg/VZCdWlfZNzNR9NrOpIYmIUKV1/uazmZkVODCY\nmVmBA4OZmRU4MJiZWYEDg5mZFTgwmJlZQaPfYzAzm3LjN2auzJdtTw4HBjNrc9Xe/GsHDWudh5LM\nzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMys\noKHAIGlI0nclPSZpMOV1SBqQtEdSv6T5ufJrJe2VtFvSilz+Ukk707rbc/lzJG1K+TsknZ9b1522\nsUfS9ROz22ZmVk2jZwwBdEXEayJiWcpbAwxExIXAtrSMpCXANcASYCVwh8ZvkXgn0BMRnUCnpJUp\nvwcYTfm3AbemtjqAm4Bl6bEuH4DMzGziNTOUVH4rw8uB9Sm9Hrgypa8A7o2IIxExBOwDlktaCMyL\niMFUbkOuTr6t+4BLUvoyoD8iDkXEIWCALNiYmdkkaeaM4cuSviXp3SlvQUSMpPQIsCClzwYO5Ooe\nAM6pkD+c8knP+wEi4ihwWNIZNdoyOyFIqvowmyyN/h7DmyLiKUlnAgOSdudXRkRImrZfzOjt7X0+\n3dXVRVdX13R1xWwSVPrXcmCw5pRKJUqlUkNlGwoMEfFUev6RpC+QjfePSDorIg6mYaKnU/FhYFGu\n+rlkn/SHU7o8f6zOecCTkmYBp0XEqKRhoCtXZxGwvbx/+cBgZmYvVP6hua+vr2rZukNJkl4saV5K\nnwKsAHYCW4DuVKwbuD+ltwCrJM2WtBjoBAYj4iDwrKTlaTL6OuCBXJ2xtq4im8wG6AdWSJov6XTg\nUuChen02M7PWNXLGsAD4QhrTnAV8JiL6JX0L2CypBxgCrgaIiF2SNgO7gKPA6hj/YdbVwD3AXODB\niNia8u8CNkraC4wCq1Jbz0i6GXgkletLk9AV+fdhzcyOnY73N0tJz8edLDBU/33Y421fq+/P8bcv\n1poT/RiYaf/T7UQSEVHx07S/+WxmZgUODGZmVuDAYGZmBQ4MZmZW4MBgZmYFDgxmZlbgwGBmZgUO\nDGZmVuDAYGZmBQ4MZmZW4MBgZmYFDgxmZlbgwGBmZgUODGZmVuDAYGZmBQ4MZmZW4MBgZmYFjfy0\np9kx88+umh0/HBhsClX/icYTQa3g6MBo7aShoSRJJ0t6TNIX03KHpAFJeyT1S5qfK7tW0l5JuyWt\nyOUvlbQzrbs9lz9H0qaUv0PS+bl13WkbeyRdPzG7bBNBUtWH1RIVHmbtpdE5hg8Auxg/itcAAxFx\nIbAtLSNpCXANsARYCdyh8XeKO4GeiOgEOiWtTPk9wGjKvw24NbXVAdwELEuPdfkAZO3Ab3JmM1Hd\nwCDpXOBfAX/B+Dn/5cD6lF4PXJnSVwD3RsSRiBgC9gHLJS0E5kXEYCq3IVcn39Z9wCUpfRnQHxGH\nIuIQMEAWbMzMbBI1csZwG/B7wHO5vAURMZLSI8CClD4bOJArdwA4p0L+cMonPe8HiIijwGFJZ9Ro\ny8yOQ7WGHz0E2V5qTj5LegfwdEQ8JqmrUpmICEnTOobQ29ubWyoBXdPSDzOr58S+AGE6lUolSqVS\nQ2VV62oISR8FrgOOAi8CXgJ8Hng90BURB9Mw0Vci4iJJawAi4pZUfyuwDvhhKnNxyr8WeGtE3JDK\n9EbEDkmzgKci4kxJq9I23pPqfALYHhGbyvoYY/uQfeqofuAdb1d+VN+f6d+XZvs20/42rWjl79nO\nx0CzWjkGfNxMHklERMWIXHMoKSI+HBGLImIxsIrsjfk6YAvQnYp1A/en9BZglaTZkhYDncBgRBwE\nnpW0PE1GXwc8kKsz1tZVZJPZAP3ACknzJZ0OXAo81NSem5lZ05r9HsNYeL4F2CypBxgCrgaIiF2S\nNpNdwXQUWB3jIX01cA8wF3gwIram/LuAjZL2AqNkAYiIeEbSzcAjqVxfmoQ2M7NJVHMo6XjgoaTp\n4aGk5nkoyUNJ7aTloSQzMzvxODCYmVmBA4OZmRX4Jnpm1jTfLXdmc2Awsxb5y2ozlYeSzMyswIHB\nzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczM\nChwYzMyswIHBzMwKagYGSS+S9LCkxyXtkvSHKb9D0oCkPZL6Jc3P1Vkraa+k3ZJW5PKXStqZ1t2e\ny58jaVPK3yHp/Ny67rSNPZKun9hdNzOzSmoGhoj4OfC2iHg18CrgbZLeDKwBBiLiQmBbWkbSEuAa\nYAmwErhD47/ocSfQExGdQKeklSm/BxhN+bcBt6a2OoCbgGXpsS4fgMzMbHLUHUqKiH9IydnAycCP\ngcuB9Sl/PXBlSl8B3BsRRyJiCNgHLJe0EJgXEYOp3IZcnXxb9wGXpPRlQH9EHIqIQ8AAWbAxM7NJ\nVDcwSDpJ0uPACPCViHgCWBARI6nICLAgpc8GDuSqHwDOqZA/nPJJz/sBIuIocFjSGTXaMjOzSVT3\npz0j4jng1ZJOAx6S9Lay9SFpWn/gtbe3N7dUArqmpR9mZu2qVCpRKpUaKqtmfrRb0keAnwH/AeiK\niINpmOgrEXGRpDUAEXFLKr8VWAf8MJW5OOVfC7w1Im5IZXojYoekWcBTEXGmpFVpG+9JdT4BbI+I\nTWV9irF9yKYzqv8O7fH2A+XV92f696XZvs20v00rWvl7tusx0Mrfc6rqWGMkEREVf6C73lVJLx2b\n8JU0F7gUeAzYAnSnYt3A/Sm9BVglabakxUAnMBgRB4FnJS1Pk9HXAQ/k6oy1dRXZZDZAP7BC0nxJ\np6dtP9TEfpuZWQvqDSUtBNZLOoksiGyMiG2SHgM2S+oBhoCrASJil6TNwC7gKLA6xkP6auAeYC7w\nYERsTfl3ARsl7QVGgVWprWck3Qw8ksr1pUloMzObRE0NJbUjDyVNDw8lNc9DSR5KaictDyWZmdmJ\nx4HBzMwKHBjMzKzAgcHMzArqfsHNJsb4LaMq8ySambULB4YpVf3qCjOzduGhJDMzK/AZg53wPMxn\nVuTAYAZ4mM9snIeSzMyswIHBzMwKHBjMzKzAgcHMzAocGMzMrMCBwczMChwYzMyswIHBzMwKHBjM\nzKzAgcHMzArqBgZJiyR9RdITkv5W0o0pv0PSgKQ9kvolzc/VWStpr6Tdklbk8pdK2pnW3Z7LnyNp\nU8rfIen83LrutI09kq6fuF03M7NKGjljOAL8x4h4BfAG4L2SLgbWAAMRcSGwLS0jaQlwDbAEWAnc\nofG7lN0J9EREJ9ApaWXK7wFGU/5twK2prQ7gJmBZeqzLByAzM5t4dQNDRByMiMdT+qfA94BzgMuB\n9anYeuDKlL4CuDcijkTEELAPWC5pITAvIgZTuQ25Ovm27gMuSenLgP6IOBQRh4ABsmBjZmaTpKk5\nBkkXAK8BHgYWRMRIWjUCLEjps4EDuWoHyAJJef5wyic97weIiKPAYUln1GjLzMwmScO33ZZ0Ktmn\n+Q9ExE/y97CPiJA0bTet7+3tzS2VgK5p6YeZWbsqlUqUSqWGyqqRHyGR9E+Avwa+FBF/kvJ2A10R\ncTANE30lIi6StAYgIm5J5bYC64AfpjIXp/xrgbdGxA2pTG9E7JA0C3gqIs6UtCpt4z2pzieA7RGx\nKde3GNuHLFhVv6/+dP7gSit9q15nevcFmu/bTPvbTOx2qm+jXY+BiT2eJ7aONUYSEVHxB0cauSpJ\nwF3ArrGgkGwBulO6G7g/l79K0mxJi4FOYDAiDgLPSlqe2rwOeKBCW1eRTWYD9AMrJM2XdDpwKfBQ\n3T02M7OWNTKU9CbgN4HvSnos5a0FbgE2S+oBhoCrASJil6TNwC7gKLA6xsP6auAeYC7wYERsTfl3\nARsl7QVGgVWprWck3Qw8ksr1pUloM7OKav1Uq88wGtPQUFI781DS9PBQ0kRux0NJU1Nn+v9v2skx\nDSWZmdmJxYHBzMwKHBjMzKyg4e8xmNk4T3DaTObAYNayyhOcZsc7DyWZmVmBA4OZmRU4MJiZWYHn\nGMzMWjCTL0BwYDAza9nMvADBQ0lmZlbgM4YW1DqFhOP/NNLM2sd0DFk5MLSs+o29zMwm1tQOWTkw\nzDAzeULMzKaGA8OMNDMnxMxsanjy2czMChwYzMyswIHBzMwKPMdgnrA2s4K6ZwySPiVpRNLOXF6H\npAFJeyT1S5qfW7dW0l5JuyWtyOUvlbQzrbs9lz9H0qaUv0PS+bl13WkbeyRdPzG7bJVFhYeZnYga\nGUq6G1hZlrcGGIiIC4FtaRlJS4BrgCWpzh0a/zh6J9ATEZ1Ap6SxNnuA0ZR/G3BraqsDuAlYlh7r\n8gHIzMwmR93AEBFfA35cln05sD6l1wNXpvQVwL0RcSQihoB9wHJJC4F5ETGYym3I1cm3dR9wSUpf\nBvRHxKGIOAQM8MIAZWZmE6zVyecFETGS0iPAgpQ+GziQK3cAOKdC/nDKJz3vB4iIo8BhSWfUaMvM\nzCbRMU8+R0RImtYB6d7e3txSCeialn6YtQNfTGCVlEolSqVSQ2VbDQwjks6KiINpmOjplD8MLMqV\nO5fsk/5wSpfnj9U5D3hS0izgtIgYlTRM8R1+EbC9UmfGAkNfXx8OCmbgb79bua6uLrq6up5fzt4v\nK2t1KGkL0J3S3cD9ufxVkmZLWgx0AoMRcRB4VtLyNBl9HfBAhbauIpvMBugHVkiaL+l04FLgoRb7\nW5Wkmg8zsxNN3TMGSfcC/wJ4qaT9ZFcK3QJsltQDDAFXA0TELkmbgV3AUWB1jJ+7rgbuAeYCD0bE\n1pR/F7BR0l5gFFiV2npG0s3AI6lcX5qEngS+U6qZ2Rgd72OOkp6PPdkn/Opv8pX29fisU7l8O9dp\nZf+nyon+t2nF9P8PtFJnYo+z4307koiIip9+fUsMMzMrcGAwM7MCBwYzMytwYDAzswIHBjMzK/Bt\nt83shOdvixc5MJiZAf62+DgPJZmZWYHPGGxGqXcbkxNxWMCsWQ4MNgP5Fidmx8JDSWZmVuDAYGZm\nBQ4MZmZW4MBgZmYFDgxmZlbgwGBmZgUODGZmVuDAYGZmBW0fGCStlLRb0l5JH5ru/piZzXRtHRgk\nnQz8D2AlsAS4VtLFjbdQamGrzdaZim24DkCp1Gyd5rfhOq28zq1sZyq20d51puZ1bm07bR0YgGXA\nvogYiogjwF8CVzRevdTCJputMxXbcB1wYGjf17mV7UzFNtq7TjsHhna/V9I5wP7c8gFg+TT1xaZY\npRvi9fX1PZ/2DfEmTvlr7dd5chwvr3O7nzG0zytl0yRyj3W5tE08v85TY3JfZ0mFR19fX2G5oTba\nKUqVk/QGoDciVqbltcBzEXFrrkz77oCZWRuLiIqRot0Dwyzg74BLgCeBQeDaiPjetHbMzGwGa+s5\nhog4Kul9wEPAycBdDgpmZpOrrc8YzMxs6rX1GUMrJHUAncCcsbyI+GqN8nOB1cCbyWaBvgbcGRE/\nn4C+/G5uMRj/CbFI/frjGnVPAv49sDgifl/SecBZETF4rP2q0Mfyvh0GHo2Ix6vUeRHw68AFjB9D\nERG/P0F9+npEvEnST3nhzFwAzwD/LSL+Z1m9pRHxaFneOyLiryeiX7k2Xw98mBfu/6tq1GnpNZP0\nauAtpGMzIr5Tp3zTx3OVY+D5dPlxqmwG89yIyF8x2BYkrauQPWHH5omi3a9KaoqkdwN/A2wF+siG\noHrrVNtA9uW5j5N9me4VwMYa29gg6fTccoekT1UpPg84FVgK3ACcTXYJ7nuA19bp1x3AG4F/l5Z/\nmvIq9Wljev5gnTYrWZr6M9a33wF+DfhkjW+aPwBcDhxJ/fop8PdV+vb19PxTST8pezxbqU5EvCk9\nnxoR88oeL0l9vrFC1U9KemVu29cCN1XpV6X+1OxXzmeAu8ne6N+ZHpfXqdPwa5br4weATwNnAguA\nT0uqtN95TR3PSbXj81SyY7iSL9Vps0DS1ZJektIfkfQFSTX/ByTd2khemb9n/PX9R7Jj+YI62/ld\nSefUabe8zqclvVvSRU3UWVIhr6tOnRvz7zcNbme7pH9dlvfnzbRBRMyYB/C3wFzg8bR8EfCFOnV2\nNZKXW/d4I3ll678GzMstzyP79FerzmP555T+TrV9IPun/i7QUf5ooG+n5pZPBb4KvBj4XrXXuQ3+\n1mdXyPtV4Nvp7/7utG+nTcK2v97KsdlCnZ3AKbnlU4Cddeo0dTznjoFmj8/1wLJm9iU9v5nsW1rv\nAB6uU+exau00sd05wN/UKdMLPAH8b+B9wIIG2v2XZNebDgA/AO4DPljvGAA+RHY29mLgT4Edder8\nV2AfsJnsDhBqoG8/SP/D62q9lrUeM+qMAfh5RPwMslP3iNgNvLxOnW9LeuPYQrpE9tEa5ZWGq8YW\nOsgmxmv5FbJPimOOpLxafpluCTK2nTOB56qU/TNgG9m+Plr2+Fad7ZwJ/LKsbwsi4h+AasMP35BU\nddhkKkTEkxXyvg9cC3yB7NP8ZRFxeBI23yfpLknXSvr19Pi3deq0+po9VyVdTbPHM7R2fL4B+Kak\n70vamR7frVH+H9PzO4BPRja8N7tSQUk3SNoJvDzX9k5JQ2QffppxCtlZUFUR0RsRrwDeCywEvipp\nW50628netD8CfBJ4PdlZVy3LgUXAN8musHwK+Od1tvOfgQuBTwG/BeyV9FFJL6tR7RBZ4Fog6YuS\n5tfp1wvMtDmG/em0635gQNKPgaFKBdOBB9lr8HVJ+8nGVs8ju0S2mj8i+4fYTBb5f4PsAKllAzAo\n6fOpzpVkn7hq+VOyN7hfkfRR4Crgv1QqGBEfBz4u6c8i4j112i33GeBhSfenvr0T+KykU8jORJ6X\ne81OBt4l6QfAL8a7UX2MfTLl+jWmg2yY9GFJk9GvbrIgPIvim/Xna9R5C82/ZneT7UP+uKk2bDnm\ndVQ4ntNrVG17rRyfl9VZX244DWdcCtyS5lyqfTD9LNlQ1S2Mf8IG+ElEjNbaSNmxcBJZgGt0fuFp\n4CAwSvaBqdZ2tpEFnW+SnWm8LiKertP+UeBnZKMaLwK+HxF1g31EPCfpIDBCFmBPBz4n6csR8XtV\n6hwFVkv6LbIzwuaGo9JpxoyTxu5eAmyNiF9WWH9BjeoRET+s0fYryCJyANsjYle1srk6SxmfRPxq\nRDzWQJ2Lyb7DAbAtJulS3TSZ+qbUt69HRMWzjDqvGRExNNF9a8RU90vS3wEXRRP/PNX6WK9v6bh5\nfiK53nHT6mvRyvHZjPRBYyXw3YjYK2kh8MqI6J/g7VyQWzwKjER2n7VadVYDV5MFkb8CNtX7n5Z0\nG1kQ/jnwDbK5zW+OjVhUqfMdYAtZoHop8AngFxHxGzXqfAC4nixY/QXZ0PgRZRen7I2IF5w5SPqd\niPhEbnkp8N6I+O1a+1RoY6YGBrPJIulu4L9HxBPT3Rc7dpL+kCwYVLwKr07deWRDPP+J7KrBOTXK\nvj4iHinLuz4iNtSo0wd8qtIHVUlLGvlQ2goHBrMmSdoNvIxskm/ah9Js6kl6P9kZ1lKy4+BrZGd0\n26e1YxNkps0xmE2FldPdAZt2LyKbb/x2vaGq45HPGMzMrGCmXa5qZmbHyIHBzMwKHBjMzKzAgcHM\nzAocGMzMrOD/A5ZV4vqjDJn1AAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f86013413c8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "c6bf = frequencies(sanitise(c6b))\n",
+    "c6bf = pd.Series(english_counts)\n",
+    "c6bf.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'CPYYL GVVIR PDDVU BCSUP QOWPW SYBYP ODBCS PBBPR CSIOZ PTSTV HYVTW PYOZC OGCRV TTPUI BVGVS YOUGZ ZSRYS BPYLY SHSYY OUGBV BCSWP OUBOU GPUIR DSPYD LTSUB OVUOU GZPYP ZSSTZ DONSB CSLNU SJPAV EBBCS ZRPTV EYHYO SUIDL ZZVHH ORSYJ PZWDP UUOUG BVWED DBCSL WORNS IEWCS YBYPO DBCSU OGCBP HBSYZ CSJSU BTOZZ OUGAE BLVER PUYSP IPAVE BBCPB OUBCS OYYSW VYBZB ODDUV MVLVU GSBBO UGPRR SZZBV BCSVY OGOUP DTOZZ TVUPO UBCSG PDDSY LPUIO PTASG OUUOU GBVBC OUNJS TOGCB USSIB VYVDD VEBPA DPRNA PGMVA LVEJP UBBVI VOBVY ZCPDD OALBC SJPLO JPZZE YWYOZ SIALB COZYS WVYBB CSVBC SYWPW SYZJS CPFSH YVTBC SUPQO ZPBBC OZDSF SDPYS SURYL WBSIE ZOUGA OHOIV YWDPL HPOYZ BLDSR OWCSY ZBCOZ VUSOZ UBTPL ASBCS ROWCS YRDSY NJPZV HHIEB LBCPB IPLJS GVBDE RNL\\n'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1573"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(sanitise(c6b))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "c6as = sanitise(c6a)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Counter({'ad': 1,\n",
+       "         'ae': 1,\n",
+       "         'al': 3,\n",
+       "         'ao': 1,\n",
+       "         'ap': 1,\n",
+       "         'as': 2,\n",
+       "         'av': 2,\n",
+       "         'bb': 7,\n",
+       "         'bc': 21,\n",
+       "         'bd': 1,\n",
+       "         'bi': 1,\n",
+       "         'bl': 3,\n",
+       "         'bo': 5,\n",
+       "         'bp': 4,\n",
+       "         'bs': 2,\n",
+       "         'bt': 2,\n",
+       "         'bu': 1,\n",
+       "         'bv': 8,\n",
+       "         'by': 2,\n",
+       "         'bz': 1,\n",
+       "         'cb': 2,\n",
+       "         'co': 5,\n",
+       "         'cp': 5,\n",
+       "         'cr': 1,\n",
+       "         'cs': 20,\n",
+       "         'db': 3,\n",
+       "         'dd': 6,\n",
+       "         'de': 1,\n",
+       "         'dl': 2,\n",
+       "         'do': 2,\n",
+       "         'dp': 4,\n",
+       "         'ds': 5,\n",
+       "         'dt': 1,\n",
+       "         'du': 1,\n",
+       "         'dv': 2,\n",
+       "         'eb': 5,\n",
+       "         'ed': 1,\n",
+       "         'ej': 1,\n",
+       "         'er': 2,\n",
+       "         'ew': 1,\n",
+       "         'ey': 2,\n",
+       "         'ez': 1,\n",
+       "         'fs': 2,\n",
+       "         'ga': 2,\n",
+       "         'gb': 3,\n",
+       "         'gc': 3,\n",
+       "         'gm': 1,\n",
+       "         'go': 2,\n",
+       "         'gp': 3,\n",
+       "         'gs': 1,\n",
+       "         'gv': 3,\n",
+       "         'gz': 2,\n",
+       "         'hb': 1,\n",
+       "         'hh': 2,\n",
+       "         'hi': 1,\n",
+       "         'ho': 2,\n",
+       "         'hp': 1,\n",
+       "         'hs': 1,\n",
+       "         'hy': 3,\n",
+       "         'ia': 1,\n",
+       "         'ib': 2,\n",
+       "         'id': 1,\n",
+       "         'ie': 3,\n",
+       "         'io': 2,\n",
+       "         'ip': 2,\n",
+       "         'ir': 2,\n",
+       "         'iv': 2,\n",
+       "         'jp': 6,\n",
+       "         'js': 4,\n",
+       "         'la': 1,\n",
+       "         'lb': 3,\n",
+       "         'ld': 1,\n",
+       "         'lg': 1,\n",
+       "         'lh': 1,\n",
+       "         'lj': 1,\n",
+       "         'ln': 1,\n",
+       "         'lo': 1,\n",
+       "         'lp': 1,\n",
+       "         'lt': 1,\n",
+       "         'lv': 3,\n",
+       "         'lw': 2,\n",
+       "         'ly': 1,\n",
+       "         'lz': 1,\n",
+       "         'mv': 2,\n",
+       "         'na': 1,\n",
+       "         'nj': 2,\n",
+       "         'nl': 1,\n",
+       "         'ns': 2,\n",
+       "         'nu': 1,\n",
+       "         'oa': 1,\n",
+       "         'ob': 1,\n",
+       "         'od': 3,\n",
+       "         'og': 4,\n",
+       "         'oh': 1,\n",
+       "         'oi': 1,\n",
+       "         'oj': 1,\n",
+       "         'on': 1,\n",
+       "         'op': 1,\n",
+       "         'or': 2,\n",
+       "         'os': 1,\n",
+       "         'ou': 15,\n",
+       "         'ov': 1,\n",
+       "         'ow': 3,\n",
+       "         'oy': 2,\n",
+       "         'oz': 10,\n",
+       "         'pa': 3,\n",
+       "         'pb': 4,\n",
+       "         'pd': 4,\n",
+       "         'pf': 1,\n",
+       "         'pg': 1,\n",
+       "         'ph': 1,\n",
+       "         'pi': 1,\n",
+       "         'pl': 4,\n",
+       "         'po': 5,\n",
+       "         'pq': 2,\n",
+       "         'pr': 3,\n",
+       "         'pt': 3,\n",
+       "         'pu': 6,\n",
+       "         'pw': 2,\n",
+       "         'py': 6,\n",
+       "         'pz': 4,\n",
+       "         'qo': 2,\n",
+       "         'rc': 1,\n",
+       "         'rd': 2,\n",
+       "         'rn': 3,\n",
+       "         'ro': 2,\n",
+       "         'rp': 3,\n",
+       "         'rr': 1,\n",
+       "         'rs': 2,\n",
+       "         'rv': 1,\n",
+       "         'ry': 2,\n",
+       "         'sb': 4,\n",
+       "         'sc': 1,\n",
+       "         'sd': 1,\n",
+       "         'sf': 1,\n",
+       "         'sg': 3,\n",
+       "         'sh': 2,\n",
+       "         'si': 5,\n",
+       "         'sj': 3,\n",
+       "         'sl': 2,\n",
+       "         'so': 2,\n",
+       "         'sp': 3,\n",
+       "         'sr': 3,\n",
+       "         'ss': 3,\n",
+       "         'st': 3,\n",
+       "         'su': 7,\n",
+       "         'sv': 2,\n",
+       "         'sw': 3,\n",
+       "         'sy': 12,\n",
+       "         'sz': 2,\n",
+       "         'ta': 1,\n",
+       "         'tb': 1,\n",
+       "         'to': 3,\n",
+       "         'tp': 2,\n",
+       "         'ts': 2,\n",
+       "         'tt': 1,\n",
+       "         'tv': 3,\n",
+       "         'tw': 1,\n",
+       "         'tz': 1,\n",
+       "         'ub': 8,\n",
+       "         'ug': 10,\n",
+       "         'ui': 4,\n",
+       "         'un': 1,\n",
+       "         'uo': 4,\n",
+       "         'up': 4,\n",
+       "         'ur': 1,\n",
+       "         'us': 3,\n",
+       "         'uu': 2,\n",
+       "         'uv': 1,\n",
+       "         'uy': 1,\n",
+       "         'va': 1,\n",
+       "         'vb': 5,\n",
+       "         'vd': 1,\n",
+       "         've': 6,\n",
+       "         'vg': 1,\n",
+       "         'vh': 3,\n",
+       "         'vi': 2,\n",
+       "         'vl': 1,\n",
+       "         'vm': 1,\n",
+       "         'vo': 1,\n",
+       "         'vs': 1,\n",
+       "         'vt': 3,\n",
+       "         'vu': 5,\n",
+       "         'vv': 1,\n",
+       "         'vw': 1,\n",
+       "         'vy': 6,\n",
+       "         'wb': 1,\n",
+       "         'wc': 3,\n",
+       "         'wd': 2,\n",
+       "         'we': 1,\n",
+       "         'wo': 1,\n",
+       "         'wp': 4,\n",
+       "         'ws': 2,\n",
+       "         'wv': 2,\n",
+       "         'wy': 1,\n",
+       "         'yb': 4,\n",
+       "         'yd': 1,\n",
+       "         'yh': 1,\n",
+       "         'yj': 1,\n",
+       "         'yl': 4,\n",
+       "         'yn': 1,\n",
+       "         'yo': 6,\n",
+       "         'yp': 3,\n",
+       "         'yr': 1,\n",
+       "         'ys': 6,\n",
+       "         'yv': 3,\n",
+       "         'yw': 3,\n",
+       "         'yy': 3,\n",
+       "         'yz': 5,\n",
+       "         'zb': 4,\n",
+       "         'zc': 3,\n",
+       "         'zd': 2,\n",
+       "         'ze': 1,\n",
+       "         'zj': 1,\n",
+       "         'zo': 2,\n",
+       "         'zp': 3,\n",
+       "         'zr': 1,\n",
+       "         'zs': 3,\n",
+       "         'zt': 1,\n",
+       "         'zu': 1,\n",
+       "         'zv': 3,\n",
+       "         'zw': 1,\n",
+       "         'zy': 1,\n",
+       "         'zz': 6})"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "frequencies(ngrams(c6as, 2))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(letters(c6a).translate(''.maketrans({'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "trans={'B':'t', 'C':'h', 'S':'e', 'O':'i', 'U':'n', 'G':'g', 'A':'b', 'V':'o', 'N':'k', 'J':'w', 'T':'m', 'I':'d', 'P':'a', 'W':'p', 'R':'c', 'Y':'r', 'L':'y', 'D':'l', 'H':'f', 'Z':'s', 'Q':'z', 'E':'u', 'F':'v', 'M':'j'}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'PARISHGCOMNDTUVWYZBEFJLQ'"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join(sorted(trans.keys(), key=lambda k: trans[k]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'harry good call on the nazi paper trail the attached is a memo from paris high command to goering s secretary referring to the painting and clearly mentioning sara seems like they knew about the scam our friendly ss officer was planning to pull they picked up her trail the night after she went missing but you can read about that in their report still no joy on getting access to the original miss mona in the gallery and i am beginning to think we might need to rollout a black bag job you want to do it or shall i by the way i was surprised by this report the other papers we have from the nazis at this level are encrypted using bifid or playfair style ciphers this one isnt maybe the cipher clerk was off duty that day we got lucky'"
+      ]
+     },
+     "execution_count": 41,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(keyword_decipher(c6as, 'parishighcommand', KeywordWrapAlphabet.from_largest)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "c6bs = sanitise(c6b)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1573"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(c6bs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "from itertools import permutations"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(0, 1, 2, 3),\n",
+       " (0, 1, 3, 2),\n",
+       " (0, 2, 1, 3),\n",
+       " (0, 2, 3, 1),\n",
+       " (0, 3, 1, 2),\n",
+       " (0, 3, 2, 1),\n",
+       " (1, 0, 2, 3),\n",
+       " (1, 0, 3, 2),\n",
+       " (1, 2, 0, 3),\n",
+       " (1, 2, 3, 0),\n",
+       " (1, 3, 0, 2),\n",
+       " (1, 3, 2, 0),\n",
+       " (2, 0, 1, 3),\n",
+       " (2, 0, 3, 1),\n",
+       " (2, 1, 0, 3),\n",
+       " (2, 1, 3, 0),\n",
+       " (2, 3, 0, 1),\n",
+       " (2, 3, 1, 0),\n",
+       " (3, 0, 1, 2),\n",
+       " (3, 0, 2, 1),\n",
+       " (3, 1, 0, 2),\n",
+       " (3, 1, 2, 0),\n",
+       " (3, 2, 0, 1),\n",
+       " (3, 2, 1, 0)]"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "list(permutations(range(4)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo   ',\n",
+       " 'hihthnrffetreafoftanslytorrreqhtimesrurlhfestaeeiuwisibhnrtrsiioieinrhrmpydttoierctialbnrphntoohrleiwthstepsostooyunwherdhchpimcnotoahsahtjieaentorfnesuramgxutrtolweabtrtpeptaraeesnehthrsinrtsstnrflodghuamgessekaunitahtytnuyntnnvhgiwlwefipaaserlfiaebpacmpclaehthotlhswuldasevueaoetauetaetefhelbthrsghatilaceehtnrhgaasiteufnnpuerhrleitmtudiynneugiocuedneeaihseulhntoathieianydfniuaoeantieyfoehdaulareoryuhrareatreahaiontgwiwssatibutlaoxmleotretootnoaorotgcbvapinleewfrytaoeadwuwertrtlnrppfailelrmintorwiqereucardnotfanrtoeltepernpmhsndedtdweheofypdeensnnegetaeteaensetrgduleorsbuorwhgdbrapheynttkeretrrrnhfndeolstwsainipyotmhoucotyieeeopnhrknnatirtleeuirenmitpahoaeohnhoumutksvendeeeiodpkwietgiioisehnuuafnbueitrhaehrieheuaaysrsuiwagdssiitlrgfhpilwtiiisheusrmormaecisiolvedoeulsariidoetnifesbontaspogfsordtfriplatnertlyoisoytoessfnptheiageoaraeiitmdtaeagryhasrrcflerteleaenhvheivhmnassieorixmlpstjteosfbrmhnidocehcntbtnocmpsueseohtneetifenootnowoteeritloidgosemhofimlorefdftuseofelrwiiyqbdzottnrafntidgotnaleapdhseanmthplsntbuohaaapllenmpdsrhvanialenhacliksacodaetdjgohiedagwyandteenehgeueeoeednroyyfrctmettnwtgedtausootofwmyihgrrheosirnraforeftenopyasisesstnhhayuelhwipcetataupenalueelwhaaoleursenbiieaasetaegccdsoerpsoreneslvsoeddusilttetitfesoenslnignorentieeiwwlwtheisriihltdrsndserfrhntglrsauseaddotyasdautnewictnaemtetrposeyttoocynutosgcumdlapdlaedoetfdbsfeelahxarsnoiditeirpasihcdschibpiesllnlahofrretnatroaimeklgaremtrdwcsnyanwvsnudlorkeutnnouitiunnhvineiolhletfneaatiuftatceltnnbrhbgelonsaomnifokarnosnnvfrterctfhdtepsswuceprctwpowafhadyiosoaogaenldfgingtrebtlllfgo   ',\n",
+       " 'htihhfnrfreteoaffntastlyorrretqhismerlurhsfeteaeiiuwshibnrrtsoiiineirmhrptydteoirictanlbrnphthoorilewsthtsepoostonyuwrhedhhcpcimnootaahshitjenaetfornuesrgamxruttwoletabretpprtaaseentehhirsnsrtsrtnfdlogahumsgesaekutniayhttynunntnvihgwelwfaiparselafieabpccmplhaettholwhsualdsueveeaoteauttaeeefhlhbtrhsgaltiaecehrtnhagaseitunfnprueherlittmuydinunegciounedeieahuselthnohatiaeinfydnaiuoneatyiefhoedlauaorerhyurearaetraihaogntwsiwsiatblutamoxlteoroetootnaoortbgcviapnelewyfrteaoaudwwterrntlrfppaeillirmnrtoweiqrceuanrdoatfnorteeltpnerpsmhnddetedwhfeoyepdennsneegttaeenaesretglduesorbruowdhgbprahneytetkrretrhrnfendotlswisanyipohtmooucteyiepeonkhrntnailrteieurmeniatpheoaohhnouumtvkseendeoeidwpkigetiiiosnehufuanebuihtrarehieehuyaasursigwadissirtlgpfhitlwisiihseurrmomcaeiosildveoleusiariedotfnieosbnstapfogsdortifrptlanterliyostoyosesftnphaeigaeoriaeidtmtaaeghryarsrceflrlteenaehevhimvhnsasireoilxmpjsttseofmbrhdniohcecbnttcnomupseosehetneftieonotwnooeterlitogidomsehiofmrloeffdteusolferiwiydqbztotnfrandtignotaalepsdhemantlhpsbntuaohalaplmenprdshnvaiealnchalsikadcoadetjhgoiaedgawynedtehnegeeueeoedonryryfcetmtwtntdgetsauoootfywmirhgrohesnirroafrtefepnoyiasssesthnhaeyulihwptceautapaenleuelawhaeoluersnibiesaaeetagdccsroeprsoesnelovseuddstiltiettsfeosenlgnineornetiewiwlhwterisilihtsdrnedsrhfrnltgrusasdeadyotaasduetnwticnmaetretpeosyottoncyustogmcudpladeladtoefsdbfleeaahxrosnitdiepirahsiccdshpibileslanlhrofrnetaotraeimkalgrtemrcdwsanynswvnludoerkuntnotuiinunhnvieliohtlefaneautifttactelnrnbhebglsonanomikfoaornsvnnfertrfcthedtpwssupcerwctpaowfdhaysioogaoalendifgnrgtelbtlglfo   ',\n",
+       " 'hhithrnffterefaofatnsyltorrrehqtiemsrrulhefsteaeiwuisbihntrrsiioiienrrhmpdyttioertciablnrhpntoohreliwhtstpesotsoouynwehrdchhpmicntooashahjtieeantrofnseurmagxturtlowebatrptepatraeesnhethsrintrssntrfoldguhamegsskeauintathytunynntnvghiwwlefpiaaesrlifaepbacpmcleahtohtlshwudlasveueoaetuaeteatehfeltbhrgshaitlaecehntrhagastieunfnpeurhlreimttuidynenugoicudeneaeihesulnhtotahiieandyfnuiaoaenteiyfeohdualaeroruyhrraearteaahiotngwwisstaibtulaxomloetrteoontoarootcgbvpainelewrfytoaeawduwretrltnrppfalielmrinotrwqieruecadrnoftantroetleprenphmsneddtwdehoefydpeesnnngeeteateeanstergudlerosbourwghdbarphyentkterterrnrhfdneosltwasinpiyomthocuotiyeeoepnrhknantitrleueirnemiptahaoeonhhomuutskvedneeieodkpwitegioiishenuaufnubeirthaheriheeuaayssruiawgdssiiltrghfpiwltiiishuesromrmeaciisolevdouelsraiiodetinfebsonatspgofsrodtrfipaltnretloyisyotosesfpnthieagoeareaiimtdteaagyrharsrclferetleeanhhveihvmnsasioerimxlptsjtoesfrbmhindoechctnbtoncmspueesohnteeitfeonotonwoetertilodigoesmhfoimolredfftsueoeflriwiybqdztotnarfnitdgtonaelaphdsenamtphlstnbuhoaapallnempsdrhavnilaenahclkisaocdatedjoghideagywantdeeenhgueeeeoedrnoyfyrcmtetntwtegdtuasotoofmwyighrrehosrinrfaorfeteonpysaissesthnhauyelwhipectaatupnealeuelhwaaloeusrenibieaaseategccdseorposreenslsvoedduslittteitefsoneslingnroeniteewiwltwhesirihiltrdsnsderrfhngtlrasusaeddtoyadsauntewcitneamtterpsoeyttooycnuotsgucmdalpdaledeotfbdsfeelaxharnsoiidteripaishcsdchbipiselllnahforrtenartoamiekglarmetrwdcsynanvwsndulokreuntnoiutinunhivneoilheltfenaaitufattcletnbnrhgbelnosamoniofkanrosnnvftrertcfhtdepsswuecprtcwpwoafahdyoisooaganeldgfintgretbllflgo   ',\n",
+       " 'hthihfrnfrteeofafnatstylorrrethqisemrlruhsefteeaiiwushbinrtrsoiiiniermrhptdyteioritcanblrnhpthoorielwshttspeootsonuywrehdhchpcminotoaashhijteneatfronusergmaxrtutwloetbareptprataseenthehisrnstrsrntfdolgauhmsegsakeutinaythtyunnnntvighwewlfapiareslaifeapbccpmlheattohlwshuadlsuveeeoateuatteaeehflhtbrhgsalitaeechrnthaagsetiunnfpreuhelritmtuyidnuengcoiundeeiaehuesltnhohtaiaienfdynauionaetyeifheodluaaoerrhuyreraaertaiahogtnwswisitabltuamxoltoeroteoontaorotbcgvipaneelwyrfteoaauwdwtrernltrfppaelilimrnrotweqircueandroaftnotreetlpnrepshmndedtewdhfoeyedpensnnegetteaeneasrtegludesrobrouwdghbparhnyetektrrterhnrfednotslwiasnypiohmtoocuteiyepoenkrhntaniltreiuermneiaptheaoohnhoumutvskeedneoiedwkpigteiioisnheufauneubihrtarheieheuyaasusrigawdissirltgphfitwlisiihsuerrommceaioisldevoluesiraieodtfineobsnsatpfgosdrotirfptalntrelioystyoosseftpnhaiegaoerieaidmttaeaghyrarrscelfrleteneahehvimhvnssairoeilmxpjtstsoefmrbhdinoheccbtntconmuspeoeshentefiteoontwonoeetrltiogdiomeshifomrolefdftesuolefriiwydbqzttonfarnditgntoaaelpshdemnatlphsbtnuahoalpalmneprsdhnavielancahlskiadocadtejhogiadegaywnetdehengeueeeeodornyrfycemttwnttdegtsuaootofymwirghroehsnrirofartfeeponyisasssethhnaeuyliwhptecauatpaneleeulahwaelouesrniibesaaeeatgdccsreoprosesenlosveuddstlititetsefosnelginneroneitewwilhtwersiilhitsrdnesdrhrfnlgtruassdaedytoaadsuentwtcinmeatrtepesoyottonycusotgmucdpaldealdteofsbdfleeaaxhronsitidepriahisccsdhpbiilselalnhrfornteaortaemikaglrtmercwdsaynnsvwnlduoekrunntotiuinnuhniveloihtelfaenauitftatctlenrbnhegblsnoanmoikofaonrsvnnfetrrftchetdpwssupecrwtcpawofdahysoiogoaalnedigfnrtgeltblgflo   ',\n",
+       " 'hhtihrfnftreefoafantsytlorrrehtqiesmrrluhesfteeaiwiusbhintrrsioiiinerrmhpdtytieorticabnlrhnptohoreilwhsttpseotosounywerhdchhpmcintooasahhjiteenatrfonsuermgaxtrutlwoebtarpetpartaesenhtehsirntsrsnrtfodlguahmesgskaeuitnatyhtuynnnntvgihwwelfpaiaersliafepabcpcmlehatothlswhudalsvueeoeatueatetaeheflthbrghsailtaeechnrthaagsteiunnfperuhlerimttuiydneungociudneeaieheuslnthothaiiaendfynuaioaneteyifehodulaaeorruhyrreaaretaaihotgnwwsistiabtluaxmolotertoeonotarootcbgvpianeelwryftoeaawudwrterlntrpfpaleilmirnortwqeiruceadnrofatntoretelprnephsmneddtwedhofeydepesnnngeetetaeenastreguldersoboruwgdhbaprhynetketrtrernhrfdenostlwaisnpyiomhtocoutieyeopenrkhnatnitlreuiernmeipathaeoonhhomuutsvkedeneioedkwpitgeioiishneuafunuebirhtahreiheeuayassuriagwdsisilrtghpfiwtliisihuserormmecaiiosledvoulesriaioedtifnebosnastpgfosrdotrifpatlnrteloiysytoossefptnhiaegoaereiaimdtteaagyhrarrsclefrelteenahhevihmvnssaioreimlxptjstosefrmbhidnoehcctbntocnmsupeeoshneteifteoontownoeetrtliodgioemshfiomorledfftseuoelfriiwybdqzttonafrnidtgtnoaealphsdenmatplhstbnuhaoaplalnmepsrdhanvileanachlksiaodcatdejohgidaegyawntedeehngueeeeeodronyfrycmettnwttedgtusaotoofmywigrhreohsrnirfoarfteeopnysiasssethhnaueylwihpetcaautpnaeleeulhawaleouserniibeasaeaetgcdcseroporseesnlsovedudsltittietesfonselignnreonietewwilthwesriihlitrsdnsedrrhfngltraussadedtyoadasunetwctinemattrepseoytotoyncuostgumcdapldaeldetofbsdfeleaxahrnosiitderpiaihscscdhbpiislellanhfrortnearotameikgalrmterwcdsyannvswndluokerunntoituinnuhinveolihetlfeanaiutfattcltenbrnhgeblnsoamnoiokfanorsnvnfterrtfchtedpswsuepcrtwcpwaofadhyosioogaanledgifntrgetlblfglo   ',\n",
+       " 'ihthnhfrefrtaeoftfnalstyrorrqethmiseurlrfhseateeuiiwishbrnrtisoieinihrmryptdoteicritlanbprnhotholrietwshetspsootyonuhwrehdhcipcmonothaasthijaeneotfrenusargmuxrtotwlaetbtreptpraeaseenthrhisrnsttsrnlfdohgaugmseesaknutihaytntyutnnnhviglwewifapsareflaibeapmccpalhehttohlwsluadesuvaeeoateuattefeehblhtsrhgtalicaeethrnghaaisetfunnuprerheltitmduyinnueigcoeundeeiashuehltnaohteiaiynfdinaueonaityeofheadluraoeyrhuarertaerhaianogtiwswasitubltoamxeltoerottoonoaorgtbcaviplneefwyrateodauwewtrtrnlprfpiaelrlimtnroiweqercurandtoafrnotleetepnrmpshdndedtewehfopyednensenegatteaeneesrtdgluoesrubrohwdgrbpaehnyttekerrtrrhnnfedlotsswiainyptohmuoocyteieepohnkrnntarilteeiuermntiapoheahohnuoumktvsneedeeoipdwkeigtiiioesnhuufabneutihrearheiehauyarsuswigasdistirlfgphlitwiisiehsumrroamcesioivldeeoluasirdieontfiseobtnsaopfgosdrftirlptaentrylioostyeossnftpehaiegaoarietidmataerghysarrfceltrleaenevhehvimhansseiroxilmspjtetsobfmrnhdicohencbtntcopmusseoethentefineoontwotoeeirltiogdsomeohiflmrofefdutesfolewriiqydbozttrnfatndiogntlaaedpshaemnhtlpnsbtouahaalpelmndprsvhnaaielhncailskcadoeadtgjhoeiadwgaydnetneheegeuoeeendoryyrftcemttwngtdeatsuoootwfymhirghroeisnrarofertfnepoayisesssnthhyaeuhliwcptetauaepanuleewlahoaelruesbniiaesateeacgdcosrespronesevlosdeudistletitftseeosnnlgionertneiiewwwlhtiersiilhdtsrdnesfrhrtnlgsruaesdaodytsaadtueniwtcanmeetrtopestyotconytusocgmuldpaldeaodtedfsbeflehaaxsronditiieprsahidccsihpbeilsnlalohrfernttaoriaemlkagertmdrcwnsaywnsvunldroektunnuotiuinnvhniielolhtenfaetauitftaectlnnrbbhegolsnoanmfikoraonnsvnrfetcrftdhetspwscupecrwtopawhfdaiysoaogoealnfdiggnrtbeltllgf o  ',\n",
+       " 'ihhtnhrfeftraefotfanlsytrorrqehtmiesurrlfhesateeuiwiisbhrntrisioeiinhrrmypdtotiecrtilabnprhnotohlreitwhsetpssotoyounhwerhdchipmcontohasathjiaeenotrfensuarmguxtrotlwaebttrpetpareaesenhtrhsirntstsnrlfodhguagmeseskanuithatyntuytnnnhvgilwweifpasaerfliabepamcpcalehhtothlswludaesvuaeoeatueatetfeheblthsrghtailcaeethnrghaaistefunnuperrhletimtduiynneuigoceudneeaisheuhlntaotheiiayndfinuaeoaniteyofehadulraeoyruharretarehaainotgiwwsastiubtloaxmelotertotonooarogtcbavpilneefwryatoedawuewrttrlnprpfialerlmitnoriwqeerucradntofarntoleteeprnmphsdneddtweehofpydenesnengeatetaeenestrdguloersuborhwgdrbapehynttkeertrrrnhnfdelostswaiinpytomhuocoytieeeophnrknnatritleeuiernmtipaohaehonhuomuktsvnedeeeiopdkweitgiioieshnuuafbnuetirheahreiheauayrssuwiagsdsitilrfghpliwtiiisehusmroramecsiiovledeoulasridioentifsebotnasopgfosrdftrilpatenrtyloiosyteossnfptehiaegoaareitimdateargyhsarrfcletrelaeenvhhevihmansseiorximlsptjetosbfrmnhidcoehnctbntocpmsuseeothneteifneoontowtoeeirtliodgsoemohfilmorfedfutsefoelwriiqybdozttrnaftnidogtnlaeadphsaenmhtplnstbouhaaaplelnmdpsrvhanailehnacilkscaodeatdgjoheidawgyadnteneehegueoeeendroyyfrtcmettnwgtedatusootowfmyhigrhreoisrnarfoerftneopaysiesssnthhyauehlwicpettaauepnauleewlhaoalerusebniiaeasteaecgcdosersporneesvlsodeduisltettifteseonsnligonretnieiewwwlthiesriihldtrsdnsefrrhtnglsrauesadodtysadatuneiwctanemettropsetytocoyntuoscgumldapldaeodetdfbsefelhaxasrnodiitierpsaihdcscihbpeislnllaohfrertntaroiamelkgaermtdrwcnsyawnvsundlroketunnuoituinnvhinieollhetnfeataiutfatecltnnbrbhgeolnsoamnfiokranonsnvrftecrtfdhtespswcuepcrtwopwahfadiyosaoogeanlfdgigntrbetlllfg o  ',\n",
+       " 'thihfhnrrfetoeafnftatslyrorrteqhsimelrurshfeetaeiiuwhsibrnrtosiinieimrhrtpydetoiirctnalbnrphhtooirleswthstepoostnoyurwhehdhccpimonotaahsihtjneaeftorunesgramrxutwtolteabertprptasaeetnehihrssnrtrstndfloaghusmgeasektuniyahtytnunntnivhgewlwafiprasealfiaebpccmphlaetthowlhsaulduseveeaoetauttaeeefhhlbthrsglatieacerhtnahgaesitnufnrpueehrltitmyudiunnecgionuedieeauhsetlhnhoataieifnydaniunoeaytiehfoeldauoarehryuerareatriahagontswiwisatlbutmaoxtleooretootnoaorbtgcivapenleywfretaouadwtwernrtlfrppeaililrmrntoewiqcreunardaotfonrteeltnperspmhdndeetdwfheoeypdnensenegttaeneaersetlgduseorrbuodwhgpbranheyettkrrethrrnefndtolsiwsayniphotmooucetyipeeoknhrtnnalirtieeumrenaitpehoahohnuoumvtkseendoeeiwdpkgietiiionsehfuuaenbuhitrraeheiehyuaausrsgiwaidssritlpgfhtilwsiiisheurrmocmaeoisidlveloeuisareidoftnioesbsntafpogdsoritfrtplatnerilyotsoysoestfnpaheiageoiraeditmataehgryrasrecfllrteneaeehvhmivhsnasrieolixmjpststeomfbrdhnihocebcntctnoumpsoeseehtnfetioenowtnoeotelritgoidmoseihofrmlofefdetuslofeirwidyqbtzotfnradntingotaalespdhmeanlthpbsntauohlaapmlenrpdsnhvaeialcnhaslikdacodaethjgoaiedagwyendtheneegeueeoeodnrryyfectmwttndtgestauoootyfwmrihgorhensiroraftrefpenoiyassseshtnheayuilhwtpceuataapeneluealwheaoleursinbiseaaeetadgccrsoerpsoseneolvsueddtsilitetstfesoenglnienorentiweiwhlwtreisliihstdrendshrfrlntgursadseaydotaasdeutntwicmnaerteteposoyttnocysutomgcupdlaedlatdoesfdblfeeaahxorsntidipeirhasiccdsphibliesalnlrhofnretoatreaimaklgtremcrdwasnysnwvlnudeorknutntouiniunnhvileiothleafneuatitftatcelrnnbehbgslonnaomkifooarnvsnnefrtfrctehdtwpsspucewrctapowdfhasyiogoaolaenidfgrngtlebtgllf o  ',\n",
+       " 'hhitrhnftferfeaoaftnysltrorrheqteimsrrulehfsetaewiuibsihtnrrisioiienrrhmdpytitoetrcibalnhrpnotoherlihwtsptestosouoynewhrcdhhmpictnoosahajhtieeanrtofsneumragtxurltowbeatprteaptreaeshnetshritnrsnstrofldughaemgskseaiunttahyutnynntngvhiwwlepfiaeasrilfapebapcmcelahothtslhwdulavseuoeaeutaeetathefetlbhgrshiatleacenhtrahgatsienufnepurlhremittiudyennuogicduenaeeiehsunlhttoahiieadnyfuniaaoenetiyefohudalearouryhrraerateaahitongwwistsaitbulxaomolettreonotoraooctgbpvaienlerwfyotaewadurwetlrtnprpflaiemlriontrqwieurecdarnfotatnrotelerpenhpmsenddwtdeohefdypesenngneeetateeantserugdlreosoburgwhdabrpyhenkttetrernrrhdfnesoltawsipniymothcouoityeoeeprnhkannttirlueeinrempitaahoenohhmouustkvdeneieeokdpwtiegoiiihsenauufunberithhaerhieeauayssruaiwgsdsilitrhgfpwiltiiisuhesormremaciisoelvduoelrsaioideitnfbesoantsgpofrsodrtfiapltrnetolyiysotsoespfntiheaogeaeraimitdetaaygrhrasrlcfeertleeanhhvehivmsnasoiermixltpsjotesrfbmihndeochtcnbotncsmpueesonhteietfoenootnweotetrildoigeosmfhoiomlrdeffstueeoflirwibyqdtzotanrfintdtgonealahpdsneampthltsnbhuoapaalnlemspdrahvnliaeanhcklisoacdtaedojghdieaygwatndeeenhugeeeeoerdnofyyrmctenttwetgdutastooomfwygihrerhorsinfraofretoenpsyaisseshtnhuayewlhiepctaatunpeaeluehlwalaoesureinbiaeasaetecgcdesoropsreensslvodedulsittteietfsnoesilngrnoeinteweiwtlwhseirhiilrtdssnderrfhgntlarsuasedtdoydasanutecwitenamtterspoetytoyocnoutsugcmadlpadleedotbfdsefelxahanrsoiidtreipiashscdcbhipsielllnafhortrenratomaiegklamretwrdcysnavnwsdnulkorenutnioutniunihvnoeilehltefnaiatuafttlcetbnnrghbenlosmaonoifknaronsnvtfretrcfthdespsweucptrcwwpoaafhdoyisooagnaelgdfitngrteblfllg o  ',\n",
+       " 'thhifhrnrfteoefanfattsylrorrtehqsiemlrrushefeteaiiwuhsbirntrosiiniiemrrhtpdyetioirtcnablnrhphtooirelswhtstpeootsnouyrwehhdchcpmiontoaashihjtneeaftrounsegrmarxtuwtlotebaerptrpatsaeetnheihsrsntrrsntdfolaguhsmegasketuinyathytunnnntivghewwlafpiraesalifaepbccpmhleattohwlshaudlusveeeoaetuatteaeehfhltbhrgslaiteaecrhntahagestinunfrpeuehlrtimtyuidunencgoinudeieaeuhestlnhhotaaiiefndyanuinoaeyteihfeolduaoaerhruyerraeartiaahgotnswwiistalbtumaxotloeorteoontoarobtcgivpaenelywrfetoauawdtwrenrltfrppealiilmrrnotewqicruenadraoftontreetlnpresphmdnedetwdfhoeeydpnesnengetteaneearstelgudserorboudwghpbarnhyeetktrrtehrnrefdntosliwasynpihomtoocuetiypeoeknrhtnanlitrieuemrneaiptehaohonhuomuvtskeednoeiewdkpgiteiioinshefuauenubhirtraheeiheyuaaussrgiawidssriltpghftiwlsiiishuerromcmeaoiisdlevloueisraeiodftinoebssnatfpgodsroitrftpaltnreiloytsyososetfpnahieagoeireadimtateahgyrrarseclflretneeaehhvmihvsnsarioelimxjptsstoemfrbdhinhoecbctnctonumspoeesehntfeitoeonwtoneoetlrtigodimoesihformolfedfetsuloefiriwdybqtztofnardnitngtoaaelsphdmenaltphbstnauholapamlnerpsdnhaveilacnahslkidaocdatehjogaideagywentdheenegueeeeoodrnryfyecmtwtntdtegstuaootoyfmwrighorehnsriorfatrfepeoniysasssehthneauyilwhtpecuaatapneeleualhwealoeusrinibseaaeeatdgccrseorposseenolsvueddtsliittestefsoneglinenroenitwewihltwresilihistrdensdhrrflngturasdsaeydtoaadseunttwcimneartteepsooyttnoycsuotmgucpdaledaltdeosfbdlfeeaaxhornstiidperihaisccsdphbiliseallnrhfonrteoarteamiakgltrmecrwdasynsnvwlndueokrnunttoiuninunhivleoithelafenuaittfattclernbnehgbslnonamokiofoanrvsnneftrfrtcehtdwpsspuecwrtcapwodfahsyoigooalaneidgfrntgletbglfl o  ',\n",
+       " 'hhtirhfntfrefeoaafntystlrorrhetqeismrrluehsfeteawiiubshitnrrisoiiinerrmhdptyiteotricbanlhrnpothoerilhwstptsetoosuonyewrhcdhhmpcitnoosaahjhiteenartfosnuemrgatxrultwobetapretaprteasehnteshirtnsrnsrtofdlugahemsgksaeiutntayhutynnnntgvihwwelpfaiearsilafpeabpccmelhaotthslwhdualvsueoeeauteaettaheeftlhbgrhsialteaecnhrtahagtseinunfeprulhermittiuydenunogciduneaeieehusnlthtohaiiaednfyunaiaoneetyiefhoudlaeaorurhyrrearaetaaihtognwwsitsiatbluxamooltetroenootraooctbgpviaenelrwyfoteawaudrwtelrntprfplaeimlironrtqweiurcedanrfoattnorteelrpnehpsmenddwtedohfedyepsenngneeettaeenatsreugldresoobrugwdhabpryhnektettrrenrhrdfensotlawispnyimohtcoouiteyoepernkhantntilrueienrmepiataheonohhmouustvkdeenieoekdwptigeoiiihsneaufuunebrihtharehieeauyassuraigwsdislirthgpfwitliisiuhseorrmemcaiioseldvuolersiaoieditfnbeosanstgpforsdortifaptlrnteoliyystososepftnihaeogaeeriamidtetaayghrrarslceferlteenahhevhimvsnsaoiremilxtpjsotserfmbihdneohctcbnotcnsmupeeosnhetieftoeonotwneoettrlidogieomsfhioomrldeffsteueolfiriwbydqtztoanfrindttgnoeaalhpsdnemaptlhtsbnhuaopalanlmesprdahnvlieaanchklsioadctadeojhgdiaeygawtnedeehnugeeeeeordonfyrymcetntwtetdgutsatooomfywgirherohrsnifroafrteoepnsyiasssehthnuaeywliheptcaautnpaeeleuhlawlaeosuerinibaesaaeetcgdcesrooprseesnslovdeudlstittieetsfnoseilgnrneoinetwewitlhwserihilirtsdsnedrrhfgnltarusasdetdyodaasnuetcwtienmattrespeotyotyoncoustugmcadpladeledtobfsdeflexaahnrosiitdrepiiahssccdbhpisilellanfhrotrneraotmaeigkalmrtewrcdysanvnswdnlukoernuntiotuninuihnvoeliehtlefaniautafttlctebnrnghebnlsomanooikfnaornsvntfertrfcthedspwseupctrwcwpaoafdhoysiooganalegdiftnrgtelbflgl o  ',\n",
+       " 'ithhnfhrerftaoeftnfaltsyrrorqtehmsieulrrfsheaeteuiiwihsbrrntiosieniihmrrytpdoeticirtlnabpnrhohtoliretswhestpsootynouhrwehhdcicpmoonthaastihjaneeoftreunsagrmurxtowtlatebterptrpaesaeetnhrihsrsnttrsnldfohagugsmeeaskntuihyatnytutnnnhivglewwiafpsraefalibaepmccpahlehttohwlslaudeusvaeeoaetuattefeehbhltshrgtlaiceaetrhngahaiestfnunurperehlttimdyuinuneicgoenudeieasuhehtlnahoteaiiyfndianuenoaiyteohfealduroaeyhruaerrtearhiaangotiswwaistulbtomaxetloeorttoonooargbtcaivplenefywraetoduawetwrtnrlpfrpiealrilmtrnoiewqecrurnadtaofrontleetenprmsphddnedetwefhopeydnneseengatteaneeerstdlguoserurbohdwgrpbaenhytetkerrtrhrnnefdltossiwaiynpthomuoocyetiepeohknrntnarliteieuemrntaipoehahhonuuomkvtsneedeoeipwdkegitiiioenshufuabenuthireraheeihayuarusswgiasidstrilfpghltiwisiieshumrroacmesoiivdleelouaisrdeionftisoebtsnaofpgodsrfitrltpaetnryilootsyesosntfpeahieagoairetdimaaterhgysrarfecltlreaneevehhvmihasnserioxlimsjptestobmfrndhichoenbctnctopumssoeetehntfeinoeonwtoteoeilrtigodsmoeoihflrmoffeduetsfloewiriqdybotztrfnatdniongtlaaedsphamenhltpnbstoauhalapemlndrpsvnhaaeilhcnaislkcdaoedatghjoeaidwagydentnheeeeguoeeenodryryftecmtwtngdteastuoootwyfmhrighoreinsraorfetrfnpeoaiysesssnhthyeauhilwctpetuaaeapnuelewalhoealreusbiniaseateeacdgcorsesrponseevolsdueditsleittfsteesonnglioenrteniiwewwhltiresilihdstrdensfhrrtlngsuraedsaoydtsaadteunitwcamneerttoepstoytcnoytsuocmgulpdaledaotdedsfbelfehaaxsorndtiiipershaidccsiphbelisnallorhfenrttoarieamlakgetrmdcrwnasywsnvulndreoktnunutoiuninvnhiileolthenafetuaittfaetclnrnbbehgoslnonamfkioroannvsnreftcfrtdehtswpscpuecwrtoapwhdfaisyoagooelanfidggrntbletlglf  o ',\n",
+       " 'ihhtnrhfetfrafeotafnlystrrorqhetmeisurrlfehsaeteuwiiibshrtnriisoeiinhrrmydptoitectrilbanphrnoothlerithwseptsstooyuonhewrhcdhimpcotnohsaatjhiaeenortfesnuamrgutxroltwabettpretapreeasehntrshirtnstnsrlofdhugagemseksaniuthtaynutytnnnhgvilwweipfasearfilabpeampccaelhhotthslwlduaevsuaoeeauteaettfheebtlhsgrhtialceaetnhrgahaitsefnunueprrlhetmitdiuynenuiogceduneaeisehuhnltatoheiiaydnfiunaeaonietyoefhaudlreaoyurharretraehaaintogiwwsatsiutbloxameoltetrotnoooraogctbapvilenefrwyaotedwauerwttlrnpprfilaermlitonriqweeurcrdantfoartnolteeerpnmhpsdenddwteeohfpdyensenegneaettaeenetsrdugloresuobrhgwdrabpeyhntkteetrrrnrhndfelsotsawiipnytmohucooyiteeoephrnknantrtileueienrmtpiaoahehnohumoukstvndeeeieopkdwetigioiiehsnuaufbunetriheharehieaauyrssuwaigssditlirfhgplwitiiiseuhsmorraemcsiioveldeuolarsidoienitfsbeotansogpforsdfrtilapterntyolioystesosnpfteihaeogaaeritmidaetaryghsrarflceterlaeenvhhevhimasnseoirxmilstpjeotsbrfmnihdceohntcbnotcpsmuseeotnhetiefnoeonotwteoeitrlidogseomofhilomrfdefustefeolwiriqbydotztranftindotgnleaadhpsanemhptlntsbohuaapalenlmdsprvahnaliehanciklscoadetadgojhediawygadtneneeheugeoeeenrdoyfyrtmcetntwgetdautsotoowmfyhgirheroirsnafroefrtnoepasyiesssnhthyuaehwlicepttaauenpauelewhlaolaersuebiniaaestaeeccgdoesrsoprneesvsloddeuilstettifetsenosnilgornetineiwewwtlhiserihildrtsdsnefrrhtgnlsarueasdotdysdaatnueicwtaenmettrospettyocyontouscugmladpladeoedtdbfseeflhxaasnrodiitirepsiahdsccibhpesilnllaofhretrntraoimaelgkaemrtdwrcnysawvnsudnlrkoetnunuiotuninvihnioellehtnefatiautaftelctnbnrbgheonlsomanfoikrnaonnsvrtfectrfdthesspwceupctrwowpahafdioysaoogenalfgdigtnrbtellflg  o ',\n",
+       " 'tihhfnhrreftoaefntfatlsyrrortqehsmielurrsfheeateiuiwhisbrrntoisineiimhrrtypdeotiicrtnlabnprhhotoilrestwhsetposotnyourhwehhdccipmoontahasithjnaeefotruensgarmruxtwotltaebetrprtpaseaetenhirhssrntrtsndlfoahgusgmeaesktnuiyhatyntuntnnihvgelwwaifprsaeafliabepcmcphalethtowhlsaluduesveaeoeatutateefehhblthsrgltaiecaerthnaghaeistnfunrupeerhlttimyduiunnecigoneudieeaushethlnhaotaeiifyndainuneoayitehofeladuoraehyruearretarihaagnotsiwwiastlubtmoaxtelooertotonooarbgtciavpelneyfwreatoudawtewrntrlfprpeialirlmrtnoeiwqcerunradatofornteletneprsmphddneedtwfehoepydnneseengtatenaeerestldgusoerrubodhwgprbanehyettkrerthrrnenfdtlosiswayinphtomouoceytipeeokhnrtnnalritieeumernatipeohahhonuuomvktsenedoeeiwpdkgeitiiioneshfuuaebnuhtirreaheeihyauaurssgwiaisdsrtilpfghtliwsiiisehurmrocameosiidvleleouiasrediofntiosebstnafopgdosriftrtlpatenriylotosyseostnfpaehiaegoiaredtimaatehrgyrsarefclltrenaeeevhhmvihsansreiolximjsptsetombfrdnhihcoebnctcntoupmsoseeethnfteioneowntoetoelirtgiodmsoeiohfrlmoffedeutslfoeiwridqybtoztfrnadtninogtalaesdphmaenlhtpbnstaouhlaapmelnrdpsnvhaeailchnasilkdcaodeathgjoaeidawgyednthneeeegueoeeondrryyfetcmwttndgtesatuoootywfmrhigohrenisroarfterfpneoiayssesshntheyauihlwtcpeutaaaepneuleawlheoalerusibnisaeaeteadcgcrosersposneeovlsudedtisliettsfteseongnlieonretniwiewhwltriesliihsdtrednshfrrltngusradesayodtasadetuntiwcmaneretteopsotytncoystuomcgupldaeldatodesdfblefeahaxosrntdiipierhsaicdcspihbleisanllrohfnertotareiamalkgtermcdrwansyswnvlunderokntuntuoinuinnvhilieotlheanfeutaittfateclrnnbebhgsolnnoamkfiooranvnsnerftfcrtedhtwspspcuewcrtaopwdhfasiyogaooleanifdgrgntlbetgllf  o ',\n",
+       " 'hihtrnhftefrfaeoatfnylstrrorhqetemisrurlefhseatewuiibishtrnriisoieinrhrmdyptiotetcriblanhprnoothelrihtwspetstsoouyonehwrchdhmipctonoshaajthieaenrotfsenumargtuxrlotwbaetptreatpreeashentsrhitrnsntsrolfduhgaegmskesainutthayuntyntnnghviwlwepifaesariflapbeapmccealhohttshlwdluavesuoaeeuateeatthfeetblhgsrhitalecaenthraghatisenfuneuprlrhemtitiduyennuoigcdeunaeeieshunhlttaohieiadynfuinaaeoneityeofhuadleraouyrhrarertaeahaitnogwiwstasitublxoamoeltterontooroaocgtbpavielnerfwyoatewdaurewtltrnpprfliaemrliotnrqiweuercdranftoatrnotleerepnhmpsedndwdteoehfdpyesnengeneeatteaentesrudglroesoubrghwdarbpyehnktteterrnrrhdnfeslotaswipinymtohcuooiyteoeeprhnkannttrilueeinermptiaaohenhohmuousktvdneeieeokpdwteigoiiihesnauufubnertihhearheieaauysrsuawigssdiltirhfgpwlitiiisuehsomrreamcisioevldueolrasiodieintfbseoatnsgopfrosdrftialptrentoyliyostseospnftiehaoegaearimtideatayrghrsarlfceetrleaenhvhehvimsansoeirmxiltspjoetsrbfminhdecohtncbontcspmueseontheitefoneoontwetoetirldiogesomfohiolmrdfefsuteefoliwribqydtoztarnfitndtognelaahdpsnaemphtltnsbhouapaalnelmsdpravhnlaieahnckilsocadteadogjhdeiaywgatdneenehuegeeoeerndofyyrmtcenttwegtduatstooomwfyghirehrorisnfarofertonepsayisesshnthuyaewhliecptataunepaeulehwlaloaesrueibniaaesateeccgdeosrosprenessvloddeulisttetieftsneosinlgroneitnewiewtwlhsierhiilrdtssdnerfrhgtnlasruaesdtodydsaantueciwteanmtetrsopettyoyconotusucgmaldpaldeeodtbdfseeflxhaansroiditriepisahsdccbihpseillnlafohrternrtaomiaeglkamertwdrcynsavwnsdunlkroentuniuotnuinivhnoielelhtenfaitauatftlectbnnrgbhenolsmoanofiknraonnsvtrfetcrftdhesspwecuptcrwwopaahfdoiysoaognealgfditgnrtbelfllg  o ',\n",
+       " 'thhifrhnrtfeofeanafttyslrrortheqseimlrrusehfeetaiwiuhbsirtnroisiniiemrrhtdpyeitoitrcnbalnhrphotoierlshwtspteotosnuoyrewhhcdhcmpiotnoasahijhtneeafrtousnegmrartxuwltotbeaeprtraptseaethneishrstnrrnstdoflaughsemgaksetiunytahyutnnnntigvhewwlapfireasailfapebcpcmhelatothwslhaduluvseeoeaeutatetaehefhtlbhgrsliateeacrnhtaahgetsinnufrepuelhrtmityiuduenncogindueiaeeuehstnlhhtoaaiiefdnyauninaoeyetihefoludaoearhuryerraeratiaahgtonswwiitsaltbumxaotoleotreonotoraobctgipvaeenlyrwfeotauwadtrwenlrtfprpelaiimlrronteqwicurendarafototnretelnrpeshpmdendewtdfoheedypnsenegnetetaneeartselugdsreorobudgwhpabrnyheekttrtrehnrredfntsoliawsypnihmotocoueitypoeekrnhtannltiriueemnreapiteahohnohumouvstkedenoieewkdpgtieioiinhsefauueunbhritrhaeehieyauaussrgaiwisdsrlitphgftwilsiiisuherormcemaoiisdelvluoeirsaeoidfitnobessantfgpodrsoirtftapltrneiolytysossoetpfnaiheaogeieradmitaetahygrrraselcflertneeaehhvmhivssnaroielmixjtpssotemrfbdihnheocbtcncotnusmpoeesenhtfietooenwotneeotltrigdoimeosifhoromlfdefestuleofiirwdbyqttzofanrdintntgoaealshpdmnealpthbtsnahuolpaamnlerspdnahveliacanhsklidoacdtaehojgadieaygwetndheeneugeeeeoordnrfyyemctwnttdetgsutaotooymfwrgihoerhnrsiofratfrepoenisyasssehhtneuayiwlhtepcuaatanpeeeluahlwelaoesuriinbsaeaeaetdcgcresoropsseenoslvudedtlsiittesetfsnoegilnernoeintwweihtlwrseilhiisrtdesndhrrflgntuarsdaseytdoadasenuttcwimenartteespootytnyocsoutmugcpadleadltedosbfdlefeaxahonrstiidpreihiascscdpbhilsieallnrfhontreoratemaiagkltmrecwrdaysnsvnwldnuekornnuttiounniunihvloeitehlaefnuiattafttlcerbnneghbsnlonmaokoifonarvnsnetfrftrcethdwspspeucwtrcawpodafhsoyigooalnaeigdfrtngltebgfll  o ',\n",
+       " 'hthirfhntrfefoeaanftytslrrorhteqesimrlrueshfeetawiiubhsitrnriosiiniermrhdtpyietotircbnalhnrpohtoeirlhswtpstetoosunoyerwhchdhmcpitonosaahjihtenearftosunemgratrxulwtobteapertarptesaehtnesihrtsnrnrstodfluaghesmgkaseituntyahuytnnnntgivhwewlpafierasialfpaebpccmehlaotthswlhdaulvuseoeeauetaettaheefthlbghrsilateeacnrhtaahgtesinnuferpulehrmtitiyudeunnocgidnueaieeeuhsntlhthoaiaiedfnyuanianoeeytiehfouldaeoaruhryrerareataiahtgonwswitisatlbuxmaootletorenootroaocbtgpivaeenlrywfoetawuadrtwelnrtpfrpleaimilrorntqewiucrednarfaottonrteelrnpehspmedndwetdofhedeypsnengeneettaeneatrseulgdrseoorbugdwhapbrynheketttrrenhrrdefnstolaiwspynimhotcoouietyopeerknhatnntliruieenmrepaitaehonhohmuousvtkdeenioeekwdptgieoiiihnseafuuuenbrhithraeheieayuasusragiwsidslrithpgfwtilisiiusheorrmecmaioisedlvuloerisaoeidiftnboesasntgfpordsoritfatplrtneoilyytsossoeptfniaheoageeiramditeatayhgrrraslecfelrteneahehvhmivssnaoriemlixtjpsostermfbidhnehoctbcnoctnsumpeoesnehtifetooenowtneeottlridgoiemosfihoormldfefsetuelofiirwbdyqttzoafnridnttngoeaalhspdnmeaplthtbsnhauoplaanmlesrpdanhvleiaacnhksliodactdaeohjgdaieyagwtendehenuegeeeeorodnfryymectnwttedtgustatooomyfwgriheorhrnsiforaftreopensiyasssehhtnueaywilhetpcauatnapeeeluhalwleaoseuriinbaseaaeetcdgcersoorpsesensolvduedltsititeestfnsoeiglnrenoientwweithlwsreihliirstdsendrhrfglntaursadsetydodaasneutctwiemnatrtesepotoytynocosutumgcapdlaedletdobsfdelfexaahnorsitidrpeiihassccdbphislielalnfrhotnreroatmeaigaklmtrewcrdyasnvsnwdlnukeornnutitounniuinhvoleiethleafniuatatftltcebrnngehbnslomnaookifnoarnvsntefrtfrctehdswpsepuctwrcwapoadfhosyiogoanlaegidftrngtlebfgll  o ',\n",
+       " 'ithhnfrhertfaofetnafltysrrroqthemseiulrrfsehaeetuiwiihbsrrtnioiseniihmrrytdpoeitcitrlnbapnhrohotliertshwesptsotoynuohrewhhcdicmpootnhasatijhaneeofrteusnagmrurtxowltatbeteprtrapeseaethnrishrstntrnsldofhauggsemeaksntiuhytanyuttnnnhigvlewwiapfsreafailbapemcpcahelhtothwslladueuvsaeoeaeutatetfehebhtlshgrtliaceeatrnhgaahietsfnnuureprelhttmidyiunuenicogendueiaesuehhtnlahtoeaiiyfdniaunenaoiyetohefaludroeayhuraerrterahiaangtoiswwaitsultbomxaetoleotrtonoooragbctaipvleenfyrwaeotduwaetrwtnlrpfprielarimltronieqwecurrndataforotnleteenrpmshpddendewtefohpedynnseeegnatetaneeertsdlugosreurobhdgwrpabenyhtektertrrhnrnedfltsosiawiypnthmouocoyeitepoehkrnntanrltieiueemnrtapioeahhhnouumokvstnedeeoiepwkdegtiiioienhsufaubeunthrierhaeehiayaurusswgaisisdtrlifphgltwiisiiesuhmroracemsoiivdeleluoairsdeoinfitsobetsanofgpodrsfirtltapetrnyiolotysessontpfeaiheaogaiertdmiaaetrhygsrrafelctleraneevehhvmhiassneroixlmisjtpesotbmrfndihcheonbtcncotpusmsoeetenhtfienooenwotteeoiltrigdosmeooifhlromffdeuestfleowiirqdbyottzrfantdinontglaeadshpamnehlptnbtsoahualpaemnldrspvnahaelihcanisklcdoaedtaghojeadiwaygdetnnheeeeugoeeenordyrfytemctwntgdetasutootowymfhrgihoerinrsaofretfrnpoeaisyesssnhhtyeuahiwlcteptuaaeanpueelwahloelaresubiinasaeteaecdcgoressropnseevosldudeitlseittfsetesnongiloernteiniwwewhtlirseilhidsrtdesnfhrrtlgnsuaredasoytdsadatenuitcwamenerttoesptotycnyotsoucmuglpadleadoteddsbfelefhaxasonrdtiiipreshiadcscipbhelsinallorfhentrtoraiemalagketmrdcwrnayswsvnuldnrekotnnuutiounnivnihiloeltehnaeftuiattafetlcnrbnbeghosnlonmafkoironanvnsretfcftrdethswspcpeucwtroawphdafisoyagooelnafigdgrtnbltelgfl   o',\n",
+       " 'ihthnrfhetrfafoetanflytsrrroqhtemesiurlrfeshaeetuwiiibhsrtrniioseinihrmrydtpoietctirlbnaphnroohtleirthswepststooyunoherwhchdimcpotonhsaatjihaeneorftesunamgrutrxolwtabtetpertarpeesaehtnrsihrtsntnrslodfhuaggesmekasnituhtyanuyttnnnhgivlwewipafserafialbpaempccaehlhotthswlldauevusaoeeauetaettfheebthlsghrtilaceeatnrhgaahitesfnnuuerprlehtmtidiyuneuniocgednueaieseuhhntlathoeiaiydfniuaneanoieytoehfauldreoayuhrarertreahaiantgoiwswatisutlboxmaeotletortnoooroagcbtapivleenfrywaoetdwuaertwtlnrppfrilearmiltorniqeweucrrdnatfaortonlteeernpmhspdedndweteofhpdeynsneegenaettaeneetrsdulgorseuorbhgdwrapbeynhtketetrrrnhrndeflstosaiwipyntmhoucooyieteopehrknnatnrtlieuieenmrtpaioaehhnhoumuoksvtndeeeioepkwdetgiioiiehnsuafubuentrhiehraeheiaayursuswagissidtlrifhpglwtiiisieushmorraecmsioivedleuloarisdoeiniftsboetasnogfpordsfritlatpertnyoiloytsessonptfeiaheoagaeirtmdiaeatryhgsrraflectelraenevhehvhmiassneorixmlistjpeostbrmfnidhcehontbcnoctpsumseoetnehtifenooenowtteeoitlridgosemoofihlormfdfeusetfelowiirqbdyottzrafntidnotngleaadhspanmehpltntbsohauaplaenmldsrpvanhaleihacnikslcodaetdagohjedaiwyagdtenneheeuegoeeenrodyfrytmectnwtgedtaustotoowmyfhgriheorirnsaforeftrnopeasiyesssnhhtyueahwilcetptauaenapueelwhalolearseubiinaasetaeeccdgoerssorpnesevsolddueiltsetitfestensoniglorentieniwwewthlisreihlidrstdsenfrhrtglnsaureadsotydsdaatneuictwaemnetrtosepttoycynotosucumglapdlaedoetddbsfeelfhxaasnorditiirpesihadsccibpheslinlalofrhetnrtroaimealgakemtrdwcrnyaswvsnudlnrkeotnnuuitounnivinhiolelethneaftiuatatfeltcnbrnbgehonslomnafokirnoannvsrtefctfrdtehsswpcepuctwrowaphadfiosyaogoenlafgidgtrnbtlelfgl   o',\n",
+       " 'tihhfnrhretfoafentaftlysrrrotqhesmeilurrsfeheaetiuwihibsrrtnoiisneiimhrrtydpeoitictrnlbanphrhootilersthwseptostonyuorhewhhcdcimpootnahsaitjhnaeefortuesngamrrutxwolttabeetprrtapseeatehnirshsrtnrtnsdlofahugsgemaekstniuyhtaynutntnnihgvelwwaipfrseaafilabpecmpchaelthotwhslalduuevseaoeeauttaetefhehbtlhsgrltiaeceartnhagaheitsnfnurueperlhttmiydiuunenciogneduieaeusehthnlhatoaeiifydnaiunneaoyiethoeflaudoreahyurearretraihaagntosiwwiatslutbmoxateoloetrotnooorabgctiapvelenyfrweaotudwaterwntlrfppreilairmlrtoneiqwceurnrdaatfoortneltenerpsmhpddenedwtfeohepdynnseeegntaetnaeeretsldugsoreruobdhgwprabneyhetktretrhrnrendftlsoisawyipnhtmooucoeyitpeoekhrntnanlrtiieuemenratpieoahhhnouumovkstendeoeiewpkdgetiiioinehsfuauebunhtrirehaeehiyaauurssgwaiissdrtlipfhgtlwisiiiseuhrmorcaemosiidvelleuoiarsedoifnitosbestanfogpdorsifrttlapterniyoltoyssesotnpfaeihaeogiaerdtmiaaethrygrsraeflclternaeeevhhmvhisasnreoilxmijstpseotmbrfdnihhceobntccnotupsmoseeetnhftieonoewnoteteolitrgidomseoiofhrlomffdeeustlfeoiwirdqbytotzfrandtinnotgaleasdhpmanelhptbntsaohulapamenlrdspnvahealichansikldcoadetahgojaediawygedtnhneeeeugeoeeonrdryfyetmcwtntdgetsautootoywmfrhgiohernirsoafrtefrpnoeiasysesshnhteyuaihwltceputaaaenpeuelawhleolaersuibinsaaeetaedccgroesrsopsneeovsluddetilsiettsfetsenognileornetinwiwehwtlriselihisdrtedsnhfrrltgnusardeasyotdasdaetnuticwmaenretteospottyncyostoumcugpladeladtoedsdbfleefahxaosnrtdiipirehsiacdscpibhlesianllrofhnetrotraeimaalgktemrcdwranysswvnludnerkontnutuionuninvihlioetlehanefutiattaftelcrnbnebghsonlnomakfoiornavnnsertffctredthwssppceuwctraowpdhafsioygaoolenaifgdrgtnlbteglfl   o',\n",
+       " 'hithrnfhterffaoeatnfyltsrrrohqteemsirulrefsheaetwuiibihstrrniiosienirhmrdytpioettcirblnahpnroohtelirhtswpesttsoouynoehrwchhdmicptoonshaajtiheaneroftseunmagrturxlowtbatepteratrpeesahetnsrihtrsnntrsoldfuhagegsmkeasintuthyaunytntnnghivwlewpiafesraifalpbaepmcceahlohttshwldlauveusoaeeuaeteatthfeetbhlgshritlaeceantrhagahtiesnfnueurplrehmttiidyuenunoicgdenuaeieesuhnhtltahoieaidyfnuianaenoeiyteohfualderoauyhrraerrteaahiatngowiswtaistulbxomaoetlteorntoorooacgbtpaivelenrfywoaetwduaretwltnrppfrlieamrilotrnqiewuecrdrnaftaotrontleerenphmspeddnwdetoefhdpeysnnegeeneatteanetersudlgroseourbghdwarpbyenhktetterrnrhrdnefsltoasiwpiynmthocuooiyetoeperhknantntrliueienemrptaiaoehnhhomuuoskvtdneeieoekpwdtegioiiihensaufuubenrthiheraheeiaayusrusawgissidltrihfpgwltiiisiueshomrreacmisoievdlueloraisodeiinftbsoeatsngofprodsrfitaltpretnoyilyotssesopntfieahoeageairmtdieaatyrhgrsralfecetlreanehvehhvmisasnoerimxlitsjpoestrbmfindhechotnbconctspumesoentehitfeonoeonwteteotilrdigoesmofoiholrmdffesuetefloiwirbqdytotzarfnitdntongelaahdspnamephlttnbshoaupalanemlsdrpavnhlaeiahcnkislocdatedaoghjdeaiywagtdenenheueegeoeernodfyrymtecntwtegdtuasttooomwyfghriehorrinsfaorfetronpesaiysesshnhtuyeawhilectpatuaneapeuelhwalloeasreuibinaaseateeccdgeorsosrpensesvoldduelitsteitefstnesoinglroenitenwiwetwhlsirehilirdstsdenrfhrgtlnasuraedstoyddsaanteucitweamntertsoepttoyycnootsuucmgalpdaledeotdbdsfeelfxhaansoridtiripeishasdccbiphselilnalforhtenrrtoamieaglakmetrwdcrynasvwsndulnkreontnuiutonuniivnhoileelthenafituaattfletcbnrngbehnoslmonaofkinroannvstreftcfrtdehsswpecputcwrwoapahdfoisyoagonelagfidtgrntbleflgl   o',\n",
+       " 'thihfrnhrtefofaenatftylsrrrothqesemilrursefheeatiwuihbisrtrnoiisnieimrhrtdypeiotitcrnblanhprhootielrshtwspetotsonuyorehwhchdcmipotonashaijthneaefrotusengmarrtuxwlottbaeeptrratpseeathenisrhstrnrntsdolfauhgsegmakestinuythayuntnntnighvewlwapifresaaiflapbecpmchealtohtwshladluuveseoaeeuatteatehfehtblhgsrlitaeecarnthaaghetisnnfureupelrhtmtiyiduuenncoigndeuiaeeueshtnhlhtaoaieifdynauinnaeoyeitheofluadoerahuyrerarertaiahagtnoswiwitasltubmxoatoeloterontooroabcgtipaveelnyrfweoatuwdatrewnltrfppreliaimrlrotneqiwcuerndraaftootrnetlenrepshmpdednewdtfoehedpynsneegenteatneaertesludgsroeroubdghwparbnyehekttrterhnrrednftsloiaswypinhmtoocuoeiytpoeekrhntannltriiueemneraptieaohhnhoumuovsktedneoieewkpdgteiioiinhesfauueubnhrtirheaeheiyaauusrsgawiissdrltiphfgtwlisiiisuehromrceamoisidevllueoiraseodifintobsesatnfgopdrosirfttalptrenioyltyossseotpnfaiehaoegieardmtiaeathyrgrrsaelfcletrneaeehvhmhvissanroeilmxijtspsoetmrbfdinhhecobtnccontuspmoeseenthfiteoonewonteetoltirgdiomesoifohrolmfdfeesutlefoiiwrdbqyttozfarnditnntogaelashdpmnaelphtbtnsahoulpaamnelrsdpnavhelaicahnskildocadteahogjadeiaywgetdnheneeuegeeoeorndrfyyemtcwnttdegtsuatotooymwfrghioehrnrisofartferponeisaysseshhnteuyaiwhltecpuataanepeeulahwleloaesruiibnsaaeeatedccgreosrospseneosvluddetlisitetseftsneoginleroneitnwwiehtwlrsielhiisrdtesdnhrfrlgtnuasrdaesytodadsaentutciwmeanrtetesopottynycosotumucgpaldealdteodsbdfleefaxhaonsrtidipriehisacsdcpbihlseialnlrfohnterortaemiaaglktmercwdraynssvwnldunekronntutiuonnuinivhloietelhaenfuitatatftlecrbnnegbhsnolnmoakofionravnnsetrfftcretdhwssppecuwtcrawopdahfsoiygoaolneaigfdrtgnltbegfll   o',\n",
+       " 'htihrfnhtreffoaeantfytlsrrrohtqeesmirluresfheeatwiuibhistrrnioisineirmhrdtypieotticrbnlahnprohoteilrhstwpsettosounyoerhwchhdmciptoonsahajithenaerfotsuenmgartruxlwotbtaepetrartpeseahtensirhtsrnnrtsodlfuahgesgmkaesitnutyhauyntnntngihvwelwpaifersaiaflpabepcmcehalothtswhldaluvuesoeaeueatetathefethblghsriltaeecanrthaaghteisnnfueruplerhmttiiydueunnocigdneuaieeeushnthlthaoiaeidfynuainaneoeyitehofuladeorauhyrrearretaaihatgnowsiwtiastlubxmoaoteltoernotorooacbgtpiaveelnryfwoeatwudartewlntrpfprleiamirlortnqeiwucerdnrafatotorntelernephsmpeddnwedtofehdepysnnegeenetatenaetresuldgrsoeorubgdhwaprbynehketttrernhrrdenfstloaiswpyinmhtocouoieytopeerkhnatnntlriuieenmerpatiaeohnhhomuuosvktdeneioeekwpdtgeioiiihnesafuuuebnrhtihreaheeiayausursagwisisdlrtihpfgwtliisiiusehormrecamiosiedvluleoriasoediifntboseastngfoprdosriftatlprtenoiylytossseoptnfiaehoaegeiarmdtieaatyhrgrrsalefceltrenaehevhhmvissanoreimlxitjsposetrmbfidnhehcotbncocntsupmeosenethifteooneownteetotlirdgioemsofiohorlmdffeseutelfoiiwrbdqyttozafrnidtntnogealahsdpnmaeplhttbnshaouplaanmelsrdpanvhleaiachnksilodcatdeaohgjdaeiyawgtednehneueegeeoerondfryymetcnwttedgtusattooomywfgrhieohrrnisfoarfteropnesiaysseshhntueyawihletcpautanaepeeulhawlleoaseruiibnasaeaetecdcgerosorspesnesovldudeltistietesftnseoignlreonietnwwiethwlsriehliirsdtsednrhfrgltnausradestyoddasanetuctiwemantretseoptotyyncoostuumcgapldaeldetodbsdfelefxahanosritdirpieihsascdcbpihsleilanlfrohtnerrotameiagalkmterwcdryansvswndlunkeronntuituonnuiinvholieetlheanfiutaattfltecbrnngebhnsolmnoaokfinoranvnsterftfcrtedhswspepcutwcrwaopadhfosiyogaonleagifdtrgntlbefgll   o']"
+      ]
+     },
+     "execution_count": 21,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[column_transposition_decipher(c6bs, p, fillvalue=' ') for p in permutations(range(4))]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnroteletpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvnaiaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrtebltllgfo'"
+      ]
+     },
+     "execution_count": 22,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hit'"
+      ]
+     },
+     "execution_count": 23,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in every_nth(c6bs, 3)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "28"
+      ]
+     },
+     "execution_count": 24,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs.find('e', 13)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1.6083844580777096"
+      ]
+     },
+     "execution_count": 25,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(c6bs) / 978"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'bnrrt'"
+      ]
+     },
+     "execution_count": 26,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs[55:60]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('heih', 177), ('heit', 207), ('heip', 307), ('heil', 522)]"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(c6bs[0] + c6bs[i] + c6bs[2*i] + c6bs[3*i], i) for i in range(int(len(c6bs) / 3)) if c6bs[i] == 'e' and c6bs[2*i] == 'i' ]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['hithhnfrferteaofftnasltyorrreqthimserulrhfsetaeeiuiwsihbnrrtsioiienirhmrpytdtoeircitalnbrpnhtohorliewtshtesposotoynuwhredhhcpicmnootahashtijeanetofrneusragmxurttowleatbrtepptraaesenethhrisnrststrnfldoghaumgseseakuntiahyttnyuntnnvhigwlewfiapasrelfaiebapcmcplahethtolhwsuladseuveaeotaeutateefehlbhtrshgatliaceehtrnhgaasietufnnpurehrelittmudyinnuegicouendeeiahsuelhtnoahtieainyfdniauoenatiyefohedaluaroeryhuraeraterahiaongtwiswsaitbultaomxletoreototonaoortgbcvaipnleewfyrtaeoaduwwetrrtnlrpfpaiellrimntrowieqrecuarndotafnrotel',\n",
+       " 'etpenrpmshnddetdewhefoypedennsneegtateeanesertgdlueosrburowhdgbrpahenyttekrertrrhnfnedoltswsianiypothmouoctyeieeponhkrnntairlteeiuremnitaphoeaohhnouumtkvsenedeeoidpwkiegtiiiosenhuufanbeuithraerhieehuayasrusiwgadsisitrlgfphiltwiisihesurmromaceisoilvdeoelusairideotnfiesobntsapofgsodrtfirpltanetrlyiosotyoessfntpheaigeaoraieitdmtaaegrhyasrrcfelrtleeanehvehivmhnassieroixlmpsjttesofbmrhndiochecnbttncompusesoehtenetfienootnwooteeriltoigdosmehoifmlroeffdtuesoflerwiiyqdbzottnrfantdigontalaepdsheamnthlpsnbtuoahaalplemnpdrshvna',\n",
+       " 'iaelnhcaliskacdoaedtjghoieadgwayndetenhegeeueoeednoryyrfctemttwntgdetasuoootfwymihrgrhoesinrraofretfenpoyaissesstnhhayeulhiwpcteatuapeanlueelwahaoeluresnbiieasaeteagcdcsorepsroenselvosedudsitlteittfseoesnlnginoernteieiwwlwhteirsiilhtdsrndesrfhrntlgrsuasedadoytasadutenwitcnametertpoesytotocnyutsogcmudlpadleadotefdsbfeleahaxrsonidtieiprashicdcshipbielslnalhorfrentatoraiemklagretmrdcwsnaynwsvnuldorekutnnoutiiunnhvnieilohltefnaeatuifttacetlnnrbhbeglosnaonmifkoaronsnvnfretrcfthdetpswsucpercwtpoawfhdayisooagoaelndfigngrteb',\n",
+       " 'ltllgfo']"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[c for c in chunks(c6bs, 522)]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'HITHH NFRFE RTEAO FFTNA SLTYO RRREQ THIMS ERULR HFSET AEEIU IWSIH BNRRT SIOII ENIRH MRPYT DTOEI RCITA LNBRP NHTOH ORLIE WTSHT ESPOS OTOYN UWHRE DHHCP ICMNO OTAHA SHTIJ EANET OFRNE USRAG MXURT TOWLE ATBRT EPPTR AAESE NETHH RISNR STSTR NFLDO GHAUM GSESE AKUNT IAHYT TNYUN TNNVH IGWLE WFIAP ASREL FAIEB APCMC PLAHE THTOL HWSUL ADSEU VEAEO TAEUT ATEEF EHLBH TRSHG ATLIA CEEHT RNHGA ASIET UFNNP UREHR ELITT MUDYI NNUEG ICOUE NDEEI AHSUE LHTNO AHTIE AINYF DNIAU OENAT IYEFO HEDAL UAROE RYHUR AERAT ERAHI AONGT WISWS AITBU LTAOM XLETO REOTO TONAO ORTGB CVAIP NLEEW FYRTA EOADU WWETR RTNLR PFPAI ELLRI MNTRO WIEQR ECUAR NDOTA FNROT ELETP ENRPM SHNDD ETDEW HEFOY PEDEN NSNEE GTATE EANES ERTGD LUEOS RBURO WHDGB RPAHE NYTTE KRERT RRHNF NEDOL TSWSI ANIYP OTHMO UOCTY EIEEP ONHKR NNTAI RLTEE IUREM NITAP HOEAO HHNOU UMTKV SENED EEOID PWKIE GTIII OSENH UUFAN BEUIT HRAER HIEEH UAYAS RUSIW GADSI SITRL GFPHI LTWII SIHES URMRO MACEI SOILV DEOEL USAIR IDEOT NFIES OBNTS APOFG SODRT FIRPL TANET RLYIO SOTYO ESSFN TPHEA IGEAO RAIEI TDMTA AEGRH YASRR CFELR TLEEA NEHVE HIVMH NASSI EROIX LMPSJ TTESO FBMRH NDIOC HECNB TTNCO MPUSE SOEHT ENETF IENOO TNWOO TEERI LTOIG DOSME HOIFM LROEF FDTUE SOFLE RWIIY QDBZO TTNRF ANTDI GONTA LAEPD SHEAM NTHLP SNBTU OAHAA LPLEM NPDRS HVNAI AELNH CALIS KACDO AEDTJ GHOIE ADGWA YNDET ENHEG EEUEO EEDNO RYYRF CTEMT TWNTG DETAS UOOOT FWYMI HRGRH OESIN RRAOF RETFE NPOYA ISSES STNHH AYEUL HIWPC TEATU APEAN LUEEL WAHAO ELURE SNBII EASAE TEAGC DCSOR EPSRO ENSEL VOSED UDSIT LTEIT TFSEO ESNLN GINOE RNTEI EIWWL WHTEI RSIIL HTDSR NDESR FHRNT LGRSU ASEDA DOYTA SADUT ENWIT CNAME TERTP OESYT OTOCN YUTSO GCMUD LPADL EADOT EFDSB FELEA HAXRS ONIDT IEIPR ASHIC DCSHI PBIEL SLNAL HORFR ENTAT ORAIE MKLAG RETMR DCWSN AYNWS VNULD OREKU TNNOU TIIUN NHVNI EILOH LTEFN AEATU IFTTA CETLN NRBHB EGLOS NAONM IFKOA RONSN VNFRE TRCFT HDETP SWSUC PERCW TPOAW FHDAY ISOOA GOAEL NDFIG NGRTE BLTLL GFO\\n'"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6b"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[29, 503, 985]"
+      ]
+     },
+     "execution_count": 30,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[i for i in range(len(c6bs)) if c6bs[i] == 'q']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hithhnfrfer'"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in every_nth(c6bs, 11)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hithhnfrferte'"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in every_nth(c6bs, 13)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hhrnrnumeodti'"
+      ]
+     },
+     "execution_count": 33,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in chunks(c6bs, 121)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon'"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join([c[0] for c in chunks(c6bs, 13)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "'l' in ''.join([c[0] for c in chunks(c6bs, 13)])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['httmtbnoreohaegaasdetgrmlvtshtenenfiargurredrmcrpwnaegennckehmoinhutioddnrtegmranmmneieseetoetmaaoeoceyiesieaidnseewtrdtttmoaicnagariounanfcfor',\n",
+       " 'ieysaniepwthhtmtenoanwecheehtulueodyratleteupnuomhsnobkeitriotiibisrimeettrsetrnaprbseemfrtnaunecitettmnntwaoecsiorhdnaeeouthesatryeuhirostphat',\n",
+       " 'taoeerrintocaoxbsrgkyllpwaegrfieianeotwtogwwftatsenesrrdyynuekdoeeilsaoosflsaacesshtonrefwntmopldeeeeairpnpneasetentstdnrcdeaihloenknlfbnnhedee',\n",
+       " 'horrerhrhsypsfureshuueflsefanntgahifeeiatbfwprrehfesrpeopenravpsuewgicetaiyfoafhsjnteoihdiranadnoandmshrohcllsollsterlowtnlfxpihrtwuntthmvdralb',\n",
+       " 'hfruitmcthnihrrtntannwaauoethntihtaorrsoocyeaonlnoeebarloiteosweihgfhelnprinreevitdnholotiflthrhadhnturayhtuuarvtneingyipypdrrpoamsthetbinecynl',\n",
+       " 'nfrlusriotuctnteesuttfihlthlgpmcsiuhyawmtvrtiwdedygruhttteamhekntuapeiufopotagleetictttiuyaahascegeotogoaaeereeoelirdrttouassabrirvnvfaefftwidt',\n",
+       " 'fteriipthewmietpttminieeaaliauuoueoehhsxoatreiotdpttrersheinhnihhadhsssiflspirrhreooenofeqnelahadwgrworfiyaeetpsinesesacetdbosifednnnncgkrptsfl',\n",
+       " 'rnqhwoyaoshnjuophrganabtdebaardueaeduialniarletpeeagonrwmprineeurysiuoaegtohehtioscmnwimsdtpplvltaeynohrsetlsesetgiisusnsslfnhermcuoiaeloespoil',\n",
+       " 'fatfsitlrproeswthnshvpahsuhcseyelinaraieapetlqaetdtdwyhsooltodguaailriissateiylviohpeoglobddspnijyeyttoesuuwnardtiwiraaayoeeiilekwlueetoatwoogg',\n",
+       " 'eshsiidnloeoarlrrfeyhaptetteihinhnalaottononrrfndeelhtniuntauetfesstmlroonyataemxfeutodrfzisnlasgnurgfetelaabgoufnwlfsdmtgaldcsnlsdtialsrrsaanf',\n",
+       " 'rliehetbisdtnaeailstiscouareerndtytuenboolalienreneudtfaohepueiarriwrvibdeoidsehlbcsftoologhbeikhdefdwsfshphicedsolhheueocdetdltanoiltnnocuwggo']"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "every_nth(c6bs, 11)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['hetuehroera',\n",
+       " 'iteloirnnny',\n",
+       " 'toetsectptn',\n",
+       " 'hffarefaolw',\n",
+       " 'hreobhelygs',\n",
+       " 'nnhmuulaarv',\n",
+       " 'felxrareisn',\n",
+       " 'rubloytpsuu',\n",
+       " 'fshewaldsal',\n",
+       " 'ertthsesesd',\n",
+       " 'rarodrehseo',\n",
+       " 'tgsrguaesdr',\n",
+       " 'emhebsnatae',\n",
+       " 'axgoriemndk',\n",
+       " 'ouatpwhnhou',\n",
+       " 'frtoagvthyt',\n",
+       " 'ftlthaehatn',\n",
+       " 'ttioedhlyan',\n",
+       " 'noannsipeso',\n",
+       " 'awcayivsuau',\n",
+       " 'sleotsmnldt',\n",
+       " 'leeotihbhui',\n",
+       " 'tahretntiti',\n",
+       " 'ytttkrauweu',\n",
+       " 'obrgrlsopnn',\n",
+       " 'rrnbegsacwn',\n",
+       " 'rthcrfihtih',\n",
+       " 'regvtpeaetv',\n",
+       " 'epaarhraacn',\n",
+       " 'qpairioltni',\n",
+       " 'ttsphlipuae',\n",
+       " 'hrinntxlami',\n",
+       " 'iaelfwlepel',\n",
+       " 'matenimmeto',\n",
+       " 'seueeipnaeh',\n",
+       " 'esfwdsspnrl',\n",
+       " 'renfoijdltt',\n",
+       " 'unnylhtrupe',\n",
+       " 'leprtetseof',\n",
+       " 'rtutsseheen',\n",
+       " 'hhrawusvlsa',\n",
+       " 'fheesronwye',\n",
+       " 'srhoimfaata',\n",
+       " 'eiraarbihot',\n",
+       " 'tsednomaatu',\n",
+       " 'anluimreooi',\n",
+       " 'eriwyahlecf',\n",
+       " 'estwpcnnlnt',\n",
+       " 'itteoedhuyt',\n",
+       " 'usmttiicrua',\n",
+       " 'iturhsoaetc',\n",
+       " 'wrdrmoclsse',\n",
+       " 'snytoihinot',\n",
+       " 'ifinulesbgl',\n",
+       " 'hlnlovckicn',\n",
+       " 'bdnrcdnaimn',\n",
+       " 'nouptebceur',\n",
+       " 'rgefyotdadb',\n",
+       " 'rhgpeetoslh',\n",
+       " 'taiailnaapb',\n",
+       " 'sucieuceeae',\n",
+       " 'imoeesodtdg',\n",
+       " 'ogulpamtell',\n",
+       " 'iseloipjaeo',\n",
+       " 'ienrnruggas',\n",
+       " 'esdihishcdn',\n",
+       " 'neemkdeodoa',\n",
+       " 'iaenresicto',\n",
+       " 'rkitnooesen',\n",
+       " 'huarnteaofm',\n",
+       " 'mnhotnhdrdi',\n",
+       " 'rtswaftgesf',\n",
+       " 'piuiiiewpbk',\n",
+       " 'yaeerenasfo',\n",
+       " 'thlqlseyrea',\n",
+       " 'dyhrtotnolr',\n",
+       " 'ttteebfdeeo',\n",
+       " 'otncenienan',\n",
+       " 'enouitetshs',\n",
+       " 'iyaausneean',\n",
+       " 'ruhrraonlxv',\n",
+       " 'cntnepohvrn',\n",
+       " 'itidmoteosf',\n",
+       " 'tneonfngsor',\n",
+       " 'anatigweene',\n",
+       " 'lviatsoedit',\n",
+       " 'nhnfaoouudr',\n",
+       " 'biynpdtedtc',\n",
+       " 'rgfrhreosif',\n",
+       " 'pwdooteeiet',\n",
+       " 'nlntefretih',\n",
+       " 'heieaiidlpd',\n",
+       " 'twalorlntre',\n",
+       " 'ofuehptoeat',\n",
+       " 'hiothlorisp',\n",
+       " 'oaepntiyths',\n",
+       " 'rpneoagytiw',\n",
+       " 'laanundrfcs',\n",
+       " 'istrueofsdu',\n",
+       " 'eripmtscecc',\n",
+       " 'weymtrmtosp',\n",
+       " 'tleskleeehe',\n",
+       " 'sffhvyhmsir',\n",
+       " 'haonsiotnpc',\n",
+       " 'tihdeoitlbw',\n",
+       " 'eeednsfwnit',\n",
+       " 'sbdeeomngep',\n",
+       " 'paatdtltilo',\n",
+       " 'opldeyrgnsa',\n",
+       " 'scueeoodolw',\n",
+       " 'omawoeeeenf',\n",
+       " 'tcrhisftrah',\n",
+       " 'opoedsfanld',\n",
+       " 'ylefpfdstha',\n",
+       " 'narowntueoy',\n",
+       " 'uhyyktuoiri',\n",
+       " 'wehpipeoefs',\n",
+       " 'htueehsoiro',\n",
+       " 'rhrdgeotweo',\n",
+       " 'etaetaffwna',\n",
+       " 'doeniilwltg',\n",
+       " 'hlrnigeywao',\n",
+       " 'hhasiermhta',\n",
+       " 'cwtnoawitoe',\n",
+       " 'pseesoiherl',\n",
+       " 'iureeririan',\n",
+       " 'clagnaygrid',\n",
+       " 'mahthiqrsef',\n",
+       " 'ndiauedhimi',\n",
+       " 'osatuiboikg',\n",
+       " 'oeoeftzelln',\n",
+       " 'tuneadoshag',\n",
+       " 'avganmtitgr',\n",
+       " 'hetnbttndrt',\n",
+       " 'aaweeanrsee',\n",
+       " 'seisuarrrtb',\n",
+       " 'hoseiefanml',\n",
+       " 'ttwrtgaodrt',\n",
+       " 'iasthrnfedl',\n",
+       " 'jeagrhtrscl',\n",
+       " 'euidayderwg',\n",
+       " 'attleaitfsf',\n",
+       " 'nabursgfhno']"
+      ]
+     },
+     "execution_count": 37,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "every_nth(c6bs, 143)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[(29, 37), (503, 507), (985, 973)]"
+      ]
+     },
+     "execution_count": 38,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[(q, u) for q in [i for i in range(len(c6bs)) if c6bs[i] == 'q'] for u in [i for i in range(len(c6bs)) if c6bs[i] == 'u'] if abs(q-u) < 13]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['harrseehthoexttnsneitetghuydoihuouocttiuedeeerrsohiaeefhifsiitiohtreiehseiiszomhhihtdtoeentencsllilrdieodhpbrlakhntnsdwon',\n",
+       " 'iorhiniterttuehfeywehueagrieaaernltvanmalddeoptwukuongaiwpuldsrsedrheseenlfoonnavsoenwtsnhelbdetnwhnotsgoarieayuvalanetog',\n",
+       " 'tfefhiroseaorphlaufbtvetaenehudagtoaelnreeeasarsorrhetneghrveapoamcvrocsotmftttankinonfiphawiclegwttycyctxaengntnenovtpar',\n",
+       " 'hfqsbrchpdhftprdkniaoeflahnitoaetatiortnttnnrhricnehdibeaimdopltitfeofnooolltahlaaehrtwnoataisviildltntmersltrwniannnpogt',\n",
+       " 'httenhiooharttioutaplaeisruaielrwoopaprdpdnebehatnmneiehdlretotygaehibbetirenllpicaeygyryyuheootnwsgaaoufshsaesnetrmfsaoe',\n",
+       " 'nnhtrmtrshsnorsgnnpchehaieehenuaimnndfooeessunnnytnoeiuustoonfaoealixmthngorrapladdgydmraeaaarstohrrsmtddoilttvoiubirwwab',\n",
+       " 'faiarralochewanhtnamwolcelgsaaatsxalupwtnwneryfieaiuooiaiwmefgneaervlrttwdewfeseeogereiaiuposeefetnsaeolsncnomnulihfesfel',\n",
+       " 'rsmetplitptularaivscstbetiiuitrewloewaiarherotnyiituistysialisesogtmmhneoofiapnmlawefthosleeapdsredudtcpbidarrutofbktuhlt',\n",
+       " 'flsesyneoiiseesuahrpuaheutceniorseoewiefpeetwteperamdehaiicueotsrrlhpncnosfindbnneaucarfshalesuenieauenafdcladlihteorcdnl',\n",
+       " 'eteiitbwycjrastmhiellethftolyyeaatrweeqnmfgghedoelptpnrstsessdrfahensdoetmdytstphdyetsgreinutrdotrsstrydetshicdiltgacpadl',\n",
+       " 'ryruodrtnmeatesgyglaaurtnmuhferhiotftlrrsotddkotpthkwharriiaorlniyeajimteetqdhudctnoeureswlreoseesreetullihoewoutalrfeyfg',\n",
+       " 'touiitpsunagbntstwfhdtsrnuetdfyitrgyrleohyalgrlhoeovkueulhsibtyteaastopfehudieorajdemohtspueaeisiifdnpteeeirmsrnecootriif',\n",
+       " 'erlwionhwonmreretlaesahnpdnnnohabebrrrctnptubetmneesiursgeornfipisnstcuiroebgaaslgeetooftcesgntneihawosaaipfknenfesnhcsgo']"
+      ]
+     },
+     "execution_count": 39,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "every_nth(c6bs, 13)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['hthithnfrfere',\n",
+       " 'foaoftnasltyr',\n",
+       " 'qurrethimserl',\n",
+       " 'sirhfetaeeiuw',\n",
+       " 'bisihnrrtsioi',\n",
+       " 'rtenihmrpytdo',\n",
+       " 'cpeiritalnbrn',\n",
+       " 'hshtoorliewth',\n",
+       " 'putesosotoynw',\n",
+       " 'dnhrehhcpicmo',\n",
+       " 'haotaashtijen',\n",
+       " 'fgetorneusram',\n",
+       " 'tbxurtowleatr',\n",
+       " 'pnteptraaesee',\n",
+       " 'rtthhisnrstsr',\n",
+       " 'dsnfloghaumge',\n",
+       " 'ktseauntiahyt',\n",
+       " 'nwnyutnnvhigl',\n",
+       " 'ifewfapasrela',\n",
+       " 'ahiebpcmcplae',\n",
+       " 'odthtlhwsulas',\n",
+       " 'eteuvaeotaeua',\n",
+       " 'fsteeehlbhtrh',\n",
+       " 'lrgatiaceehtn',\n",
+       " 'anhgasietufnp',\n",
+       " 'huurerelittmd',\n",
+       " 'neyinuegicoun',\n",
+       " 'itdeeahsuelhn',\n",
+       " 'tdoahieainyfn',\n",
+       " 'ofiauenatiyeo',\n",
+       " 'ayhedluaroerh',\n",
+       " 'eiurarateraha',\n",
+       " 'ttongwiswsaib',\n",
+       " 'arultomxletoe',\n",
+       " 'tgotoonaoortb',\n",
+       " 'iycvapnleewfr',\n",
+       " 'ortaeaduwwetr',\n",
+       " 'rltnlpfpaielr',\n",
+       " 'teimnrowieqrc',\n",
+       " 'nouardotafnrt',\n",
+       " 'thelepenrpmsn',\n",
+       " 'tyddedewhefop',\n",
+       " 'naedensneegtt',\n",
+       " 'nleeaesertgdu',\n",
+       " 'rgeosburowhdb',\n",
+       " 'hrrpaenytteke',\n",
+       " 'rlrtrhnfnedot',\n",
+       " 'ihswsaniypotm',\n",
+       " 'coouotyeieepn',\n",
+       " 'nehkrntairlte',\n",
+       " 'eoiurmnitaphe',\n",
+       " 'hvaohnouumtks',\n",
+       " 'dkeneeeoidpwi',\n",
+       " 'iuegtiiosenhu',\n",
+       " 'befaneuithrar',\n",
+       " 'euhiehuayasrs',\n",
+       " 'aliwgdsisitrg',\n",
+       " 'ihfphltwiisie',\n",
+       " 'mssurromaceio',\n",
+       " 'diilveoelusar',\n",
+       " 'obidetnfieson',\n",
+       " 'pttsaofgsodrf',\n",
+       " 'lyirptanetrli',\n",
+       " 'ttosoyoessfnp',\n",
+       " 'ieheageaoraii',\n",
+       " 'tatdmaaegrhys',\n",
+       " 'farrcelrtleen',\n",
+       " 'esehvhivmhnas',\n",
+       " 'otierixlmpsjt',\n",
+       " 'foesobmrhndic',\n",
+       " 'nphecbttncomu',\n",
+       " 'ofsesehteneti',\n",
+       " 'oeenotnwooter',\n",
+       " 'ohiltigdosmeo',\n",
+       " 'luifmroeffdte',\n",
+       " 'ldsoferwiiyqb',\n",
+       " 'tizotnrfantdg',\n",
+       " 'aeontlaepdsha',\n",
+       " 'homntlpsnbtua',\n",
+       " 'lrhaaplemnpds',\n",
+       " 'aahvniaelnhcl',\n",
+       " 'ajiskcdoaedtg',\n",
+       " 'edhoiadgwayne',\n",
+       " 'hetenegeeueoe',\n",
+       " 'rmdnoyyrfctet',\n",
+       " 'totwngdetasuo',\n",
+       " 'whotfymihrgro',\n",
+       " 'ntesirraofref',\n",
+       " 'osenpyaissest',\n",
+       " 'apnhhyeulhiwc',\n",
+       " 'tuteauapeanle',\n",
+       " 'aeelwhaoelurs',\n",
+       " 'ianbieasaeteg',\n",
+       " 'secdcorepsron',\n",
+       " 'viselosedudst',\n",
+       " 'isltettfseoen',\n",
+       " 'iilngnoerntee',\n",
+       " 'liiwwwhteirsi',\n",
+       " 'dflhtsrndesrh',\n",
+       " 'ldrntgrsuasea',\n",
+       " 'tndoyasadutew',\n",
+       " 'npitcameterto',\n",
+       " 'ttesyotocnyus',\n",
+       " 'meogcudlpadla',\n",
+       " 'eedotfdsbfela',\n",
+       " 'rehaxsonidtii',\n",
+       " 'siprahicdcshp',\n",
+       " 'lrbieslnalhof',\n",
+       " 'tmrenatoraiek',\n",
+       " 'rslagetmrdcwn',\n",
+       " 'wraynsvnuldoe',\n",
+       " 'nnkutnoutiiun',\n",
+       " 'iehvneilohltf',\n",
+       " 'acnaetuifttae',\n",
+       " 'notlnrbhbegls',\n",
+       " 'nonaomifkoarn',\n",
+       " 'ntsnvfretrcfh',\n",
+       " 'prdetswsucpec',\n",
+       " 'oiwtpawfhdays',\n",
+       " 'giooaoaelndfg',\n",
+       " 'tfngrebltllgo']"
+      ]
+     },
+     "execution_count": 40,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "[''.join(transpose(l, (3, 11, 0, 1, 2, 4, 5, 6,7, 8, 9, 10, 12))) for l in chunks(c6bs, 13)]"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2013/2013-challenge7.ipynb b/2013/2013-challenge7.ipynb
new file mode 100644 (file)
index 0000000..e7dd197
--- /dev/null
@@ -0,0 +1,271 @@
+{
+ "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 *"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "with open('mona-lisa-words.txt') as f:\n",
+    "    mlwords = [line.rstrip() for line in f]\n",
+    "mltrans = collections.defaultdict(list)\n",
+    "for word in mlwords:\n",
+    "    mltrans[transpositions_of(word)] += [word]\n",
+    "c7a = open('7a.ciphertext').read()\n",
+    "c7b = open('7b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f2925a38c18>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nAABJRU5ErkJggg==\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f2925eb4a58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
+    "freqs_7a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f28fb521d30>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nEqMB7LsAAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f28fb5d26a0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
+    "freqs_7b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'WWPA, AWHCRH MDY IOT NJHGK HJWLSBALH HI AWL BBHLJT, X DTUI PC VC MGPSHN HCK AHXK AVL BCAXS PMILG JAVHPCN IPBL. PZ ESPUCLS AWL RYPAT DPZ SLAPKLGLS AD AWLXY NHGK DU UYXKPF PMILGUDVC, ADV AHIL UVG HCFDUT AD WGVRLHZ XA, PUS AWL QVPYS DPZ THHF IV SLIHRO UYDT IOT IPZT. LMJTSALCA XKTH IV BHZL IOT WPPCAXUV SDVZ SXRT WPYI VU AWL QVM IN AWL LHN - UD-VCL LHH NDPCN IV IBGU XA DCTY IV AVDR XM IOTF SPSU’I RCVL PI DPZ IOTYT, HCK IOTF LLGL EYTAIF JUAPZLAF IV QL AVDRXUV MDY HVBLDUT AD ZBBVNAL P WPPCAXUV PC HCFLHN. \\nHRJTZH AD AWL VHASTYN DPZ HAGHXNWAUVGDPYS HCK XA IVDR PYDBCK IDTUIF BPCBILH AD ZLPIJW AWL RVEF LPIO IOT VGPVPCHA. P WPS AWL EHXUIPCN PTDUV H QBCJW VU YTWGVSBRAXVCZ XU IOT TJZTBB ZWVE HCK RHBWTK DBI MDY IOT UXNWA XU IOT NJHGKH’ IPAWYDVB. AJYCZ DBI AWLN WGLULG AD BHL IOT KXYTJIVGZ’ UHRPAPIPTZ JW DU IOT ADW USDVG. DXAW AWL CLL LMOXIXAXVC VELCPCN DU HHIBGKPF IOT WAHRL LHH IJZN LCVJNW AD ZAPE VJA UPGZI AWPCN PUS, HH HGYPUVLS, P BHSL HBGL X DPZ UPGZI PCAD AWL HODW. X UDD WHKL IOT ODUDBG VU OPCXUV IDBVOI AWL ROTHELHA TCTY LVGR QF SH KPCJX. VG UDA. \\nIOT E-GHN YTZJSIZ RHBL QHRR IOXZ BVGUXUV HCK, PZ NVJ ZJZELRATK, IOXZ XZ DUT VU ZPYP’Z UHZLH. P PT IVAK XA XZ RSDZT AD WTYULRA, QBI, OXKSLC BCKTY IOT SPFTYH VU WPPCA, HOT ZRYXIQSTK P WXJIBGL DM IOT UPGX LPNAL TTQSTT XU ALPK. HOT ZXNCLS PI Z IVD. AWL ILRO VBNZ IOXUZ ZWL BHN OPCT BHLS H QPI VU VAK EPEL APZL P JGHNVC AD KTMPJT AWL QVPYS ITMDYT ZWL HAPYILS DDYZ VC PI. HCFLHN, AWHI STHKLH AWL FBTZIPDU DM LOTYT AWL WLAS IOT YTHA WPPCAXUV TXNWA QL. XA’H OPYS AD ITSXLKL IOPA HOT STMI PI DXAW AWL HZ PUS P RHC’A HLT OTY VVXUV VC AWL GBC DXAW PI ZIBRR JUSLG OTY RVPA. XA’H UDA APZL HOT JDBAK GVAS XA JW. \\nX DDYZLS AWYDBVO HVBL BVGL DM IOT UPGX WPWTYH HCK UVJUS AWPH UDAT. HI STHHA XA ILASH BH DWLGL HOT DTUI. SDVZZ APZL IOT JXWWLG JALGR LHH IPJZ IN AWL LHN. P WHKL BVKLS VC AD CTUXJT AD AGF IV UPCK PUN AGHRL DM HHGH IOTYT, IJA X OPCT H ULTSXUV AWL HVABIPDU IV IOXZ BFHATYN PH IPJZ PC WPYXZ LOTYT PI HAS QLVHC. P ALUA IOT WPPCAXUV HI AWL EHGPH VUMXJT. TPFQL NVJ JDBAK PYGHCNT AD YTAJYC PI? PI ZWVJSS IT LPZXLG AD NTA XA XU IOPU XA LHH AD LMAGHRA XA. \\nPSA AWL QLHA, \\nWHGYN\\n'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c7a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('hp', -2071.4841308636614)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "vigenere_frequency_break(sanitise(c7a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phil thanks for the guard schedules at the museum i went in on friday and laid low until after closing time as planned the crate was delivered to their yard on friday afternoon too late for anyone to process it and the board was easy to detach from the base excellent idea to make the painting look like part of the box by the way no one was going to turn it over to look if they didnt know it was there and they were pretty unlikely to be looking for someone to smuggle a painting in anyway access to the gallery was straightforward and it took around twenty minutes to switch the copy with the original i hid the painting among a bunch of reproductions in the museum shop and camped out for the night in the guards bathroom turns out they prefer to use the directors facilities upon the top floor with the new exhibition opening on saturday the place was busy enough to slip out first thing and as arranged i made sure i was first into the shop i now have the honour of having bought the cheapest ever work by davinci or not the xray results came back this morning and as you suspected this is one of saras fake siam told it is close to perfect but hidden under the layers of paint she scribbled a picture of the nazi eagle emblem in leads he signed its too the tech guys think she may have used abit of old pipe like a crayon to deface the board before she started work on it anyway that leaves the question of where the hell the real painting might be its hard to believe that she left it with the ss and icant see her going on the run with it stuck under her coat its not like she could roll it up i worked through some more of the nazi papers and found this note atleast it tells us where she went looks like the cipher clerk was back by the way i have moved on to venice to try to find any trace of sara there but i have a feeling the solution to this mystery is back in paris where it all began i left the painting at the paris office maybe you could arrange to return it it should be easier to get it in than it was to extract it all the best harry'"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(vigenere_decipher(sanitise(c7a), 'hp')))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(2, -4150.8334806309485)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "railfence_break(sanitise(c7b))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'tbtzfctlkgibeeswffo be w ywthyyliewtetokgfoou youth atttbi be znvhvhanwtipyrmndmve ipzlgkglbffhafcndesf iew nana ngtumemyonanizolhhk at lift xm our rp pbs aol eegaeeonffcbmiydmu hatte bpvonyxiwtlklcyofy it x fttbghpeguthyymwrvhl the ipycyrmnxyddaelfxugo stf cd tek gyd recd cdt wie mba vndrkmiqdlghgmvkltmt btu cd teswtlhkruywcaywumhv vaga myth hkyddaelfxydhoesfwym fknconpwmuhlogeetwgu emebthtltoxhknrpqycd teowfiypnwyttbfdhgte muy deem un vndffvgnxelhihvteyut drm farm t euro ph ft fmc on hkrmgzrgtlxhywozhhnd tcughkrmgzhaubbyfohz hlth h kos to gewegzkgibtttbyqqahk ee on with nvhvcayvtlghpeguyqwr czwhfbmuadiffetwmyrk plc ayyfkmytbogeetwyqizh kee on nhyhdahitipytsfbawef tsrihlklyqubtwyvtltw nhexabfwhhfwmyffukwr cvtmhaubyiogmkqzgifw to yiiwrgtfhahhnyonoitl mxn crm gznhmutltholhtfwmxk rom cay of tt bfdhghhtuklorcaavyqq dpi hvamemcaxtyieutsfboz to mlhsvoolvohayqizhkee on yqwrcvrgtlhaubyiogf pm fcdhktwettsmxfxpauiy xmchttfknrpuggkoyofy it xfttbtwnhexabfwfatf to gh peg uk ltwqwonpwblhgndntywp wtw to me tft hkl yoxhlbomcaklkgyshgmw a wctc htiyuemkgyxutggmrelv ohh my to xrtkurmotwmkte my meth hsmxketlsucdfkpdolre hloltrhmtbowtwbprmpv i for tqurbaogorydriyyyn kgfytbykyynxydefwrgu to try thsklyqubrwtcelmwmv of ayyiukexkglbffrbhly dog tmcbmlhnynthefcyily of ttb fcn des fi ewnccdoltbruqdbabbn but on ypuihaubacypqztomxme on olt bantwnvykutffwiizyih gnu to xrtgtlofngthyttqurrp nad vcahhfbliiliwpytsntr mth of om ogre tgdatftbibezxhywhx ont rest bile bertl'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(railfence_decipher(sanitise(c7b), 2)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1304"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(sanitise(c7b))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014-challenge1.ipynb b/2014-challenge1.ipynb
deleted file mode 100644 (file)
index 00f9ccc..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:238ee41cd65ee30b21b8e31cf8256253cda5ffb52bd978fe39c5c022b8eaa509"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "import matplotlib.pyplot as plt\n",
-      "%matplotlib inline\n",
-      "\n",
-      "from cipherbreak import *\n",
-      "\n",
-      "c1a = open('2014/1a.ciphertext').read()\n",
-      "c1b = open('2014/1b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = caesar_break(c1a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "(4, -728.156672407534)"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(caesar_decipher(c1a, key_a))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "MARK, \n",
-        "\n",
-        "THANKS FOR BRINGING ME IN ON THIS ONE, SEEMS LIKE A FASCINATING CASE. \n",
-        "\n",
-        "I HAVE THREE QUESTIONS: \n",
-        "WHY WOULD THE FLAG DAY ASSOCIATES WANT A SHIP? \n",
-        "WHY WOULD THEY WANT THIS SHIP? \n",
-        "WHY WOULD THEY WANT THIS SHIP NOW? \n",
-        "\n",
-        "HAVING READ THE ATTACHED DOCUMENT I SUSPECT THAT THE ANSWERS ARE ALL RELATED TO THE QUESTION OF WHAT EXACTLY SHE AND HER FLAG DAY ASSOCIATE CREW WERE TRYING TO SURVEY. \n",
-        "\n",
-        "I AM GUESSING THAT YOU ALREADY CHECKED OUT THE ONBOARD GPS SYSTEM FOR INFORMATION ABOUT HER MOVEMENTS, BUT IF YOU DID FIND ANYTHING I WOULD BE FASCINATED TO HEAR ABOUT IT. IN THE MEANTIME I AM PRETTY SURE THAT YOU KNOW MORE ABOUT THE FLAG DAY ASSOCIATES THAN YOU HAVE TOLD ME, SO A BRIEFING WOULD BE MUCH APPRECIATED. \n",
-        "\n",
-        "ALL THE BEST, \n",
-        "\n",
-        "HARRY \n",
-        "\n"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = caesar_break(c1b)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "(22, -637.7038880633795)"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "report on the trojan project having drugged the crew we were able to take the ship with essentially no resistance the crew were handed to the somali pirates at the deepwater rendezvous as planned and we began the survey just after midnight the radar showed an approaching vessel which our database identified as a coastguard cutter we headed south to avoid detection with all ship lights off we then completed the survey in the new location afterdawn with the listening post installed we began assembling the equipment for phase two of the operation keeping a watch for further patrols in the sky and on the water\n"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge2.ipynb b/2014-challenge2.ipynb
deleted file mode 100644 (file)
index 4e5eeff..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:95cdf1235b4fe6238989ec008feb03cf628e9bfb2e2d10e7949b2aaa237928c4"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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",
-      "c2a = open('2014/2a.ciphertext').read()\n",
-      "c2b = open('2014/2b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 26,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f20ea3cf908>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f20ea40cf60>"
-       ]
-      }
-     ],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = affine_break(c2a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "((5, 25, True), -761.8388033231918)"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(affine_decipher(c2a, key_a[0], key_a[1]))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "DEAR MARK, \n",
-        "\n",
-        "THANKS FOR THE LATEST REPORT FROM THE ON-SITE TEAM. IT SHOWS THAT THE SHIPBOARD GPS SYSTEM WAS COMPLETELY SCRAMBLED SO WE ARE NOT GOING TO BE ABLE TO TRACE HER MOVEMENTS FROM THAT. DO WE HAVE ANY ODD TRACES FROM ONSHORE RADAR THAT GIVE A HINT OF WHERE SHE MIGHT HAVE BEEN? \n",
-        "\n",
-        "THE COMMENT IN THE LAST MESSAGE THAT THE PIRATES COMPLETED THE SURVEY EVEN THOUGH THEY HAD MOVED SOUTH TO AVOID DETECTION SHOULD HAVE TOLD ME THAT THE SURVEY WAS NOT GEOGRAPHIC. AT FIRST I THOUGHT IT MIGHT HAVE BEEN REFERRING TO A TELECOMS SURVEY SINCE YOU MENTIONED THE LONG AERIAL, BUT ACTUALLY THE ATTACHED MESSAGE IS VERY REVEALING. STILL NOT SURE WHAT THE SURVEY WAS FOR THOUGH, AND HOW THAT IS CONNECTED TO THE MISSING SUPERSTRUCTURE. CAN YOU GET ME ANY PICTURES? \n",
-        "\n",
-        "HARRY \n",
-        "\n"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = keyword_break_mp(c2b)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "(('flag', <KeywordWrapAlphabet.from_largest: 3>), -367.81492429457404)"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(keyword_decipher(c2b, key_b[0], key_b[1])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "calm weather allowed us to complete the hull survey and establish its integrity no major remedial works were required and the pumps and extra bulkheads were installed out in deep waters over the next five days we are now testing the system for reliability and safety before moving on to phase three of the operation operation trojan remains on target\n"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_2b = pd.Series(collections.Counter([l.lower() for l in c2b if l in string.ascii_letters]))\n",
-      "freqs_2b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f20c5dcc208>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f20ea3e2828>"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge3.ipynb b/2014-challenge3.ipynb
deleted file mode 100644 (file)
index 92ac480..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:d8ff372312e3a12aff6a0d9e6b5df79509140ca9131aeeb8fc78255c4c5e8cd3"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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",
-      "c3a = open('2014/3a.ciphertext').read()\n",
-      "c3b = open('2014/3b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f80ce03bc88>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f810453c2b0>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = affine_break(c3a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "((11, 1, True), -839.4977013876568)"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(affine_decipher(sanitise(c3a), key_a[0], key_a[1]))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "harry you asked me about the flag day associates they area transnational hacking group dedicated to the overthrow of western capitalism they have been implicated in several major protests including an attempt to takeover the uk national grid attacks on reservoir systems and interference in bank trading networks it looks like the fda carried out fairly extensive modifications to the ship they did a good job too we hadnt noticed the added bulkheads until we compared the layout with the plans from lloyds register they seem to be there to add rigidity though there is one additional panel at the stern that doesnt fit the pattern and we will be removing that tonight to see what it is there for we would have done it this afternoon but decided we should conduct our own hull survey in case there is a booby trap\n"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = keyword_break_mp(c3b)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "(('seahorse', <KeywordWrapAlphabet.from_last: 2>), -681.3308426043137)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(keyword_decipher(c3b, key_b[0], key_b[1])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "phase three the nautilus system was fully tested last night with complete success we sailed within four hundred metres of the target and monitored all radio traffic for two hours with no sign that we were being watched or were even noticed we then conducted a full radar sweep of the area and found three dead spots where we could work on the ship without detection as planned we converted the two adjacent empty containers in the middle of the stack into a large workshop area and carried out a full inspection drill now even if we are boarded our work should remain undetected we retrieved seahorse from the third container and carried out stage one of the assembly\n"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_3b = pd.Series(collections.Counter([l.lower() for l in c3b if l in string.ascii_letters]))\n",
-      "freqs_3b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f80cfc0bf60>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f80cfc0beb8>"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge4.ipynb b/2014-challenge4.ipynb
deleted file mode 100644 (file)
index 71e4da6..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:85b017d44c4150025cec1993a3ad84bbb01961530ccda02157c917ba9e7b9019"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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",
-      "c4a = open('2014/4a.ciphertext').read()\n",
-      "c4b = open('2014/4b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fa712b63358>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fa740323cf8>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c4bs = sanitise(c4b)\n",
-      "c4bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = keyword_break_mp(c4a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "(('stern', <KeywordWrapAlphabet.from_largest: 3>), -830.5838133421847)"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(keyword_decipher(sanitise(c4a), key_a[0], key_a[1]))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "harry we completed the survey and you are not going to believe what we found behind the false bulkhead in the stern there was a large pumping station connected to a number of sea facing outlets it looks like a scuttling valve system similar to the ones used on u boats in world war two icant understand why they would goto so much effort when they could have scuttled her at anytime with a small quantity of plastic explosive the team back at nsa have run some analytics on the remaining text files we extracted from the servers onboard these ciphers are going to be pretty hard to crack the attached report has frequency analysis matching usual english text so we can assume that the sender was a native speaker did you have any thoughts on what the nautilus system might have been or what it was for\n"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c4bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "(((6, 0, 1, 7, 9, 4, 2, 3, 5, 8, 10), False, True), -1777.161911681522)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "rar rrc tee eat flen var rire epymeslntnkeeeeepbln suce lnrsdreowaeyahsdaebt ture t be sonr is nu ahl drool ciano it vs ref ytnlowmesnhtbuoosbys ghuoaeywmoaaiarnvimo art ttt plnas yfcutuuadgserarriuii yaro i iue ted as an thn nc do etc dcr mla oop pdt coeehsfseodioobgdgt oeser dns do pyyeewdemekhnhtyirel roe hfs mmnpsutwuptlhodyrgw row a en its re tdg is nw rna or uuup eia foa or ilac wait a wmo san olobprugpehnuvltwdsh me acic wrp in so srm wa be gti muth ch smc elp seri row o on eeee a dead nii earl dmos colla ms fed laws or et nos idge cue mha a elias eos eoc a ufo ent hsw tue ent mn irl tai eg tim twsnklsucgaerswolrn blrvfenyergstsoeafeu am lrm prnn i are to wage f miao ios is a chul wultuhdstifdorhtabd doe hwl rio at strn rcts ieoussvebtkreettvpnc imf as hss we peso ntvieifaegmaioeuuose new e as me i\n"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c4bs, fitness=Ptrigrams)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "(((4, 8, 0, 6, 9, 3, 1, 2, 5, 7, 10), False, True), -2823.7851213306785)"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], key_b[1], key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "sda ebt ture t be sonr is nu ahl drool ciano it vs ref ytnlowmesnhtbuoosbys ghuoaeywmoaaiarnvimo art ttt plnas yfcutuuadgserarriuii yaro i iue ted as an thn nc do etc dcr mla oop pdt coeehsfseodioobgdgt oeser dns do pyyeewdemekhnhtyirel roe hfs mmnpsutwuptlhodyrgw row a en its re tdg is nwp in so srm wa be gti muth ch smc elp seri row o on eeee a dead nii earl dmos coll rna or uuup eia foa or ilac wait a wmo san olobprugpehnuvltwdsh meac icw rams fed laws or et nos idge cue mha a elias eos eoc a ufo ent hsw tue ent mn irl tai eg tim twsnklsucgaerswolrn blrvfenyergstsoeafeu am lrm prnn i are tra rrr c tee eat flen var rireepymeslntnkeeeee pblnsucelnrsdreowaey a how age f miao ios is a chul wultuhdstifdorhtabd doe hwl rio at strn rcts ieoussvebtkreettvpnc imf as hss we peso ntvieifaegmaioeuuose new e as me i\n"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_4b = pd.Series(collections.Counter([l.lower() for l in c4b if l in string.ascii_letters]))\n",
-      "freqs_4b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 11,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fe3606b8400>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fe35d50f550>"
-       ]
-      }
-     ],
-     "prompt_number": 11
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "railfence_break(c4bs)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "(5, -1581.9784460662272)"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(railfence_decipher(c4bs, 5)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "'phase four the decks were cleared by two am and the mounting plates were prepared and measured mounting points were assembled by four am though owing to the approaching dawn deployment of seabird was postponed and we embarked onstage two of seahorse assembly with camouflage plates installed we set to cruising in case of air or sea surveillance following standard routes to avoid suspicion monitoring of airwaves gave no cause for concern but we have raised security levels and are using a column transposition cipher for this communication with keyword seabird future comms will relyon even more security tonight will be used for more sea trials of the nautilus system while the assembly crew rest and the survey team carryout further mapping we will resume the seahorse build at dusk tomorrow'"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge5.ipynb b/2014-challenge5.ipynb
deleted file mode 100644 (file)
index 4eecb6a..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:7aee1c5a7be0ded7315a453bbefef56aee8217ed72fa1276cfe88f18bc828f77"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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",
-      "c5a = open('2014/5a.ciphertext').read()\n",
-      "c5b = open('2014/5b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fde5b682550>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fde6c503908>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c5bs = sanitise(c5b)\n",
-      "c5bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "'sssatanuelclaendeeheevrnhtailsltocsoeoanuodoeecaferbetrtenoiiucrwurfaproeercssoeuatulgtematremlieaveieogcelesaeeeyyiuuoaidaosdmdecsshthuhatcnxaererseltunaghanrdtevepisydtaeamcinmrnweoramrvibodsdfdpatimrssietdaospecgracnetblfioeushsmeeirlshmittrlnesehmclssoswfottwnbyteyngeymttgstariixeeedrnasmltwgmildcrtseogohrolsshmawndsstrabndnecfcayehotdornonenecatneavoeaatehercyrighsayrefsooatemncwtkaaawndadmsllnnnlutfoeeenoyoewtmanrrsxhvorolhisfunnthaeeofolphebaatmnornoeodnvtphnoetedeaeonphpaeuratvhndetahrahpoorsefovddsttpsvgraaatodsuryidovtrelerltmemdheoarshoarrrerxisgeifawfaiyidusiyieeesotkeaelatresntifemteiaighaceiondktkitteaeanecnndictnedddenstsheanrtamneahshidaocnuissctehslnlectheetlltidlcttnpnmcvsvnositdaelxpihsfattysfoedcmwhtebaachertaigriuirtngiaphetrowehwswaacmgcouwoogoegsmtarteeiemvayinogstitagblncstcycolretedarehopnebyegwcteetlteyeteenansafmo'"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = keyword_break_mp(c5a)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "(('seabird', <KeywordWrapAlphabet.from_largest: 3>), -1255.0542494109186)"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(keyword_decipher(sanitise(c5a), key_a[0], key_a[1]))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "harry i cracked that last message for myself and noticed something really odd the text said it was encrypted using a column transposition with keyword seabird but it was enciphered using a rail fence cipher i can only assume that the text we retrieved was an archive of the original message re encrypted for safety whoever the flag day associates are they have a pretty sophisticated operation if they are filing messages like this more like one of the major terrorist groups than the usual hacker collective the tech guys took a look at the aerial from the boat and they tell me that it is a drag wire usually used to communicate with a submarine when submerged it carried an acoustic transducer array as well as a shortwave transmitter and listening gear one thing that puzzles me now is why we were allowed to find the ship floating at all surely they must have planned to sink her using the scuttling equipment otherwise what was it for they seem too smart to leave it floating for us to find any thoughts mark ps just before i sent this the cipher clerk came in with a decrypt of the attached columnar transposition keyword has length six think it answers some of our questions about the nautilus system\n"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c5bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "(((3, 2, 4, 1, 5, 0), False, True), -1998.321513226948)"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c5bs), key_b[0], \n",
-      "                                                              fillcolumnwise=key_b[1], \n",
-      "                                                              emptycolumnwise=key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
-       ]
-      }
-     ],
-     "prompt_number": 42
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = column_transposition_break_mp(c5bs, fitness=Ptrigrams)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "(((3, 2, 4, 1, 5, 0), False, True), -2821.4971440358026)"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "print(' '.join(segment(sanitise(column_transposition_decipher(c5bs, key_b[0], \n",
-      "                                                              fillcolumnwise=key_b[1], emptycolumnwise=key_b[2])))))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "output_type": "stream",
-       "stream": "stdout",
-       "text": [
-        "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
-       ]
-      }
-     ],
-     "prompt_number": 40
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "transpositions[key_b[0]]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 41,
-       "text": [
-        "['tokens',\n",
-        " 'trials',\n",
-        " 'tricks',\n",
-        " 'tromps',\n",
-        " 'umiaks',\n",
-        " 'unfair',\n",
-        " 'urbans',\n",
-        " 'urgent',\n",
-        " 'vocals',\n",
-        " 'womans',\n",
-        " 'womens',\n",
-        " 'wreaks',\n",
-        " 'wrecks',\n",
-        " 'yokels',\n",
-        " 'ricardo',\n",
-        " 'sneaker',\n",
-        " 'speaker',\n",
-        " 'tobagos',\n",
-        " 'trebles',\n",
-        " 'woolens',\n",
-        " 'sneakers',\n",
-        " 'speakers',\n",
-        " 'speedier',\n",
-        " 'tobaccos',\n",
-        " 'together',\n",
-        " 'treaties',\n",
-        " 'treatise',\n",
-        " 'trollops',\n",
-        " 'unedited',\n",
-        " 'woollens',\n",
-        " 'wreckers',\n",
-        " 'treatises',\n",
-        " 'triteness',\n",
-        " 'usherette',\n",
-        " 'woodcocks',\n",
-        " 'tritenesss',\n",
-        " 'usherettes']"
-       ]
-      }
-     ],
-     "prompt_number": 41
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge6.ipynb b/2014-challenge6.ipynb
deleted file mode 100644 (file)
index fc91ef6..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:5973034ac2337d403853a03b7c1d5fdb5ce28d6b3ac7e6be40537ee382e9f648"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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",
-      "c6a = open('2014/6a.ciphertext').read()\n",
-      "c6b = open('2014/6b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc55c2b98d0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc586677dd8>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_6a = pd.Series(collections.Counter([l.lower() for l in c6a if l in string.ascii_letters]))\n",
-      "freqs_6a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc55a6375c0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc55a6462b0>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_6b = pd.Series(collections.Counter([l.lower() for l in c6b if l in string.ascii_letters]))\n",
-      "freqs_6b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7fc55a642128>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\ngg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7fc55a5a5400>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6as = sanitise(c6a)\n",
-      "c6as"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "'mtaeglatcleptenopeautelebiiootatwnantateituiiagaeostgvetabdresiacqobwavgrhrsihssaekajbwwttdrsmeetnyafsegilegtkrreocuantteomsgstnsiaeluutrbaiaeteeserhxgtooarrbhpcklialhnaesvearhbepiydcesewtaxuyaerywoeinhteegeisieireaassrbitnhtuorooleewsttereoahyakhlsmsaeodslthsutigqimnidsgetpmwtrnnotfhvselkaumrndvcnrluceryhyeetlnigouncnanrhpnosbhshpslreclvrinfoehniaeennhcrbenrgunruesmlrehiutgteordroeaeoisoeusiknteeslohthdcrmisuteoteaeoshfaiaesemritrseisaigwyrmhrbtetncoenuhorcadeodlcrncomnctosihudtcinagesntisutigytmshthyalatlsnhilguimtlbfldyhrfrnetsaosteetaefhlgokhretcakuteihrlrtlsetshlcpeadhthyutaeennhryraeennihrnbhnsnehyutsdtoywmtiatalwhvbepetlxihuscrtadtikhnxmsaesnwluevgnrcpegvnhteruigeuealsdntikeaeomctwrybusiilephkyodhrsyhecaatrmrltrarretstuoetnuesiduaidoesisaeetbllerpntroisiatsiasesomihsieiaunsaitneelacrfnrnngvetteenslhvpepteonedtnaooutgsotancetimiiwoetiuihclsewtcniieotslfbeecohenpoelsdoctceeemiiirttmhbiuovecegaitjuaborcleentatruyinetsidlaeehitwencceohwvohoatwkteroarhcseer'"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c6bs = sanitise(c6b)\n",
-      "c6bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = railfence_break(c6as)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "(3, -2314.997881051078)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(railfence_decipher(c6as, key_a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = hill_break(c6bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 14,
-       "text": [
-        "(matrix([[0, 1],\n",
-        "         [1, 1]]), -666.1299098341699)"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(hill_decipher(key_b, c6bs)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 13,
-       "text": [
-        "'phase six seahorse operated exactly as planned with good forward visibility at the trial depths the crew managed several tasks requiring concentration and dexterity and we plan to run a full test overnight on dummy cables dropped from the ship the software seems to be operating as designed but there are still bugs in the firmware that need ironing out before we deploy the collective is working full time to hunt them down and remove them though we are all getting tired mistakes are easy to make and could be fatal time is no longer on our side though and we are still planning to launch the final phase of the operation in three days timex'"
-       ]
-      }
-     ],
-     "prompt_number": 13
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge7.ipynb b/2014-challenge7.ipynb
deleted file mode 100644 (file)
index 35d298f..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:3a4749bad5690e746e43cddb887ed31282398e12c90470d01010a2e6a024c527"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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",
-      "c7a = open('2014/7a.ciphertext').read()\n",
-      "c7b = open('2014/7b.ciphertext').read()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f51e347e1d0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f521042a0f0>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
-      "freqs_7a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f51e3496278>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n/Os4hwAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f51e349fda0>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
-      "freqs_7b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f51e33869e8>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nDLufFZvIJUlZmZGnbM9cMN7xxfI7t2702wpUt59+H7kk1VjFJvJGvqqaZ6Wx5IKOz7oy6vJ+33ox\n39Oero/zqszIJWlW3n/0UMQ/iIiFGXnK9swF4x1fLL9z6+KuK5sZeYRG+3ZSUkwqNpE38lXVMCsd\n7dvJ9P0sos6M3LpqtpW/zoxckpSJGXnK9qyLK0+c04tI1ol1cdeVzYxckmqsYhN5I1+VWWnUdWbk\n1lWzrfx1WbbNIk5QqNhELkmLSxEnKESbkftd0XHXDVMs68S6uOvyStteLb+P3O+KlqSgYtFKw7pF\nWGdGbl0128pfN+xtM9ojci0+eeM0qe6izciti7suj1jGZt3irMuriIy8YtGKJCmrMibyU4AtwIPA\nudlKGzmbtC7mOrNu66rZVv66YW/TRU/kewN/S5jMjwLOAF6WvryZs1nrYq5rNuPop3VVqIuhj8Pf\npoueyI8DHgK2As8AXwJOS1/+s5zNWhdTXedfsn3oQx/K+VW71RyfdWXWVbeP7dt1+zadbbvO18+i\nJ/KDgUfabj+aLJP2mPuXbLuBC/Zcr9t/btHiMXe7voD2bbzs7broiXzAj3O3WmedddZVpK146oo+\n/fD1wAwhIwc4D3gW+Ju2xzSBVxXcriTV3Ubg6GE0tAR4GJgEnkuYtDN82ClJqoLfBO4nfOh53oj7\nIkmSJFVbFb4mcAJ4CbBP27Jv9anZDzgLeCPhA9bbgL8HflFw385pu76b2fXV+lD3E33q9wJ+HzgM\n+CvgRcABwPcK7GO7c5jfz/8GfkDvE1T3Bd5OiMRa37+zm9DnIn0HeAPwJPM/GN8N7AA+BvzdAvXH\nEMbS7q3A1wrsY7tjgfOZv15e2adukPV5NHA8s9v1xhQ1efaHMeAQ5p5lVkUXdFlWxrYZtVH/if57\ngW8CNwAXAv9G+LC0n8sIf3D0KcIfIL0c+KeUdSvabk8Al/R4/DJgKWECeR9wEOF0yj8GXpOivc8A\nvw78XnL7yWTZQlpj+GCK5+7mmKRvrX7+ESHq+hy9/8r2X4FTCef+P5lcft7j8d9Jfj4J7Oq47OxR\n94bk51LCum2/jCf9P7tH/eeAV7TdPgP4yx6P79a/NP1suRy4lDApvy25nJqiLuv6bPkA8EXgBcDK\n5Hqv9dGSd3+4PsVjuvkdwu8L4C+AfyHd/vA3KZe1+zmz6/D/CNvzZIq2ziHfqc9fJMxLR2asO6rL\nsqkUdWczd06K0j2Eo4nW0eKRhI2in80pl3XqdlSa5k+pbiNMNi3LkmX93NXxE3ofYW0mTMJ3E15k\nOi9p+rm07fZSwrub5wH39ai7J8VzD8tBPe57MfBDwnbyXsJ4n19iX77T/yFd5V2fm4D9227vnyzr\nJ+/+sIHwR3xZtfr0RsLflL8VuDNF3V1dlqUZX7t9CAd//cwA9wLfBv6E8MKYxomEdwE3AT8Gvkq6\nA6t7CAdLY4T97dPAd1PUfZTweeJVhLP9qpCSZPb95GeT8HYU0m2AXyQc6ba8nnRHIBuZOyFOkG5D\nur+tfyTX709RdyfhawtaG/AL6L4xt5xNmHCfImxE7ZcfpWhvC+FsoZZ92vrZq93P0j8uqIqXEtbR\nDYQdpkwnA18gHPm/Pbn8Voq6vOtzE+HApmU/0m2fefeH+wlHuT9K2tlEOIjop3Xws5YQHULv7et9\nyXP/T1s7mwgnTV+eor12E4SJL61XESbL+4GbU9YsIazD84GfkG5f35/wbui7hEn9fNInHnsRJvEv\nEcZ2EXB4yto9HR6lRwhvK64hvAI+Qe8z4lsb9RLC0dIjhLzsRaRb2R8H7iC8+o0B7yD8kvu5jJBr\nX53UnU44munn04R3GC8k/HJ+G/jzHo//VHL5B0JEktXlhBePa5J+vg24grCRdXuBbK3PvYEzCS8Y\nTyXL0mTBw9I5mU0QNv47KbefqwkvHEsIfw/RcnWfuuPJtz4vJYypfTvrFf21vJbu+8OmPu3+Rorn\n7uYxwovVKsJkvi+9J60rCDHOWmaPWiFEXP/Vp6323/1ehH0pSz7+U2Bb0s4LUjz+ZsL+cgfhaP61\nyXP080vgfwkvvvsSXhyf7Vkx69mkj9sJL6wrgK8A3wA+nOYJqnQYP0XI3W4Anl7gMZM96ncD/56i\nnZcT3j7tBm4h3TsACPlt60Oob9H7CKTdy4A3J9dvpnfEUYRjCVn0bsLO/f0ej53s81xbi+nSwCb7\n3L+1pHbvJ8Q4Wf9ieXKB5VtT1B7D3A8t02xnC7WXpd0s9iccQd5N+JbTAwmfXdxYcDswd2y/JEx2\nz6SoO4uQ5b8Q+Gfgy6Tb1z9JmLx/AdxOiHHuIEzSvWwEriW8yPwK8I+EF/F39Kn7APAewgvN5wkH\nfs8QXrQeJOORuaT5LiW88Cs+f81gfwW5DHg/4eDwqT6PhXAA1ek9KeouBH51gfu6fYDaVZWOyKWq\n2UI4Iqpq5KTivZ/wzvsYwu/9tuRyyyg71c+oM3Kpyk7p/xDVzL6Ez9J+SLoIR5IkSZIkSZIkSZIk\nSVqk/h/e+2Rlj0saNgAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f51e339d7b8>"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7as = sanitise(c7a)\n",
-      "c7as"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "'veyjmyjkrzilysyjeydorulcsrcjnmoiddeugurlogfsnwcrlhckhghmwkejxlyktlagflalvtmgkyyomvlmgkyjosfdrzepwaqgnrzeqzinoaqforkcsltjwdussrzarlhcnajneqzabbakeebatjgoiklgcerzebjidlwmgdussnmljwdgftmlhceeazalasksnbtlmukcvtfwilderhrckuksbjqtfwcpwwfsdydrcsdwsbyfdmfeblhcneqkejohguhussjmciqfmjuqoirzosltfwsfapuwwmmlbzatwhyvnmadcstfstrzedvafsdzwelgpcjaraneanrzeqwwylepkscshmjscaslglmfgcjakqsrwrwlhcuurswyqollhcktyjbmsrbkibwcjwapwdyfapwamxapgulvfgnekwtcjsqiuyjeuatfsdgktgfcravcharlepfodtojlsdssrwncvtmjegffmjccvdcukndarwsgkaukokwtfanediiwtfasmfaqmbpwsamekasqaolscmmpjwodqeyjsyyouzellhcqfgltcvajgcydsfapuatfsjsjypagewdgfsnwcraolkyqleklhcveacpjstckcyfcyjrwscpsncveqaglwdrgdchlmqaljotsrceorwonwrylebnefacjwdckiefebxopmnbwrqwamhepstggnqawykajjeyvyagnawrlwdytosltfwrcxepwnawtmlhcuazdeqanrzejssrhaplodlhcxdydoeturlhcfevlscutggnfsskwrcsljqwmjrgwdgliqwnajynleboirzakgrckeamrceobafgwdyesagtpsnqhoqatggnaapfwryfdrwljkuqohyltfwyuwrcjeydlwmprgwfstgvollulvepktyfdgkhmotfwwfglcssqwmzdygkpmoepwdrzeqgrrgfagmnmtgfgrzeweuqlbcvogfggkrcsljqillelkitwalvwmmlbtupftfjosyhytarlepqilvawkillhyltgeerzegjillepuenlmgyhrforuaruhyfyrzilyuqwfsdbsltfwyasnfsrbdyfsvczihsciwdydoaslqgciwtgftfwmgvdjwodlhcgccsnasnwguewtkwaazaplsfgwgfgrzebwenkeyuazdeqanrzepwgggngvolliksggferzeskwgdlzwanjozdekturatksylwebkokwdghlmeaaqtmyerlhcxujdcmnepsgceankfpgmrzemealagmnepfmcftgxiyergyhratgkillhcarzwsranrwrcktqlondawslmfguwajdhyneydorlojgsczepw'"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7bs = sanitise(c7b)\n",
-      "c7bs"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "'anwaecnndrtwtanireoahsrdntieerdctewayerevaaarpioerobsedescrehlaoitithsdtrinosepeplthtnidtwsduledlhotpeaterhaaredeoaiodtahregerothwhtsureteeinwigiresetpowicooonitseudseechacteofiileonewiotacteodteuneahsedaptryemronmomlexontkemeoyvitsteenhantrertieineotndlhpoplyitewitrsedeevdycfrmnsnaypinmteeneeinahinepritedehveleaorelllvmocnahncepherohjuuvehautathttetoasipowwneedselopgdeslfedterfcaatehjasdtrprleseeretetecneorrsgckamiiwaefutiashaongcthsrenrehtrsthhaceinwtprloghetodaeraloeedeatsomldwedtwefsbelevpdteonoignsavftegsebomcehatietnrsptonthusorecredendcetlwaehesedrncveracuhoihaleinaemeunherdesttstasipedeyleeemtiisiigothntssfolnitretrwhemtkhhswtorcssnererohteencsapeblircnthuleofenrsromrnshmaddaodeatihioroutwevthapeceetovterdleaditewdottttcatkmbhtheicwantnisedwatxankeabovoanmswlprgaispodfogndpedeswrdacttrefhdesyaberretlavod'"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = vigenere_frequency_break(c7as)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "('say', -1726.4679903722085)"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(c7as, key_a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "'dear mark things area lot clearer now i flew out to inspect the ship myself last night and took a good look around the reason the ship was not scuttled was that the valves had jammed it looks like the driftwood was pulled into the mechanism and blocked the inlet presumably the crew had already abandoned the vessel which was lucky for us without the ship we would have had no idea that the fda had been operating in these waters seahorse is no longer a mystery the cutaway on the starboard side cleared an area of around five meters square with a distinctive pattern of bolts fastened to reinforced deck plates i saw something like this on a sub rescue mission a couple of years ago when they fitted a local ship with a jury rigged inspection system the deck plates can carry a crane designed to deploy an rova remote operated vehicle designed for undersea operations i was already concerned about the reference to the cables in the last part of the fda log but the next section has me really worried it is encrypted with a more secure modified amsco transposition cipher and tells us what they were really up to what i dont understand is how the whole assembly is powered the sort of computing they must be doing is really intensive and would burn through a battery in days in that time their intercept might not catch anything useful but they can hardly have hijacked a local socket in the middle of the ocean can you get me a chart showing the deepsea cables in the region i dont imagine the us will be a problem but it may need some diplomacy to get the full coverage maps from the omani government if i am right it is in their best interests to playalong we all have alot to lose here'"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_b, score = amsco_break(c7bs)\n",
-      "key_b, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "(((1, 2, 0, 4, 3), (2, 1)), -1902.8377732825452)"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(amsco_transposition_decipher(c7bs, key_b[0], fillpattern=key_b[1])))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "'phase seven we approached the cable junction undercover of night with nautilus at an elevation of three feet towing seahorse to starboard comms interception showed that we remained undetected and seahorse was deployed at operating depth the various layers of armoured protection were removed from the cable and as expected once the steel jacket was removed the other layers provided little resistance the divers entered the water and cut into the core to insert the optical repeaters linking them back to the man in the middle unit which was powered up and fully tested initial tests showed that it was operating as expected and three keys have already been recovered from the omani transmissions with daylight approaching the remaining tests were postponed for the following night and the ship returned to deeper waters where it remained at low deck height the divers were left at seahorse to decompress slowly and will be recovered tomorrow once the final tests have been concluded'"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "transpositions[key_b[0]]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 12,
-       "text": [
-        "['cable',\n",
-        " 'facto',\n",
-        " 'facts',\n",
-        " 'gabon',\n",
-        " 'hafts',\n",
-        " 'hefts',\n",
-        " 'ibexs',\n",
-        " 'kabul',\n",
-        " 'lacys',\n",
-        " 'ladys',\n",
-        " 'laius',\n",
-        " 'lefts',\n",
-        " 'macon',\n",
-        " 'macro',\n",
-        " 'macys',\n",
-        " 'malts',\n",
-        " 'melon',\n",
-        " 'melts',\n",
-        " 'negro',\n",
-        " 'oahus',\n",
-        " 'obeys',\n",
-        " 'obits',\n",
-        " 'odets',\n",
-        " 'pacts',\n",
-        " 'pants',\n",
-        " 'pelts',\n",
-        " 'pints',\n",
-        " 'piotr',\n",
-        " 'pious',\n",
-        " 'plots',\n",
-        " 'plows',\n",
-        " 'ploys',\n",
-        " 'rafts',\n",
-        " 'rants',\n",
-        " 'remus',\n",
-        " 'rents',\n",
-        " 'riots',\n",
-        " 'scout',\n",
-        " 'shout',\n",
-        " 'snout',\n",
-        " 'cabbed',\n",
-        " 'cabbie',\n",
-        " 'cabbys',\n",
-        " 'cabral',\n",
-        " 'dabble',\n",
-        " 'faeroe',\n",
-        " 'gabbro',\n",
-        " 'ibexes',\n",
-        " 'jaguar',\n",
-        " 'kaboom',\n",
-        " 'kaftan',\n",
-        " 'lacuna',\n",
-        " 'lagoon',\n",
-        " 'lefter',\n",
-        " 'legume',\n",
-        " 'macaws',\n",
-        " 'magyar',\n",
-        " 'malays',\n",
-        " 'maltas',\n",
-        " 'mellon',\n",
-        " 'negevs',\n",
-        " 'nellys',\n",
-        " 'nelson',\n",
-        " 'odious',\n",
-        " 'paddys',\n",
-        " 'panzas',\n",
-        " 'peggys',\n",
-        " 'pelves',\n",
-        " 'pennys',\n",
-        " 'photos',\n",
-        " 'pinups',\n",
-        " 'qantas',\n",
-        " 'rabats',\n",
-        " 'rallys',\n",
-        " 'refuse',\n",
-        " 'refute',\n",
-        " 'remuss',\n",
-        " 'renews',\n",
-        " 'repute',\n",
-        " 'scouts',\n",
-        " 'shouts',\n",
-        " 'snouts',\n",
-        " 'cabbage',\n",
-        " 'cabrera',\n",
-        " 'dabbled',\n",
-        " 'gadwall',\n",
-        " 'ladonna',\n",
-        " 'leftest',\n",
-        " 'madonna',\n",
-        " 'malayan',\n",
-        " 'million',\n",
-        " 'papacys',\n",
-        " 'pellets',\n",
-        " 'penneys',\n",
-        " 'qantass',\n",
-        " 'ragtags',\n",
-        " 'refuses',\n",
-        " 'refuter',\n",
-        " 'regrets',\n",
-        " 'rennets',\n",
-        " 'renters',\n",
-        " 'reroute',\n",
-        " 'sallust',\n",
-        " 'macassar',\n",
-        " 'mahatmas',\n",
-        " 'mahayana',\n",
-        " 'nanettes',\n",
-        " 'palatals',\n",
-        " 'phosphor',\n",
-        " 'reenters',\n",
-        " 'phosphors',\n",
-        " 'sinusitis',\n",
-        " 'malayalams',\n",
-        " 'sinusitiss']"
-       ]
-      }
-     ],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": []
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014-challenge8.ipynb b/2014-challenge8.ipynb
deleted file mode 100644 (file)
index e30823e..0000000
+++ /dev/null
@@ -1,5186 +0,0 @@
-{
- "metadata": {
-  "name": "",
-  "signature": "sha256:8cfa7fab1d8d3830f8cdd550122b0b7f10258d8adb3ff205bd1feeca64418741"
- },
- "nbformat": 3,
- "nbformat_minor": 0,
- "worksheets": [
-  {
-   "cells": [
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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('2014/8a.ciphertext').read()\n",
-      "c8b = open('2014/8b.ciphertext').read().strip()"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 1
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 2,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d36fa358>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f26006854e0>"
-       ]
-      }
-     ],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_8a = pd.Series(collections.Counter([l.lower() for l in c8a if l in string.ascii_letters]))\n",
-      "freqs_8a.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 3,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d37269b0>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25d369f358>"
-       ]
-      }
-     ],
-     "prompt_number": 3
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c8as = sanitise(c8a)\n",
-      "c8as"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 4,
-       "text": [
-        "'nyvlggsyglchxfeuytqcesqxpziufiggrbjhpayncruyfpsxufiupskyrectmmcncruyregxigrlglbtiblmecebzsvrlpuxpbibjajrljreobajrlufigjehbezywtmgjyxfqxictsgrdgtbjafyoocwtmjblctwwucqmgofrlfmrfrlfwlbtijlwuypmchjqxicrfchumtsmzjbimyvhcuvyrugxjcwpdtpuisrlfdhbaencyqumufeogrhcrjmytqsmsxjmrcsxjrmttiswzvjrfpecjitnidgemdssaitasvjhuyofgxpsxgmvvqfvrxiyxxmymbxfjpufigbeufeuuiiyzfavbaofbxicmsamqfisqwpgrtribbmtskhcwuuimcxufinbitrvpwxsmnbljppytuixgpmlifbgpmtfpeugsodvpkxicsnyrjeswcvokioreoyvnchggkirishiuyrerlfdpjeluasorvpjwzqxfkwgpsnyhsmrfkiblaigpfuiociersflwvpiuusufmoewpliufeuuiemrprwflhdpmuggbjmodsskeugsoygsmwtrlfzecypnyreyftrvbgxblhuusufeuuivqiblsoavjrmdyplcchcrfpeugsonvprsdmpplxiyxdfeolimemwcrufimczfjsgasnkmukiorxicjeylbtitfsxlmobiwcppnmoexigwqjeogenqyscxiyxufizummjvfgrtreucxictpuisqyqnpzumufmoyjfuqplxiqfvrajrlmsglrlfwajjpomxhsitqxiyxxcoomabzsvrmuyreuixgpmnyugxpsxpdfvqmocwtdssjsoeiomyhfxpasncyqumufeqjeomjpsvpurumiynppgxjrmorlfkiblxjkixcrpuoomaufeurlfgvigkicwuqidsvjrcdmqnsrjaeugsoqescioavznxfbytgrhygbbioswdgticvtmafaeoqxbpxisrugrhrlsmyhfxichbrecywfdssmxicvjlxfpgfnxtuidyrdpedixigwnycccxicfscelrlsmyhfaffewcffcrmmslgrhdssgrufiggkirehymoqxufigbemcxtlsuqgscajryqypmrlfzitrlbpvz'"
-       ]
-      }
-     ],
-     "prompt_number": 4
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key_a, score = vigenere_frequency_break(c8as)\n",
-      "key_a, score"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 5,
-       "text": [
-        "('bye', -1461.9840974270046)"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "' '.join(segment(vigenere_decipher(c8as, key_a)))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 6,
-       "text": [
-        "'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'"
-       ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c8b) / 8"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 7,
-       "text": [
-        "875.0"
-       ]
-      }
-     ],
-     "prompt_number": 7
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[c for c in chunks(c8b, 5)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 8,
-       "text": [
-        "['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",
-        " ...]"
-       ]
-      }
-     ],
-     "prompt_number": 8
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(int(c, 2)) for c in chunks(c8b, 5)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 9,
-       "text": [
-        "[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",
-        " ...]"
-       ]
-      }
-     ],
-     "prompt_number": 9
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "max([(int(c, 2)) for c in chunks(c8b, 5)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 10,
-       "text": [
-        "24"
-       ]
-      }
-     ],
-     "prompt_number": 10
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "max([chr(int(c, 2) + ord('a')) for c in chunks(c8b, 5)])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 11,
-       "text": [
-        "'y'"
-       ]
-      }
-     ],
-     "prompt_number": 11
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 12
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c8bl = ''.join([cadenus_letter(int(c, 2), doubled='z') for c in chunks(c8b, 5)])\n",
-      "c8bl"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 13,
-       "text": [
-        "'afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdtoipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlimlpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxsoaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaeseeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypaidyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogyiterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsiantaoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefeisiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghynweintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeemrpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylonahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda'"
-       ]
-      }
-     ],
-     "prompt_number": 13
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "min(c8bl), max(c8bl)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 14,
-       "text": [
-        "('a', 'y')"
-       ]
-      }
-     ],
-     "prompt_number": 14
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "len(c8bl), len(c8bl) / 25"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 15,
-       "text": [
-        "(1400, 56.0)"
-       ]
-      }
-     ],
-     "prompt_number": 15
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs_8b = pd.Series(collections.Counter([l.lower() for l in c8bl if l in string.ascii_letters]))\n",
-      "freqs_8b.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 16,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d357dc18>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25d357d278>"
-       ]
-      }
-     ],
-     "prompt_number": 16
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "freqs = pd.Series(english_counts)\n",
-      "freqs.plot(kind='bar')"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 17,
-       "text": [
-        "<matplotlib.axes.AxesSubplot at 0x7f25d351a940>"
-       ]
-      },
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0x7f25d34b3e48>"
-       ]
-      }
-     ],
-     "prompt_number": 17
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "rows = chunks(c8bl, len(c8bl) // 25)\n",
-      "rows"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 18,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 18
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "chunks(''.join([l if l in 'phase' else '.' for l in c8bl]), 56)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 19,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 19
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "columns = [''.join(c) for c in zip(*rows)]\n",
-      "columns"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 20,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 20
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 21,
-       "text": [
-        "{'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",
-        " '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",
-        " '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",
-        " '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",
-        " '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)],\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",
-        " '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)]}"
-       ]
-      }
-     ],
-     "prompt_number": 21
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "keycolumn = make_cadenus_keycolumn(reverse=True)\n",
-      "inverse_keycolumn = {v: l for l, v in keycolumn.items()}\n",
-      "inverse_keycolumn"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 22,
-       "text": [
-        "{0: 'a',\n",
-        " 1: 'z',\n",
-        " 2: 'y',\n",
-        " 3: 'x',\n",
-        " 4: 'w',\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'}"
-       ]
-      }
-     ],
-     "prompt_number": 22
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 23
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 24,
-       "text": [
-        "43005"
-       ]
-      }
-     ],
-     "prompt_number": 24
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "valid_partial_solution(solutions[1], inverse_keycolumn)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 25,
-       "text": [
-        "True"
-       ]
-      }
-     ],
-     "prompt_number": 25
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 26,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 26
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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)]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 27
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "display_solution(solutions[0], columns)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 28,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 28
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "sum(Ptrigrams(r) for r in display_rows)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 29,
-       "text": [
-        "-109.09171451522874"
-       ]
-      }
-     ],
-     "prompt_number": 29
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 30
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(s, display_solution(s, columns), score_solution(s, columns)) for s in solutions[:10]]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 31,
-       "text": [
-        "[([(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)]"
-       ]
-      }
-     ],
-     "prompt_number": 31
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "sorted(solutions[:10], key=lambda s: score_solution(s, columns), reverse=True)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 32,
-       "text": [
-        "[[(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)]]"
-       ]
-      }
-     ],
-     "prompt_number": 32
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "solutions = sorted(solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 33
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 34,
-       "text": [
-        "10000"
-       ]
-      }
-     ],
-     "prompt_number": 34
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "display_solution(solutions[0], columns)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 35,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 35
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "hinted_keywords = [w for w in keywords if w[0] =='f' if len(transpositions_of(w)) == 7]\n",
-      "len(hinted_keywords)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 36,
-       "text": [
-        "849"
-       ]
-      }
-     ],
-     "prompt_number": 36
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "hinted_keywords[:10]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 37,
-       "text": [
-        "['fabrics',\n",
-        " 'facings',\n",
-        " 'faction',\n",
-        " 'factors',\n",
-        " 'factory',\n",
-        " 'faculty',\n",
-        " 'fadeout',\n",
-        " 'failure',\n",
-        " 'fainest',\n",
-        " 'fainted']"
-       ]
-      }
-     ],
-     "prompt_number": 37
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "first_chunk = c8bl[:175]\n",
-      "len(first_chunk)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 38,
-       "text": [
-        "175"
-       ]
-      }
-     ],
-     "prompt_number": 38
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[cadenus_decipher(first_chunk, w, keycolumn)[:20] for w in hinted_keywords]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 39,
-       "text": [
-        "['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']"
-       ]
-      }
-     ],
-     "prompt_number": 39
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[w for w in hinted_keywords if cadenus_decipher(first_chunk, w, keycolumn).startswith('phaseseven')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 40,
-       "text": [
-        "[]"
-       ]
-      }
-     ],
-     "prompt_number": 40
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 41
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "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])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 42
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "key8b, fitness = cadenus_break(c8bl, words=hinted_keywords, fitness=Ptrigrams)\n",
-      "key8b, fitness"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 43,
-       "text": [
-        "(('finalist',\n",
-        "  {'l': 20,\n",
-        "   'u': 11,\n",
-        "   'p': 16,\n",
-        "   'q': 15,\n",
-        "   'j': 22,\n",
-        "   'm': 19,\n",
-        "   'f': 1,\n",
-        "   'r': 14,\n",
-        "   'b': 5,\n",
-        "   'v': 10,\n",
-        "   'e': 2,\n",
-        "   'x': 9,\n",
-        "   'z': 7,\n",
-        "   'i': 23,\n",
-        "   'k': 21,\n",
-        "   'w': 10,\n",
-        "   'o': 17,\n",
-        "   't': 12,\n",
-        "   'y': 8,\n",
-        "   'a': 6,\n",
-        "   's': 13,\n",
-        "   'c': 4,\n",
-        "   'd': 3,\n",
-        "   'g': 0,\n",
-        "   'h': 24,\n",
-        "   'n': 18}),\n",
-        " -5286.197562931952)"
-       ]
-      }
-     ],
-     "prompt_number": 43
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "cadenus_decipher(first_chunk, key8b[0], key8b[1])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 44,
-       "text": [
-        "'wledgctftrojhrtheonovoresoovrpanegoarerufofinaltnportiuhertiorafthehasdwarenncompleeeandoastestssoveconlrudedtlsreisnntignfrrrthesinaaltranlicthaaehesecisityseemiceshuneanykhf'"
-       ]
-      }
-     ],
-     "prompt_number": 44
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(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, make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('phaseseven')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 45,
-       "text": [
-        "[]"
-       ]
-      }
-     ],
-     "prompt_number": 45
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(w, s, d1+d2, r, cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=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+d2, start=s, reverse=r)).startswith('phase')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 53,
-       "text": [
-        "[('filbert',\n",
-        "  'm',\n",
-        "  'lu',\n",
-        "  False,\n",
-        "  'phasennrkmffnhignsdaaojsrcisrncheentoeetueweisvhsounsucoaleyrhreitdioseotototdhsoagreeysifaglenhtlhonriuelseairscnrteameteiwnntneefefcrartataieposrlandrlvtartalvhctofnorehdpro'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lm',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lq',\n",
-        "  True,\n",
-        "  'phaseoeeeesnnufleyehhdoddraccseoeshengoenotthsaeovnlnesgurcrnofriearrtiatttsutacihtracaearaielrmanhhtpnleikhdseaigrtcssejpoemlwnrdinlfoisnfnteofetrourstrnrltrtvnaiwhsvafooeyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lr',\n",
-        "  True,\n",
-        "  'phaseoeeeeynnufledehhdodoraccseoeshengsenotthnaeovnlresgurcanofrietrrtiatitsutacehtracararaielpmanhhtdnleikhtseaigrocssejpdemlwnrsinlfoifnfnteosetrourrtrnrlthtvnaiwesvafoosyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'lw',\n",
-        "  True,\n",
-        "  'phaseoeeeennnuflerehhdodaraccseteshengienottheaeovnlresgurcpnofriedrrtiatttsutacohtracadaraielsmanhhtfnleikhsseaigrrcssejphemlwnreinlfoisnfnteosetrourytrnrltdtvnaiwosvafoooyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mn',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mo',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mp',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mq',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mr',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'ms',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mt',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mu',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mv',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mw',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mx',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'my',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'mz',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'no',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'np',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nq',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nr',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'ns',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nt',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nu',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nv',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nw',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nx',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'ny',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('foolerys',\n",
-        "  'z',\n",
-        "  'nz',\n",
-        "  True,\n",
-        "  'phaseoeeeernnuflehehhdoderaccseseshengsenotthyaeovnldesgurconofrieorrtiatstsutacnhtracararaielamanhhttnleikhiseaigrecssejpremlwnrpinlfoidnfnteotetrourotrnrltdtvnaiwssvafoofyoi'),\n",
-        " ('filleting',\n",
-        "  'm',\n",
-        "  'lu',\n",
-        "  False,\n",
-        "  'phasentekmysrhfgndmnrdjsonnpcncofareoestiiteinreovunrvuruleavhtrittocwiotiohothsenoaaeyrhoeilepagehondsfdisetnteinroeugetedsrhwnesoalfrafrnctiesseeoanrtatrarhrscactealafehslll')]"
-       ]
-      }
-     ],
-     "prompt_number": 53
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "[(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('phases')]"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 46,
-       "text": [
-        "[]"
-       ]
-      }
-     ],
-     "prompt_number": 46
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "cadenus_decipher(first_chunk, 'filbert', make_cadenus_keycolumn(doubled_letters='lu', start='m', reverse=False))"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 52,
-       "text": [
-        "'phasennrkmffnhignsdaaojsrcisrncheentoeetueweisvhsounsucoaleyrhreitdioseotototdhsoagreeysifaglenhtlhonriuelseairscnrteameteiwnntneefefcrartataieposrlandrlvtartalvhctofnorehdpro'"
-       ]
-      }
-     ],
-     "prompt_number": 52
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "chunks(first_chunk, 175)"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "pyout",
-       "prompt_number": 48,
-       "text": [
-        "['afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanes']"
-       ]
-      }
-     ],
-     "prompt_number": 48
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [],
-     "language": "python",
-     "metadata": {},
-     "outputs": [],
-     "prompt_number": 48
-    }
-   ],
-   "metadata": {}
-  }
- ]
-}
\ No newline at end of file
diff --git a/2014/2014-challenge1.ipynb b/2014/2014-challenge1.ipynb
new file mode 100644 (file)
index 0000000..5dabd2d
--- /dev/null
@@ -0,0 +1,156 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c1a = open('1a.ciphertext').read()\n",
+    "c1b = open('1b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(4, -728.156672407534)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = caesar_break(c1a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "MARK, \n",
+      "\n",
+      "THANKS FOR BRINGING ME IN ON THIS ONE, SEEMS LIKE A FASCINATING CASE. \n",
+      "\n",
+      "I HAVE THREE QUESTIONS: \n",
+      "WHY WOULD THE FLAG DAY ASSOCIATES WANT A SHIP? \n",
+      "WHY WOULD THEY WANT THIS SHIP? \n",
+      "WHY WOULD THEY WANT THIS SHIP NOW? \n",
+      "\n",
+      "HAVING READ THE ATTACHED DOCUMENT I SUSPECT THAT THE ANSWERS ARE ALL RELATED TO THE QUESTION OF WHAT EXACTLY SHE AND HER FLAG DAY ASSOCIATE CREW WERE TRYING TO SURVEY. \n",
+      "\n",
+      "I AM GUESSING THAT YOU ALREADY CHECKED OUT THE ONBOARD GPS SYSTEM FOR INFORMATION ABOUT HER MOVEMENTS, BUT IF YOU DID FIND ANYTHING I WOULD BE FASCINATED TO HEAR ABOUT IT. IN THE MEANTIME I AM PRETTY SURE THAT YOU KNOW MORE ABOUT THE FLAG DAY ASSOCIATES THAN YOU HAVE TOLD ME, SO A BRIEFING WOULD BE MUCH APPRECIATED. \n",
+      "\n",
+      "ALL THE BEST, \n",
+      "\n",
+      "HARRY \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(caesar_decipher(c1a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(22, -637.7038880633795)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = caesar_break(c1b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "report on the trojan project having drugged the crew we were able to take the ship with essentially no resistance the crew were handed to the somali pirates at the deepwater rendezvous as planned and we began the survey just after midnight the radar showed an approaching vessel which our database identified as a coastguard cutter we headed south to avoid detection with all ship lights off we then completed the survey in the new location afterdawn with the listening post installed we began assembling the equipment for phase two of the operation keeping a watch for further patrols in the sky and on the water\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge2.ipynb b/2014/2014-challenge2.ipynb
new file mode 100644 (file)
index 0000000..f891699
--- /dev/null
@@ -0,0 +1,216 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "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",
+    "c2a = open('2a.ciphertext').read()\n",
+    "c2b = open('2b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f8012c71eb8>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f8012c71898>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((5, 25, True), -761.8388033231918)"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = affine_break(c2a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "DEAR MARK, \n",
+      "\n",
+      "THANKS FOR THE LATEST REPORT FROM THE ON-SITE TEAM. IT SHOWS THAT THE SHIPBOARD GPS SYSTEM WAS COMPLETELY SCRAMBLED SO WE ARE NOT GOING TO BE ABLE TO TRACE HER MOVEMENTS FROM THAT. DO WE HAVE ANY ODD TRACES FROM ONSHORE RADAR THAT GIVE A HINT OF WHERE SHE MIGHT HAVE BEEN? \n",
+      "\n",
+      "THE COMMENT IN THE LAST MESSAGE THAT THE PIRATES COMPLETED THE SURVEY EVEN THOUGH THEY HAD MOVED SOUTH TO AVOID DETECTION SHOULD HAVE TOLD ME THAT THE SURVEY WAS NOT GEOGRAPHIC. AT FIRST I THOUGHT IT MIGHT HAVE BEEN REFERRING TO A TELECOMS SURVEY SINCE YOU MENTIONED THE LONG AERIAL, BUT ACTUALLY THE ATTACHED MESSAGE IS VERY REVEALING. STILL NOT SURE WHAT THE SURVEY WAS FOR THOUGH, AND HOW THAT IS CONNECTED TO THE MISSING SUPERSTRUCTURE. CAN YOU GET ME ANY PICTURES? \n",
+      "\n",
+      "HARRY \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(affine_decipher(c2a, key_a[0], key_a[1]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('flag', <KeywordWrapAlphabet.from_largest: 3>), -367.81492429457404)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = keyword_break_mp(c2b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "calm weather allowed us to complete the hull survey and establish its integrity no major remedial works were required and the pumps and extra bulkheads were installed out in deep waters over the next five days we are now testing the system for reliability and safety before moving on to phase three of the operation operation trojan remains on target\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(keyword_decipher(c2b, key_b[0], key_b[1])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f800850a358>"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nRU5ErkJggg==\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f800b778a58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_2b = pd.Series(collections.Counter([l.lower() for l in c2b if l in string.ascii_letters]))\n",
+    "freqs_2b.plot(kind='bar')"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge3.ipynb b/2014/2014-challenge3.ipynb
new file mode 100644 (file)
index 0000000..e959488
--- /dev/null
@@ -0,0 +1,209 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "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",
+    "c3a = open('3a.ciphertext').read()\n",
+    "c3b = open('3b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f809e4fc208>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f809e51ea58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((11, 1, True), -839.4977013876568)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = affine_break(c3a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry you asked me about the flag day associates they area transnational hacking group dedicated to the overthrow of western capitalism they have been implicated in several major protests including an attempt to takeover the uk national grid attacks on reservoir systems and interference in bank trading networks it looks like the fda carried out fairly extensive modifications to the ship they did a good job too we hadnt noticed the added bulkheads until we compared the layout with the plans from lloyds register they seem to be there to add rigidity though there is one additional panel at the stern that doesnt fit the pattern and we will be removing that tonight to see what it is there for we would have done it this afternoon but decided we should conduct our own hull survey in case there is a booby trap\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(affine_decipher(sanitise(c3a), key_a[0], key_a[1]))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('seahorse', <KeywordWrapAlphabet.from_last: 2>), -681.3308426043137)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = keyword_break_mp(c3b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "phase three the nautilus system was fully tested last night with complete success we sailed within four hundred metres of the target and monitored all radio traffic for two hours with no sign that we were being watched or were even noticed we then conducted a full radar sweep of the area and found three dead spots where we could work on the ship without detection as planned we converted the two adjacent empty containers in the middle of the stack into a large workshop area and carried out a full inspection drill now even if we are boarded our work should remain undetected we retrieved seahorse from the third container and carried out stage one of the assembly\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(keyword_decipher(c3b, key_b[0], key_b[1])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f809e35e438>"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nRK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f809e35e4e0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_3b = pd.Series(collections.Counter([l.lower() for l in c3b if l in string.ascii_letters]))\n",
+    "freqs_3b.plot(kind='bar')"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge4.ipynb b/2014/2014-challenge4.ipynb
new file mode 100644 (file)
index 0000000..d1f240b
--- /dev/null
@@ -0,0 +1,322 @@
+{
+ "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",
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f775bffe668>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f775bfe5f28>"
+      ]
+     },
+     "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": [
+       "'prsaoegerauiadmwehdnisnrasawuaaessrefgdosogvorbeeeaartesctdfmenuibrttlmeytumtmeuaikwhutkwerwahmnpwraeesononesebatoihacineetbrotadaktgfeesyioflttlstiiaeosvieonsrrtaupmnnoaencocnuvrsclvdrgctaiihriciaihrsduomrlemcrngleomarfhiuewhalcsasracufrawwsmehulstoaohceletmtoilsepdmumtptrslyrhhntpanwpmoadppdwbeseoassltmlpesletuncorerlclitaosvsiniifwseafortaaduyenenonnsopfhontwkoertcslyvoeiohlufoeioetsthtsbreneveaouepgieesobduorsfeercdyadutaepeadrdigseebfuoggopogalyfewsoeemdntohrebhaaesneworgnfiaulnlwadueodcotrargvuenewhiertlauilmsoniotmuinewaiuewloerstttisdrsasnussiesmerdhetryrhpnlrtereadmredebnntrnenwmoutrdosaneowomcgidciasaontiioiascesissupcrmoybrineyweelaylewtyrtilhsto'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c4bs = sanitise(c4b)\n",
+    "c4bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('stern', <KeywordWrapAlphabet.from_largest: 3>), -830.5838133421847)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = keyword_break_mp(c4a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry we completed the survey and you are not going to believe what we found behind the false bulkhead in the stern there was a large pumping station connected to a number of sea facing outlets it looks like a scuttling valve system similar to the ones used on u boats in world war two icant understand why they would goto so much effort when they could have scuttled her at anytime with a small quantity of plastic explosive the team back at nsa have run some analytics on the remaining text files we extracted from the servers onboard these ciphers are going to be pretty hard to crack the attached report has frequency analysis matching usual english text so we can assume that the sender was a native speaker did you have any thoughts on what the nautilus system might have been or what it was for\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(sanitise(c4a), key_a[0], key_a[1]))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((6, 0, 1, 7, 9, 4, 2, 3, 5, 8, 10), False, True), -1777.161911681522)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c4bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "et et mlpdshgnbralwrrauiur tep as gsl di ocpedacnscbtsesuotut ira la lee a so at dy de og is as tavrtdeiioalkoducrhe hom tein oarscnegigctuimetyfo so rice lite her a aire iue leer dad tom sub rg mihm it yfflvwhetamioucuer to seo e oleh sri cu fig in ddy lea log ten urs site oawioheikttpohsmpps wlsosinrndshstgverll muut has ra erupt it lit smt mck is yn lace trw a bfi awrr pm eere i uunet or oe wfi a gary ws nsw lal dsb aveo smee mlr hive essor yim eee a osmer n no amf nrad hep no do ie re hywsunroffbnwrretttg hn tear po amd in peet gh au out ale air di serna sue eu now nwyopebyegheplnmshew van me on o an aol w own nbae irc mateo de nubs odys a usoe eau pre e on n west ptbnrenlerrdiacswsoa a dwl to foo ea cob hoc erp rr uses in egf st fast hurn hterneoavcfotsaeocrd int cwo a is y at it wwsncauwsdsoseldlkdf mm levu norm ect\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], \n",
+    "                                                              emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((4, 8, 0, 6, 9, 3, 1, 2, 5, 7, 10), False, True), -2823.7851213306785)"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c4bs, fitness=Ptrigrams)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "te tmpl dsehgbralrwranuirtep sag sul doc pea dc nisc tses out ub tial a lee as road yd egoist as avr ted ii to ako durch el hote in a or smc n gig cut i meet fo soir cey lie her a air te ie leed radu to sub rmg ihmmiyfflwvhettaiouc eur tmo so eol hes re ic fig id nd yule log tn eur ass teoa iwohieittposhmpkpsl so snirnwdsstgvrellhmut has are ru up it list mttmcisynalcektrabfi war rwp mere iuu nee too ew fai garry sns wall dwsbveosememalrivees so rhy ieee a some mr no am frn adn he no do eire phys un rf of bwnwrettgthnrterpo admin a petg hao uu tea laird sie renau eeuonwnswypebygeheo plm she vw ann me no a no al woo wnba eric mn a to den bus oed yau so eea us pre on new step tn rene lrrbdicswsaoadawl of ooaecotbhcerprrusoes neg ft sfa is turn he trn he ovc fost aea ord inc two cas ya ttiw wisc au wds sons ldlkfdmmelvunomrecet\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c4bs), key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], \n",
+    "                                                              emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f773db9db70>"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWwAAAD+CAYAAAAeRj9FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFLlJREFUeJzt3X2QZFd93vHvIym8SAiWTWC0MVEEVBZhAsbIKHIs4hEW\nZYUSa5VxNlbeNhSoYjBGpLDDkoRocJVtyWXHNkklrgikWt4cr7ElC1ds73hRIxkoEZBkhMR6IfY6\n8suOHIKEwFaQpV/+6Lva0ezM9J2e6Zk5M99PVdf0vXNPn9M9t585fe69fVJVSJI2v9M2ugGSpH4M\nbElqhIEtSY0wsCWpEQa2JDXCwJakRowM7CRXJ7knyReSXN2t25lkNsnRJIeS7Jh8UyVpe1s2sJP8\nXeBNwCuBbwMuT/JCYD8wW1W7gcPdsiRpgkb1sM8H7qiqR6rqMeATwOuBPcCBbpsDwBWTa6IkCUYH\n9heAV3VDIGcCrwWeB0xV1Vy3zRwwNcE2SpKAM5b7ZVUdSXIdcAj4BnA38NiCbSqJ17dL0oQtG9gA\nVXUDcANAkp8A/hiYS3JOVR1Psgt4YLGyBrkkjaeqsnBdn7NEntv9PBf4fuAjwC3Avm6TfcDNy1S6\n6O2aa65Z8nd9bqspv93Kttpun7Ov13Z9zksZ2cMGPprkrwOPAm+pqoeSXAscTPJG4Biwt8fjSJJW\noc+QyD9YZN3/BS6dSIskSYvasCsdp6enN6z8diu7kXX7nNsou5F1+5z7y3LjJauVpCb5+JK0FSWh\nxjnoKEnaHAxsSWqEgS1JjTCwJakRBrYkNcLAlqRGGNiS1AgDW5IaYWBLUiMMbElqhIEtSY0wsCWp\nEQa2JDWizwQGGlNyypdtncJvM5TUV58pwt6V5N4k9yT5SJKndrOozyY5muRQkh3r0dg21TI3Sepv\n2cBOch5wFfCKqnopcDrwg8B+YLaqdgOHu2VJ0gSN6mF/jeFcjmcmOQM4E/hTYA9woNvmAHDFxFoo\nSQJGBHY3d+PPAv+bYVA/WFWzwFRVzXWbzQFTE22lJGn5g45JXgi8HTgPeAj4lST/bP42VVVJlhyQ\nnZmZeeL+9PT0qudgk6StZjAYMBgMRm637JyOSf4x8JqqelO3/M+Bi4BXA5dU1fEku4Bbq+r8Rcpv\n6zkdh2eJLPf841kikk4x7pyOR4CLkjw9w/S5FLgP+Biwr9tmH3DzWjZWknSqkbOmJ/k3DEP5ceBO\n4E3A2cBB4FzgGLC3qh5cpKw9bHvYklZoqR72yMBeZaUGtoEtaYXGHRKRJG0SBrYkNcLAlqRGGNiS\n1AgDW5IaYWBLUiMMbElqhIEtSY0wsCWpEQa2JDXCwJakRhjYktQIA1uSGmFgS1IjDGxJaoSBLUmN\nGBnYSV6U5K55t4eSvC3JziSzSY4mOZRkx3o0WJK2qxXNOJPkNOBPgAuBHwH+T1X9dJJ3As+uqv0L\ntnfGGWeckbRCazXjzKXAl6vqfmAPcKBbfwC4YnVNlCQtZ6WB/YPAL3X3p6pqrrs/B0ytWaskSac4\no++GSZ4CvA5458LfVVUlWfSz/czMzBP3p6enmZ6eXnEjJWkrGwwGDAaDkdv1HsNO8n3Am6vqsm75\nCDBdVceT7AJurarzF5RxDNsxbEkrtBZj2FdycjgE4BZgX3d/H3Dz+M2TJI3Sq4ed5Czgj4DnV9XD\n3bqdwEHgXOAYsLeqHlxQzh62PWxJK7RUD3tFp/WNUamBbWBLWqG1Oq1PkrRBDGxJaoSBLUmNMLAl\nqREGtiQ1wsCWpEYY2JLUCANbkhphYEtSIwxsSWqEgS1JjTCwJakRBrYkNcLAlqRGGNiS1AgDW5Ia\n0Suwk+xI8tEkX0xyX5K/l2RnktkkR5McSrJj0o2VpO2sbw/7F4D/UVUvBl4GHAH2A7NVtRs43C1L\nkiZk5BRhSZ4F3FVVL1iw/gjw3VU1l+QcYOCs6U/mFGGSxrGaKcKeD/x5khuT3Jnk+m5S3qmqmuu2\nmQOm1rC9kqQFzui5zSuAt1bV/0zy8ywY/qiqSrJoV3FmZuaJ+9PT00xPT4/dWEnaigaDAYPBYOR2\nfYZEzgE+XVXP75YvBt4FvAC4pKqOJ9kF3OqQyJM5JCJpHGMPiVTVceD+JLu7VZcC9wIfA/Z16/YB\nN69RWyVJixjZwwZI8m3A+4CnAP8LeANwOnAQOBc4BuytqgcXlLOHbQ9b0got1cPuFdirqNTANrAl\nrdBqzhKRJG0CBrYkNcLAlqRGGNiS1AgDW5IaYWBLUiMMbElqhIEtSY0wsCWpEQa2JDXCwJakRhjY\nktSIPhMYrJnhlyEtzS9C0nYz6j0Bvi900roG9tBSO9/oHVfampb/RkfpBIdEJKkRvXrYSY4BXwMe\nAx6tqguT7AR+GfjbLDGBgaStyaGcjdG3h13AdFV9e1Vd2K3bD8xW1W7gMAsm5pW01dUyN03CSoZE\nFv5L3QMc6O4fAK5YkxZJkha1kh727yT5bJKrunVTVTXX3Z8Dpta8dZKkJ/Q9S+S7qurPkjwHmE1y\nZP4vq6qS+DlIkiaoV2BX1Z91P/88yU3AhcBcknOq6niSXcADi5WdmZlZq7ZK0pY0GAwYDAYjtxs5\na3qSM4HTq+rhJGcBh4D3AJcCX6mq65LsB3ZU1f4FZZ80a/rys4hvvRnEnTVdo7S6j7Ta7lYsNWt6\nnx72FHBTdxrPGcCHq+pQks8CB5O8ke60vjVsr6QJ88rj9ozsYa/qwe1hYy9Ey9nIfWQ170f37cla\nqoftlY6S1AgDW5IaYWBLUiM24Nv6JG1nfg/J+AxsSRvAr5Qdh0MiktQIA1uSGmFgS1IjDGxJaoSB\nLUmNMLAlqREGtiQ1wsCWpEYY2JLUCANbkhphYEtSI3oFdpLTk9yV5GPd8s4ks0mOJjmUZMdkmylJ\n6tvDvhq4j5Pf2LIfmK2q3cDhblmSNEEjAzvJ84DXAu/j5Ndo7QEOdPcPAFdMpHVqTpKRN0nj6dPD\n/jngx4DH562bqqq57v4cw4l6pU4tc5M0rmUDO8nlwANVdRdLfEltN8uu70RJmrBRExj8fWBPktcC\nTwOemeSDwFySc6rqeJJdwANLPcDMzMyaNVaStqLBYMBgMBi5XfpOxZPku4EfrarXJflp4CtVdV2S\n/cCOqjrlwGOSmv/4w/HLperLlpsWaPnnCz5nbeTrtZr342ra7T4yWhKq6pRRjZVOEXbiVbwWOJjk\njcAxYO/qmie1yzkKtV5697DHenB72Gy3noTPedEtNmVv0x725rVUD9srHSWpEQa2JDXCwJakRhjY\nktQIA1uSGmFgS1IjDGxJaoSBLUmNMLAlqREGtiQ1wsCWpEYY2JLUCANbkhphYEtSIwxsSWqEgS1J\njRg1Ce/TktyR5O4k9yX5qW79ziSzSY4mOZRkx/o0V5K2r2UDu6oeAS6pqpcDLwMuSXIxsB+Yrard\nwOFuWZI0QSOHRKrqL7q7TwFOB74K7AEOdOsPAFdMpHWSpCeMDOwkpyW5G5gDbq2qe4GpqprrNpkD\npibYRkkSPWZNr6rHgZcneRbw20kuWfD7SrLkjJkzMzOrbqQkbWWDwYDBYDByuxXNmp7k3cBfAm8C\npqvqeJJdDHve5y+yvbOmb7PZoX3Oi26xKWcQd9b0zWusWdOT/I0TZ4AkeTrwGuAu4BZgX7fZPuDm\ntW2uJGmhUUMiu4ADSU5jGO4frKrDSe4CDiZ5I3AM2DvZZkrSid758rZy73xFQyIrfnCHRNhuH/18\nzotusSmHB1ocEtku+9dSQyIjDzpKrRjV+9oKb2Rtbwa2tpile4xS6/wuEUlqhIEtSY0wsCWpEQa2\nJDXCwJakRhjYktQIT+sbYbtfWSVp8zCwe1n+yipJWg8GtoSfpNQGA1t6gp+ktLl50FGSGmEPW5J6\n2AzDZga2JPW2scNmDolIUiP6zJr+t5LcmuTeJF9I8rZu/c4ks0mOJjl0YioxSdJk9OlhPwr866p6\nCXAR8MNJXgzsB2arajdwuFuWJE3IyMCuquNVdXd3/+vAF4FvAfYAB7rNDgBXTKqRWl9JRt4krb8V\nHXRMch7w7cAdwFRVzXW/mgOm1rRl2mCekyxtNr0DO8kzgF8Frq6qh+f3sqqqkiz6Dp+ZmVltG1dt\nM5yOI0lLGQwGDAaDkdv1mjU9yV8DfgP4zar6+W7dEWC6qo4n2QXcWlXnLyi3KWZNd4bnlWn1OTsL\n+Mr4eq3Meta91Kzpfc4SCfB+4L4TYd25BdjX3d8H3LwWDZUkLW5kDzvJxcBtwOc5+e/lXcBngIPA\nucAxYG9VPbigrD1se9i9y66WPcaV8fVamc3Qwx45hl1Vv8vSPfFLV9swSVI/XukoSY0wsCWpEQa2\nJDXCwJakRhjYktQIvw9batioq3g342mjGp+BLTVv6XOptbU4JCJJjTCwJakRBrYkNcIx7E1sNQeU\nPBglbT0G9qa3mgNKHoySthKHRCSpEQa2JDXCwJakRjiGLUkTtlbzyvaZIuyGJHNJ7pm3bmeS2SRH\nkxxKsmNkTZK0rdUyt376DIncCFy2YN1+YLaqdgOHu2VJ0gSNDOyquh346oLVe4AD3f0DwBVr3K5T\nJFn2Jklb3bhj2FNVNdfdnwOm1qg9I3hesaTta9UHHauqkiw5CDMzM7PaKiRpy+uTlelzZDLJecDH\nquql3fIRYLqqjifZBdxaVecvUq7mP/7y08QvP0X85MouX36jyo4uv/Ver9Vq8Tm7j6xf2dVaz3Yn\noapOGToY9zzsW4B93f19wM1jPo4kqac+p/X9EvAp4EVJ7k/yBuBa4DVJjgKv7pYlSRM0cgy7qq5c\n4leXrnFbJEnL8EpHSdtG6187bGBL2mbaPT3YL3+SpEYY2JLUCANbkhphYEtSIwxsSWqEgS1JjTCw\nJakRBrYkNcILZ7SptH4lmjRJBrY2oXavRJMmySERSWqEgS1JjTCwJakRqwrsJJclOZLkS0neuVaN\nkiSdauzATnI68J+By4BvBa5M8uL+jzAYt+o1KL/dym5k3RtVdiPrbrHsRta9UWU3su7xyq6mh30h\n8OWqOlZVjwL/Hfi+/sUHq6h6teW3W9mNrHujym5k3S2W3ci6N6rsRtY9XtnVBPa3APfPW/7jbp0k\naQJWE9hewSBJ6yjjXjmW5CJgpqou65bfBTxeVdfN28ZQl6QxVNUpV4qtJrDPAH4f+B7gT4HPAFdW\n1RdX00hJ0uLGvjS9qv4qyVuB3wZOB95vWEvS5Izdw5Ykra91/fKnJDuBvwM89cS6qrqtZ9mnA28B\nLmZ4wPN24L9W1SMTaCpJ3jFvsTj5zUMFUFX/scdjnAb8U+D5VfXjSc4Fzqmqz6x1exep+x2c2u6H\ngM9V1d0jyj4NeD1wHif3kaqqH59Ma5+o94Kq+tyCdZdX1W9Mst6unlcC/5ZTn/PLepRd1euV5OXA\nq+j266r6vZ7lxn5PZPi1iM+rqvtHbbuZJLlmkdUT3zc3i3W7ND3JVcAngN8C3sNwKGVmBQ/xAYYX\n6LyX4QU7LwE+2LPuDyR59rzlnUluGFHsbOAZwAXAm4G/yfC0xR8CXtGzzf8F+E7gn3TLX+/WLdfW\nD3Y/396zjqVcwLCtJ9r9r4B/CFzf46rUXwf2AI92bf468I3lCiT5ZPfz60keXnD7Ws82X5/kpfMe\n80rgP4wqtESdK637w8CNDIP3dd1tT8+yK3695rX9auBDwHOAKeBDSd7Ws96x3xOd31zBtk+SZG+S\nZ3b3353kpiS93hdJruuzbgnf4ORr/BjDffq8nmVJ8o4kY51+nORDSa5Kcv4YZd82P4PGVlXrcgO+\nADwduLtbPh+4aQXl7+uzbomyd/dZt0TZ24Gz5y2fzbAX1KfsXfN/dvd/b9TzZBiynwd2Lryt4PW6\nHXjGvOVnALcBZwJfHPW3Wq/9YkG9LwDu7PaNq7rn8Kx1qvuTqyg79usF3AOcNW/5LOCenmXHfk90\n2x4ALhy33d3PixleBXI5cEfPsnct9XhjtOOpwCdWsP0McC/wu8BbgakVlH01cA0wC/wh8KvA23uW\n/Qngy8BBhleHZ5znu55f/vRIVf0lDD9CVtUR4EUrKH9nku88sdCdVvi5ZbafL91wzImFnQwPlPbx\nXIY9pxMe7db18c3uEv4T9T4HeHxEmV8EDjN8bT634PbZnvXCsMf2zXnLjzLcOf8CGPWR+VNJRg4F\nrLWq+gPgSuAmhj3d762qh9ap+vckeX+SK5O8vrt9f8+yq329Hl/i/iireU8AXAR8OskfJLmnu32+\nZ9nHup+XA9fXcNjqKcsVSPLmJPcAL5pX3z1JjjHsoIzjLFZwwV5VzVTVS4AfBnYBtyU53LPsxxkG\n77uB64FXMvz03afsvwN2AzcA/xL4UpKfTPLCvm2H9R3Dvr/7SHAzMJvkq8CxUYW6PzAM2/rJJPcz\nHK87l+FphX38LMMd8yDDMd1/xPCF7+MDwGeS/FpX9gqGPZM+/hPD8Hlukp8EfgD498sVqKr3Au9N\n8otV9UM961nMh4E7ktzMsN2vAz6S5CyGvfhTzHutTwfekOQPgf93smmjx3PHMa/eE3YyHK67I8nE\n6l1gH8N/kmfw5ND8tR5lX8X4r9eNDJ/n/P1r1HDdCd/BIu+J7vXsU//39qxnMX+S5L8BrwGu7cbx\nR3UAP8JwGOZa4J2cPL7ycFV9pU+lC/aV0xh2nsYZv34AOA58hWHnpk/dhxn+g/g0wx76d1TVA30r\nrKrHkxwH5hj+w3s28NEkv1NVP9arDV13fV0lmQaeCfxWVX1zxLbnLfPrqqo/6lnnSxh+pCng41W1\naGgtUfYCTh4Uuq2q7lpB2RczPFcd4HCt46mP3YG072LY7k9W1bI99BGvNVV1bK3athnqXdCG3wfO\nrzHeEEu1v2+7u/3riQOHffevjXzdun/8lwGfr6ovJdkFvLSqDk2qzq7e8+Yt/hUwV8PvMupb/i3A\nXoZB/yvAL/fNgiQ/x/Cf5CPApxgek/v0iZGDEWWvBv4Fw38Q72M4HPxohicmfKmqevW0Pa1PApLc\nCPxMVd270W3R5CT5KYYhveyZUiMe42yGwxo/yvCsr6cuXwKSvAe4YbEOZpJv7f1Pw8CWIMkR4IUM\nDyZNfBhI7UnyIww/aV/AcD+5neEnoo+vVxuchFcaumyjG6BN72kMj4fduZJhmLVkD1uSGuGcjpLU\nCANbkhphYEtSIwxsSWqEgS1Jjfj/D8EMhx4iwpYAAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f773daa0400>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_4b = pd.Series(collections.Counter([l.lower() for l in c4b if l in string.ascii_letters]))\n",
+    "freqs_4b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(5, -1581.9784460662272)"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "railfence_break(c4bs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phase four the decks were cleared by two am and the mounting plates were prepared and measured mounting points were assembled by four am though owing to the approaching dawn deployment of seabird was postponed and we embarked onstage two of seahorse assembly with camouflage plates installed we set to cruising in case of air or sea surveillance following standard routes to avoid suspicion monitoring of airwaves gave no cause for concern but we have raised security levels and are using a column transposition cipher for this communication with keyword seabird future comms will relyon even more security tonight will be used for more sea trials of the nautilus system while the assembly crew rest and the survey team carryout further mapping we will resume the seahorse build at dusk tomorrow'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(railfence_decipher(c4bs, 5)))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge5.ipynb b/2014/2014-challenge5.ipynb
new file mode 100644 (file)
index 0000000..9ab0764
--- /dev/null
@@ -0,0 +1,302 @@
+{
+ "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",
+    "c5a = open('5a.ciphertext').read()\n",
+    "c5b = open('5b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7efd70cf76d8>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7efd70cdef98>"
+      ]
+     },
+     "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": [
+       "'sssatanuelclaendeeheevrnhtailsltocsoeoanuodoeecaferbetrtenoiiucrwurfaproeercssoeuatulgtematremlieaveieogcelesaeeeyyiuuoaidaosdmdecsshthuhatcnxaererseltunaghanrdtevepisydtaeamcinmrnweoramrvibodsdfdpatimrssietdaospecgracnetblfioeushsmeeirlshmittrlnesehmclssoswfottwnbyteyngeymttgstariixeeedrnasmltwgmildcrtseogohrolsshmawndsstrabndnecfcayehotdornonenecatneavoeaatehercyrighsayrefsooatemncwtkaaawndadmsllnnnlutfoeeenoyoewtmanrrsxhvorolhisfunnthaeeofolphebaatmnornoeodnvtphnoetedeaeonphpaeuratvhndetahrahpoorsefovddsttpsvgraaatodsuryidovtrelerltmemdheoarshoarrrerxisgeifawfaiyidusiyieeesotkeaelatresntifemteiaighaceiondktkitteaeanecnndictnedddenstsheanrtamneahshidaocnuissctehslnlectheetlltidlcttnpnmcvsvnositdaelxpihsfattysfoedcmwhtebaachertaigriuirtngiaphetrowehwswaacmgcouwoogoegsmtarteeiemvayinogstitagblncstcycolretedarehopnebyegwcteetlteyeteenansafmo'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c5bs = sanitise(c5b)\n",
+    "c5bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('seabird', <KeywordWrapAlphabet.from_largest: 3>), -1255.0542494109186)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = keyword_break_mp(c5a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry i cracked that last message for myself and noticed something really odd the text said it was encrypted using a column transposition with keyword seabird but it was enciphered using a rail fence cipher i can only assume that the text we retrieved was an archive of the original message re encrypted for safety whoever the flag day associates are they have a pretty sophisticated operation if they are filing messages like this more like one of the major terrorist groups than the usual hacker collective the tech guys took a look at the aerial from the boat and they tell me that it is a drag wire usually used to communicate with a submarine when submerged it carried an acoustic transducer array as well as a shortwave transmitter and listening gear one thing that puzzles me now is why we were allowed to find the ship floating at all surely they must have planned to sink her using the scuttling equipment otherwise what was it for they seem too smart to leave it floating for us to find any thoughts mark ps just before i sent this the cipher clerk came in with a decrypt of the attached columnar transposition keyword has length six think it answers some of our questions about the nautilus system\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(sanitise(c5a), key_a[0], key_a[1]))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((3, 2, 4, 1, 5, 0), False, True), -1998.321513226948)"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c5bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(sanitise(c5bs), key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], \n",
+    "                                                              emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((3, 2, 4, 1, 5, 0), False, True), -2821.4971440358026)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = column_transposition_break_mp(c5bs, fitness=Ptrigrams)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "phase five seahorse is ready for trials and the nautilus system is fully functional we engaged the mechanism and lowered the deck to three feet above sealevel approaching the shore by the radar station at all times signals from their communications were monitored and no sign was given that our approach had been monitored or even noticed we backed off the deck was raised by two feet and the approach attempted again once more our incursion was unnoticed overnight we conducted a range of tests and mapped the radar coverage on three separate occasions there seems to have been a flurry of activity and our modeling suggests that the ships masts may have triggered brief alarms on all occasions the automatic dive systems cut incorrectly lowering the decks to sealevel and the alarms were cancelled the seahorse deployment system will be fully mounted tonight and we will conduct a battery of tests on the deployment and emergency recovery systems over the next two nights assuming that sea and air traffic remains low xxxx\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(column_transposition_decipher(c5bs, key_b[0], \n",
+    "                                                              fillcolumnwise=key_b[1], emptycolumnwise=key_b[2])))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['tokens',\n",
+       " 'trials',\n",
+       " 'tricks',\n",
+       " 'tromps',\n",
+       " 'umiaks',\n",
+       " 'unfair',\n",
+       " 'urbans',\n",
+       " 'urgent',\n",
+       " 'vocals',\n",
+       " 'womans',\n",
+       " 'womens',\n",
+       " 'wreaks',\n",
+       " 'wrecks',\n",
+       " 'yokels',\n",
+       " 'ricardo',\n",
+       " 'sneaker',\n",
+       " 'speaker',\n",
+       " 'tobagos',\n",
+       " 'trebles',\n",
+       " 'woolens',\n",
+       " 'sneakers',\n",
+       " 'speakers',\n",
+       " 'speedier',\n",
+       " 'tobaccos',\n",
+       " 'together',\n",
+       " 'treaties',\n",
+       " 'treatise',\n",
+       " 'trollops',\n",
+       " 'unedited',\n",
+       " 'woollens',\n",
+       " 'wreckers',\n",
+       " 'treatises',\n",
+       " 'triteness',\n",
+       " 'usherette',\n",
+       " 'woodcocks',\n",
+       " 'tritenesss',\n",
+       " 'usherettes']"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions[key_b[0]]"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge6.ipynb b/2014/2014-challenge6.ipynb
new file mode 100644 (file)
index 0000000..df21a33
--- /dev/null
@@ -0,0 +1,295 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "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",
+    "c6a = open('6a.ciphertext').read()\n",
+    "c6b = open('6b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f09a09d1240>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f09a09f7a58>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs = pd.Series(english_counts)\n",
+    "freqs.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f09a09545f8>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n9ZxBLkk99/8BiWCcUqHoOG4AAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f09a098c0f0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_6a = pd.Series(collections.Counter([l.lower() for l in c6a if l in string.ascii_letters]))\n",
+    "freqs_6a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f09a087a828>"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f09a08630f0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_6b = pd.Series(collections.Counter([l.lower() for l in c6b if l in string.ascii_letters]))\n",
+    "freqs_6b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'mtaeglatcleptenopeautelebiiootatwnantateituiiagaeostgvetabdresiacqobwavgrhrsihssaekajbwwttdrsmeetnyafsegilegtkrreocuantteomsgstnsiaeluutrbaiaeteeserhxgtooarrbhpcklialhnaesvearhbepiydcesewtaxuyaerywoeinhteegeisieireaassrbitnhtuorooleewsttereoahyakhlsmsaeodslthsutigqimnidsgetpmwtrnnotfhvselkaumrndvcnrluceryhyeetlnigouncnanrhpnosbhshpslreclvrinfoehniaeennhcrbenrgunruesmlrehiutgteordroeaeoisoeusiknteeslohthdcrmisuteoteaeoshfaiaesemritrseisaigwyrmhrbtetncoenuhorcadeodlcrncomnctosihudtcinagesntisutigytmshthyalatlsnhilguimtlbfldyhrfrnetsaosteetaefhlgokhretcakuteihrlrtlsetshlcpeadhthyutaeennhryraeennihrnbhnsnehyutsdtoywmtiatalwhvbepetlxihuscrtadtikhnxmsaesnwluevgnrcpegvnhteruigeuealsdntikeaeomctwrybusiilephkyodhrsyhecaatrmrltrarretstuoetnuesiduaidoesisaeetbllerpntroisiatsiasesomihsieiaunsaitneelacrfnrnngvetteenslhvpepteonedtnaooutgsotancetimiiwoetiuihclsewtcniieotslfbeecohenpoelsdoctceeemiiirttmhbiuovecegaitjuaborcleentatruyinetsidlaeehitwencceohwvohoatwkteroarhcseer'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6as = sanitise(c6a)\n",
+    "c6as"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'hwssswxfewhhrfewpdrvttdhxbccleayphalnadhiehaoudrotwnrrvysabjlttbaytmelrkaidopthatlelrtwaamaneksvvzrvllatkcrjquicizgtoqcpnrrkttowandqehtqrvtbaydqealannohulanuzlwextlvjrvivhnohdqmgykaclmswrupdetfioftfelhzpxhaswftwprrsweiseohefpdrvttnvagdvswgoerbetnharvaeevtlltbmgaiatgelinmdawevhatterdhrznbnvoutnefoteveaehlaymhacglzeptvvdimworfisgtuzlwibeqohubtghamqornjnnrumqvjtxeltfovgawdaeevllgrtxibgtibevmpsaateoasevaeyqohameonncfuidoefafattemuimnflznbekofobrliaehhauihnnnwzaeevtlltpaalnanvtzlzuucptaelinanpaahewfthaosetaribnbnvhaevdhyytlmuxb'"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6bs = sanitise(c6b)\n",
+    "c6bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(3, -2314.997881051078)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = railfence_break(c6as)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'mark the last message told usa lot the scuttling equipment is designed to pump water in and out of the vessel like a submarine dive control but clearly they werent planning to turn a container ship into a sub this ship is a largescale version of something i have seen in the caribbean drug runners use a similar technique to get below radar coverage for inshore runs sinking the vessel so that the deck remains just below the wave tops the fda pirates seem more interested in staying away from shore but getting close enough to track and record electronic communications without detection i am guessing this scuttling system is what they call nautilus in their log but i am still baffled by the references to seahorse the next page of the log looks harder to crack but the cipher clerk tells me it is a hill cipher and that they must have been in a hurry or have been enciphering by hand since they just used a two by two matrix actually we have been pretty lax with our security and i think the next message is end will use avi genere cipher given that we are using secure cables i dont think we have too much to worry about so i will keep the keyword short say three characters more later harry'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(railfence_decipher(c6as, key_a)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(matrix([[0, 1],\n",
+       "         [1, 1]]), -666.1299098341699)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = hill_break(c6bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phase six seahorse operated exactly as planned with good forward visibility at the trial depths the crew managed several tasks requiring concentration and dexterity and we plan to run a full test overnight on dummy cables dropped from the ship the software seems to be operating as designed but there are still bugs in the firmware that need ironing out before we deploy the collective is working full time to hunt them down and remove them though we are all getting tired mistakes are easy to make and could be fatal time is no longer on our side though and we are still planning to launch the final phase of the operation in three days timex'"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(hill_decipher(key_b, c6bs)))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge7.ipynb b/2014/2014-challenge7.ipynb
new file mode 100644 (file)
index 0000000..7e8f74c
--- /dev/null
@@ -0,0 +1,431 @@
+{
+ "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",
+    "c7a = open('7a.ciphertext').read()\n",
+    "c7b = open('7b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe4081aa6d8>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fe408191f98>"
+      ]
+     },
+     "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": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe3dd3dba20>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fe3dd4129e8>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7a = pd.Series(collections.Counter([l.lower() for l in c7a if l in string.ascii_letters]))\n",
+    "freqs_7a.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7fe3dd3b1390>"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7fe3dd45a240>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "freqs_7b = pd.Series(collections.Counter([l.lower() for l in c7b if l in string.ascii_letters]))\n",
+    "freqs_7b.plot(kind='bar')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'veyjmyjkrzilysyjeydorulcsrcjnmoiddeugurlogfsnwcrlhckhghmwkejxlyktlagflalvtmgkyyomvlmgkyjosfdrzepwaqgnrzeqzinoaqforkcsltjwdussrzarlhcnajneqzabbakeebatjgoiklgcerzebjidlwmgdussnmljwdgftmlhceeazalasksnbtlmukcvtfwilderhrckuksbjqtfwcpwwfsdydrcsdwsbyfdmfeblhcneqkejohguhussjmciqfmjuqoirzosltfwsfapuwwmmlbzatwhyvnmadcstfstrzedvafsdzwelgpcjaraneanrzeqwwylepkscshmjscaslglmfgcjakqsrwrwlhcuurswyqollhcktyjbmsrbkibwcjwapwdyfapwamxapgulvfgnekwtcjsqiuyjeuatfsdgktgfcravcharlepfodtojlsdssrwncvtmjegffmjccvdcukndarwsgkaukokwtfanediiwtfasmfaqmbpwsamekasqaolscmmpjwodqeyjsyyouzellhcqfgltcvajgcydsfapuatfsjsjypagewdgfsnwcraolkyqleklhcveacpjstckcyfcyjrwscpsncveqaglwdrgdchlmqaljotsrceorwonwrylebnefacjwdckiefebxopmnbwrqwamhepstggnqawykajjeyvyagnawrlwdytosltfwrcxepwnawtmlhcuazdeqanrzejssrhaplodlhcxdydoeturlhcfevlscutggnfsskwrcsljqwmjrgwdgliqwnajynleboirzakgrckeamrceobafgwdyesagtpsnqhoqatggnaapfwryfdrwljkuqohyltfwyuwrcjeydlwmprgwfstgvollulvepktyfdgkhmotfwwfglcssqwmzdygkpmoepwdrzeqgrrgfagmnmtgfgrzeweuqlbcvogfggkrcsljqillelkitwalvwmmlbtupftfjosyhytarlepqilvawkillhyltgeerzegjillepuenlmgyhrforuaruhyfyrzilyuqwfsdbsltfwyasnfsrbdyfsvczihsciwdydoaslqgciwtgftfwmgvdjwodlhcgccsnasnwguewtkwaazaplsfgwgfgrzebwenkeyuazdeqanrzepwgggngvolliksggferzeskwgdlzwanjozdekturatksylwebkokwdghlmeaaqtmyerlhcxujdcmnepsgceankfpgmrzemealagmnepfmcftgxiyergyhratgkillhcarzwsranrwrcktqlondawslmfguwajdhyneydorlojgsczepw'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c7as = sanitise(c7a)\n",
+    "c7as"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'anwaecnndrtwtanireoahsrdntieerdctewayerevaaarpioerobsedescrehlaoitithsdtrinosepeplthtnidtwsduledlhotpeaterhaaredeoaiodtahregerothwhtsureteeinwigiresetpowicooonitseudseechacteofiileonewiotacteodteuneahsedaptryemronmomlexontkemeoyvitsteenhantrertieineotndlhpoplyitewitrsedeevdycfrmnsnaypinmteeneeinahinepritedehveleaorelllvmocnahncepherohjuuvehautathttetoasipowwneedselopgdeslfedterfcaatehjasdtrprleseeretetecneorrsgckamiiwaefutiashaongcthsrenrehtrsthhaceinwtprloghetodaeraloeedeatsomldwedtwefsbelevpdteonoignsavftegsebomcehatietnrsptonthusorecredendcetlwaehesedrncveracuhoihaleinaemeunherdesttstasipedeyleeemtiisiigothntssfolnitretrwhemtkhhswtorcssnererohteencsapeblircnthuleofenrsromrnshmaddaodeatihioroutwevthapeceetovterdleaditewdottttcatkmbhtheicwantnisedwatxankeabovoanmswlprgaispodfogndpedeswrdacttrefhdesyaberretlavod'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c7bs = sanitise(c7b)\n",
+    "c7bs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('say', -1726.4679903722085)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = vigenere_frequency_break(c7as)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'dear mark things area lot clearer now i flew out to inspect the ship myself last night and took a good look around the reason the ship was not scuttled was that the valves had jammed it looks like the driftwood was pulled into the mechanism and blocked the inlet presumably the crew had already abandoned the vessel which was lucky for us without the ship we would have had no idea that the fda had been operating in these waters seahorse is no longer a mystery the cutaway on the starboard side cleared an area of around five meters square with a distinctive pattern of bolts fastened to reinforced deck plates i saw something like this on a sub rescue mission a couple of years ago when they fitted a local ship with a jury rigged inspection system the deck plates can carry a crane designed to deploy an rova remote operated vehicle designed for undersea operations i was already concerned about the reference to the cables in the last part of the fda log but the next section has me really worried it is encrypted with a more secure modified amsco transposition cipher and tells us what they were really up to what i dont understand is how the whole assembly is powered the sort of computing they must be doing is really intensive and would burn through a battery in days in that time their intercept might not catch anything useful but they can hardly have hijacked a local socket in the middle of the ocean can you get me a chart showing the deepsea cables in the region i dont imagine the us will be a problem but it may need some diplomacy to get the full coverage maps from the omani government if i am right it is in their best interests to playalong we all have alot to lose here'"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(vigenere_decipher(c7as, key_a)))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((1, 2, 0, 4, 3), (2, 1), <AmscoFillStyle.continuous: 1>),\n",
+       " -1902.8377732825452)"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = amsco_break(c7bs)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'phase seven we approached the cable junction undercover of night with nautilus at an elevation of three feet towing seahorse to starboard comms interception showed that we remained undetected and seahorse was deployed at operating depth the various layers of armoured protection were removed from the cable and as expected once the steel jacket was removed the other layers provided little resistance the divers entered the water and cut into the core to insert the optical repeaters linking them back to the man in the middle unit which was powered up and fully tested initial tests showed that it was operating as expected and three keys have already been recovered from the omani transmissions with daylight approaching the remaining tests were postponed for the following night and the ship returned to deeper waters where it remained at low deck height the divers were left at seahorse to decompress slowly and will be recovered tomorrow once the final tests have been concluded'"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "' '.join(segment(amsco_transposition_decipher(c7bs, key_b[0], fillpattern=key_b[1], fillstyle=key_b[2])))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['cable',\n",
+       " 'facto',\n",
+       " 'facts',\n",
+       " 'gabon',\n",
+       " 'hafts',\n",
+       " 'hefts',\n",
+       " 'ibexs',\n",
+       " 'kabul',\n",
+       " 'lacys',\n",
+       " 'ladys',\n",
+       " 'laius',\n",
+       " 'lefts',\n",
+       " 'macon',\n",
+       " 'macro',\n",
+       " 'macys',\n",
+       " 'malts',\n",
+       " 'melon',\n",
+       " 'melts',\n",
+       " 'negro',\n",
+       " 'oahus',\n",
+       " 'obeys',\n",
+       " 'obits',\n",
+       " 'odets',\n",
+       " 'pacts',\n",
+       " 'pants',\n",
+       " 'pelts',\n",
+       " 'pints',\n",
+       " 'piotr',\n",
+       " 'pious',\n",
+       " 'plots',\n",
+       " 'plows',\n",
+       " 'ploys',\n",
+       " 'rafts',\n",
+       " 'rants',\n",
+       " 'remus',\n",
+       " 'rents',\n",
+       " 'riots',\n",
+       " 'scout',\n",
+       " 'shout',\n",
+       " 'snout',\n",
+       " 'cabbed',\n",
+       " 'cabbie',\n",
+       " 'cabbys',\n",
+       " 'cabral',\n",
+       " 'dabble',\n",
+       " 'faeroe',\n",
+       " 'gabbro',\n",
+       " 'ibexes',\n",
+       " 'jaguar',\n",
+       " 'kaboom',\n",
+       " 'kaftan',\n",
+       " 'lacuna',\n",
+       " 'lagoon',\n",
+       " 'lefter',\n",
+       " 'legume',\n",
+       " 'macaws',\n",
+       " 'magyar',\n",
+       " 'malays',\n",
+       " 'maltas',\n",
+       " 'mellon',\n",
+       " 'negevs',\n",
+       " 'nellys',\n",
+       " 'nelson',\n",
+       " 'odious',\n",
+       " 'paddys',\n",
+       " 'panzas',\n",
+       " 'peggys',\n",
+       " 'pelves',\n",
+       " 'pennys',\n",
+       " 'photos',\n",
+       " 'pinups',\n",
+       " 'qantas',\n",
+       " 'rabats',\n",
+       " 'rallys',\n",
+       " 'refuse',\n",
+       " 'refute',\n",
+       " 'remuss',\n",
+       " 'renews',\n",
+       " 'repute',\n",
+       " 'scouts',\n",
+       " 'shouts',\n",
+       " 'snouts',\n",
+       " 'cabbage',\n",
+       " 'cabrera',\n",
+       " 'dabbled',\n",
+       " 'gadwall',\n",
+       " 'ladonna',\n",
+       " 'leftest',\n",
+       " 'madonna',\n",
+       " 'malayan',\n",
+       " 'million',\n",
+       " 'papacys',\n",
+       " 'pellets',\n",
+       " 'penneys',\n",
+       " 'qantass',\n",
+       " 'ragtags',\n",
+       " 'refuses',\n",
+       " 'refuter',\n",
+       " 'regrets',\n",
+       " 'rennets',\n",
+       " 'renters',\n",
+       " 'reroute',\n",
+       " 'sallust',\n",
+       " 'macassar',\n",
+       " 'mahatmas',\n",
+       " 'mahayana',\n",
+       " 'nanettes',\n",
+       " 'palatals',\n",
+       " 'phosphor',\n",
+       " 'reenters',\n",
+       " 'phosphors',\n",
+       " 'sinusitis',\n",
+       " 'malayalams',\n",
+       " 'sinusitiss']"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions[key_b[0]]"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2014/2014-challenge8.ipynb b/2014/2014-challenge8.ipynb
new file mode 100644 (file)
index 0000000..f6d9d2e
--- /dev/null
@@ -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": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f42359ab6a0>"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f4235991f60>"
+      ]
+     },
+     "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": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f420b429860>"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nAAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f420b4599b0>"
+      ]
+     },
+     "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": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f420b349a20>"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\nNbxLWGOjAAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f420b349048>"
+      ]
+     },
+     "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": [
+       "<matplotlib.axes._subplots.AxesSubplot at 0x7f420b2a5d68>"
+      ]
+     },
+     "execution_count": 17,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0x7f420b33ecc0>"
+      ]
+     },
+     "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
+}
diff --git a/2015-challenge1.ipynb b/2015-challenge1.ipynb
deleted file mode 100644 (file)
index f565f7b..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c1a = open('2015/1a.ciphertext').read()\n",
-    "c1b = open('2015/1b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(12, -883.4816832492597)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_a, score = caesar_break(c1a)\n",
-    "key_a, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "HARRY, SORRY TO DRAG YOU BACK IN , WE WERE HOPING TO GIVE YOU SOME TIME OFF AFTER THE LAST CASE, BUT SOMETHING CAME UP AND WE NEED YOUR HELP. \n",
-      "\n",
-      "AT A MEETING OF THE FOUR POWERS ALLIED CONTROL COUNCIL TWO WEEKS AGO THE FRENCH ACCUSED THE RUSSIANS OF SHELTERING A NAZI MEDIC KNOWN AS THE REICHSDOKTOR. APPARENTLY THEY INTERCEPTED A MORSE CODE RADIO BROADCAST FROM THE RUSSIAN SECTOR OF BERLIN IN WHICH THE DOCTOR WAS OFFERING INTELLIGENCE ABOUT THE RATLINES IN EXCHANGE FOR ASYLUM. THE RUSSIANS CLAIMED NOT TO KNOW ANYTHING ABOUT IT, AND MAYBE THEY ARE TELLING THE TRUTH, BUT THINGS HAVE BEEN A LITTLE FROSTY SINCE TRUMAN'S SPEECH ON MARCH TWELFTH AND WE REALLY DON'T NEED MORE CONFLICT RIGHT NOW. WE FIGURE WITH YOUR CONTACTS OVER HERE YOU MIGHT BE ABLE TO FIND OUT IF THE RUSSIANS ARE TELLING THE TRUTH. I HAVE ATTACHED THE ENCRYPTED TRANSCRIPT OF THE BROADCAST. \n",
-      "CHARLIE\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(caesar_decipher(c1a, key_a))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(14, -403.53308240183975)"
-      ]
-     },
-     "execution_count": 8,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = caesar_break(c1b)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "if you want to know the secret of the rat lines i maybe able to help but the price will be high and is not negotiable life herein berlin has lost its lustre and i want sanctuary in a more congenial climate with security for my future i can provide details of personnel policy security and routes and can furnish you with documentary evidence of the reach of the organization the reichs doktor\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
-   ]
-  },
-  {
-   "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
-}
diff --git a/2015-challenge2.ipynb b/2015-challenge2.ipynb
deleted file mode 100644 (file)
index 8a55515..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c2a = open('2015/2a.ciphertext').read()\n",
-    "c2b = open('2015/2b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(15, -1150.5844346071483)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_a, score = caesar_break(c2a)\n",
-    "key_a, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CHARLIE, NO NEED TO APOLOGISE, LIFE WAS GETTING DULL BEHIND A DESK AND I WAS GLAD TO HAVE AN EXCUSE TO FLY BACK TO EUROPE. I AM INTRIGUED ABOUT THE REICHSDOKTOR - I HADN'T COME ACROSS THIS BEFORE, WHEN DID YOU FIRST COME HEAR OF IT? \n",
-      "I THINK I MAY ALREADY BE MAKING SOME PROGRESS. ON ARRIVAL I FOUND A POSTCARD WAITING FOR ME ON THE MAT AT THE EMBASSY WITH NO MESSAGE ON IT . AT LEAST THAT'S WHAT IT LOOKED LIKE AT FIRST. I DID NOTICE THAT THE LETTERS ON THE FRONT COULD BE HIGHLIGHTED TO PICK OUT THE PHRASE THE REICHSDOKTOR SO UNLESS THAT IS AN EXTRAORDINARY COINCIDENCE I FIGURED IT MUST BE RELATED TO OUR INVESTIGATION. THE STRANGEST THING WAS THAT THE POSTCARD HAD A STAMP BUT NO POSTMARK ON IT, SO IT CAN'T HAVE BEEN POSTED. SINCE IT WASN'T SIGNED I ASSUME THEY WANTED TO STAY ANONYMOUS AND I COULDN'T SEE WHY THEY WOULD HAVE TAKEN THE RISK OF HAND DELIVERING IT, BUT IN THE END I WORKED IT OUT. THERE WAS A HIDDEN MESSAGE. I'LL LEAVE IT TO YOU TO FIGURE OUT WHERE IT WAS HIDDEN. ANYWAY I'VE ATTACHED THE MESSAGE I FOUND. I KNOW THAT RELATIONS WITH THREE OF THE FOUR POWERS ARE RELATIVELY STABLE, BUT I THINK WE NEED TO KEEP THIS TO OURSELVES FOR NOW. ALL THE BEST, \n",
-      "HARRY\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(caesar_decipher(c2a, key_a))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(21, -574.2402792119872)"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = caesar_break(c2b)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "if you really want to get in the middle of this you will have to pay i know you will be hunting me and i can forgive the arrogance but i will not forgive your ignorance before you can learn more about the rat lines from me you will have to ask your colleagues in french and british intelligence what they already know powerful forces are working to keep the rat lines running and we both need to know who our enemies are before we can meet you should understand that without me your investigations will gain little negotiations with me may gain everything\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(caesar_decipher(c2b, key_b)))))"
-   ]
-  },
-  {
-   "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
-}
diff --git a/2015-challenge3.ipynb b/2015-challenge3.ipynb
deleted file mode 100644 (file)
index 2b81441..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c3a = open('2015/3a.ciphertext').read()\n",
-    "c3b = open('2015/3b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "((3, 5, True), -901.37737042341)"
-      ]
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_m, key_a_a, key_a_o), score = affine_break(c3a)\n",
-    "(key_a_m, key_a_a, key_a_o), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "HARRY, THE PUZZLE OF THE STAMPED POSTCARD HAD ME FOOLED FOR A WHILE, BUT I THINK I FIGURED IT OUT. WAS THE MESSAGE ON THE BACK OF THE STAMP? I AM GUESSING YOU STEAMED IT OFF AND FOUND IT THERE. IT WAS A PRETTY INGENIOUS PLOY. MY MASTERS BACK IN WASHINGTON ARE INCREASINGLY WORRIED ABOUT OUR RELATIONSHIP WITH THE REST OF THE FOUR POWERS. FOLLOWING THE BREAKDOWN IN TRUST WITH THE SOVIETS THEY ARE COUNTING ON THE UK AND FRANCE AS ALLIES. IF THEY ARE GOING BEHIND OUR BACKS WITH THIS REICHSDOKTOR, THAT DOES NOT BODE WELL FOR FUTURE DIPLOMACY. DO YOU HAVE CONTACTS THERE YOU CAN EXPLOIT TO FIND OUT WHAT THEY ARE INTENDING? WE REALLY CANNOT AFFORD TO FALL OUT RIGHT NOW. THE ATTACHED MESSAGE IS ANOTHER INTERCEPT, THIS TIME FROM THE BRITISH EMBASSY WIRELESS. WHILE THINGS ARE DICEY I DON’T FEEL I CAN ASK THEM ABOUT IT, MAYBE YOU COULD CRACK IT FOR US. DOES IT MENTION THE RATLINES? BEST, CHARLIE\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(affine_decipher(c3a, multiplier=key_a_m, adder=key_a_a, one_based=key_a_o))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "((5, 7, True), -574.5522852453349)"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_b_m, key_b_a, key_b_o), score = affine_break(c3b)\n",
-    "(key_b_m, key_b_a, key_b_o), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "eyes only rumours of a source in berlin with access to the rat lines source seems to go by name of reichs doktor russian intercepts suggest has been seen in vicinity of us embassy not clear how to make direct contact also not clear why our us friends are keeping this to themselves detailed info about rat i lines hard to obtain but high value could lead to arrest of major targets of nuremberg investigations vital we reach reichs doktor at earliest opportunity discreet enquiries in french and us sectors only request funds for further investigation\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(affine_decipher(c3b, multiplier=key_b_m, adder=key_b_a, one_based=key_b_o)))))"
-   ]
-  },
-  {
-   "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
-}
diff --git a/2015-challenge4.ipynb b/2015-challenge4.ipynb
deleted file mode 100644 (file)
index ec3147a..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c4a = open('2015/4a.ciphertext').read()\n",
-    "c4b = open('2015/4b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('reanimates', <KeywordWrapAlphabet.from_last: 2>), -911.6411317751041)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c4a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "gharlie, the attaghew note fas ledt in one od my weaw wrops last nibht anw appears to ce drom our mysterious sourge. it gontains tfo really sibnidigant pieges od intellibenge. the dirst is that the rieghswoktor mibht not reder to an inwiviwual adter all. it seems to ce the gowename dor the orbanization runninb the ratlines. aggorwinb to my other sourges this is a gollegtion od routes, abents anw sade houses usew to transport nazi sympathisers anw far griminals out od bermany anw on to south ameriga. fe have knofn that sugh an orbanisation exists singe the enw od the far, cut this is the dirst time i have seen it namew. the other piege od indormation is mugh more suctle. i am cebinninb to fonwer id our sourge is gloser to home than fe haw realisew. anw i am not rederrinb to drangois! see id you gan spot the tfo thinbs i notigew. cy the fay, fho transgricew the rawio intergept you sent me last feek? harry\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c4a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'a': 'c',\n",
-       " 'b': 'o',\n",
-       " 'c': 'p',\n",
-       " 'd': 'q',\n",
-       " 'e': 'b',\n",
-       " 'f': 'r',\n",
-       " 'g': 's',\n",
-       " 'h': 't',\n",
-       " 'i': 'e',\n",
-       " 'j': 'u',\n",
-       " 'k': 'v',\n",
-       " 'l': 'w',\n",
-       " 'm': 'f',\n",
-       " 'n': 'd',\n",
-       " 'o': 'x',\n",
-       " 'p': 'y',\n",
-       " 'q': 'z',\n",
-       " 'r': 'a',\n",
-       " 's': 'h',\n",
-       " 't': 'g',\n",
-       " 'u': 'i',\n",
-       " 'v': 'j',\n",
-       " 'w': 'k',\n",
-       " 'x': 'l',\n",
-       " 'y': 'm',\n",
-       " 'z': 'n'}"
-      ]
-     },
-     "execution_count": 3,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "trans = ''.maketrans(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase)\n",
-    "t2 = {chr(c): chr(trans[c]) for c in trans}\n",
-    "t2"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "[('r', 'a'),\n",
-       " ('a', 'b'),\n",
-       " ('t', 'c'),\n",
-       " ('l', 'd'),\n",
-       " ('i', 'e'),\n",
-       " ('n', 'f'),\n",
-       " ('e', 'g'),\n",
-       " ('s', 'h'),\n",
-       " ('u', 'i'),\n",
-       " ('v', 'j'),\n",
-       " ('w', 'k'),\n",
-       " ('x', 'l'),\n",
-       " ('y', 'm'),\n",
-       " ('z', 'n'),\n",
-       " ('b', 'o'),\n",
-       " ('c', 'p'),\n",
-       " ('d', 'q'),\n",
-       " ('f', 'r'),\n",
-       " ('g', 's'),\n",
-       " ('h', 't'),\n",
-       " ('j', 'u'),\n",
-       " ('k', 'v'),\n",
-       " ('m', 'w'),\n",
-       " ('o', 'x'),\n",
-       " ('p', 'y'),\n",
-       " ('q', 'z')]"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "t2['t'] = 'c'\n",
-    "t2['a'] = 'b'\n",
-    "t2['e'] = 'g'\n",
-    "\n",
-    "t2['l'] = 'd'\n",
-    "t2['n'] = 'f'\n",
-    "t2['m'] = 'w'\n",
-    "\n",
-    "sorted(((c, t2[c]) for c in t2), key=lambda p: p[1])"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "charlie, the attached note was left in one of my dead drops last night and appears to be from our mysterious source. it contains two really significant pieces of intelligence. the first is that the riechsdoktor might not refer to an individual after all. it seems to be the codename for the organization running the ratlines. according to my other sources this is a collection of routes, agents and safe houses used to transport nazi sympathisers and war criminals out of germany and on to south america. we have known that such an organisation exists since the end of the war, but this is the first time i have seen it named. the other piece of information is much more subtle. i am beginning to wonder if our source is closer to home than we had realised. and i am not referring to francois! see if you can spot the two things i noticed. by the way, who transcribed the radio intercept you sent me last week? harry\n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c4a, 'ratlines', wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 6,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('francois', <KeywordWrapAlphabet.from_last: 2>), -1082.7018217012803)"
-      ]
-     },
-     "execution_count": 6,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_b_word, key_b_wrap), score =keyword_break_mp(c4b)\n",
-    "(key_b_word, key_b_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "the french maybe your allies but they are not your friends they plan to infiltrate the rat i lines and to try to turn the high value targets for themselves they have a particular interest in nazi scientists from the die alchemist en project if you want to break the reichs doktor network before they can do so take care not to share any intelligence with them you have been warned i think it is time to begin negotiations i have a number in mind and i think once you know what i am offering you will find it very reasonable as a sign of good faith ioffer you the following information one of the local rat i line coordinators will be leaving the us sector tomorrow night in a black limousine under the backseat of his car you will find hidden a juniors s officer who is trying to escape and in the trunk you will find a number of papers relating to stolen artworks that he hopes to trade to the french for his freedom you might want to consider carefully whether you can trust your friend charlie with this information after all her husband francois is french\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(keyword_decipher(c4b, key_b_word, wrap_alphabet=key_b_wrap)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "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
-}
diff --git a/2015-challenge5.ipynb b/2015-challenge5.ipynb
deleted file mode 100644 (file)
index 12ba698..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 3,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c5a = open('2015/5a.ciphertext').read()\n",
-    "c5b = open('2015/5b.ciphertext').read()"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('cornfield', <KeywordWrapAlphabet.from_largest: 3>), -1557.5551917175146)"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c5a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "harry, i checked out who transcribed the radio transmission like you asked. it was a junior cipher clerk in room 5. i would have offered to set up a meeting with her, but she has disappeared and hasn’t been seen since last friday. the marines saw her leave at her usual time, and she was booked out for some leave on monday and tuesday so no one noticed she was missing until today. we sent an officer out to her usual haunts and i will get back to you if we find anything. what made you ask? did you have a reason to believe she was involved in something? \n",
-      "\n",
-      "i took another look at the messages. were you referring to the typos? the word ratlines keeps being spelt as ratilines. is that important? what did you mean about our source being close to home? \n",
-      "\n",
-      "also did some digging about the reichsdoktor. seems you were right and it refers to an underground nazi organisation dedicated to rebuilding the reich. maybe they think of it as healing? a bunch of rich nazi sympathisers took over the ratlines from a group of ss officers who set them up at the tail of the war and have been active in shipping scientists, engineers and soldiers to towns across south america. if our source has inside information then maybe we could intercept the lines and pick up some of the high value targets the french are after. what was “die alchemisten project”? \n",
-      "\n",
-      "the enclosed message was handed to the marines, but they didn’t get a name. initial analysis shows it must be a vigenere cipher with period two so it should be reasonably straightforward to crack. \n",
-      "\n",
-      "all the best, charlie \n",
-      "\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c5a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('de', -885.6842458313828)"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = vigenere_frequency_break(c5b, max_key_length=2)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 21,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "the first item in our little auction will be the location of a safehouse in the uk sector of berlin it is a minor stopover on the rat lines but you never know you might get lucky and find someone interesting hiding there at the very least you will inconvenience the reichs doktor if you take possession of it how much would that be worth to you do i hear a bid of five hundred thousand francs from our french friends perhaps the british would pay more or maybe they can not afford to i wonder how they feel about that perhaps you should ask them if you want to outbid your so called friends then leave the money in unmarked treasury bills in locker at the far end of the platform in friedrichstrasse i will leave the details in locker you will find the key in do not try to double cross me it will not work and our little game will end before it has even properly begun\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c4b), key_b)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "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
-}
diff --git a/2015-challenge6.ipynb b/2015-challenge6.ipynb
deleted file mode 100644 (file)
index 09214d2..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 4,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c6a = sanitise(open('2015/6a.ciphertext').read())\n",
-    "c6b = sanitise(open('2015/6b.ciphertext').read())"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 2,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('hammering', <KeywordWrapAlphabet.from_largest: 3>), -2247.716859509375)"
-      ]
-     },
-     "execution_count": 2,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c6a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 5,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "freslitiacehartaypoinseailinthareagevtiaeceyiaepptestwboarinartayptwmthhegthctpifktwupenwinartasenhfsipaodartsewiomthhegtpstaayunliktlyfoinfiwtnfthoidigustyousjuniosfiprtsfltskcehinvolvtwmigrabtcosarfrtfkingrtsbefkgsounwenwbenkeffounahareaihellimtenacrtniheiwarthousftcehflohtaoromtbuaarinkingebouaiaiemnoahustiamekthhtnhtaoarinkhrtceharthousftartmthhegthhaillkttpfomingenwiemguthhingareahrtrehgonthoartstmuhabthomtoartshousftdosousinatlligtnfthomtaringihboartsingmtebouaartaontodartmthhegthcrywothousenaegonihakttpaeunainguhebouaousellithiaihnoaliktartaringhctestbtingehktwaobiwdosestaringhctestliktlyaoriwtdsomontenoartsedatsellenyceyidolloctwontodousdstnfrfollteguthaodsitwsifrhasehhtenwceafrtwrtsasyaopifkupartktydsomlofktshttmhaorevtbttnefonifoulwnaflteslyhttcreacehgoingonbuahrtwiwnahttmaobtebltaooptnlofktsenwltdaobviouhlyuphtaedatshrtrewgontiaookelookealofktsiarehedelhtbefkhoiemguthhingartmontycehaektnbuanoaringpsoviwtwintxfrengtfoulwyouwigesounwciaryousfonaefahinartbsiaihrenwsuhhientmbehhithenwhttidartyestgtaaingarthemthosaodfommunifeaionhmeybtyoufoulwcesnartmbyartceywitelfrtmihatnpsojtfacehartfowtnemtdosartnezieaombombtddosairewesuninciarartmwusingartcescrtnctctstasyingaokttpartisrenwhoddartrtevyceatshupplystmtmbtsartbombinginvtmoskareacehuhosseartsousnoswifellithenyceyiaihhaillaophtfstahoartdefaouspsoaegonihaknochebouaiaihhignidifenaihuhptfaartktyaoarihcroltmyhatsylithinartisiwtnaiayidctkntccroartyctstcoskingdosctmigrabtebltaodigustouacreaartyestupaoontlehaaringefaingonerunfriaookelookeahomtodartdstnfrwtewwsophedatsartdsitwsifrhasehhtinfiwtnaenwdounwarteaaefrtwfommunifeaionirevtnarewaimtaofsefkiabuaiarinkiameybtevigtntstegeinbuairevtnarewefrenftaoasybebbegthasifkoniaytagivtiaaoyousblefkfrembtsenwhttcreaartyfenmektodiaellartbtharessy\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c6a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'icrdvsfshmrghcfhpzysxdrhsvsxfghcrhnrkfshrmrpshrzzfrdflayhcsxhcfhpzflwfggrnfgmfzsiufljzrxlsxhcfhdrxgidszhyehcfdrlsywfggrnfzdfhhpjxvsufvpiysxislfxifgysesnjdfpyjdtjxsydiszcfdivfdumrgsxkyvkflwsnchafmydhcicfiusxncfdariundyjxlrxlarxuriiyjxhghcrhsgrvvswfrxhmcfxsgrslhcfgyjdifmrgivygfhycywfajhhcsxusxnrayjhshsrwxyhgjdfshwrufggfxgfhyhcsxugcfmrghcfgyjdifhcfwfggrnfgghsvvuffziywsxnrxlsrwnjfggsxnhcrhgcfcrgnyxfgyhcfdfwjghafgywfyhcfdgyjdifeydyjdsxhfvvsnfxifgywfhcsxnsgayhcfdsxnwfrayjhhcfhyxfyehcfwfggrnfgmcplyfgyjdrxhrnyxsghuffzhrjxhsxnjgrayjhyjdrvvsfgshsgxyhvsufhcfhcsxngmfrdfafsxnrguflhyasleydrdfhcsxngmfrdfvsufvphycslfedywyxfrxyhcfdrehfdrvvrxpmrpseyvvymflyxfyeyjdedfxiciyvvfrnjfghyedsfldsicghdrggfrxlmrhicflcfdhdphyzsiujzhcfufpedywvyiufdgffwghycrkfaffxriyxsiyjvlxhivfrdvpgffmcrhmrgnysxnyxajhgcflslxhgffwhyafravfhyyzfxvyiufdrxlvfehyaksyjgvpjzgfhrehfdgcfcrlnyxfshyyurvyyurhvyiufdshcrgrervgfariugysrwnjfggsxnhcfwyxfpmrghrufxajhxyhcsxnzdykslflsxfoicrxnfiyjvlpyjlsnrdyjxlmshcpyjdiyxhrihgsxhcfadshsgcrxldjggsrxfwarggsfgrxlgffsehcfprdfnfhhsxnhcfgrwfgydhyeiywwjxsirhsyxgwrpafpyjiyjvlmrdxhcfwaphcfmrplsfrvicfwsghfxzdytfihmrghcfiylfxrwfeydhcfxrqsrhywaywafeeydhscrlrdjxsxmshchcfwljdsxnhcfmrdmcfxmfmfdfhdpsxnhyuffzhcfsdcrxlgyeehcfcfrkpmrhfdgjzzvpdfwfwafdhcfaywasxnsxkfwyduhcrhmrgjgyddrhcfdyjdxydlsirvvsfgrxpmrpshsgghsvvhyzgfidfhgyhcferihyjdzdyhrnyxsghuxymgrayjhshsggsnxsesirxhsgjgzfihhcfufphyhcsgmcyvfwpghfdpvsfgsxhcfsdslfxhshpsemfuxfmmcyhcfpmfdfmydusxneydmfwsnchafravfhyesnjdfyjhmcrhhcfprdfjzhyyxfvrghhcsxnrihsxnyxrcjxicshyyurvyyurhgywfyehcfedfxiclfrlldyzgrehfdhcfedsfldsicghdrggfsxislfxhrxleyjxlhcfrhhricfliywwjxsirhsyxscrkfxhcrlhswfhyidriushajhshcsxushwrpafrksnfxfdfrnrsxajhscrkfxhcrlricrxifhyhdparaarnfghdsiuyxshpfhnskfshhypyjdavriuicrwafdrxlgffmcrhhcfpirxwrufyeshrvvhcfafghcrddp'"
-      ]
-     },
-     "execution_count": 8,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "c6a"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 24,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'CHARLIE IT WAS THE TYPO IN RAT I LINES THAT GAVE IT AWAY IT APPEARED BOTH IN THE TYPED MESSAGES WE PICKED UP AND IN THE TRANSCRIPT OF THE RADIO MESSAGE PRETTY UNLIKELY COINCIDENCE SO I FIGURE YOUR JUNIOR CIPHER CLERK WAS INVOLVED MIGHT BE WORTH CHECKING HER BACKGROUND AND BANK ACCOUNTS THAT IS ALL I MEANT WHEN I SAID THE SOURCE WAS CLOSE TO HOME BUT THINKING ABOUT IT I AM NOT SURE IT MAKES SENSE TO THINK SHE WAS THE SOURCE THE MESSAGES STILL KEEP COMING AND I AM GUESSING THAT SHE HAS GONE SO THERE MUST BE SOME OTHER SOURCE FOR OUR INTELLIGENCE SOMETHING IS BOTHERING ME ABOUT THE TONE OF THE MESSAGES WHY DOES OUR ANTAGONIST KEEP TAUNTING US ABOUT OUR ALLIES IT IS NOT LIKE THE THINGS WE ARE BEING ASKED TO BID FOR ARE THINGS WE ARE LIKELY TO HIDE FROM ONE ANOTHER AFTER ALL ANYWAY I FOLLOWED ONE OF OUR FRENCH COLLEAGUES TO FRIEDRICHSTRASSE AND WATCHED HER TRY TO PICKUP THE KEY FROM LOCKER SEEMS TO HAVE BEEN A CON I COULDNT CLEARLY SEE WHAT WAS GOING ON BUT SHE DIDNT SEEM TO BE ABLE TO OPEN LOCKER AND LEFT OBVIOUSLY UPSET AFTER SHE HAD GONE I TOOK A LOOK AT LOCKER IT HAS A FALSE BACK SO I AM GUESSING THE MONEY WAS TAKEN BUT NOTHING PROVIDED IN EXCHANGE COULD YOU DIG AROUND WITH YOUR CONTACTS IN THE BRITISH AND RUSSIAN EMBASSIES AND SEE IF THEY ARE GETTING THE SAME SORT OF COMMUNICATIONS MAYBE YOU COULD WARN THEM BY THE WAY DIE ALCHEMIST EN PROJECT WAS THE CODENAME FOR THE NAZI ATOM BOMB EFFORT I HAD A RUN IN WITH THEM DURING THE WAR WHEN WE WERE TRYING TO KEEP THEIR HANDS OFF THE HEAVY WATER SUPPLY REMEMBER THE BOMBING IN VE MORK THAT WAS US OR RATHER OUR NORDIC ALLIES ANYWAY IT IS STILL TOP SECRET SO THE FACT OUR PROTAGONIST KNOWS ABOUT IT IS SIGNIFICANT I SUSPECT THE KEY TO THIS WHOLE MYSTERY LIES IN THEIR IDENTITY IF WE KNEW WHO THEY WERE WORKING FOR WE MIGHT BE ABLE TO FIGURE OUT WHAT THEY ARE UP TO ONE LAST THING ACTING ON A HUNCH I TOOK A LOOK AT SOME OF THE FRENCH DEAD DROPS AFTER THE FRIEDRICHSTRASSE INCIDENT AND FOUND THE ATTACHED COMMUNICATION I HAVENT HAD TIME TO CRACK IT BUT I THINK IT MAYBE AVI GENERE AGAIN BUT I HAVENT HAD A CHANCE TO TRY BABBAGE STRICK ON IT YET GIVE IT TO YOUR BLACK CHAMBER AND SEE WHAT THEY CAN MAKE OF IT ALL THE BEST HARRY'"
-      ]
-     },
-     "execution_count": 24,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "translations = {'c': 'H', 'r': 'A', 'd': 'R', 'p': 'Y', 'i': 'C', 'd': 'R', 'v': 'L', 's': 'I', 'f': 'E', \n",
-    "                'h': 'T', 'a': 'B', 'g': 'S', 'm': 'W', 'y': 'O', 'z': 'P', 'n': 'G', 'j': 'U', 't': 'J',\n",
-    "               'x': 'N', 'k': 'V', 'l': 'D', 'w': 'M', 'u': 'K', 'e': 'F', 'q': 'Z', 'o': 'X'}\n",
-    "translation_table = ''.maketrans(translations)\n",
-    "plaintext = ' '.join(segment(c6a.translate(translation_table)))\n",
-    "plaintext"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 28,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'BHRFESTCUVDWGXYZAIJKLMNOP'"
-      ]
-     },
-     "execution_count": 28,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "''.join(translations[l] for l in sorted(translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 34,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'railfencstuvwxyzdghjkmopq'"
-      ]
-     },
-     "execution_count": 34,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "inverted_translations = {translations[a]: a for a in translations}\n",
-    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 37,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'railfencstuvwxyzbdghjkmopq'"
-      ]
-     },
-     "execution_count": 37,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "keyword_cipher_alphabet_of('railfences', wrap_alphabet=KeywordWrapAlphabet.from_last)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 39,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "charlie it was the typo in rat i lines that gave it away it appeared both in the typed messages we picked up and in the transcript of the radio message pretty unlikely coincidence so i figure your junior cipher clerk was involved might be worth checking her background and bank accounts that is all i meant when i said the source was close to home but thinking about it i am not sure it makes sense to think she was the source the messages still keep coming and i am guessing that she has gone so there must be some other source for our intelligence something is bothering me about the tone of the messages why does our antagonist keep taunting us about our allies it is not like the things we are being asked to bid for are things we are likely to hide from one another after all anyway i followed one of our french colleagues to friedrichstrasse and watched her try to pickup the key from locker seems to have been a con i couldnt clearly see what was going on but she didnt seem to be able to open locker and left obviously upset after she had gone i took a look at locker it has a false back so i am guessing the money was taken but nothing provided in exchange could you dig around with your contacts in the british and russian embassies and see if they are getting the same sort of communications maybe you could warn them by the way die alchemist en project was the codename for the nazi atom bomb effort i had a run in with them during the war when we were trying to keep their hands off the heavy water supply remember the bombing in ve mork that was us or rather our nordic allies anyway it is still top secret so the fact our protagonist knows about it is significant i suspect the key to this whole mystery lies in their identity if we knew who they were working for we might be able to figure out what they are up to one last thing acting on a hunch i took a look at some of the french dead drops after the friedrichstrasse incident and found the attached communication i havent had time to crack it but i think it maybe avi genere again but i havent had a chance to try babbage strick on it yet give it to your black chamber and see what they can make of it all the best harry\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(keyword_decipher(c6a, 'railfences', wrap_alphabet=KeywordWrapAlphabet.from_last))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 31,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('kremlin', -908.5396262316657)"
-      ]
-     },
-     "execution_count": 31,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = vigenere_frequency_break(c6b)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 32,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "the americans have robbed you rather than trying to outbid you they got to the lockers first and arranged to steal your money and the valuable intelligence i provided for you they can not be trusted none of your allies can be trusted they believe that they can cheat you but they do not understand that you can only cheat in a game and this is not a game if you try to playa game of chess like your allies we will find ourselves in a stalemate you have been warned so let us start again i can let you have the address of another safehouse at a small discount on our original price and i will include the identity of a british double agent working in your embassy shall we say four hundred thousand francs to be paid directly to an account of my choosing if you want to know more about the treachery of your so called friends then let us meet in the park by the british embassy on friday at eleven\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c6b), key_b)))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "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
-}
diff --git a/2015-challenge7.ipynb b/2015-challenge7.ipynb
deleted file mode 100644 (file)
index 23259d8..0000000
+++ /dev/null
@@ -1,1575 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 7,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c7a = sanitise(open('2015/7a.ciphertext').read())\n",
-    "c7b = sanitise(open('2015/7b.ciphertext').read())"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 8,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(('annmarie', <KeywordWrapAlphabet.from_largest: 3>), -1865.8708508162845)"
-      ]
-     },
-     "execution_count": 8,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "(key_a_word, key_a_wrap), score = keyword_break_mp(c7a)\n",
-    "(key_a_word, key_a_wrap), score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 9,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "dhorlieithinkiknacchotisgainganfutineewtadhedkobecthingsfebareirepartcemoyhoveonappartunityhereidhedkewthedipherdlerksfodkgraunwonwitturnsautsheischiterussionherbomilylebtmasdacinfutshehosrelotivesinthegulogotpermshedleorlyhosnalavebarthesavietgavernmentsaiomstillnatsurechashecoscarkingbarfutithinkthisiskeyintelligendeinthemeontimeihovefeencotdhingthefritstheyseemtahovefeenindantodtcithaurbrienwsinthereidhswaktaronwtheyinturnhovefeencotdhingthebrendhitseemslikeceoreollcarkingogoinstaneonatherchidhireollywiwntexpedtonwgivenchotcereowinthebrendhwadumentlostceekiwantthinkthotisodaindiwendemyacnguessisthottherussionsknacchotisgainganonwthotaurfesthapeabundaveringitistafreokintatheirhqonwtrytabinwsamethingthereunbartunotelyoddarwingtamysaurdeyuritheyhovetokentausingonecdiphersalitoirebarordhivestarogeabtapsedretbilessaevenibcemonogetasteoltherelevontbileitcilltokeolatabdamputingtafreokthedipheriottodhofriebmessogebramyuriendryptewusingonomsdadipherkeycarwlengthissixinchidhhewesdrifesthedipheritisverydleversimpletaimplementfutoweviltadrodkonwmyanehapeisthotcedonolsabinwthedipherkeychileinthehqarotleostportabitiplontaenterintcaceeksanwedemfersixteenththerussionsorehastingolorgeprapogonwoeventosportabtheinternotianolefouousstellungcithleowingpalitfuramemfersinottenwondemastabthesedurityteomcillfeaddupiewciththotonwhqseduritycillferelotivelylightcithludkicillgetinonwautciththebilesceneewthotnightonwthencedongettathefattamabthechalereidhswaktarstrotogemollthefesthorry\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(keyword_decipher(c7a, key_a_word, wrap_alphabet=key_a_wrap))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 10,
-   "metadata": {
-    "collapsed": false,
-    "scrolled": true
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'A': 'a',\n",
-       " 'B': 'o',\n",
-       " 'C': 'p',\n",
-       " 'D': 'q',\n",
-       " 'E': 'f',\n",
-       " 'F': 'r',\n",
-       " 'G': 's',\n",
-       " 'H': 't',\n",
-       " 'I': 'e',\n",
-       " 'J': 'u',\n",
-       " 'K': 'v',\n",
-       " 'L': 'w',\n",
-       " 'M': 'c',\n",
-       " 'N': 'b',\n",
-       " 'O': 'x',\n",
-       " 'P': 'y',\n",
-       " 'Q': 'z',\n",
-       " 'R': 'd',\n",
-       " 'S': 'g',\n",
-       " 'T': 'h',\n",
-       " 'U': 'i',\n",
-       " 'V': 'j',\n",
-       " 'W': 'k',\n",
-       " 'X': 'l',\n",
-       " 'Y': 'm',\n",
-       " 'Z': 'n'}"
-      ]
-     },
-     "execution_count": 10,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "trans_a = {p.upper(): c for p, c in zip(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase, )}\n",
-    "trans_a"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry'"
-      ]
-     },
-     "execution_count": 11,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "translations = {\n",
-    " 'A': 'o',\n",
-    " 'B': 'a',\n",
-    " 'C': 'p',\n",
-    " 'D': 'q',\n",
-    " 'E': 'b',\n",
-    " 'F': 'r',\n",
-    " 'G': 's',\n",
-    " 'H': 't',\n",
-    " 'I': 'e',\n",
-    " 'J': 'u',\n",
-    " 'K': 'v',\n",
-    " 'L': 'd',\n",
-    " 'M': 'w',\n",
-    " 'N': 'f',\n",
-    " 'O': 'x',\n",
-    " 'P': 'y',\n",
-    " 'Q': 'z',\n",
-    " 'R': 'c',\n",
-    " 'S': 'g',\n",
-    " 'T': 'h',\n",
-    " 'U': 'i',\n",
-    " 'V': 'j',\n",
-    " 'W': 'k',\n",
-    " 'X': 'l',\n",
-    " 'Y': 'm',\n",
-    " 'Z': 'n'}\n",
-    "translation_table = ''.maketrans(translations)\n",
-    "plaintext = ' '.join(segment(c7a.upper().translate(translation_table)))\n",
-    "plaintext"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'oapqbrsteuvdwfxyzcghijklmn'"
-      ]
-     },
-     "execution_count": 12,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "''.join(translations[l] for l in sorted(translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 13,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'BERLINSTUVWXYZACDFGHJKMOPQ'"
-      ]
-     },
-     "execution_count": 13,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "inverted_translations = {translations[a]: a for a in translations}\n",
-    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 14,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "'berlinstuvwxyzacdfghjkmopq'"
-      ]
-     },
-     "execution_count": 14,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "keyword_cipher_alphabet_of('berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(keyword_decipher(c7a, 'berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 16,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{(0, 1, 2, 3, 4, 5): (0, 1, 2, 3, 4, 5),\n",
-       " (0, 1, 2, 3, 5, 4): (0, 1, 2, 3, 5, 4),\n",
-       " (0, 1, 2, 4, 3, 5): (0, 1, 2, 4, 3, 5),\n",
-       " (0, 1, 2, 4, 5, 3): (0, 1, 2, 4, 5, 3),\n",
-       " (0, 1, 2, 5, 3, 4): (0, 1, 2, 5, 3, 4),\n",
-       " (0, 1, 2, 5, 4, 3): (0, 1, 2, 5, 4, 3),\n",
-       " (0, 1, 3, 2, 4, 5): (0, 1, 3, 2, 4, 5),\n",
-       " (0, 1, 3, 2, 5, 4): (0, 1, 3, 2, 5, 4),\n",
-       " (0, 1, 3, 4, 2, 5): (0, 1, 3, 4, 2, 5),\n",
-       " (0, 1, 3, 4, 5, 2): (0, 1, 3, 4, 5, 2),\n",
-       " (0, 1, 3, 5, 2, 4): (0, 1, 3, 5, 2, 4),\n",
-       " (0, 1, 3, 5, 4, 2): (0, 1, 3, 5, 4, 2),\n",
-       " (0, 1, 4, 2, 3, 5): (0, 1, 4, 2, 3, 5),\n",
-       " (0, 1, 4, 2, 5, 3): (0, 1, 4, 2, 5, 3),\n",
-       " (0, 1, 4, 3, 2, 5): (0, 1, 4, 3, 2, 5),\n",
-       " (0, 1, 4, 3, 5, 2): (0, 1, 4, 3, 5, 2),\n",
-       " (0, 1, 4, 5, 2, 3): (0, 1, 4, 5, 2, 3),\n",
-       " (0, 1, 4, 5, 3, 2): (0, 1, 4, 5, 3, 2),\n",
-       " (0, 1, 5, 2, 3, 4): (0, 1, 5, 2, 3, 4),\n",
-       " (0, 1, 5, 2, 4, 3): (0, 1, 5, 2, 4, 3),\n",
-       " (0, 1, 5, 3, 2, 4): (0, 1, 5, 3, 2, 4),\n",
-       " (0, 1, 5, 3, 4, 2): (0, 1, 5, 3, 4, 2),\n",
-       " (0, 1, 5, 4, 2, 3): (0, 1, 5, 4, 2, 3),\n",
-       " (0, 1, 5, 4, 3, 2): (0, 1, 5, 4, 3, 2),\n",
-       " (0, 2, 1, 3, 4, 5): (0, 2, 1, 3, 4, 5),\n",
-       " (0, 2, 1, 3, 5, 4): (0, 2, 1, 3, 5, 4),\n",
-       " (0, 2, 1, 4, 3, 5): (0, 2, 1, 4, 3, 5),\n",
-       " (0, 2, 1, 4, 5, 3): (0, 2, 1, 4, 5, 3),\n",
-       " (0, 2, 1, 5, 3, 4): (0, 2, 1, 5, 3, 4),\n",
-       " (0, 2, 1, 5, 4, 3): (0, 2, 1, 5, 4, 3),\n",
-       " (0, 2, 3, 1, 4, 5): (0, 2, 3, 1, 4, 5),\n",
-       " (0, 2, 3, 1, 5, 4): (0, 2, 3, 1, 5, 4),\n",
-       " (0, 2, 3, 4, 1, 5): (0, 2, 3, 4, 1, 5),\n",
-       " (0, 2, 3, 4, 5, 1): (0, 2, 3, 4, 5, 1),\n",
-       " (0, 2, 3, 5, 1, 4): (0, 2, 3, 5, 1, 4),\n",
-       " (0, 2, 3, 5, 4, 1): (0, 2, 3, 5, 4, 1),\n",
-       " (0, 2, 4, 1, 3, 5): (0, 2, 4, 1, 3, 5),\n",
-       " (0, 2, 4, 1, 5, 3): (0, 2, 4, 1, 5, 3),\n",
-       " (0, 2, 4, 3, 1, 5): (0, 2, 4, 3, 1, 5),\n",
-       " (0, 2, 4, 3, 5, 1): (0, 2, 4, 3, 5, 1),\n",
-       " (0, 2, 4, 5, 1, 3): (0, 2, 4, 5, 1, 3),\n",
-       " (0, 2, 4, 5, 3, 1): (0, 2, 4, 5, 3, 1),\n",
-       " (0, 2, 5, 1, 3, 4): (0, 2, 5, 1, 3, 4),\n",
-       " (0, 2, 5, 1, 4, 3): (0, 2, 5, 1, 4, 3),\n",
-       " (0, 2, 5, 3, 1, 4): (0, 2, 5, 3, 1, 4),\n",
-       " (0, 2, 5, 3, 4, 1): (0, 2, 5, 3, 4, 1),\n",
-       " (0, 2, 5, 4, 1, 3): (0, 2, 5, 4, 1, 3),\n",
-       " (0, 2, 5, 4, 3, 1): (0, 2, 5, 4, 3, 1),\n",
-       " (0, 3, 1, 2, 4, 5): (0, 3, 1, 2, 4, 5),\n",
-       " (0, 3, 1, 2, 5, 4): (0, 3, 1, 2, 5, 4),\n",
-       " (0, 3, 1, 4, 2, 5): (0, 3, 1, 4, 2, 5),\n",
-       " (0, 3, 1, 4, 5, 2): (0, 3, 1, 4, 5, 2),\n",
-       " (0, 3, 1, 5, 2, 4): (0, 3, 1, 5, 2, 4),\n",
-       " (0, 3, 1, 5, 4, 2): (0, 3, 1, 5, 4, 2),\n",
-       " (0, 3, 2, 1, 4, 5): (0, 3, 2, 1, 4, 5),\n",
-       " (0, 3, 2, 1, 5, 4): (0, 3, 2, 1, 5, 4),\n",
-       " (0, 3, 2, 4, 1, 5): (0, 3, 2, 4, 1, 5),\n",
-       " (0, 3, 2, 4, 5, 1): (0, 3, 2, 4, 5, 1),\n",
-       " (0, 3, 2, 5, 1, 4): (0, 3, 2, 5, 1, 4),\n",
-       " (0, 3, 2, 5, 4, 1): (0, 3, 2, 5, 4, 1),\n",
-       " (0, 3, 4, 1, 2, 5): (0, 3, 4, 1, 2, 5),\n",
-       " (0, 3, 4, 1, 5, 2): (0, 3, 4, 1, 5, 2),\n",
-       " (0, 3, 4, 2, 1, 5): (0, 3, 4, 2, 1, 5),\n",
-       " (0, 3, 4, 2, 5, 1): (0, 3, 4, 2, 5, 1),\n",
-       " (0, 3, 4, 5, 1, 2): (0, 3, 4, 5, 1, 2),\n",
-       " (0, 3, 4, 5, 2, 1): (0, 3, 4, 5, 2, 1),\n",
-       " (0, 3, 5, 1, 2, 4): (0, 3, 5, 1, 2, 4),\n",
-       " (0, 3, 5, 1, 4, 2): (0, 3, 5, 1, 4, 2),\n",
-       " (0, 3, 5, 2, 1, 4): (0, 3, 5, 2, 1, 4),\n",
-       " (0, 3, 5, 2, 4, 1): (0, 3, 5, 2, 4, 1),\n",
-       " (0, 3, 5, 4, 1, 2): (0, 3, 5, 4, 1, 2),\n",
-       " (0, 3, 5, 4, 2, 1): (0, 3, 5, 4, 2, 1),\n",
-       " (0, 4, 1, 2, 3, 5): (0, 4, 1, 2, 3, 5),\n",
-       " (0, 4, 1, 2, 5, 3): (0, 4, 1, 2, 5, 3),\n",
-       " (0, 4, 1, 3, 2, 5): (0, 4, 1, 3, 2, 5),\n",
-       " (0, 4, 1, 3, 5, 2): (0, 4, 1, 3, 5, 2),\n",
-       " (0, 4, 1, 5, 2, 3): (0, 4, 1, 5, 2, 3),\n",
-       " (0, 4, 1, 5, 3, 2): (0, 4, 1, 5, 3, 2),\n",
-       " (0, 4, 2, 1, 3, 5): (0, 4, 2, 1, 3, 5),\n",
-       " (0, 4, 2, 1, 5, 3): (0, 4, 2, 1, 5, 3),\n",
-       " (0, 4, 2, 3, 1, 5): (0, 4, 2, 3, 1, 5),\n",
-       " (0, 4, 2, 3, 5, 1): (0, 4, 2, 3, 5, 1),\n",
-       " (0, 4, 2, 5, 1, 3): (0, 4, 2, 5, 1, 3),\n",
-       " (0, 4, 2, 5, 3, 1): (0, 4, 2, 5, 3, 1),\n",
-       " (0, 4, 3, 1, 2, 5): (0, 4, 3, 1, 2, 5),\n",
-       " (0, 4, 3, 1, 5, 2): (0, 4, 3, 1, 5, 2),\n",
-       " (0, 4, 3, 2, 1, 5): (0, 4, 3, 2, 1, 5),\n",
-       " (0, 4, 3, 2, 5, 1): (0, 4, 3, 2, 5, 1),\n",
-       " (0, 4, 3, 5, 1, 2): (0, 4, 3, 5, 1, 2),\n",
-       " (0, 4, 3, 5, 2, 1): (0, 4, 3, 5, 2, 1),\n",
-       " (0, 4, 5, 1, 2, 3): (0, 4, 5, 1, 2, 3),\n",
-       " (0, 4, 5, 1, 3, 2): (0, 4, 5, 1, 3, 2),\n",
-       " (0, 4, 5, 2, 1, 3): (0, 4, 5, 2, 1, 3),\n",
-       " (0, 4, 5, 2, 3, 1): (0, 4, 5, 2, 3, 1),\n",
-       " (0, 4, 5, 3, 1, 2): (0, 4, 5, 3, 1, 2),\n",
-       " (0, 4, 5, 3, 2, 1): (0, 4, 5, 3, 2, 1),\n",
-       " (0, 5, 1, 2, 3, 4): (0, 5, 1, 2, 3, 4),\n",
-       " (0, 5, 1, 2, 4, 3): (0, 5, 1, 2, 4, 3),\n",
-       " (0, 5, 1, 3, 2, 4): (0, 5, 1, 3, 2, 4),\n",
-       " (0, 5, 1, 3, 4, 2): (0, 5, 1, 3, 4, 2),\n",
-       " (0, 5, 1, 4, 2, 3): (0, 5, 1, 4, 2, 3),\n",
-       " (0, 5, 1, 4, 3, 2): (0, 5, 1, 4, 3, 2),\n",
-       " (0, 5, 2, 1, 3, 4): (0, 5, 2, 1, 3, 4),\n",
-       " (0, 5, 2, 1, 4, 3): (0, 5, 2, 1, 4, 3),\n",
-       " (0, 5, 2, 3, 1, 4): (0, 5, 2, 3, 1, 4),\n",
-       " (0, 5, 2, 3, 4, 1): (0, 5, 2, 3, 4, 1),\n",
-       " (0, 5, 2, 4, 1, 3): (0, 5, 2, 4, 1, 3),\n",
-       " (0, 5, 2, 4, 3, 1): (0, 5, 2, 4, 3, 1),\n",
-       " (0, 5, 3, 1, 2, 4): (0, 5, 3, 1, 2, 4),\n",
-       " (0, 5, 3, 1, 4, 2): (0, 5, 3, 1, 4, 2),\n",
-       " (0, 5, 3, 2, 1, 4): (0, 5, 3, 2, 1, 4),\n",
-       " (0, 5, 3, 2, 4, 1): (0, 5, 3, 2, 4, 1),\n",
-       " (0, 5, 3, 4, 1, 2): (0, 5, 3, 4, 1, 2),\n",
-       " (0, 5, 3, 4, 2, 1): (0, 5, 3, 4, 2, 1),\n",
-       " (0, 5, 4, 1, 2, 3): (0, 5, 4, 1, 2, 3),\n",
-       " (0, 5, 4, 1, 3, 2): (0, 5, 4, 1, 3, 2),\n",
-       " (0, 5, 4, 2, 1, 3): (0, 5, 4, 2, 1, 3),\n",
-       " (0, 5, 4, 2, 3, 1): (0, 5, 4, 2, 3, 1),\n",
-       " (0, 5, 4, 3, 1, 2): (0, 5, 4, 3, 1, 2),\n",
-       " (0, 5, 4, 3, 2, 1): (0, 5, 4, 3, 2, 1),\n",
-       " (1, 0, 2, 3, 4, 5): (1, 0, 2, 3, 4, 5),\n",
-       " (1, 0, 2, 3, 5, 4): (1, 0, 2, 3, 5, 4),\n",
-       " (1, 0, 2, 4, 3, 5): (1, 0, 2, 4, 3, 5),\n",
-       " (1, 0, 2, 4, 5, 3): (1, 0, 2, 4, 5, 3),\n",
-       " (1, 0, 2, 5, 3, 4): (1, 0, 2, 5, 3, 4),\n",
-       " (1, 0, 2, 5, 4, 3): (1, 0, 2, 5, 4, 3),\n",
-       " (1, 0, 3, 2, 4, 5): (1, 0, 3, 2, 4, 5),\n",
-       " (1, 0, 3, 2, 5, 4): (1, 0, 3, 2, 5, 4),\n",
-       " (1, 0, 3, 4, 2, 5): (1, 0, 3, 4, 2, 5),\n",
-       " (1, 0, 3, 4, 5, 2): (1, 0, 3, 4, 5, 2),\n",
-       " (1, 0, 3, 5, 2, 4): (1, 0, 3, 5, 2, 4),\n",
-       " (1, 0, 3, 5, 4, 2): (1, 0, 3, 5, 4, 2),\n",
-       " (1, 0, 4, 2, 3, 5): (1, 0, 4, 2, 3, 5),\n",
-       " (1, 0, 4, 2, 5, 3): (1, 0, 4, 2, 5, 3),\n",
-       " (1, 0, 4, 3, 2, 5): (1, 0, 4, 3, 2, 5),\n",
-       " (1, 0, 4, 3, 5, 2): (1, 0, 4, 3, 5, 2),\n",
-       " (1, 0, 4, 5, 2, 3): (1, 0, 4, 5, 2, 3),\n",
-       " (1, 0, 4, 5, 3, 2): (1, 0, 4, 5, 3, 2),\n",
-       " (1, 0, 5, 2, 3, 4): (1, 0, 5, 2, 3, 4),\n",
-       " (1, 0, 5, 2, 4, 3): (1, 0, 5, 2, 4, 3),\n",
-       " (1, 0, 5, 3, 2, 4): (1, 0, 5, 3, 2, 4),\n",
-       " (1, 0, 5, 3, 4, 2): (1, 0, 5, 3, 4, 2),\n",
-       " (1, 0, 5, 4, 2, 3): (1, 0, 5, 4, 2, 3),\n",
-       " (1, 0, 5, 4, 3, 2): (1, 0, 5, 4, 3, 2),\n",
-       " (1, 2, 0, 3, 4, 5): (1, 2, 0, 3, 4, 5),\n",
-       " (1, 2, 0, 3, 5, 4): (1, 2, 0, 3, 5, 4),\n",
-       " (1, 2, 0, 4, 3, 5): (1, 2, 0, 4, 3, 5),\n",
-       " (1, 2, 0, 4, 5, 3): (1, 2, 0, 4, 5, 3),\n",
-       " (1, 2, 0, 5, 3, 4): (1, 2, 0, 5, 3, 4),\n",
-       " (1, 2, 0, 5, 4, 3): (1, 2, 0, 5, 4, 3),\n",
-       " (1, 2, 3, 0, 4, 5): (1, 2, 3, 0, 4, 5),\n",
-       " (1, 2, 3, 0, 5, 4): (1, 2, 3, 0, 5, 4),\n",
-       " (1, 2, 3, 4, 0, 5): (1, 2, 3, 4, 0, 5),\n",
-       " (1, 2, 3, 4, 5, 0): (1, 2, 3, 4, 5, 0),\n",
-       " (1, 2, 3, 5, 0, 4): (1, 2, 3, 5, 0, 4),\n",
-       " (1, 2, 3, 5, 4, 0): (1, 2, 3, 5, 4, 0),\n",
-       " (1, 2, 4, 0, 3, 5): (1, 2, 4, 0, 3, 5),\n",
-       " (1, 2, 4, 0, 5, 3): (1, 2, 4, 0, 5, 3),\n",
-       " (1, 2, 4, 3, 0, 5): (1, 2, 4, 3, 0, 5),\n",
-       " (1, 2, 4, 3, 5, 0): (1, 2, 4, 3, 5, 0),\n",
-       " (1, 2, 4, 5, 0, 3): (1, 2, 4, 5, 0, 3),\n",
-       " (1, 2, 4, 5, 3, 0): (1, 2, 4, 5, 3, 0),\n",
-       " (1, 2, 5, 0, 3, 4): (1, 2, 5, 0, 3, 4),\n",
-       " (1, 2, 5, 0, 4, 3): (1, 2, 5, 0, 4, 3),\n",
-       " (1, 2, 5, 3, 0, 4): (1, 2, 5, 3, 0, 4),\n",
-       " (1, 2, 5, 3, 4, 0): (1, 2, 5, 3, 4, 0),\n",
-       " (1, 2, 5, 4, 0, 3): (1, 2, 5, 4, 0, 3),\n",
-       " (1, 2, 5, 4, 3, 0): (1, 2, 5, 4, 3, 0),\n",
-       " (1, 3, 0, 2, 4, 5): (1, 3, 0, 2, 4, 5),\n",
-       " (1, 3, 0, 2, 5, 4): (1, 3, 0, 2, 5, 4),\n",
-       " (1, 3, 0, 4, 2, 5): (1, 3, 0, 4, 2, 5),\n",
-       " (1, 3, 0, 4, 5, 2): (1, 3, 0, 4, 5, 2),\n",
-       " (1, 3, 0, 5, 2, 4): (1, 3, 0, 5, 2, 4),\n",
-       " (1, 3, 0, 5, 4, 2): (1, 3, 0, 5, 4, 2),\n",
-       " (1, 3, 2, 0, 4, 5): (1, 3, 2, 0, 4, 5),\n",
-       " (1, 3, 2, 0, 5, 4): (1, 3, 2, 0, 5, 4),\n",
-       " (1, 3, 2, 4, 0, 5): (1, 3, 2, 4, 0, 5),\n",
-       " (1, 3, 2, 4, 5, 0): (1, 3, 2, 4, 5, 0),\n",
-       " (1, 3, 2, 5, 0, 4): (1, 3, 2, 5, 0, 4),\n",
-       " (1, 3, 2, 5, 4, 0): (1, 3, 2, 5, 4, 0),\n",
-       " (1, 3, 4, 0, 2, 5): (1, 3, 4, 0, 2, 5),\n",
-       " (1, 3, 4, 0, 5, 2): (1, 3, 4, 0, 5, 2),\n",
-       " (1, 3, 4, 2, 0, 5): (1, 3, 4, 2, 0, 5),\n",
-       " (1, 3, 4, 2, 5, 0): (1, 3, 4, 2, 5, 0),\n",
-       " (1, 3, 4, 5, 0, 2): (1, 3, 4, 5, 0, 2),\n",
-       " (1, 3, 4, 5, 2, 0): (1, 3, 4, 5, 2, 0),\n",
-       " (1, 3, 5, 0, 2, 4): (1, 3, 5, 0, 2, 4),\n",
-       " (1, 3, 5, 0, 4, 2): (1, 3, 5, 0, 4, 2),\n",
-       " (1, 3, 5, 2, 0, 4): (1, 3, 5, 2, 0, 4),\n",
-       " (1, 3, 5, 2, 4, 0): (1, 3, 5, 2, 4, 0),\n",
-       " (1, 3, 5, 4, 0, 2): (1, 3, 5, 4, 0, 2),\n",
-       " (1, 3, 5, 4, 2, 0): (1, 3, 5, 4, 2, 0),\n",
-       " (1, 4, 0, 2, 3, 5): (1, 4, 0, 2, 3, 5),\n",
-       " (1, 4, 0, 2, 5, 3): (1, 4, 0, 2, 5, 3),\n",
-       " (1, 4, 0, 3, 2, 5): (1, 4, 0, 3, 2, 5),\n",
-       " (1, 4, 0, 3, 5, 2): (1, 4, 0, 3, 5, 2),\n",
-       " (1, 4, 0, 5, 2, 3): (1, 4, 0, 5, 2, 3),\n",
-       " (1, 4, 0, 5, 3, 2): (1, 4, 0, 5, 3, 2),\n",
-       " (1, 4, 2, 0, 3, 5): (1, 4, 2, 0, 3, 5),\n",
-       " (1, 4, 2, 0, 5, 3): (1, 4, 2, 0, 5, 3),\n",
-       " (1, 4, 2, 3, 0, 5): (1, 4, 2, 3, 0, 5),\n",
-       " (1, 4, 2, 3, 5, 0): (1, 4, 2, 3, 5, 0),\n",
-       " (1, 4, 2, 5, 0, 3): (1, 4, 2, 5, 0, 3),\n",
-       " (1, 4, 2, 5, 3, 0): (1, 4, 2, 5, 3, 0),\n",
-       " (1, 4, 3, 0, 2, 5): (1, 4, 3, 0, 2, 5),\n",
-       " (1, 4, 3, 0, 5, 2): (1, 4, 3, 0, 5, 2),\n",
-       " (1, 4, 3, 2, 0, 5): (1, 4, 3, 2, 0, 5),\n",
-       " (1, 4, 3, 2, 5, 0): (1, 4, 3, 2, 5, 0),\n",
-       " (1, 4, 3, 5, 0, 2): (1, 4, 3, 5, 0, 2),\n",
-       " (1, 4, 3, 5, 2, 0): (1, 4, 3, 5, 2, 0),\n",
-       " (1, 4, 5, 0, 2, 3): (1, 4, 5, 0, 2, 3),\n",
-       " (1, 4, 5, 0, 3, 2): (1, 4, 5, 0, 3, 2),\n",
-       " (1, 4, 5, 2, 0, 3): (1, 4, 5, 2, 0, 3),\n",
-       " (1, 4, 5, 2, 3, 0): (1, 4, 5, 2, 3, 0),\n",
-       " (1, 4, 5, 3, 0, 2): (1, 4, 5, 3, 0, 2),\n",
-       " (1, 4, 5, 3, 2, 0): (1, 4, 5, 3, 2, 0),\n",
-       " (1, 5, 0, 2, 3, 4): (1, 5, 0, 2, 3, 4),\n",
-       " (1, 5, 0, 2, 4, 3): (1, 5, 0, 2, 4, 3),\n",
-       " (1, 5, 0, 3, 2, 4): (1, 5, 0, 3, 2, 4),\n",
-       " (1, 5, 0, 3, 4, 2): (1, 5, 0, 3, 4, 2),\n",
-       " (1, 5, 0, 4, 2, 3): (1, 5, 0, 4, 2, 3),\n",
-       " (1, 5, 0, 4, 3, 2): (1, 5, 0, 4, 3, 2),\n",
-       " (1, 5, 2, 0, 3, 4): (1, 5, 2, 0, 3, 4),\n",
-       " (1, 5, 2, 0, 4, 3): (1, 5, 2, 0, 4, 3),\n",
-       " (1, 5, 2, 3, 0, 4): (1, 5, 2, 3, 0, 4),\n",
-       " (1, 5, 2, 3, 4, 0): (1, 5, 2, 3, 4, 0),\n",
-       " (1, 5, 2, 4, 0, 3): (1, 5, 2, 4, 0, 3),\n",
-       " (1, 5, 2, 4, 3, 0): (1, 5, 2, 4, 3, 0),\n",
-       " (1, 5, 3, 0, 2, 4): (1, 5, 3, 0, 2, 4),\n",
-       " (1, 5, 3, 0, 4, 2): (1, 5, 3, 0, 4, 2),\n",
-       " (1, 5, 3, 2, 0, 4): (1, 5, 3, 2, 0, 4),\n",
-       " (1, 5, 3, 2, 4, 0): (1, 5, 3, 2, 4, 0),\n",
-       " (1, 5, 3, 4, 0, 2): (1, 5, 3, 4, 0, 2),\n",
-       " (1, 5, 3, 4, 2, 0): (1, 5, 3, 4, 2, 0),\n",
-       " (1, 5, 4, 0, 2, 3): (1, 5, 4, 0, 2, 3),\n",
-       " (1, 5, 4, 0, 3, 2): (1, 5, 4, 0, 3, 2),\n",
-       " (1, 5, 4, 2, 0, 3): (1, 5, 4, 2, 0, 3),\n",
-       " (1, 5, 4, 2, 3, 0): (1, 5, 4, 2, 3, 0),\n",
-       " (1, 5, 4, 3, 0, 2): (1, 5, 4, 3, 0, 2),\n",
-       " (1, 5, 4, 3, 2, 0): (1, 5, 4, 3, 2, 0),\n",
-       " (2, 0, 1, 3, 4, 5): (2, 0, 1, 3, 4, 5),\n",
-       " (2, 0, 1, 3, 5, 4): (2, 0, 1, 3, 5, 4),\n",
-       " (2, 0, 1, 4, 3, 5): (2, 0, 1, 4, 3, 5),\n",
-       " (2, 0, 1, 4, 5, 3): (2, 0, 1, 4, 5, 3),\n",
-       " (2, 0, 1, 5, 3, 4): (2, 0, 1, 5, 3, 4),\n",
-       " (2, 0, 1, 5, 4, 3): (2, 0, 1, 5, 4, 3),\n",
-       " (2, 0, 3, 1, 4, 5): (2, 0, 3, 1, 4, 5),\n",
-       " (2, 0, 3, 1, 5, 4): (2, 0, 3, 1, 5, 4),\n",
-       " (2, 0, 3, 4, 1, 5): (2, 0, 3, 4, 1, 5),\n",
-       " (2, 0, 3, 4, 5, 1): (2, 0, 3, 4, 5, 1),\n",
-       " (2, 0, 3, 5, 1, 4): (2, 0, 3, 5, 1, 4),\n",
-       " (2, 0, 3, 5, 4, 1): (2, 0, 3, 5, 4, 1),\n",
-       " (2, 0, 4, 1, 3, 5): (2, 0, 4, 1, 3, 5),\n",
-       " (2, 0, 4, 1, 5, 3): (2, 0, 4, 1, 5, 3),\n",
-       " (2, 0, 4, 3, 1, 5): (2, 0, 4, 3, 1, 5),\n",
-       " (2, 0, 4, 3, 5, 1): (2, 0, 4, 3, 5, 1),\n",
-       " (2, 0, 4, 5, 1, 3): (2, 0, 4, 5, 1, 3),\n",
-       " (2, 0, 4, 5, 3, 1): (2, 0, 4, 5, 3, 1),\n",
-       " (2, 0, 5, 1, 3, 4): (2, 0, 5, 1, 3, 4),\n",
-       " (2, 0, 5, 1, 4, 3): (2, 0, 5, 1, 4, 3),\n",
-       " (2, 0, 5, 3, 1, 4): (2, 0, 5, 3, 1, 4),\n",
-       " (2, 0, 5, 3, 4, 1): (2, 0, 5, 3, 4, 1),\n",
-       " (2, 0, 5, 4, 1, 3): (2, 0, 5, 4, 1, 3),\n",
-       " (2, 0, 5, 4, 3, 1): (2, 0, 5, 4, 3, 1),\n",
-       " (2, 1, 0, 3, 4, 5): (2, 1, 0, 3, 4, 5),\n",
-       " (2, 1, 0, 3, 5, 4): (2, 1, 0, 3, 5, 4),\n",
-       " (2, 1, 0, 4, 3, 5): (2, 1, 0, 4, 3, 5),\n",
-       " (2, 1, 0, 4, 5, 3): (2, 1, 0, 4, 5, 3),\n",
-       " (2, 1, 0, 5, 3, 4): (2, 1, 0, 5, 3, 4),\n",
-       " (2, 1, 0, 5, 4, 3): (2, 1, 0, 5, 4, 3),\n",
-       " (2, 1, 3, 0, 4, 5): (2, 1, 3, 0, 4, 5),\n",
-       " (2, 1, 3, 0, 5, 4): (2, 1, 3, 0, 5, 4),\n",
-       " (2, 1, 3, 4, 0, 5): (2, 1, 3, 4, 0, 5),\n",
-       " (2, 1, 3, 4, 5, 0): (2, 1, 3, 4, 5, 0),\n",
-       " (2, 1, 3, 5, 0, 4): (2, 1, 3, 5, 0, 4),\n",
-       " (2, 1, 3, 5, 4, 0): (2, 1, 3, 5, 4, 0),\n",
-       " (2, 1, 4, 0, 3, 5): (2, 1, 4, 0, 3, 5),\n",
-       " (2, 1, 4, 0, 5, 3): (2, 1, 4, 0, 5, 3),\n",
-       " (2, 1, 4, 3, 0, 5): (2, 1, 4, 3, 0, 5),\n",
-       " (2, 1, 4, 3, 5, 0): (2, 1, 4, 3, 5, 0),\n",
-       " (2, 1, 4, 5, 0, 3): (2, 1, 4, 5, 0, 3),\n",
-       " (2, 1, 4, 5, 3, 0): (2, 1, 4, 5, 3, 0),\n",
-       " (2, 1, 5, 0, 3, 4): (2, 1, 5, 0, 3, 4),\n",
-       " (2, 1, 5, 0, 4, 3): (2, 1, 5, 0, 4, 3),\n",
-       " (2, 1, 5, 3, 0, 4): (2, 1, 5, 3, 0, 4),\n",
-       " (2, 1, 5, 3, 4, 0): (2, 1, 5, 3, 4, 0),\n",
-       " (2, 1, 5, 4, 0, 3): (2, 1, 5, 4, 0, 3),\n",
-       " (2, 1, 5, 4, 3, 0): (2, 1, 5, 4, 3, 0),\n",
-       " (2, 3, 0, 1, 4, 5): (2, 3, 0, 1, 4, 5),\n",
-       " (2, 3, 0, 1, 5, 4): (2, 3, 0, 1, 5, 4),\n",
-       " (2, 3, 0, 4, 1, 5): (2, 3, 0, 4, 1, 5),\n",
-       " (2, 3, 0, 4, 5, 1): (2, 3, 0, 4, 5, 1),\n",
-       " (2, 3, 0, 5, 1, 4): (2, 3, 0, 5, 1, 4),\n",
-       " (2, 3, 0, 5, 4, 1): (2, 3, 0, 5, 4, 1),\n",
-       " (2, 3, 1, 0, 4, 5): (2, 3, 1, 0, 4, 5),\n",
-       " (2, 3, 1, 0, 5, 4): (2, 3, 1, 0, 5, 4),\n",
-       " (2, 3, 1, 4, 0, 5): (2, 3, 1, 4, 0, 5),\n",
-       " (2, 3, 1, 4, 5, 0): (2, 3, 1, 4, 5, 0),\n",
-       " (2, 3, 1, 5, 0, 4): (2, 3, 1, 5, 0, 4),\n",
-       " (2, 3, 1, 5, 4, 0): (2, 3, 1, 5, 4, 0),\n",
-       " (2, 3, 4, 0, 1, 5): (2, 3, 4, 0, 1, 5),\n",
-       " (2, 3, 4, 0, 5, 1): (2, 3, 4, 0, 5, 1),\n",
-       " (2, 3, 4, 1, 0, 5): (2, 3, 4, 1, 0, 5),\n",
-       " (2, 3, 4, 1, 5, 0): (2, 3, 4, 1, 5, 0),\n",
-       " (2, 3, 4, 5, 0, 1): (2, 3, 4, 5, 0, 1),\n",
-       " (2, 3, 4, 5, 1, 0): (2, 3, 4, 5, 1, 0),\n",
-       " (2, 3, 5, 0, 1, 4): (2, 3, 5, 0, 1, 4),\n",
-       " (2, 3, 5, 0, 4, 1): (2, 3, 5, 0, 4, 1),\n",
-       " (2, 3, 5, 1, 0, 4): (2, 3, 5, 1, 0, 4),\n",
-       " (2, 3, 5, 1, 4, 0): (2, 3, 5, 1, 4, 0),\n",
-       " (2, 3, 5, 4, 0, 1): (2, 3, 5, 4, 0, 1),\n",
-       " (2, 3, 5, 4, 1, 0): (2, 3, 5, 4, 1, 0),\n",
-       " (2, 4, 0, 1, 3, 5): (2, 4, 0, 1, 3, 5),\n",
-       " (2, 4, 0, 1, 5, 3): (2, 4, 0, 1, 5, 3),\n",
-       " (2, 4, 0, 3, 1, 5): (2, 4, 0, 3, 1, 5),\n",
-       " (2, 4, 0, 3, 5, 1): (2, 4, 0, 3, 5, 1),\n",
-       " (2, 4, 0, 5, 1, 3): (2, 4, 0, 5, 1, 3),\n",
-       " (2, 4, 0, 5, 3, 1): (2, 4, 0, 5, 3, 1),\n",
-       " (2, 4, 1, 0, 3, 5): (2, 4, 1, 0, 3, 5),\n",
-       " (2, 4, 1, 0, 5, 3): (2, 4, 1, 0, 5, 3),\n",
-       " (2, 4, 1, 3, 0, 5): (2, 4, 1, 3, 0, 5),\n",
-       " (2, 4, 1, 3, 5, 0): (2, 4, 1, 3, 5, 0),\n",
-       " (2, 4, 1, 5, 0, 3): (2, 4, 1, 5, 0, 3),\n",
-       " (2, 4, 1, 5, 3, 0): (2, 4, 1, 5, 3, 0),\n",
-       " (2, 4, 3, 0, 1, 5): (2, 4, 3, 0, 1, 5),\n",
-       " (2, 4, 3, 0, 5, 1): (2, 4, 3, 0, 5, 1),\n",
-       " (2, 4, 3, 1, 0, 5): (2, 4, 3, 1, 0, 5),\n",
-       " (2, 4, 3, 1, 5, 0): (2, 4, 3, 1, 5, 0),\n",
-       " (2, 4, 3, 5, 0, 1): (2, 4, 3, 5, 0, 1),\n",
-       " (2, 4, 3, 5, 1, 0): (2, 4, 3, 5, 1, 0),\n",
-       " (2, 4, 5, 0, 1, 3): (2, 4, 5, 0, 1, 3),\n",
-       " (2, 4, 5, 0, 3, 1): (2, 4, 5, 0, 3, 1),\n",
-       " (2, 4, 5, 1, 0, 3): (2, 4, 5, 1, 0, 3),\n",
-       " (2, 4, 5, 1, 3, 0): (2, 4, 5, 1, 3, 0),\n",
-       " (2, 4, 5, 3, 0, 1): (2, 4, 5, 3, 0, 1),\n",
-       " (2, 4, 5, 3, 1, 0): (2, 4, 5, 3, 1, 0),\n",
-       " (2, 5, 0, 1, 3, 4): (2, 5, 0, 1, 3, 4),\n",
-       " (2, 5, 0, 1, 4, 3): (2, 5, 0, 1, 4, 3),\n",
-       " (2, 5, 0, 3, 1, 4): (2, 5, 0, 3, 1, 4),\n",
-       " (2, 5, 0, 3, 4, 1): (2, 5, 0, 3, 4, 1),\n",
-       " (2, 5, 0, 4, 1, 3): (2, 5, 0, 4, 1, 3),\n",
-       " (2, 5, 0, 4, 3, 1): (2, 5, 0, 4, 3, 1),\n",
-       " (2, 5, 1, 0, 3, 4): (2, 5, 1, 0, 3, 4),\n",
-       " (2, 5, 1, 0, 4, 3): (2, 5, 1, 0, 4, 3),\n",
-       " (2, 5, 1, 3, 0, 4): (2, 5, 1, 3, 0, 4),\n",
-       " (2, 5, 1, 3, 4, 0): (2, 5, 1, 3, 4, 0),\n",
-       " (2, 5, 1, 4, 0, 3): (2, 5, 1, 4, 0, 3),\n",
-       " (2, 5, 1, 4, 3, 0): (2, 5, 1, 4, 3, 0),\n",
-       " (2, 5, 3, 0, 1, 4): (2, 5, 3, 0, 1, 4),\n",
-       " (2, 5, 3, 0, 4, 1): (2, 5, 3, 0, 4, 1),\n",
-       " (2, 5, 3, 1, 0, 4): (2, 5, 3, 1, 0, 4),\n",
-       " (2, 5, 3, 1, 4, 0): (2, 5, 3, 1, 4, 0),\n",
-       " (2, 5, 3, 4, 0, 1): (2, 5, 3, 4, 0, 1),\n",
-       " (2, 5, 3, 4, 1, 0): (2, 5, 3, 4, 1, 0),\n",
-       " (2, 5, 4, 0, 1, 3): (2, 5, 4, 0, 1, 3),\n",
-       " (2, 5, 4, 0, 3, 1): (2, 5, 4, 0, 3, 1),\n",
-       " (2, 5, 4, 1, 0, 3): (2, 5, 4, 1, 0, 3),\n",
-       " (2, 5, 4, 1, 3, 0): (2, 5, 4, 1, 3, 0),\n",
-       " (2, 5, 4, 3, 0, 1): (2, 5, 4, 3, 0, 1),\n",
-       " (2, 5, 4, 3, 1, 0): (2, 5, 4, 3, 1, 0),\n",
-       " (3, 0, 1, 2, 4, 5): (3, 0, 1, 2, 4, 5),\n",
-       " (3, 0, 1, 2, 5, 4): (3, 0, 1, 2, 5, 4),\n",
-       " (3, 0, 1, 4, 2, 5): (3, 0, 1, 4, 2, 5),\n",
-       " (3, 0, 1, 4, 5, 2): (3, 0, 1, 4, 5, 2),\n",
-       " (3, 0, 1, 5, 2, 4): (3, 0, 1, 5, 2, 4),\n",
-       " (3, 0, 1, 5, 4, 2): (3, 0, 1, 5, 4, 2),\n",
-       " (3, 0, 2, 1, 4, 5): (3, 0, 2, 1, 4, 5),\n",
-       " (3, 0, 2, 1, 5, 4): (3, 0, 2, 1, 5, 4),\n",
-       " (3, 0, 2, 4, 1, 5): (3, 0, 2, 4, 1, 5),\n",
-       " (3, 0, 2, 4, 5, 1): (3, 0, 2, 4, 5, 1),\n",
-       " (3, 0, 2, 5, 1, 4): (3, 0, 2, 5, 1, 4),\n",
-       " (3, 0, 2, 5, 4, 1): (3, 0, 2, 5, 4, 1),\n",
-       " (3, 0, 4, 1, 2, 5): (3, 0, 4, 1, 2, 5),\n",
-       " (3, 0, 4, 1, 5, 2): (3, 0, 4, 1, 5, 2),\n",
-       " (3, 0, 4, 2, 1, 5): (3, 0, 4, 2, 1, 5),\n",
-       " (3, 0, 4, 2, 5, 1): (3, 0, 4, 2, 5, 1),\n",
-       " (3, 0, 4, 5, 1, 2): (3, 0, 4, 5, 1, 2),\n",
-       " (3, 0, 4, 5, 2, 1): (3, 0, 4, 5, 2, 1),\n",
-       " (3, 0, 5, 1, 2, 4): (3, 0, 5, 1, 2, 4),\n",
-       " (3, 0, 5, 1, 4, 2): (3, 0, 5, 1, 4, 2),\n",
-       " (3, 0, 5, 2, 1, 4): (3, 0, 5, 2, 1, 4),\n",
-       " (3, 0, 5, 2, 4, 1): (3, 0, 5, 2, 4, 1),\n",
-       " (3, 0, 5, 4, 1, 2): (3, 0, 5, 4, 1, 2),\n",
-       " (3, 0, 5, 4, 2, 1): (3, 0, 5, 4, 2, 1),\n",
-       " (3, 1, 0, 2, 4, 5): (3, 1, 0, 2, 4, 5),\n",
-       " (3, 1, 0, 2, 5, 4): (3, 1, 0, 2, 5, 4),\n",
-       " (3, 1, 0, 4, 2, 5): (3, 1, 0, 4, 2, 5),\n",
-       " (3, 1, 0, 4, 5, 2): (3, 1, 0, 4, 5, 2),\n",
-       " (3, 1, 0, 5, 2, 4): (3, 1, 0, 5, 2, 4),\n",
-       " (3, 1, 0, 5, 4, 2): (3, 1, 0, 5, 4, 2),\n",
-       " (3, 1, 2, 0, 4, 5): (3, 1, 2, 0, 4, 5),\n",
-       " (3, 1, 2, 0, 5, 4): (3, 1, 2, 0, 5, 4),\n",
-       " (3, 1, 2, 4, 0, 5): (3, 1, 2, 4, 0, 5),\n",
-       " (3, 1, 2, 4, 5, 0): (3, 1, 2, 4, 5, 0),\n",
-       " (3, 1, 2, 5, 0, 4): (3, 1, 2, 5, 0, 4),\n",
-       " (3, 1, 2, 5, 4, 0): (3, 1, 2, 5, 4, 0),\n",
-       " (3, 1, 4, 0, 2, 5): (3, 1, 4, 0, 2, 5),\n",
-       " (3, 1, 4, 0, 5, 2): (3, 1, 4, 0, 5, 2),\n",
-       " (3, 1, 4, 2, 0, 5): (3, 1, 4, 2, 0, 5),\n",
-       " (3, 1, 4, 2, 5, 0): (3, 1, 4, 2, 5, 0),\n",
-       " (3, 1, 4, 5, 0, 2): (3, 1, 4, 5, 0, 2),\n",
-       " (3, 1, 4, 5, 2, 0): (3, 1, 4, 5, 2, 0),\n",
-       " (3, 1, 5, 0, 2, 4): (3, 1, 5, 0, 2, 4),\n",
-       " (3, 1, 5, 0, 4, 2): (3, 1, 5, 0, 4, 2),\n",
-       " (3, 1, 5, 2, 0, 4): (3, 1, 5, 2, 0, 4),\n",
-       " (3, 1, 5, 2, 4, 0): (3, 1, 5, 2, 4, 0),\n",
-       " (3, 1, 5, 4, 0, 2): (3, 1, 5, 4, 0, 2),\n",
-       " (3, 1, 5, 4, 2, 0): (3, 1, 5, 4, 2, 0),\n",
-       " (3, 2, 0, 1, 4, 5): (3, 2, 0, 1, 4, 5),\n",
-       " (3, 2, 0, 1, 5, 4): (3, 2, 0, 1, 5, 4),\n",
-       " (3, 2, 0, 4, 1, 5): (3, 2, 0, 4, 1, 5),\n",
-       " (3, 2, 0, 4, 5, 1): (3, 2, 0, 4, 5, 1),\n",
-       " (3, 2, 0, 5, 1, 4): (3, 2, 0, 5, 1, 4),\n",
-       " (3, 2, 0, 5, 4, 1): (3, 2, 0, 5, 4, 1),\n",
-       " (3, 2, 1, 0, 4, 5): (3, 2, 1, 0, 4, 5),\n",
-       " (3, 2, 1, 0, 5, 4): (3, 2, 1, 0, 5, 4),\n",
-       " (3, 2, 1, 4, 0, 5): (3, 2, 1, 4, 0, 5),\n",
-       " (3, 2, 1, 4, 5, 0): (3, 2, 1, 4, 5, 0),\n",
-       " (3, 2, 1, 5, 0, 4): (3, 2, 1, 5, 0, 4),\n",
-       " (3, 2, 1, 5, 4, 0): (3, 2, 1, 5, 4, 0),\n",
-       " (3, 2, 4, 0, 1, 5): (3, 2, 4, 0, 1, 5),\n",
-       " (3, 2, 4, 0, 5, 1): (3, 2, 4, 0, 5, 1),\n",
-       " (3, 2, 4, 1, 0, 5): (3, 2, 4, 1, 0, 5),\n",
-       " (3, 2, 4, 1, 5, 0): (3, 2, 4, 1, 5, 0),\n",
-       " (3, 2, 4, 5, 0, 1): (3, 2, 4, 5, 0, 1),\n",
-       " (3, 2, 4, 5, 1, 0): (3, 2, 4, 5, 1, 0),\n",
-       " (3, 2, 5, 0, 1, 4): (3, 2, 5, 0, 1, 4),\n",
-       " (3, 2, 5, 0, 4, 1): (3, 2, 5, 0, 4, 1),\n",
-       " (3, 2, 5, 1, 0, 4): (3, 2, 5, 1, 0, 4),\n",
-       " (3, 2, 5, 1, 4, 0): (3, 2, 5, 1, 4, 0),\n",
-       " (3, 2, 5, 4, 0, 1): (3, 2, 5, 4, 0, 1),\n",
-       " (3, 2, 5, 4, 1, 0): (3, 2, 5, 4, 1, 0),\n",
-       " (3, 4, 0, 1, 2, 5): (3, 4, 0, 1, 2, 5),\n",
-       " (3, 4, 0, 1, 5, 2): (3, 4, 0, 1, 5, 2),\n",
-       " (3, 4, 0, 2, 1, 5): (3, 4, 0, 2, 1, 5),\n",
-       " (3, 4, 0, 2, 5, 1): (3, 4, 0, 2, 5, 1),\n",
-       " (3, 4, 0, 5, 1, 2): (3, 4, 0, 5, 1, 2),\n",
-       " (3, 4, 0, 5, 2, 1): (3, 4, 0, 5, 2, 1),\n",
-       " (3, 4, 1, 0, 2, 5): (3, 4, 1, 0, 2, 5),\n",
-       " (3, 4, 1, 0, 5, 2): (3, 4, 1, 0, 5, 2),\n",
-       " (3, 4, 1, 2, 0, 5): (3, 4, 1, 2, 0, 5),\n",
-       " (3, 4, 1, 2, 5, 0): (3, 4, 1, 2, 5, 0),\n",
-       " (3, 4, 1, 5, 0, 2): (3, 4, 1, 5, 0, 2),\n",
-       " (3, 4, 1, 5, 2, 0): (3, 4, 1, 5, 2, 0),\n",
-       " (3, 4, 2, 0, 1, 5): (3, 4, 2, 0, 1, 5),\n",
-       " (3, 4, 2, 0, 5, 1): (3, 4, 2, 0, 5, 1),\n",
-       " (3, 4, 2, 1, 0, 5): (3, 4, 2, 1, 0, 5),\n",
-       " (3, 4, 2, 1, 5, 0): (3, 4, 2, 1, 5, 0),\n",
-       " (3, 4, 2, 5, 0, 1): (3, 4, 2, 5, 0, 1),\n",
-       " (3, 4, 2, 5, 1, 0): (3, 4, 2, 5, 1, 0),\n",
-       " (3, 4, 5, 0, 1, 2): (3, 4, 5, 0, 1, 2),\n",
-       " (3, 4, 5, 0, 2, 1): (3, 4, 5, 0, 2, 1),\n",
-       " (3, 4, 5, 1, 0, 2): (3, 4, 5, 1, 0, 2),\n",
-       " (3, 4, 5, 1, 2, 0): (3, 4, 5, 1, 2, 0),\n",
-       " (3, 4, 5, 2, 0, 1): (3, 4, 5, 2, 0, 1),\n",
-       " (3, 4, 5, 2, 1, 0): (3, 4, 5, 2, 1, 0),\n",
-       " (3, 5, 0, 1, 2, 4): (3, 5, 0, 1, 2, 4),\n",
-       " (3, 5, 0, 1, 4, 2): (3, 5, 0, 1, 4, 2),\n",
-       " (3, 5, 0, 2, 1, 4): (3, 5, 0, 2, 1, 4),\n",
-       " (3, 5, 0, 2, 4, 1): (3, 5, 0, 2, 4, 1),\n",
-       " (3, 5, 0, 4, 1, 2): (3, 5, 0, 4, 1, 2),\n",
-       " (3, 5, 0, 4, 2, 1): (3, 5, 0, 4, 2, 1),\n",
-       " (3, 5, 1, 0, 2, 4): (3, 5, 1, 0, 2, 4),\n",
-       " (3, 5, 1, 0, 4, 2): (3, 5, 1, 0, 4, 2),\n",
-       " (3, 5, 1, 2, 0, 4): (3, 5, 1, 2, 0, 4),\n",
-       " (3, 5, 1, 2, 4, 0): (3, 5, 1, 2, 4, 0),\n",
-       " (3, 5, 1, 4, 0, 2): (3, 5, 1, 4, 0, 2),\n",
-       " (3, 5, 1, 4, 2, 0): (3, 5, 1, 4, 2, 0),\n",
-       " (3, 5, 2, 0, 1, 4): (3, 5, 2, 0, 1, 4),\n",
-       " (3, 5, 2, 0, 4, 1): (3, 5, 2, 0, 4, 1),\n",
-       " (3, 5, 2, 1, 0, 4): (3, 5, 2, 1, 0, 4),\n",
-       " (3, 5, 2, 1, 4, 0): (3, 5, 2, 1, 4, 0),\n",
-       " (3, 5, 2, 4, 0, 1): (3, 5, 2, 4, 0, 1),\n",
-       " (3, 5, 2, 4, 1, 0): (3, 5, 2, 4, 1, 0),\n",
-       " (3, 5, 4, 0, 1, 2): (3, 5, 4, 0, 1, 2),\n",
-       " (3, 5, 4, 0, 2, 1): (3, 5, 4, 0, 2, 1),\n",
-       " (3, 5, 4, 1, 0, 2): (3, 5, 4, 1, 0, 2),\n",
-       " (3, 5, 4, 1, 2, 0): (3, 5, 4, 1, 2, 0),\n",
-       " (3, 5, 4, 2, 0, 1): (3, 5, 4, 2, 0, 1),\n",
-       " (3, 5, 4, 2, 1, 0): (3, 5, 4, 2, 1, 0),\n",
-       " (4, 0, 1, 2, 3, 5): (4, 0, 1, 2, 3, 5),\n",
-       " (4, 0, 1, 2, 5, 3): (4, 0, 1, 2, 5, 3),\n",
-       " (4, 0, 1, 3, 2, 5): (4, 0, 1, 3, 2, 5),\n",
-       " (4, 0, 1, 3, 5, 2): (4, 0, 1, 3, 5, 2),\n",
-       " (4, 0, 1, 5, 2, 3): (4, 0, 1, 5, 2, 3),\n",
-       " (4, 0, 1, 5, 3, 2): (4, 0, 1, 5, 3, 2),\n",
-       " (4, 0, 2, 1, 3, 5): (4, 0, 2, 1, 3, 5),\n",
-       " (4, 0, 2, 1, 5, 3): (4, 0, 2, 1, 5, 3),\n",
-       " (4, 0, 2, 3, 1, 5): (4, 0, 2, 3, 1, 5),\n",
-       " (4, 0, 2, 3, 5, 1): (4, 0, 2, 3, 5, 1),\n",
-       " (4, 0, 2, 5, 1, 3): (4, 0, 2, 5, 1, 3),\n",
-       " (4, 0, 2, 5, 3, 1): (4, 0, 2, 5, 3, 1),\n",
-       " (4, 0, 3, 1, 2, 5): (4, 0, 3, 1, 2, 5),\n",
-       " (4, 0, 3, 1, 5, 2): (4, 0, 3, 1, 5, 2),\n",
-       " (4, 0, 3, 2, 1, 5): (4, 0, 3, 2, 1, 5),\n",
-       " (4, 0, 3, 2, 5, 1): (4, 0, 3, 2, 5, 1),\n",
-       " (4, 0, 3, 5, 1, 2): (4, 0, 3, 5, 1, 2),\n",
-       " (4, 0, 3, 5, 2, 1): (4, 0, 3, 5, 2, 1),\n",
-       " (4, 0, 5, 1, 2, 3): (4, 0, 5, 1, 2, 3),\n",
-       " (4, 0, 5, 1, 3, 2): (4, 0, 5, 1, 3, 2),\n",
-       " (4, 0, 5, 2, 1, 3): (4, 0, 5, 2, 1, 3),\n",
-       " (4, 0, 5, 2, 3, 1): (4, 0, 5, 2, 3, 1),\n",
-       " (4, 0, 5, 3, 1, 2): (4, 0, 5, 3, 1, 2),\n",
-       " (4, 0, 5, 3, 2, 1): (4, 0, 5, 3, 2, 1),\n",
-       " (4, 1, 0, 2, 3, 5): (4, 1, 0, 2, 3, 5),\n",
-       " (4, 1, 0, 2, 5, 3): (4, 1, 0, 2, 5, 3),\n",
-       " (4, 1, 0, 3, 2, 5): (4, 1, 0, 3, 2, 5),\n",
-       " (4, 1, 0, 3, 5, 2): (4, 1, 0, 3, 5, 2),\n",
-       " (4, 1, 0, 5, 2, 3): (4, 1, 0, 5, 2, 3),\n",
-       " (4, 1, 0, 5, 3, 2): (4, 1, 0, 5, 3, 2),\n",
-       " (4, 1, 2, 0, 3, 5): (4, 1, 2, 0, 3, 5),\n",
-       " (4, 1, 2, 0, 5, 3): (4, 1, 2, 0, 5, 3),\n",
-       " (4, 1, 2, 3, 0, 5): (4, 1, 2, 3, 0, 5),\n",
-       " (4, 1, 2, 3, 5, 0): (4, 1, 2, 3, 5, 0),\n",
-       " (4, 1, 2, 5, 0, 3): (4, 1, 2, 5, 0, 3),\n",
-       " (4, 1, 2, 5, 3, 0): (4, 1, 2, 5, 3, 0),\n",
-       " (4, 1, 3, 0, 2, 5): (4, 1, 3, 0, 2, 5),\n",
-       " (4, 1, 3, 0, 5, 2): (4, 1, 3, 0, 5, 2),\n",
-       " (4, 1, 3, 2, 0, 5): (4, 1, 3, 2, 0, 5),\n",
-       " (4, 1, 3, 2, 5, 0): (4, 1, 3, 2, 5, 0),\n",
-       " (4, 1, 3, 5, 0, 2): (4, 1, 3, 5, 0, 2),\n",
-       " (4, 1, 3, 5, 2, 0): (4, 1, 3, 5, 2, 0),\n",
-       " (4, 1, 5, 0, 2, 3): (4, 1, 5, 0, 2, 3),\n",
-       " (4, 1, 5, 0, 3, 2): (4, 1, 5, 0, 3, 2),\n",
-       " (4, 1, 5, 2, 0, 3): (4, 1, 5, 2, 0, 3),\n",
-       " (4, 1, 5, 2, 3, 0): (4, 1, 5, 2, 3, 0),\n",
-       " (4, 1, 5, 3, 0, 2): (4, 1, 5, 3, 0, 2),\n",
-       " (4, 1, 5, 3, 2, 0): (4, 1, 5, 3, 2, 0),\n",
-       " (4, 2, 0, 1, 3, 5): (4, 2, 0, 1, 3, 5),\n",
-       " (4, 2, 0, 1, 5, 3): (4, 2, 0, 1, 5, 3),\n",
-       " (4, 2, 0, 3, 1, 5): (4, 2, 0, 3, 1, 5),\n",
-       " (4, 2, 0, 3, 5, 1): (4, 2, 0, 3, 5, 1),\n",
-       " (4, 2, 0, 5, 1, 3): (4, 2, 0, 5, 1, 3),\n",
-       " (4, 2, 0, 5, 3, 1): (4, 2, 0, 5, 3, 1),\n",
-       " (4, 2, 1, 0, 3, 5): (4, 2, 1, 0, 3, 5),\n",
-       " (4, 2, 1, 0, 5, 3): (4, 2, 1, 0, 5, 3),\n",
-       " (4, 2, 1, 3, 0, 5): (4, 2, 1, 3, 0, 5),\n",
-       " (4, 2, 1, 3, 5, 0): (4, 2, 1, 3, 5, 0),\n",
-       " (4, 2, 1, 5, 0, 3): (4, 2, 1, 5, 0, 3),\n",
-       " (4, 2, 1, 5, 3, 0): (4, 2, 1, 5, 3, 0),\n",
-       " (4, 2, 3, 0, 1, 5): (4, 2, 3, 0, 1, 5),\n",
-       " (4, 2, 3, 0, 5, 1): (4, 2, 3, 0, 5, 1),\n",
-       " (4, 2, 3, 1, 0, 5): (4, 2, 3, 1, 0, 5),\n",
-       " (4, 2, 3, 1, 5, 0): (4, 2, 3, 1, 5, 0),\n",
-       " (4, 2, 3, 5, 0, 1): (4, 2, 3, 5, 0, 1),\n",
-       " (4, 2, 3, 5, 1, 0): (4, 2, 3, 5, 1, 0),\n",
-       " (4, 2, 5, 0, 1, 3): (4, 2, 5, 0, 1, 3),\n",
-       " (4, 2, 5, 0, 3, 1): (4, 2, 5, 0, 3, 1),\n",
-       " (4, 2, 5, 1, 0, 3): (4, 2, 5, 1, 0, 3),\n",
-       " (4, 2, 5, 1, 3, 0): (4, 2, 5, 1, 3, 0),\n",
-       " (4, 2, 5, 3, 0, 1): (4, 2, 5, 3, 0, 1),\n",
-       " (4, 2, 5, 3, 1, 0): (4, 2, 5, 3, 1, 0),\n",
-       " (4, 3, 0, 1, 2, 5): (4, 3, 0, 1, 2, 5),\n",
-       " (4, 3, 0, 1, 5, 2): (4, 3, 0, 1, 5, 2),\n",
-       " (4, 3, 0, 2, 1, 5): (4, 3, 0, 2, 1, 5),\n",
-       " (4, 3, 0, 2, 5, 1): (4, 3, 0, 2, 5, 1),\n",
-       " (4, 3, 0, 5, 1, 2): (4, 3, 0, 5, 1, 2),\n",
-       " (4, 3, 0, 5, 2, 1): (4, 3, 0, 5, 2, 1),\n",
-       " (4, 3, 1, 0, 2, 5): (4, 3, 1, 0, 2, 5),\n",
-       " (4, 3, 1, 0, 5, 2): (4, 3, 1, 0, 5, 2),\n",
-       " (4, 3, 1, 2, 0, 5): (4, 3, 1, 2, 0, 5),\n",
-       " (4, 3, 1, 2, 5, 0): (4, 3, 1, 2, 5, 0),\n",
-       " (4, 3, 1, 5, 0, 2): (4, 3, 1, 5, 0, 2),\n",
-       " (4, 3, 1, 5, 2, 0): (4, 3, 1, 5, 2, 0),\n",
-       " (4, 3, 2, 0, 1, 5): (4, 3, 2, 0, 1, 5),\n",
-       " (4, 3, 2, 0, 5, 1): (4, 3, 2, 0, 5, 1),\n",
-       " (4, 3, 2, 1, 0, 5): (4, 3, 2, 1, 0, 5),\n",
-       " (4, 3, 2, 1, 5, 0): (4, 3, 2, 1, 5, 0),\n",
-       " (4, 3, 2, 5, 0, 1): (4, 3, 2, 5, 0, 1),\n",
-       " (4, 3, 2, 5, 1, 0): (4, 3, 2, 5, 1, 0),\n",
-       " (4, 3, 5, 0, 1, 2): (4, 3, 5, 0, 1, 2),\n",
-       " (4, 3, 5, 0, 2, 1): (4, 3, 5, 0, 2, 1),\n",
-       " (4, 3, 5, 1, 0, 2): (4, 3, 5, 1, 0, 2),\n",
-       " (4, 3, 5, 1, 2, 0): (4, 3, 5, 1, 2, 0),\n",
-       " (4, 3, 5, 2, 0, 1): (4, 3, 5, 2, 0, 1),\n",
-       " (4, 3, 5, 2, 1, 0): (4, 3, 5, 2, 1, 0),\n",
-       " (4, 5, 0, 1, 2, 3): (4, 5, 0, 1, 2, 3),\n",
-       " (4, 5, 0, 1, 3, 2): (4, 5, 0, 1, 3, 2),\n",
-       " (4, 5, 0, 2, 1, 3): (4, 5, 0, 2, 1, 3),\n",
-       " (4, 5, 0, 2, 3, 1): (4, 5, 0, 2, 3, 1),\n",
-       " (4, 5, 0, 3, 1, 2): (4, 5, 0, 3, 1, 2),\n",
-       " (4, 5, 0, 3, 2, 1): (4, 5, 0, 3, 2, 1),\n",
-       " (4, 5, 1, 0, 2, 3): (4, 5, 1, 0, 2, 3),\n",
-       " (4, 5, 1, 0, 3, 2): (4, 5, 1, 0, 3, 2),\n",
-       " (4, 5, 1, 2, 0, 3): (4, 5, 1, 2, 0, 3),\n",
-       " (4, 5, 1, 2, 3, 0): (4, 5, 1, 2, 3, 0),\n",
-       " (4, 5, 1, 3, 0, 2): (4, 5, 1, 3, 0, 2),\n",
-       " (4, 5, 1, 3, 2, 0): (4, 5, 1, 3, 2, 0),\n",
-       " (4, 5, 2, 0, 1, 3): (4, 5, 2, 0, 1, 3),\n",
-       " (4, 5, 2, 0, 3, 1): (4, 5, 2, 0, 3, 1),\n",
-       " (4, 5, 2, 1, 0, 3): (4, 5, 2, 1, 0, 3),\n",
-       " (4, 5, 2, 1, 3, 0): (4, 5, 2, 1, 3, 0),\n",
-       " (4, 5, 2, 3, 0, 1): (4, 5, 2, 3, 0, 1),\n",
-       " (4, 5, 2, 3, 1, 0): (4, 5, 2, 3, 1, 0),\n",
-       " (4, 5, 3, 0, 1, 2): (4, 5, 3, 0, 1, 2),\n",
-       " (4, 5, 3, 0, 2, 1): (4, 5, 3, 0, 2, 1),\n",
-       " (4, 5, 3, 1, 0, 2): (4, 5, 3, 1, 0, 2),\n",
-       " (4, 5, 3, 1, 2, 0): (4, 5, 3, 1, 2, 0),\n",
-       " (4, 5, 3, 2, 0, 1): (4, 5, 3, 2, 0, 1),\n",
-       " (4, 5, 3, 2, 1, 0): (4, 5, 3, 2, 1, 0),\n",
-       " (5, 0, 1, 2, 3, 4): (5, 0, 1, 2, 3, 4),\n",
-       " (5, 0, 1, 2, 4, 3): (5, 0, 1, 2, 4, 3),\n",
-       " (5, 0, 1, 3, 2, 4): (5, 0, 1, 3, 2, 4),\n",
-       " (5, 0, 1, 3, 4, 2): (5, 0, 1, 3, 4, 2),\n",
-       " (5, 0, 1, 4, 2, 3): (5, 0, 1, 4, 2, 3),\n",
-       " (5, 0, 1, 4, 3, 2): (5, 0, 1, 4, 3, 2),\n",
-       " (5, 0, 2, 1, 3, 4): (5, 0, 2, 1, 3, 4),\n",
-       " (5, 0, 2, 1, 4, 3): (5, 0, 2, 1, 4, 3),\n",
-       " (5, 0, 2, 3, 1, 4): (5, 0, 2, 3, 1, 4),\n",
-       " (5, 0, 2, 3, 4, 1): (5, 0, 2, 3, 4, 1),\n",
-       " (5, 0, 2, 4, 1, 3): (5, 0, 2, 4, 1, 3),\n",
-       " (5, 0, 2, 4, 3, 1): (5, 0, 2, 4, 3, 1),\n",
-       " (5, 0, 3, 1, 2, 4): (5, 0, 3, 1, 2, 4),\n",
-       " (5, 0, 3, 1, 4, 2): (5, 0, 3, 1, 4, 2),\n",
-       " (5, 0, 3, 2, 1, 4): (5, 0, 3, 2, 1, 4),\n",
-       " (5, 0, 3, 2, 4, 1): (5, 0, 3, 2, 4, 1),\n",
-       " (5, 0, 3, 4, 1, 2): (5, 0, 3, 4, 1, 2),\n",
-       " (5, 0, 3, 4, 2, 1): (5, 0, 3, 4, 2, 1),\n",
-       " (5, 0, 4, 1, 2, 3): (5, 0, 4, 1, 2, 3),\n",
-       " (5, 0, 4, 1, 3, 2): (5, 0, 4, 1, 3, 2),\n",
-       " (5, 0, 4, 2, 1, 3): (5, 0, 4, 2, 1, 3),\n",
-       " (5, 0, 4, 2, 3, 1): (5, 0, 4, 2, 3, 1),\n",
-       " (5, 0, 4, 3, 1, 2): (5, 0, 4, 3, 1, 2),\n",
-       " (5, 0, 4, 3, 2, 1): (5, 0, 4, 3, 2, 1),\n",
-       " (5, 1, 0, 2, 3, 4): (5, 1, 0, 2, 3, 4),\n",
-       " (5, 1, 0, 2, 4, 3): (5, 1, 0, 2, 4, 3),\n",
-       " (5, 1, 0, 3, 2, 4): (5, 1, 0, 3, 2, 4),\n",
-       " (5, 1, 0, 3, 4, 2): (5, 1, 0, 3, 4, 2),\n",
-       " (5, 1, 0, 4, 2, 3): (5, 1, 0, 4, 2, 3),\n",
-       " (5, 1, 0, 4, 3, 2): (5, 1, 0, 4, 3, 2),\n",
-       " (5, 1, 2, 0, 3, 4): (5, 1, 2, 0, 3, 4),\n",
-       " (5, 1, 2, 0, 4, 3): (5, 1, 2, 0, 4, 3),\n",
-       " (5, 1, 2, 3, 0, 4): (5, 1, 2, 3, 0, 4),\n",
-       " (5, 1, 2, 3, 4, 0): (5, 1, 2, 3, 4, 0),\n",
-       " (5, 1, 2, 4, 0, 3): (5, 1, 2, 4, 0, 3),\n",
-       " (5, 1, 2, 4, 3, 0): (5, 1, 2, 4, 3, 0),\n",
-       " (5, 1, 3, 0, 2, 4): (5, 1, 3, 0, 2, 4),\n",
-       " (5, 1, 3, 0, 4, 2): (5, 1, 3, 0, 4, 2),\n",
-       " (5, 1, 3, 2, 0, 4): (5, 1, 3, 2, 0, 4),\n",
-       " (5, 1, 3, 2, 4, 0): (5, 1, 3, 2, 4, 0),\n",
-       " (5, 1, 3, 4, 0, 2): (5, 1, 3, 4, 0, 2),\n",
-       " (5, 1, 3, 4, 2, 0): (5, 1, 3, 4, 2, 0),\n",
-       " (5, 1, 4, 0, 2, 3): (5, 1, 4, 0, 2, 3),\n",
-       " (5, 1, 4, 0, 3, 2): (5, 1, 4, 0, 3, 2),\n",
-       " (5, 1, 4, 2, 0, 3): (5, 1, 4, 2, 0, 3),\n",
-       " (5, 1, 4, 2, 3, 0): (5, 1, 4, 2, 3, 0),\n",
-       " (5, 1, 4, 3, 0, 2): (5, 1, 4, 3, 0, 2),\n",
-       " (5, 1, 4, 3, 2, 0): (5, 1, 4, 3, 2, 0),\n",
-       " (5, 2, 0, 1, 3, 4): (5, 2, 0, 1, 3, 4),\n",
-       " (5, 2, 0, 1, 4, 3): (5, 2, 0, 1, 4, 3),\n",
-       " (5, 2, 0, 3, 1, 4): (5, 2, 0, 3, 1, 4),\n",
-       " (5, 2, 0, 3, 4, 1): (5, 2, 0, 3, 4, 1),\n",
-       " (5, 2, 0, 4, 1, 3): (5, 2, 0, 4, 1, 3),\n",
-       " (5, 2, 0, 4, 3, 1): (5, 2, 0, 4, 3, 1),\n",
-       " (5, 2, 1, 0, 3, 4): (5, 2, 1, 0, 3, 4),\n",
-       " (5, 2, 1, 0, 4, 3): (5, 2, 1, 0, 4, 3),\n",
-       " (5, 2, 1, 3, 0, 4): (5, 2, 1, 3, 0, 4),\n",
-       " (5, 2, 1, 3, 4, 0): (5, 2, 1, 3, 4, 0),\n",
-       " (5, 2, 1, 4, 0, 3): (5, 2, 1, 4, 0, 3),\n",
-       " (5, 2, 1, 4, 3, 0): (5, 2, 1, 4, 3, 0),\n",
-       " (5, 2, 3, 0, 1, 4): (5, 2, 3, 0, 1, 4),\n",
-       " (5, 2, 3, 0, 4, 1): (5, 2, 3, 0, 4, 1),\n",
-       " (5, 2, 3, 1, 0, 4): (5, 2, 3, 1, 0, 4),\n",
-       " (5, 2, 3, 1, 4, 0): (5, 2, 3, 1, 4, 0),\n",
-       " (5, 2, 3, 4, 0, 1): (5, 2, 3, 4, 0, 1),\n",
-       " (5, 2, 3, 4, 1, 0): (5, 2, 3, 4, 1, 0),\n",
-       " (5, 2, 4, 0, 1, 3): (5, 2, 4, 0, 1, 3),\n",
-       " (5, 2, 4, 0, 3, 1): (5, 2, 4, 0, 3, 1),\n",
-       " (5, 2, 4, 1, 0, 3): (5, 2, 4, 1, 0, 3),\n",
-       " (5, 2, 4, 1, 3, 0): (5, 2, 4, 1, 3, 0),\n",
-       " (5, 2, 4, 3, 0, 1): (5, 2, 4, 3, 0, 1),\n",
-       " (5, 2, 4, 3, 1, 0): (5, 2, 4, 3, 1, 0),\n",
-       " (5, 3, 0, 1, 2, 4): (5, 3, 0, 1, 2, 4),\n",
-       " (5, 3, 0, 1, 4, 2): (5, 3, 0, 1, 4, 2),\n",
-       " (5, 3, 0, 2, 1, 4): (5, 3, 0, 2, 1, 4),\n",
-       " (5, 3, 0, 2, 4, 1): (5, 3, 0, 2, 4, 1),\n",
-       " (5, 3, 0, 4, 1, 2): (5, 3, 0, 4, 1, 2),\n",
-       " (5, 3, 0, 4, 2, 1): (5, 3, 0, 4, 2, 1),\n",
-       " (5, 3, 1, 0, 2, 4): (5, 3, 1, 0, 2, 4),\n",
-       " (5, 3, 1, 0, 4, 2): (5, 3, 1, 0, 4, 2),\n",
-       " (5, 3, 1, 2, 0, 4): (5, 3, 1, 2, 0, 4),\n",
-       " (5, 3, 1, 2, 4, 0): (5, 3, 1, 2, 4, 0),\n",
-       " (5, 3, 1, 4, 0, 2): (5, 3, 1, 4, 0, 2),\n",
-       " (5, 3, 1, 4, 2, 0): (5, 3, 1, 4, 2, 0),\n",
-       " (5, 3, 2, 0, 1, 4): (5, 3, 2, 0, 1, 4),\n",
-       " (5, 3, 2, 0, 4, 1): (5, 3, 2, 0, 4, 1),\n",
-       " (5, 3, 2, 1, 0, 4): (5, 3, 2, 1, 0, 4),\n",
-       " (5, 3, 2, 1, 4, 0): (5, 3, 2, 1, 4, 0),\n",
-       " (5, 3, 2, 4, 0, 1): (5, 3, 2, 4, 0, 1),\n",
-       " (5, 3, 2, 4, 1, 0): (5, 3, 2, 4, 1, 0),\n",
-       " (5, 3, 4, 0, 1, 2): (5, 3, 4, 0, 1, 2),\n",
-       " (5, 3, 4, 0, 2, 1): (5, 3, 4, 0, 2, 1),\n",
-       " (5, 3, 4, 1, 0, 2): (5, 3, 4, 1, 0, 2),\n",
-       " (5, 3, 4, 1, 2, 0): (5, 3, 4, 1, 2, 0),\n",
-       " (5, 3, 4, 2, 0, 1): (5, 3, 4, 2, 0, 1),\n",
-       " (5, 3, 4, 2, 1, 0): (5, 3, 4, 2, 1, 0),\n",
-       " (5, 4, 0, 1, 2, 3): (5, 4, 0, 1, 2, 3),\n",
-       " (5, 4, 0, 1, 3, 2): (5, 4, 0, 1, 3, 2),\n",
-       " (5, 4, 0, 2, 1, 3): (5, 4, 0, 2, 1, 3),\n",
-       " (5, 4, 0, 2, 3, 1): (5, 4, 0, 2, 3, 1),\n",
-       " (5, 4, 0, 3, 1, 2): (5, 4, 0, 3, 1, 2),\n",
-       " (5, 4, 0, 3, 2, 1): (5, 4, 0, 3, 2, 1),\n",
-       " (5, 4, 1, 0, 2, 3): (5, 4, 1, 0, 2, 3),\n",
-       " (5, 4, 1, 0, 3, 2): (5, 4, 1, 0, 3, 2),\n",
-       " (5, 4, 1, 2, 0, 3): (5, 4, 1, 2, 0, 3),\n",
-       " (5, 4, 1, 2, 3, 0): (5, 4, 1, 2, 3, 0),\n",
-       " (5, 4, 1, 3, 0, 2): (5, 4, 1, 3, 0, 2),\n",
-       " (5, 4, 1, 3, 2, 0): (5, 4, 1, 3, 2, 0),\n",
-       " (5, 4, 2, 0, 1, 3): (5, 4, 2, 0, 1, 3),\n",
-       " (5, 4, 2, 0, 3, 1): (5, 4, 2, 0, 3, 1),\n",
-       " (5, 4, 2, 1, 0, 3): (5, 4, 2, 1, 0, 3),\n",
-       " (5, 4, 2, 1, 3, 0): (5, 4, 2, 1, 3, 0),\n",
-       " (5, 4, 2, 3, 0, 1): (5, 4, 2, 3, 0, 1),\n",
-       " (5, 4, 2, 3, 1, 0): (5, 4, 2, 3, 1, 0),\n",
-       " (5, 4, 3, 0, 1, 2): (5, 4, 3, 0, 1, 2),\n",
-       " (5, 4, 3, 0, 2, 1): (5, 4, 3, 0, 2, 1),\n",
-       " (5, 4, 3, 1, 0, 2): (5, 4, 3, 1, 0, 2),\n",
-       " (5, 4, 3, 1, 2, 0): (5, 4, 3, 1, 2, 0),\n",
-       " (5, 4, 3, 2, 0, 1): (5, 4, 3, 2, 0, 1),\n",
-       " (5, 4, 3, 2, 1, 0): (5, 4, 3, 2, 1, 0)}"
-      ]
-     },
-     "execution_count": 16,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "transpositions6 = {t: t for t in set(itertools.permutations(list(range(6))))}\n",
-    "transpositions6"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 17,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "(((2, 4, 3, 5, 0, 1), (1, 2), <AmscoFillStyle.reverse_each_row: 3>),\n",
-       " -1437.9908206760847)"
-      ]
-     },
-     "execution_count": 17,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_b, score = amsco_break(c7b, translist=transpositions6)\n",
-    "key_b, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 18,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "[[AmscoSlice(index=0, start=0, end=1),\n",
-       "  AmscoSlice(index=1, start=1, end=3),\n",
-       "  AmscoSlice(index=2, start=3, end=4),\n",
-       "  AmscoSlice(index=3, start=4, end=6),\n",
-       "  AmscoSlice(index=4, start=6, end=7),\n",
-       "  AmscoSlice(index=5, start=7, end=9)],\n",
-       " [AmscoSlice(index=6, start=9, end=11),\n",
-       "  AmscoSlice(index=7, start=11, end=12),\n",
-       "  AmscoSlice(index=8, start=12, end=14),\n",
-       "  AmscoSlice(index=9, start=14, end=15),\n",
-       "  AmscoSlice(index=10, start=15, end=17),\n",
-       "  AmscoSlice(index=11, start=17, end=18)],\n",
-       " [AmscoSlice(index=12, start=18, end=19),\n",
-       "  AmscoSlice(index=13, start=19, end=21),\n",
-       "  AmscoSlice(index=14, start=21, end=22),\n",
-       "  AmscoSlice(index=15, start=22, end=24),\n",
-       "  AmscoSlice(index=16, start=24, end=25),\n",
-       "  AmscoSlice(index=17, start=25, end=27)],\n",
-       " [AmscoSlice(index=18, start=27, end=29),\n",
-       "  AmscoSlice(index=19, start=29, end=30),\n",
-       "  AmscoSlice(index=20, start=30, end=32),\n",
-       "  AmscoSlice(index=21, start=32, end=33),\n",
-       "  AmscoSlice(index=22, start=33, end=35),\n",
-       "  AmscoSlice(index=23, start=35, end=36)],\n",
-       " [AmscoSlice(index=24, start=36, end=37),\n",
-       "  AmscoSlice(index=25, start=37, end=39),\n",
-       "  AmscoSlice(index=26, start=39, end=40),\n",
-       "  AmscoSlice(index=27, start=40, end=42),\n",
-       "  AmscoSlice(index=28, start=42, end=43),\n",
-       "  AmscoSlice(index=29, start=43, end=45)],\n",
-       " [AmscoSlice(index=30, start=45, end=47),\n",
-       "  AmscoSlice(index=31, start=47, end=48),\n",
-       "  AmscoSlice(index=32, start=48, end=50),\n",
-       "  AmscoSlice(index=33, start=50, end=51),\n",
-       "  AmscoSlice(index=34, start=51, end=53),\n",
-       "  AmscoSlice(index=35, start=53, end=54)],\n",
-       " [AmscoSlice(index=36, start=54, end=55),\n",
-       "  AmscoSlice(index=37, start=55, end=57),\n",
-       "  AmscoSlice(index=38, start=57, end=58),\n",
-       "  AmscoSlice(index=39, start=58, end=60),\n",
-       "  AmscoSlice(index=40, start=60, end=61),\n",
-       "  AmscoSlice(index=41, start=61, end=63)],\n",
-       " [AmscoSlice(index=42, start=63, end=65),\n",
-       "  AmscoSlice(index=43, start=65, end=66),\n",
-       "  AmscoSlice(index=44, start=66, end=68),\n",
-       "  AmscoSlice(index=45, start=68, end=69),\n",
-       "  AmscoSlice(index=46, start=69, end=71),\n",
-       "  AmscoSlice(index=47, start=71, end=72)],\n",
-       " [AmscoSlice(index=48, start=72, end=73),\n",
-       "  AmscoSlice(index=49, start=73, end=75),\n",
-       "  AmscoSlice(index=50, start=75, end=76),\n",
-       "  AmscoSlice(index=51, start=76, end=78),\n",
-       "  AmscoSlice(index=52, start=78, end=79),\n",
-       "  AmscoSlice(index=53, start=79, end=81)],\n",
-       " [AmscoSlice(index=54, start=81, end=83),\n",
-       "  AmscoSlice(index=55, start=83, end=84),\n",
-       "  AmscoSlice(index=56, start=84, end=86),\n",
-       "  AmscoSlice(index=57, start=86, end=87),\n",
-       "  AmscoSlice(index=58, start=87, end=89),\n",
-       "  AmscoSlice(index=59, start=89, end=90)],\n",
-       " [AmscoSlice(index=60, start=90, end=91),\n",
-       "  AmscoSlice(index=61, start=91, end=93),\n",
-       "  AmscoSlice(index=62, start=93, end=94),\n",
-       "  AmscoSlice(index=63, start=94, end=96),\n",
-       "  AmscoSlice(index=64, start=96, end=97),\n",
-       "  AmscoSlice(index=65, start=97, end=99)],\n",
-       " [AmscoSlice(index=66, start=99, end=101),\n",
-       "  AmscoSlice(index=67, start=101, end=102),\n",
-       "  AmscoSlice(index=68, start=102, end=104),\n",
-       "  AmscoSlice(index=69, start=104, end=105),\n",
-       "  AmscoSlice(index=70, start=105, end=107),\n",
-       "  AmscoSlice(index=71, start=107, end=108)],\n",
-       " [AmscoSlice(index=72, start=108, end=109),\n",
-       "  AmscoSlice(index=73, start=109, end=111),\n",
-       "  AmscoSlice(index=74, start=111, end=112),\n",
-       "  AmscoSlice(index=75, start=112, end=114),\n",
-       "  AmscoSlice(index=76, start=114, end=115),\n",
-       "  AmscoSlice(index=77, start=115, end=117)],\n",
-       " [AmscoSlice(index=78, start=117, end=119),\n",
-       "  AmscoSlice(index=79, start=119, end=120),\n",
-       "  AmscoSlice(index=80, start=120, end=122),\n",
-       "  AmscoSlice(index=81, start=122, end=123),\n",
-       "  AmscoSlice(index=82, start=123, end=125),\n",
-       "  AmscoSlice(index=83, start=125, end=126)],\n",
-       " [AmscoSlice(index=84, start=126, end=127),\n",
-       "  AmscoSlice(index=85, start=127, end=129),\n",
-       "  AmscoSlice(index=86, start=129, end=130),\n",
-       "  AmscoSlice(index=87, start=130, end=132),\n",
-       "  AmscoSlice(index=88, start=132, end=133),\n",
-       "  AmscoSlice(index=89, start=133, end=135)],\n",
-       " [AmscoSlice(index=90, start=135, end=137),\n",
-       "  AmscoSlice(index=91, start=137, end=138),\n",
-       "  AmscoSlice(index=92, start=138, end=140),\n",
-       "  AmscoSlice(index=93, start=140, end=141),\n",
-       "  AmscoSlice(index=94, start=141, end=143),\n",
-       "  AmscoSlice(index=95, start=143, end=144)],\n",
-       " [AmscoSlice(index=96, start=144, end=145),\n",
-       "  AmscoSlice(index=97, start=145, end=147),\n",
-       "  AmscoSlice(index=98, start=147, end=148),\n",
-       "  AmscoSlice(index=99, start=148, end=150),\n",
-       "  AmscoSlice(index=100, start=150, end=151),\n",
-       "  AmscoSlice(index=101, start=151, end=153)],\n",
-       " [AmscoSlice(index=102, start=153, end=155),\n",
-       "  AmscoSlice(index=103, start=155, end=156),\n",
-       "  AmscoSlice(index=104, start=156, end=158),\n",
-       "  AmscoSlice(index=105, start=158, end=159),\n",
-       "  AmscoSlice(index=106, start=159, end=161),\n",
-       "  AmscoSlice(index=107, start=161, end=162)],\n",
-       " [AmscoSlice(index=108, start=162, end=163),\n",
-       "  AmscoSlice(index=109, start=163, end=165),\n",
-       "  AmscoSlice(index=110, start=165, end=166),\n",
-       "  AmscoSlice(index=111, start=166, end=168),\n",
-       "  AmscoSlice(index=112, start=168, end=169),\n",
-       "  AmscoSlice(index=113, start=169, end=171)],\n",
-       " [AmscoSlice(index=114, start=171, end=173),\n",
-       "  AmscoSlice(index=115, start=173, end=174),\n",
-       "  AmscoSlice(index=116, start=174, end=176),\n",
-       "  AmscoSlice(index=117, start=176, end=177),\n",
-       "  AmscoSlice(index=118, start=177, end=179),\n",
-       "  AmscoSlice(index=119, start=179, end=180)],\n",
-       " [AmscoSlice(index=120, start=180, end=181),\n",
-       "  AmscoSlice(index=121, start=181, end=183),\n",
-       "  AmscoSlice(index=122, start=183, end=184),\n",
-       "  AmscoSlice(index=123, start=184, end=186),\n",
-       "  AmscoSlice(index=124, start=186, end=187),\n",
-       "  AmscoSlice(index=125, start=187, end=189)],\n",
-       " [AmscoSlice(index=126, start=189, end=191),\n",
-       "  AmscoSlice(index=127, start=191, end=192),\n",
-       "  AmscoSlice(index=128, start=192, end=194),\n",
-       "  AmscoSlice(index=129, start=194, end=195),\n",
-       "  AmscoSlice(index=130, start=195, end=197),\n",
-       "  AmscoSlice(index=131, start=197, end=198)],\n",
-       " [AmscoSlice(index=132, start=198, end=199),\n",
-       "  AmscoSlice(index=133, start=199, end=201),\n",
-       "  AmscoSlice(index=134, start=201, end=202),\n",
-       "  AmscoSlice(index=135, start=202, end=204),\n",
-       "  AmscoSlice(index=136, start=204, end=205),\n",
-       "  AmscoSlice(index=137, start=205, end=207)],\n",
-       " [AmscoSlice(index=138, start=207, end=209),\n",
-       "  AmscoSlice(index=139, start=209, end=210),\n",
-       "  AmscoSlice(index=140, start=210, end=212),\n",
-       "  AmscoSlice(index=141, start=212, end=213),\n",
-       "  AmscoSlice(index=142, start=213, end=215),\n",
-       "  AmscoSlice(index=143, start=215, end=216)],\n",
-       " [AmscoSlice(index=144, start=216, end=217),\n",
-       "  AmscoSlice(index=145, start=217, end=219),\n",
-       "  AmscoSlice(index=146, start=219, end=220),\n",
-       "  AmscoSlice(index=147, start=220, end=222),\n",
-       "  AmscoSlice(index=148, start=222, end=223),\n",
-       "  AmscoSlice(index=149, start=223, end=225)],\n",
-       " [AmscoSlice(index=150, start=225, end=227),\n",
-       "  AmscoSlice(index=151, start=227, end=228),\n",
-       "  AmscoSlice(index=152, start=228, end=230),\n",
-       "  AmscoSlice(index=153, start=230, end=231),\n",
-       "  AmscoSlice(index=154, start=231, end=233),\n",
-       "  AmscoSlice(index=155, start=233, end=234)],\n",
-       " [AmscoSlice(index=156, start=234, end=235),\n",
-       "  AmscoSlice(index=157, start=235, end=237),\n",
-       "  AmscoSlice(index=158, start=237, end=238),\n",
-       "  AmscoSlice(index=159, start=238, end=240),\n",
-       "  AmscoSlice(index=160, start=240, end=241),\n",
-       "  AmscoSlice(index=161, start=241, end=243)],\n",
-       " [AmscoSlice(index=162, start=243, end=245),\n",
-       "  AmscoSlice(index=163, start=245, end=246),\n",
-       "  AmscoSlice(index=164, start=246, end=248),\n",
-       "  AmscoSlice(index=165, start=248, end=249),\n",
-       "  AmscoSlice(index=166, start=249, end=251),\n",
-       "  AmscoSlice(index=167, start=251, end=252)],\n",
-       " [AmscoSlice(index=168, start=252, end=253),\n",
-       "  AmscoSlice(index=169, start=253, end=255),\n",
-       "  AmscoSlice(index=170, start=255, end=256),\n",
-       "  AmscoSlice(index=171, start=256, end=258),\n",
-       "  AmscoSlice(index=172, start=258, end=259),\n",
-       "  AmscoSlice(index=173, start=259, end=261)],\n",
-       " [AmscoSlice(index=174, start=261, end=263),\n",
-       "  AmscoSlice(index=175, start=263, end=264),\n",
-       "  AmscoSlice(index=176, start=264, end=266),\n",
-       "  AmscoSlice(index=177, start=266, end=267),\n",
-       "  AmscoSlice(index=178, start=267, end=269),\n",
-       "  AmscoSlice(index=179, start=269, end=270)],\n",
-       " [AmscoSlice(index=180, start=270, end=271),\n",
-       "  AmscoSlice(index=181, start=271, end=273),\n",
-       "  AmscoSlice(index=182, start=273, end=274),\n",
-       "  AmscoSlice(index=183, start=274, end=276),\n",
-       "  AmscoSlice(index=184, start=276, end=277),\n",
-       "  AmscoSlice(index=185, start=277, end=279)],\n",
-       " [AmscoSlice(index=186, start=279, end=281),\n",
-       "  AmscoSlice(index=187, start=281, end=282),\n",
-       "  AmscoSlice(index=188, start=282, end=284),\n",
-       "  AmscoSlice(index=189, start=284, end=285),\n",
-       "  AmscoSlice(index=190, start=285, end=287),\n",
-       "  AmscoSlice(index=191, start=287, end=288)],\n",
-       " [AmscoSlice(index=192, start=288, end=289),\n",
-       "  AmscoSlice(index=193, start=289, end=291),\n",
-       "  AmscoSlice(index=194, start=291, end=292),\n",
-       "  AmscoSlice(index=195, start=292, end=294),\n",
-       "  AmscoSlice(index=196, start=294, end=295),\n",
-       "  AmscoSlice(index=197, start=295, end=297)],\n",
-       " [AmscoSlice(index=198, start=297, end=299),\n",
-       "  AmscoSlice(index=199, start=299, end=300),\n",
-       "  AmscoSlice(index=200, start=300, end=302),\n",
-       "  AmscoSlice(index=201, start=302, end=303),\n",
-       "  AmscoSlice(index=202, start=303, end=305),\n",
-       "  AmscoSlice(index=203, start=305, end=306)],\n",
-       " [AmscoSlice(index=204, start=306, end=307),\n",
-       "  AmscoSlice(index=205, start=307, end=309),\n",
-       "  AmscoSlice(index=206, start=309, end=310),\n",
-       "  AmscoSlice(index=207, start=310, end=312),\n",
-       "  AmscoSlice(index=208, start=312, end=313),\n",
-       "  AmscoSlice(index=209, start=313, end=315)],\n",
-       " [AmscoSlice(index=210, start=315, end=317),\n",
-       "  AmscoSlice(index=211, start=317, end=318),\n",
-       "  AmscoSlice(index=212, start=318, end=320),\n",
-       "  AmscoSlice(index=213, start=320, end=321),\n",
-       "  AmscoSlice(index=214, start=321, end=323),\n",
-       "  AmscoSlice(index=215, start=323, end=324)],\n",
-       " [AmscoSlice(index=216, start=324, end=325),\n",
-       "  AmscoSlice(index=217, start=325, end=327),\n",
-       "  AmscoSlice(index=218, start=327, end=328),\n",
-       "  AmscoSlice(index=219, start=328, end=330),\n",
-       "  AmscoSlice(index=220, start=330, end=331),\n",
-       "  AmscoSlice(index=221, start=331, end=333)],\n",
-       " [AmscoSlice(index=222, start=333, end=335),\n",
-       "  AmscoSlice(index=223, start=335, end=336),\n",
-       "  AmscoSlice(index=224, start=336, end=338),\n",
-       "  AmscoSlice(index=225, start=338, end=339),\n",
-       "  AmscoSlice(index=226, start=339, end=341),\n",
-       "  AmscoSlice(index=227, start=341, end=342)],\n",
-       " [AmscoSlice(index=228, start=342, end=343),\n",
-       "  AmscoSlice(index=229, start=343, end=345),\n",
-       "  AmscoSlice(index=230, start=345, end=346),\n",
-       "  AmscoSlice(index=231, start=346, end=348),\n",
-       "  AmscoSlice(index=232, start=348, end=349),\n",
-       "  AmscoSlice(index=233, start=349, end=351)],\n",
-       " [AmscoSlice(index=234, start=351, end=353),\n",
-       "  AmscoSlice(index=235, start=353, end=354),\n",
-       "  AmscoSlice(index=236, start=354, end=356),\n",
-       "  AmscoSlice(index=237, start=356, end=357),\n",
-       "  AmscoSlice(index=238, start=357, end=359),\n",
-       "  AmscoSlice(index=239, start=359, end=360)],\n",
-       " [AmscoSlice(index=240, start=360, end=361),\n",
-       "  AmscoSlice(index=241, start=361, end=363),\n",
-       "  AmscoSlice(index=242, start=363, end=364),\n",
-       "  AmscoSlice(index=243, start=364, end=366),\n",
-       "  AmscoSlice(index=244, start=366, end=367),\n",
-       "  AmscoSlice(index=245, start=367, end=369)],\n",
-       " [AmscoSlice(index=246, start=369, end=371),\n",
-       "  AmscoSlice(index=247, start=371, end=372),\n",
-       "  AmscoSlice(index=248, start=372, end=374),\n",
-       "  AmscoSlice(index=249, start=374, end=375),\n",
-       "  AmscoSlice(index=250, start=375, end=377),\n",
-       "  AmscoSlice(index=251, start=377, end=378)],\n",
-       " [AmscoSlice(index=252, start=378, end=379),\n",
-       "  AmscoSlice(index=253, start=379, end=381),\n",
-       "  AmscoSlice(index=254, start=381, end=382),\n",
-       "  AmscoSlice(index=255, start=382, end=384),\n",
-       "  AmscoSlice(index=256, start=384, end=385),\n",
-       "  AmscoSlice(index=257, start=385, end=387)],\n",
-       " [AmscoSlice(index=258, start=387, end=389),\n",
-       "  AmscoSlice(index=259, start=389, end=390),\n",
-       "  AmscoSlice(index=260, start=390, end=392),\n",
-       "  AmscoSlice(index=261, start=392, end=393),\n",
-       "  AmscoSlice(index=262, start=393, end=395),\n",
-       "  AmscoSlice(index=263, start=395, end=396)],\n",
-       " [AmscoSlice(index=264, start=396, end=397),\n",
-       "  AmscoSlice(index=265, start=397, end=399),\n",
-       "  AmscoSlice(index=266, start=399, end=400),\n",
-       "  AmscoSlice(index=267, start=400, end=402),\n",
-       "  AmscoSlice(index=268, start=402, end=403),\n",
-       "  AmscoSlice(index=269, start=403, end=405)],\n",
-       " [AmscoSlice(index=270, start=405, end=407),\n",
-       "  AmscoSlice(index=271, start=407, end=408),\n",
-       "  AmscoSlice(index=272, start=408, end=410),\n",
-       "  AmscoSlice(index=273, start=410, end=411),\n",
-       "  AmscoSlice(index=274, start=411, end=413),\n",
-       "  AmscoSlice(index=275, start=413, end=414)],\n",
-       " [AmscoSlice(index=276, start=414, end=415),\n",
-       "  AmscoSlice(index=277, start=415, end=417),\n",
-       "  AmscoSlice(index=278, start=417, end=418),\n",
-       "  AmscoSlice(index=279, start=418, end=420),\n",
-       "  AmscoSlice(index=280, start=420, end=421),\n",
-       "  AmscoSlice(index=281, start=421, end=423)],\n",
-       " [AmscoSlice(index=282, start=423, end=425),\n",
-       "  AmscoSlice(index=283, start=425, end=426),\n",
-       "  AmscoSlice(index=284, start=426, end=428),\n",
-       "  AmscoSlice(index=285, start=428, end=429),\n",
-       "  AmscoSlice(index=286, start=429, end=431),\n",
-       "  AmscoSlice(index=287, start=431, end=432)],\n",
-       " [AmscoSlice(index=288, start=432, end=433),\n",
-       "  AmscoSlice(index=289, start=433, end=435),\n",
-       "  AmscoSlice(index=290, start=435, end=436),\n",
-       "  AmscoSlice(index=291, start=436, end=438),\n",
-       "  AmscoSlice(index=292, start=438, end=439),\n",
-       "  AmscoSlice(index=293, start=439, end=441)],\n",
-       " [AmscoSlice(index=294, start=441, end=443),\n",
-       "  AmscoSlice(index=295, start=443, end=444),\n",
-       "  AmscoSlice(index=296, start=444, end=446),\n",
-       "  AmscoSlice(index=297, start=446, end=447),\n",
-       "  AmscoSlice(index=298, start=447, end=449),\n",
-       "  AmscoSlice(index=299, start=449, end=450)],\n",
-       " [AmscoSlice(index=300, start=450, end=451),\n",
-       "  AmscoSlice(index=301, start=451, end=453),\n",
-       "  AmscoSlice(index=302, start=453, end=454),\n",
-       "  AmscoSlice(index=303, start=454, end=456),\n",
-       "  AmscoSlice(index=304, start=456, end=457),\n",
-       "  AmscoSlice(index=305, start=457, end=459)],\n",
-       " [AmscoSlice(index=306, start=459, end=461),\n",
-       "  AmscoSlice(index=307, start=461, end=462),\n",
-       "  AmscoSlice(index=308, start=462, end=464),\n",
-       "  AmscoSlice(index=309, start=464, end=465),\n",
-       "  AmscoSlice(index=310, start=465, end=467),\n",
-       "  AmscoSlice(index=311, start=467, end=468)],\n",
-       " [AmscoSlice(index=312, start=468, end=469),\n",
-       "  AmscoSlice(index=313, start=469, end=471),\n",
-       "  AmscoSlice(index=314, start=471, end=472),\n",
-       "  AmscoSlice(index=315, start=472, end=474),\n",
-       "  AmscoSlice(index=316, start=474, end=475),\n",
-       "  AmscoSlice(index=317, start=475, end=477)],\n",
-       " [AmscoSlice(index=318, start=477, end=479),\n",
-       "  AmscoSlice(index=319, start=479, end=480),\n",
-       "  AmscoSlice(index=320, start=480, end=482),\n",
-       "  AmscoSlice(index=321, start=482, end=483),\n",
-       "  AmscoSlice(index=322, start=483, end=485),\n",
-       "  AmscoSlice(index=323, start=485, end=486)],\n",
-       " [AmscoSlice(index=324, start=486, end=487),\n",
-       "  AmscoSlice(index=325, start=487, end=489),\n",
-       "  AmscoSlice(index=326, start=489, end=490),\n",
-       "  AmscoSlice(index=327, start=490, end=492),\n",
-       "  AmscoSlice(index=328, start=492, end=493),\n",
-       "  AmscoSlice(index=329, start=493, end=495)],\n",
-       " [AmscoSlice(index=330, start=495, end=497),\n",
-       "  AmscoSlice(index=331, start=497, end=498),\n",
-       "  AmscoSlice(index=332, start=498, end=500),\n",
-       "  AmscoSlice(index=333, start=500, end=501),\n",
-       "  AmscoSlice(index=334, start=501, end=503),\n",
-       "  AmscoSlice(index=335, start=503, end=504)],\n",
-       " [AmscoSlice(index=336, start=504, end=505),\n",
-       "  AmscoSlice(index=337, start=505, end=507),\n",
-       "  AmscoSlice(index=338, start=507, end=508),\n",
-       "  AmscoSlice(index=339, start=508, end=510),\n",
-       "  AmscoSlice(index=340, start=510, end=511),\n",
-       "  AmscoSlice(index=341, start=511, end=513)],\n",
-       " [AmscoSlice(index=342, start=513, end=515),\n",
-       "  AmscoSlice(index=343, start=515, end=516),\n",
-       "  AmscoSlice(index=344, start=516, end=518),\n",
-       "  AmscoSlice(index=345, start=518, end=519),\n",
-       "  AmscoSlice(index=346, start=519, end=521),\n",
-       "  AmscoSlice(index=347, start=521, end=522)],\n",
-       " [AmscoSlice(index=348, start=522, end=523),\n",
-       "  AmscoSlice(index=349, start=523, end=525),\n",
-       "  AmscoSlice(index=350, start=525, end=526),\n",
-       "  AmscoSlice(index=351, start=526, end=528),\n",
-       "  AmscoSlice(index=352, start=528, end=529),\n",
-       "  AmscoSlice(index=353, start=529, end=531)],\n",
-       " [AmscoSlice(index=354, start=531, end=533),\n",
-       "  AmscoSlice(index=355, start=533, end=534),\n",
-       "  AmscoSlice(index=356, start=534, end=536),\n",
-       "  AmscoSlice(index=357, start=536, end=537),\n",
-       "  AmscoSlice(index=358, start=537, end=539),\n",
-       "  AmscoSlice(index=359, start=539, end=540)],\n",
-       " [AmscoSlice(index=360, start=540, end=541),\n",
-       "  AmscoSlice(index=361, start=541, end=543),\n",
-       "  AmscoSlice(index=362, start=543, end=544),\n",
-       "  AmscoSlice(index=363, start=544, end=546),\n",
-       "  AmscoSlice(index=364, start=546, end=547),\n",
-       "  AmscoSlice(index=365, start=547, end=549)],\n",
-       " [AmscoSlice(index=366, start=549, end=551),\n",
-       "  AmscoSlice(index=367, start=551, end=552),\n",
-       "  AmscoSlice(index=368, start=552, end=554),\n",
-       "  AmscoSlice(index=369, start=554, end=555),\n",
-       "  AmscoSlice(index=370, start=555, end=557),\n",
-       "  AmscoSlice(index=371, start=557, end=558)],\n",
-       " [AmscoSlice(index=372, start=558, end=559),\n",
-       "  AmscoSlice(index=373, start=559, end=561),\n",
-       "  AmscoSlice(index=374, start=561, end=562),\n",
-       "  AmscoSlice(index=375, start=562, end=564),\n",
-       "  AmscoSlice(index=376, start=564, end=565),\n",
-       "  AmscoSlice(index=377, start=565, end=567)],\n",
-       " [AmscoSlice(index=378, start=567, end=569),\n",
-       "  AmscoSlice(index=379, start=569, end=570),\n",
-       "  AmscoSlice(index=380, start=570, end=572),\n",
-       "  AmscoSlice(index=381, start=572, end=573),\n",
-       "  AmscoSlice(index=382, start=573, end=575),\n",
-       "  AmscoSlice(index=383, start=575, end=576)],\n",
-       " [AmscoSlice(index=384, start=576, end=577),\n",
-       "  AmscoSlice(index=385, start=577, end=579),\n",
-       "  AmscoSlice(index=386, start=579, end=580),\n",
-       "  AmscoSlice(index=387, start=580, end=582),\n",
-       "  AmscoSlice(index=388, start=582, end=583),\n",
-       "  AmscoSlice(index=389, start=583, end=585)],\n",
-       " [AmscoSlice(index=390, start=585, end=587),\n",
-       "  AmscoSlice(index=391, start=587, end=588),\n",
-       "  AmscoSlice(index=392, start=588, end=590),\n",
-       "  AmscoSlice(index=393, start=590, end=591),\n",
-       "  AmscoSlice(index=394, start=591, end=593),\n",
-       "  AmscoSlice(index=395, start=593, end=594)],\n",
-       " [AmscoSlice(index=396, start=594, end=595),\n",
-       "  AmscoSlice(index=397, start=595, end=597),\n",
-       "  AmscoSlice(index=398, start=597, end=598),\n",
-       "  AmscoSlice(index=399, start=598, end=600),\n",
-       "  AmscoSlice(index=400, start=600, end=601),\n",
-       "  AmscoSlice(index=401, start=601, end=603)],\n",
-       " [AmscoSlice(index=402, start=603, end=605),\n",
-       "  AmscoSlice(index=403, start=605, end=606),\n",
-       "  AmscoSlice(index=404, start=606, end=608),\n",
-       "  AmscoSlice(index=405, start=608, end=609),\n",
-       "  AmscoSlice(index=406, start=609, end=611),\n",
-       "  AmscoSlice(index=407, start=611, end=612)]]"
-      ]
-     },
-     "execution_count": 18,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "amsco_transposition_positions(c7b, 'abcdef', \n",
-    "      fillpattern=(1, 2),\n",
-    "      fillstyle=AmscoFillStyle.reverse_each_row)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 19,
-   "metadata": {
-    "collapsed": false,
-    "scrolled": true
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "['stager',\n",
-       " 'staler',\n",
-       " 'stalin',\n",
-       " 'stamen',\n",
-       " 'sucker',\n",
-       " 'tucker',\n",
-       " 'twangs',\n",
-       " 'twerps',\n",
-       " 'twirls',\n",
-       " 'staffer',\n",
-       " 'stagers',\n",
-       " 'stagger',\n",
-       " 'stalins',\n",
-       " 'stamens',\n",
-       " 'stamina',\n",
-       " 'stammer',\n",
-       " 'statler',\n",
-       " 'suckers',\n",
-       " 'sudsier',\n",
-       " 'swagger',\n",
-       " 'tubbier',\n",
-       " 'tycoons',\n",
-       " 'loadable',\n",
-       " 'noblemen',\n",
-       " 'rubidium',\n",
-       " 'staffers',\n",
-       " 'staggers',\n",
-       " 'staminas',\n",
-       " 'stammers',\n",
-       " 'standard',\n",
-       " 'steelier',\n",
-       " 'submerse',\n",
-       " 'swaggers',\n",
-       " 'tubbiest',\n",
-       " 'tuitions',\n",
-       " 'twenties',\n",
-       " 'stalemate',\n",
-       " 'staleness',\n",
-       " 'stalinist',\n",
-       " 'stammerer',\n",
-       " 'standards',\n",
-       " 'submerses',\n",
-       " 'swaggerer',\n",
-       " 'stalemates',\n",
-       " 'stalenesss',\n",
-       " 'stammerers',\n",
-       " 'stepsister',\n",
-       " 'succulence',\n",
-       " 'statistical',\n",
-       " 'stepsisters',\n",
-       " 'succulences',\n",
-       " 'statistician',\n",
-       " 'statisticians']"
-      ]
-     },
-     "execution_count": 19,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "transpositions[key_b[0]]"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 20,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "security protocol solitaire comrades under a decree from moscow we are confined to using a new high security stream cipher stolen from the americans the solitaire cipher all files classified top secret and above are to be archived using this method this new field cipher has been tested and proven to match the security of the fi alka machine without the overhead of the technology you will need only a deck of cards to implement the cipher the key to be used will be provided and distributed on a one time pad and you must destroy the key as you use it the key consists of a random shuffle of a full deck of cards together with two distinguishable jokers agents should be freely able to carry this equipment without arousing suspicion\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(sanitise(\n",
-    "                amsco_transposition_decipher(sanitise(c7b), \n",
-    "                                             keyword=transpositions[key_b[0]][0], \n",
-    "                                             fillpattern=key_b[1],\n",
-    "                                             fillstyle=key_b[2])\n",
-    "            ))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "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
-}
diff --git a/2015-challenge8.ipynb b/2015-challenge8.ipynb
deleted file mode 100644 (file)
index 90231b1..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "code",
-   "execution_count": 1,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [],
-   "source": [
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from cipherbreak import *\n",
-    "\n",
-    "c8a = sanitise(open('2015/8a.ciphertext').read())\n",
-    "c8b = sanitise(open('2015/8b.ciphertext').read())"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 12,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "('charlie', -2104.8140749325567)"
-      ]
-     },
-     "execution_count": 12,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "key_a, score = vigenere_frequency_break(c8a)\n",
-    "key_a, score"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 15,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "harry i am so sorry we went into the russian hq last night without you but the station chief wanted it to be his team that got the glory i am really grateful to you for coming back and putting us on the right track though the stolen file from soviet headquarters was as you expected encrypted with the solitaire cipher fortunately the cipher clerk who managed the encryption was incredibly careless i found a sheet of burnt paper in the bin which gave me a list of thirty eight cards and i am hoping that this is a large part of the key it will still be hard to break but maybe not impossible especially as the erased part was still intact there maybe another clue in that the page appears to have been torn from an economics textbook i found on the desk anyway i figure the chemists at langley may help us to reconstruct the whole key given time though i wouldnt expect them to manage more than one card a day given how careful they will have to be not to destroy the document it will take usa while to crack this but maybe time is on our side with christmas things seem to be quiet and i am hoping that within the next three weeks we may know precisely what the soviets were trying to do here whatever the outcome i think it is clear that the future of europe is not likely to be settled for a while i hear rumours everyday about shortages in the soviet bloc and border controls are going up in places you wouldnt expect to prevent largescale migration there are problems in greece and turkey and divisions between the british and french and the brits are having real trouble paying off their war debts whether or not we crack the reichs doktor mystery i think there is going to be plenty for you to do i know we had to work hard to persuade you to flyover but we really do need you here even the chief recognizes that so if i can i want to persuade you to stay francois and i are being posted to paris kind of a thankyou for our work on this project but icant go unless i know the berlin station has someone i trust hope youll agree to take the job charlie\n"
-     ]
-    }
-   ],
-   "source": [
-    "print(' '.join(segment(vigenere_decipher(c8a, key_a))))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "collapsed": true
-   },
-   "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
-}
diff --git a/2015/2015-challenge1.ipynb b/2015/2015-challenge1.ipynb
new file mode 100644 (file)
index 0000000..7d73732
--- /dev/null
@@ -0,0 +1,143 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c1a = open('1a.ciphertext').read()\n",
+    "c1b = open('1b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(12, -883.4816832492597)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = caesar_break(c1a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "HARRY, SORRY TO DRAG YOU BACK IN , WE WERE HOPING TO GIVE YOU SOME TIME OFF AFTER THE LAST CASE, BUT SOMETHING CAME UP AND WE NEED YOUR HELP. \n",
+      "\n",
+      "AT A MEETING OF THE FOUR POWERS ALLIED CONTROL COUNCIL TWO WEEKS AGO THE FRENCH ACCUSED THE RUSSIANS OF SHELTERING A NAZI MEDIC KNOWN AS THE REICHSDOKTOR. APPARENTLY THEY INTERCEPTED A MORSE CODE RADIO BROADCAST FROM THE RUSSIAN SECTOR OF BERLIN IN WHICH THE DOCTOR WAS OFFERING INTELLIGENCE ABOUT THE RATLINES IN EXCHANGE FOR ASYLUM. THE RUSSIANS CLAIMED NOT TO KNOW ANYTHING ABOUT IT, AND MAYBE THEY ARE TELLING THE TRUTH, BUT THINGS HAVE BEEN A LITTLE FROSTY SINCE TRUMAN'S SPEECH ON MARCH TWELFTH AND WE REALLY DON'T NEED MORE CONFLICT RIGHT NOW. WE FIGURE WITH YOUR CONTACTS OVER HERE YOU MIGHT BE ABLE TO FIND OUT IF THE RUSSIANS ARE TELLING THE TRUTH. I HAVE ATTACHED THE ENCRYPTED TRANSCRIPT OF THE BROADCAST. \n",
+      "CHARLIE\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(caesar_decipher(c1a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(14, -403.53308240183975)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = caesar_break(c1b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "if you want to know the secret of the rat lines i maybe able to help but the price will be high and is not negotiable life herein berlin has lost its lustre and i want sanctuary in a more congenial climate with security for my future i can provide details of personnel policy security and routes and can furnish you with documentary evidence of the reach of the organization the reichs doktor\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(caesar_decipher(c1b, key_b)))))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2015/2015-challenge2.ipynb b/2015/2015-challenge2.ipynb
new file mode 100644 (file)
index 0000000..7438ce2
--- /dev/null
@@ -0,0 +1,143 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c2a = open('2a.ciphertext').read()\n",
+    "c2b = open('2b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(15, -1150.5844346071483)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = caesar_break(c2a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "CHARLIE, NO NEED TO APOLOGISE, LIFE WAS GETTING DULL BEHIND A DESK AND I WAS GLAD TO HAVE AN EXCUSE TO FLY BACK TO EUROPE. I AM INTRIGUED ABOUT THE REICHSDOKTOR - I HADN'T COME ACROSS THIS BEFORE, WHEN DID YOU FIRST COME HEAR OF IT? \n",
+      "I THINK I MAY ALREADY BE MAKING SOME PROGRESS. ON ARRIVAL I FOUND A POSTCARD WAITING FOR ME ON THE MAT AT THE EMBASSY WITH NO MESSAGE ON IT . AT LEAST THAT'S WHAT IT LOOKED LIKE AT FIRST. I DID NOTICE THAT THE LETTERS ON THE FRONT COULD BE HIGHLIGHTED TO PICK OUT THE PHRASE THE REICHSDOKTOR SO UNLESS THAT IS AN EXTRAORDINARY COINCIDENCE I FIGURED IT MUST BE RELATED TO OUR INVESTIGATION. THE STRANGEST THING WAS THAT THE POSTCARD HAD A STAMP BUT NO POSTMARK ON IT, SO IT CAN'T HAVE BEEN POSTED. SINCE IT WASN'T SIGNED I ASSUME THEY WANTED TO STAY ANONYMOUS AND I COULDN'T SEE WHY THEY WOULD HAVE TAKEN THE RISK OF HAND DELIVERING IT, BUT IN THE END I WORKED IT OUT. THERE WAS A HIDDEN MESSAGE. I'LL LEAVE IT TO YOU TO FIGURE OUT WHERE IT WAS HIDDEN. ANYWAY I'VE ATTACHED THE MESSAGE I FOUND. I KNOW THAT RELATIONS WITH THREE OF THE FOUR POWERS ARE RELATIVELY STABLE, BUT I THINK WE NEED TO KEEP THIS TO OURSELVES FOR NOW. ALL THE BEST, \n",
+      "HARRY\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(caesar_decipher(c2a, key_a))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(21, -574.2402792119872)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = caesar_break(c2b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "if you really want to get in the middle of this you will have to pay i know you will be hunting me and i can forgive the arrogance but i will not forgive your ignorance before you can learn more about the rat lines from me you will have to ask your colleagues in french and british intelligence what they already know powerful forces are working to keep the rat lines running and we both need to know who our enemies are before we can meet you should understand that without me your investigations will gain little negotiations with me may gain everything\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(caesar_decipher(c2b, key_b)))))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2015/2015-challenge3.ipynb b/2015/2015-challenge3.ipynb
new file mode 100644 (file)
index 0000000..65deaa8
--- /dev/null
@@ -0,0 +1,141 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c3a = open('3a.ciphertext').read()\n",
+    "c3b = open('3b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((3, 5, True), -901.37737042341)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_m, key_a_a, key_a_o), score = affine_break(c3a)\n",
+    "(key_a_m, key_a_a, key_a_o), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "HARRY, THE PUZZLE OF THE STAMPED POSTCARD HAD ME FOOLED FOR A WHILE, BUT I THINK I FIGURED IT OUT. WAS THE MESSAGE ON THE BACK OF THE STAMP? I AM GUESSING YOU STEAMED IT OFF AND FOUND IT THERE. IT WAS A PRETTY INGENIOUS PLOY. MY MASTERS BACK IN WASHINGTON ARE INCREASINGLY WORRIED ABOUT OUR RELATIONSHIP WITH THE REST OF THE FOUR POWERS. FOLLOWING THE BREAKDOWN IN TRUST WITH THE SOVIETS THEY ARE COUNTING ON THE UK AND FRANCE AS ALLIES. IF THEY ARE GOING BEHIND OUR BACKS WITH THIS REICHSDOKTOR, THAT DOES NOT BODE WELL FOR FUTURE DIPLOMACY. DO YOU HAVE CONTACTS THERE YOU CAN EXPLOIT TO FIND OUT WHAT THEY ARE INTENDING? WE REALLY CANNOT AFFORD TO FALL OUT RIGHT NOW. THE ATTACHED MESSAGE IS ANOTHER INTERCEPT, THIS TIME FROM THE BRITISH EMBASSY WIRELESS. WHILE THINGS ARE DICEY I DON’T FEEL I CAN ASK THEM ABOUT IT, MAYBE YOU COULD CRACK IT FOR US. DOES IT MENTION THE RATLINES? BEST, CHARLIE\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(affine_decipher(c3a, multiplier=key_a_m, adder=key_a_a, one_based=key_a_o))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "((5, 7, True), -574.5522852453349)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_b_m, key_b_a, key_b_o), score = affine_break(c3b)\n",
+    "(key_b_m, key_b_a, key_b_o), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "eyes only rumours of a source in berlin with access to the rat lines source seems to go by name of reichs doktor russian intercepts suggest has been seen in vicinity of us embassy not clear how to make direct contact also not clear why our us friends are keeping this to themselves detailed info about rat i lines hard to obtain but high value could lead to arrest of major targets of nuremberg investigations vital we reach reichs doktor at earliest opportunity discreet enquiries in french and us sectors only request funds for further investigation\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(affine_decipher(c3b, multiplier=key_b_m, adder=key_b_a, one_based=key_b_o)))))"
+   ]
+  },
+  {
+   "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
+}
diff --git a/2015/2015-challenge4.ipynb b/2015/2015-challenge4.ipynb
new file mode 100644 (file)
index 0000000..f2a1c9d
--- /dev/null
@@ -0,0 +1,363 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c4a = open('4a.ciphertext').read()\n",
+    "c4b = open('4b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('reanimates', <KeywordWrapAlphabet.from_last: 2>), -911.6411317751041)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c4a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "gharlie, the attaghew note fas ledt in one od my weaw wrops last nibht anw appears to ce drom our mysterious sourge. it gontains tfo really sibnidigant pieges od intellibenge. the dirst is that the rieghswoktor mibht not reder to an inwiviwual adter all. it seems to ce the gowename dor the orbanization runninb the ratlines. aggorwinb to my other sourges this is a gollegtion od routes, abents anw sade houses usew to transport nazi sympathisers anw far griminals out od bermany anw on to south ameriga. fe have knofn that sugh an orbanisation exists singe the enw od the far, cut this is the dirst time i have seen it namew. the other piege od indormation is mugh more suctle. i am cebinninb to fonwer id our sourge is gloser to home than fe haw realisew. anw i am not rederrinb to drangois! see id you gan spot the tfo thinbs i notigew. cy the fay, fho transgricew the rawio intergept you sent me last feek? harry\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c4a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'a': 'c',\n",
+       " 'b': 'o',\n",
+       " 'c': 'p',\n",
+       " 'd': 'q',\n",
+       " 'e': 'b',\n",
+       " 'f': 'r',\n",
+       " 'g': 's',\n",
+       " 'h': 't',\n",
+       " 'i': 'e',\n",
+       " 'j': 'u',\n",
+       " 'k': 'v',\n",
+       " 'l': 'w',\n",
+       " 'm': 'f',\n",
+       " 'n': 'd',\n",
+       " 'o': 'x',\n",
+       " 'p': 'y',\n",
+       " 'q': 'z',\n",
+       " 'r': 'a',\n",
+       " 's': 'h',\n",
+       " 't': 'g',\n",
+       " 'u': 'i',\n",
+       " 'v': 'j',\n",
+       " 'w': 'k',\n",
+       " 'x': 'l',\n",
+       " 'y': 'm',\n",
+       " 'z': 'n'}"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans = ''.maketrans(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase)\n",
+    "t2 = {chr(c): chr(trans[c]) for c in trans}\n",
+    "t2"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('r', 'a'),\n",
+       " ('a', 'b'),\n",
+       " ('t', 'c'),\n",
+       " ('l', 'd'),\n",
+       " ('i', 'e'),\n",
+       " ('n', 'f'),\n",
+       " ('e', 'g'),\n",
+       " ('s', 'h'),\n",
+       " ('u', 'i'),\n",
+       " ('v', 'j'),\n",
+       " ('w', 'k'),\n",
+       " ('x', 'l'),\n",
+       " ('y', 'm'),\n",
+       " ('z', 'n'),\n",
+       " ('b', 'o'),\n",
+       " ('c', 'p'),\n",
+       " ('d', 'q'),\n",
+       " ('f', 'r'),\n",
+       " ('g', 's'),\n",
+       " ('h', 't'),\n",
+       " ('j', 'u'),\n",
+       " ('k', 'v'),\n",
+       " ('m', 'w'),\n",
+       " ('o', 'x'),\n",
+       " ('p', 'y'),\n",
+       " ('q', 'z')]"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "t2['t'] = 'c'\n",
+    "t2['a'] = 'b'\n",
+    "t2['e'] = 'g'\n",
+    "\n",
+    "t2['l'] = 'd'\n",
+    "t2['n'] = 'f'\n",
+    "t2['m'] = 'w'\n",
+    "\n",
+    "sorted(((c, t2[c]) for c in t2), key=lambda p: p[1])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charlie, the attached note was left in one of my dead drops last night and appears to be from our mysterious source. it contains two really significant pieces of intelligence. the first is that the riechsdoktor might not refer to an individual after all. it seems to be the codename for the organization running the ratlines. according to my other sources this is a collection of routes, agents and safe houses used to transport nazi sympathisers and war criminals out of germany and on to south america. we have known that such an organisation exists since the end of the war, but this is the first time i have seen it named. the other piece of information is much more subtle. i am beginning to wonder if our source is closer to home than we had realised. and i am not referring to francois! see if you can spot the two things i noticed. by the way, who transcribed the radio intercept you sent me last week? harry\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c4a, 'ratlines', wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('francois', <KeywordWrapAlphabet.from_last: 2>), -1082.7018217012803)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_b_word, key_b_wrap), score =keyword_break_mp(c4b)\n",
+    "(key_b_word, key_b_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "the french maybe your allies but they are not your friends they plan to infiltrate the rat i lines and to try to turn the high value targets for themselves they have a particular interest in nazi scientists from the die alchemist en project if you want to break the reichs doktor network before they can do so take care not to share any intelligence with them you have been warned i think it is time to begin negotiations i have a number in mind and i think once you know what i am offering you will find it very reasonable as a sign of good faith ioffer you the following information one of the local rat i line coordinators will be leaving the us sector tomorrow night in a black limousine under the backseat of his car you will find hidden a juniors s officer who is trying to escape and in the trunk you will find a number of papers relating to stolen artworks that he hopes to trade to the french for his freedom you might want to consider carefully whether you can trust your friend charlie with this information after all her husband francois is french\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(keyword_decipher(c4b, key_b_word, wrap_alphabet=key_b_wrap)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'reanimtsuvwxyzbcdfghjklopq'"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0 remniatsuvwxyzbcdfghjklopq -1262.9588058797406 hgfaoju, sgu fssfhgux qesu yft ouzs jq equ ez pc xufx xaemt ofts qjigs fqx fmmufat se ru zaep eva pctsuajevt tevahu. js heqsfjqt sye aufooc tjiqjzjhfqs mjuhut ez jqsuoojiuqhu. sgu zjats jt sgfs sgu ajuhgtxelsea pjigs qes auzua se fq jqxjwjxvfo fzsua foo. js tuupt se ru sgu hexuqfpu zea sgu eaifqjdfsjeq avqqjqi sgu afsojqut. fhheaxjqi se pc esgua tevahut sgjt jt f heoouhsjeq ez aevsut, fiuqst fqx tfzu gevtut vtux se safqtmeas qfdj tcpmfsgjtuat fqx yfa hajpjqfot evs ez iuapfqc fqx eq se tevsg fpuajhf. yu gfwu lqeyq sgfs tvhg fq eaifqjtfsjeq ubjtst tjqhu sgu uqx ez sgu yfa, rvs sgjt jt sgu zjats sjpu j gfwu tuuq js qfpux. sgu esgua mjuhu ez jqzeapfsjeq jt pvhg peau tvrsou. j fp ruijqqjqi se yeqxua jz eva tevahu jt hoetua se gepu sgfq yu gfx aufojtux. fqx j fp qes auzuaajqi se zafqhejt! tuu jz cev hfq tmes sgu sye sgjqit j qesjhux. rc sgu yfc, yge safqthajrux sgu afxje jqsuahums cev tuqs pu ofts yuul? gfaac\n",
+      "\n",
+      "1 remniatsuvwxyzbcdfghokljpq -1178.441293417976 hgfajou, sgu fssfhgux qesu yft juzs oq equ ez pc xufx xaemt jfts qoigs fqx fmmufat se ru zaep eva pctsuaoevt tevahu. os heqsfoqt sye aufjjc toiqozohfqs mouhut ez oqsujjoiuqhu. sgu zoats ot sgfs sgu aouhgtxelsea poigs qes auzua se fq oqxowoxvfj fzsua fjj. os tuupt se ru sgu hexuqfpu zea sgu eaifqodfsoeq avqqoqi sgu afsjoqut. fhheaxoqi se pc esgua tevahut sgot ot f hejjuhsoeq ez aevsut, fiuqst fqx tfzu gevtut vtux se safqtmeas qfdo tcpmfsgotuat fqx yfa haopoqfjt evs ez iuapfqc fqx eq se tevsg fpuaohf. yu gfwu lqeyq sgfs tvhg fq eaifqotfsoeq ubotst toqhu sgu uqx ez sgu yfa, rvs sgot ot sgu zoats sopu o gfwu tuuq os qfpux. sgu esgua mouhu ez oqzeapfsoeq ot pvhg peau tvrsju. o fp ruioqqoqi se yeqxua oz eva tevahu ot hjetua se gepu sgfq yu gfx aufjotux. fqx o fp qes auzuaaoqi se zafqheot! tuu oz cev hfq tmes sgu sye sgoqit o qesohux. rc sgu yfc, yge safqthaorux sgu afxoe oqsuahums cev tuqs pu jfts yuul? gfaac\n",
+      "\n",
+      "2 cemniatsuvwxyzbrdfghokljpq -1176.749704780956 hgfajou, sgu fssfhgux qesu yft juzs oq equ ez pr xufx xaemt jfts qoigs fqx fmmufat se cu zaep eva prtsuaoevt tevahu. os heqsfoqt sye aufjjr toiqozohfqs mouhut ez oqsujjoiuqhu. sgu zoats ot sgfs sgu aouhgtxelsea poigs qes auzua se fq oqxowoxvfj fzsua fjj. os tuupt se cu sgu hexuqfpu zea sgu eaifqodfsoeq avqqoqi sgu afsjoqut. fhheaxoqi se pr esgua tevahut sgot ot f hejjuhsoeq ez aevsut, fiuqst fqx tfzu gevtut vtux se safqtmeas qfdo trpmfsgotuat fqx yfa haopoqfjt evs ez iuapfqr fqx eq se tevsg fpuaohf. yu gfwu lqeyq sgfs tvhg fq eaifqotfsoeq ubotst toqhu sgu uqx ez sgu yfa, cvs sgot ot sgu zoats sopu o gfwu tuuq os qfpux. sgu esgua mouhu ez oqzeapfsoeq ot pvhg peau tvcsju. o fp cuioqqoqi se yeqxua oz eva tevahu ot hjetua se gepu sgfq yu gfx aufjotux. fqx o fp qes auzuaaoqi se zafqheot! tuu oz rev hfq tmes sgu sye sgoqit o qesohux. cr sgu yfr, yge safqthaocux sgu afxoe oqsuahums rev tuqs pu jfts yuul? gfaar\n",
+      "\n",
+      "3 vemniatsucwxyzbrdfghokljpq -1172.734320973362 hgfajou, sgu fssfhgux qesu yft juzs oq equ ez pr xufx xaemt jfts qoigs fqx fmmufat se vu zaep eca prtsuaoect tecahu. os heqsfoqt sye aufjjr toiqozohfqs mouhut ez oqsujjoiuqhu. sgu zoats ot sgfs sgu aouhgtxelsea poigs qes auzua se fq oqxowoxcfj fzsua fjj. os tuupt se vu sgu hexuqfpu zea sgu eaifqodfsoeq acqqoqi sgu afsjoqut. fhheaxoqi se pr esgua tecahut sgot ot f hejjuhsoeq ez aecsut, fiuqst fqx tfzu gectut ctux se safqtmeas qfdo trpmfsgotuat fqx yfa haopoqfjt ecs ez iuapfqr fqx eq se tecsg fpuaohf. yu gfwu lqeyq sgfs tchg fq eaifqotfsoeq ubotst toqhu sgu uqx ez sgu yfa, vcs sgot ot sgu zoats sopu o gfwu tuuq os qfpux. sgu esgua mouhu ez oqzeapfsoeq ot pchg peau tcvsju. o fp vuioqqoqi se yeqxua oz eca tecahu ot hjetua se gepu sgfq yu gfx aufjotux. fqx o fp qes auzuaaoqi se zafqheot! tuu oz rec hfq tmes sgu sye sgoqit o qesohux. vr sgu yfr, yge safqthaovux sgu afxoe oqsuahums rec tuqs pu jfts yuul? gfaar\n",
+      "\n",
+      "10 vfmniatsulxpyzcrdbgqokejwh -1138.6987012040154 qgbajou, sgu bssbqgup hfsu ybt juzs oh fhu fz wr pubp pafmt jbts hoigs bhp bmmubat sf vu zafw fla wrtsuaoflt tflaqu. os qfhsboht syf aubjjr toihozoqbhs mouqut fz ohsujjoiuhqu. sgu zoats ot sgbs sgu aouqgtpfesfa woigs hfs auzua sf bh ohpoxoplbj bzsua bjj. os tuuwt sf vu sgu qfpuhbwu zfa sgu faibhodbsofh alhhohi sgu absjohut. bqqfapohi sf wr fsgua tflaqut sgot ot b qfjjuqsofh fz aflsut, biuhst bhp tbzu gfltut ltup sf sabhtmfas hbdo trwmbsgotuat bhp yba qaowohbjt fls fz iuawbhr bhp fh sf tflsg bwuaoqb. yu gbxu ehfyh sgbs tlqg bh faibhotbsofh ucotst tohqu sgu uhp fz sgu yba, vls sgot ot sgu zoats sowu o gbxu tuuh os hbwup. sgu fsgua mouqu fz ohzfawbsofh ot wlqg wfau tlvsju. o bw vuiohhohi sf yfhpua oz fla tflaqu ot qjftua sf gfwu sgbh yu gbp aubjotup. bhp o bw hfs auzuaaohi sf zabhqfot! tuu oz rfl qbh tmfs sgu syf sgohit o hfsoqup. vr sgu ybr, ygf sabhtqaovup sgu abpof ohsuaqums rfl tuhs wu jbts yuue? gbaar\n",
+      "\n",
+      "20 vfyniadsgkxpwzmcqhutolejrb -1125.2537605606442 tuhajog, sug hsshtugp bfsg whd jgzs ob fbg fz rc pghp pafyd jhds boius hbp hyyghad sf vg zafr fka rcdsgaofkd dfkatg. os tfbshobd swf aghjjc doibozothbs yogtgd fz obsgjjoigbtg. sug zoads od suhs sug aogtudpfesfa roius bfs agzga sf hb obpoxopkhj hzsga hjj. os dggrd sf vg sug tfpgbhrg zfa sug faihboqhsofb akbbobi sug ahsjobgd. httfapobi sf rc fsuga dfkatgd suod od h tfjjgtsofb fz afksgd, higbsd hbp dhzg ufkdgd kdgp sf sahbdyfas bhqo dcryhsuodgad hbp wha taorobhjd fks fz igarhbc hbp fb sf dfksu hrgaoth. wg uhxg ebfwb suhs dktu hb faihbodhsofb gmodsd dobtg sug gbp fz sug wha, vks suod od sug zoads sorg o uhxg dggb os bhrgp. sug fsuga yogtg fz obzfarhsofb od rktu rfag dkvsjg. o hr vgiobbobi sf wfbpga oz fka dfkatg od tjfdga sf ufrg suhb wg uhp aghjodgp. hbp o hr bfs agzgaaobi sf zahbtfod! dgg oz cfk thb dyfs sug swf suobid o bfsotgp. vc sug whc, wuf sahbdtaovgp sug ahpof obsgatgys cfk dgbs rg jhds wgge? uhaac\n",
+      "\n",
+      "41 cfjowbdsexuikqmryngtalpzhv -1124.2920779257197 tgnbzae, sge nssntgei vfse knd zeqs av fve fq hr ieni ibfjd znds vawgs nvi njjenbd sf ce qbfh fxb hrdsebafxd dfxbte. as tfvsnavd skf benzzr dawvaqatnvs jaeted fq avsezzawevte. sge qabds ad sgns sge baetgdifpsfb hawgs vfs beqeb sf nv aviauaixnz nqseb nzz. as deehd sf ce sge tfievnhe qfb sge fbwnvaynsafv bxvvavw sge bnszaved. nttfbiavw sf hr fsgeb dfxbted sgad ad n tfzzetsafv fq bfxsed, nwevsd nvi dnqe gfxded xdei sf sbnvdjfbs vnya drhjnsgadebd nvi knb tbahavnzd fxs fq webhnvr nvi fv sf dfxsg nhebatn. ke gnue pvfkv sgns dxtg nv fbwnvadnsafv emadsd davte sge evi fq sge knb, cxs sgad ad sge qabds sahe a gnue deev as vnhei. sge fsgeb jaete fq avqfbhnsafv ad hxtg hfbe dxcsze. a nh cewavvavw sf kfvieb aq fxb dfxbte ad tzfdeb sf gfhe sgnv ke gni benzadei. nvi a nh vfs beqebbavw sf qbnvtfad! dee aq rfx tnv djfs sge skf sgavwd a vfsatei. cr sge knr, kgf sbnvdtbacei sge bniaf avsebtejs rfx devs he znds keep? gnbbr\n",
+      "\n",
+      "42 cfjzwbdsexuikqmryngtalpohv -1085.6036078813306 tgnboae, sge nssntgei vfse knd oeqs av fve fq hr ieni ibfjd onds vawgs nvi njjenbd sf ce qbfh fxb hrdsebafxd dfxbte. as tfvsnavd skf benoor dawvaqatnvs jaeted fq avseooawevte. sge qabds ad sgns sge baetgdifpsfb hawgs vfs beqeb sf nv aviauaixno nqseb noo. as deehd sf ce sge tfievnhe qfb sge fbwnvaynsafv bxvvavw sge bnsoaved. nttfbiavw sf hr fsgeb dfxbted sgad ad n tfooetsafv fq bfxsed, nwevsd nvi dnqe gfxded xdei sf sbnvdjfbs vnya drhjnsgadebd nvi knb tbahavnod fxs fq webhnvr nvi fv sf dfxsg nhebatn. ke gnue pvfkv sgns dxtg nv fbwnvadnsafv emadsd davte sge evi fq sge knb, cxs sgad ad sge qabds sahe a gnue deev as vnhei. sge fsgeb jaete fq avqfbhnsafv ad hxtg hfbe dxcsoe. a nh cewavvavw sf kfvieb aq fxb dfxbte ad tofdeb sf gfhe sgnv ke gni benoadei. nvi a nh vfs beqebbavw sf qbnvtfad! dee aq rfx tnv djfs sge skf sgavwd a vfsatei. cr sge knr, kgf sbnvdtbacei sge bniaf avsebtejs rfx devs he onds keep? gnbbr\n",
+      "\n",
+      "45 bvjzycdsexuikqmrwngtalpohf -1079.7756157738888 tgncoae, sge nssntgei fvse knd oeqs af vfe vq hr ieni icvjd onds faygs nfi njjencd sv be qcvh vxc hrdsecavxd dvxcte. as tvfsnafd skv cenoor dayfaqatnfs jaeted vq afseooayefte. sge qacds ad sgns sge caetgdivpsvc haygs fvs ceqec sv nf afiauaixno nqsec noo. as deehd sv be sge tviefnhe qvc sge vcynfawnsavf cxffafy sge cnsoafed. nttvciafy sv hr vsgec dvxcted sgad ad n tvooetsavf vq cvxsed, nyefsd nfi dnqe gvxded xdei sv scnfdjvcs fnwa drhjnsgadecd nfi knc tcahafnod vxs vq yechnfr nfi vf sv dvxsg nhecatn. ke gnue pfvkf sgns dxtg nf vcynfadnsavf emadsd dafte sge efi vq sge knc, bxs sgad ad sge qacds sahe a gnue deef as fnhei. sge vsgec jaete vq afqvchnsavf ad hxtg hvce dxbsoe. a nh beyaffafy sv kvfiec aq vxc dvxcte ad tovdec sv gvhe sgnf ke gni cenoadei. nfi a nh fvs ceqeccafy sv qcnftvad! dee aq rvx tnf djvs sge skv sgafyd a fvsatei. br sge knr, kgv scnfdtcabei sge cniav afsectejs rvx defs he onds keep? gnccr\n",
+      "\n",
+      "47 bvjzycdtexpikqmrwngsaluohf -1072.6883675689066 sgncoae, tge nttnsgei fvte knd oeqt af vfe vq hr ieni icvjd ondt faygt nfi njjencd tv be qcvh vxc hrdtecavxd dvxcse. at svftnafd tkv cenoor dayfaqasnft jaesed vq afteooayefse. tge qacdt ad tgnt tge caesgdivutvc haygt fvt ceqec tv nf afiapaixno nqtec noo. at deehd tv be tge sviefnhe qvc tge vcynfawntavf cxffafy tge cntoafed. nssvciafy tv hr vtgec dvxcsed tgad ad n svooestavf vq cvxted, nyeftd nfi dnqe gvxded xdei tv tcnfdjvct fnwa drhjntgadecd nfi knc scahafnod vxt vq yechnfr nfi vf tv dvxtg nhecasn. ke gnpe ufvkf tgnt dxsg nf vcynfadntavf emadtd dafse tge efi vq tge knc, bxt tgad ad tge qacdt tahe a gnpe deef at fnhei. tge vtgec jaese vq afqvchntavf ad hxsg hvce dxbtoe. a nh beyaffafy tv kvfiec aq vxc dvxcse ad sovdec tv gvhe tgnf ke gni cenoadei. nfi a nh fvt ceqeccafy tv qcnfsvad! dee aq rvx snf djvt tge tkv tgafyd a fvtasei. br tge knr, kgv tcnfdscabei tge cniav aftecsejt rvx deft he ondt keeu? gnccr\n",
+      "\n",
+      "50 brjzkcdtespiyqmvwngxaluohf -1048.0345619644993 xgncoae, tge nttnxgei frte ynd oeqt af rfe rq hv ieni icrjd ondt fakgt nfi njjencd tr be qcrh rsc hvdtecarsd drscxe. at xrftnafd tyr cenoov dakfaqaxnft jaexed rq afteooakefxe. tge qacdt ad tgnt tge caexgdirutrc hakgt frt ceqec tr nf afiapaisno nqtec noo. at deehd tr be tge xriefnhe qrc tge rcknfawntarf csffafk tge cntoafed. nxxrciafk tr hv rtgec drscxed tgad ad n xrooextarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnwa dvhjntgadecd nfi ync xcahafnod rst rq kechnfv nfi rf tr drstg nhecaxn. ye gnpe ufryf tgnt dsxg nf rcknfadntarf emadtd dafxe tge efi rq tge ync, bst tgad ad tge qacdt tahe a gnpe deef at fnhei. tge rtgec jaexe rq afqrchntarf ad hsxg hrce dsbtoe. a nh bekaffafk tr yrfiec aq rsc drscxe ad xordec tr grhe tgnf ye gni cenoadei. nfi a nh frt ceqeccafk tr qcnfxrad! dee aq vrs xnf djrt tge tyr tgafkd a frtaxei. bv tge ynv, ygr tcnfdxcabei tge cniar aftecxejt vrs deft he ondt yeeu? gnccv\n",
+      "\n",
+      "52 vrjzkcdtespiyqmbwngxaluohf -1047.4217167696756 xgncoae, tge nttnxgei frte ynd oeqt af rfe rq hb ieni icrjd ondt fakgt nfi njjencd tr ve qcrh rsc hbdtecarsd drscxe. at xrftnafd tyr cenoob dakfaqaxnft jaexed rq afteooakefxe. tge qacdt ad tgnt tge caexgdirutrc hakgt frt ceqec tr nf afiapaisno nqtec noo. at deehd tr ve tge xriefnhe qrc tge rcknfawntarf csffafk tge cntoafed. nxxrciafk tr hb rtgec drscxed tgad ad n xrooextarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnwa dbhjntgadecd nfi ync xcahafnod rst rq kechnfb nfi rf tr drstg nhecaxn. ye gnpe ufryf tgnt dsxg nf rcknfadntarf emadtd dafxe tge efi rq tge ync, vst tgad ad tge qacdt tahe a gnpe deef at fnhei. tge rtgec jaexe rq afqrchntarf ad hsxg hrce dsvtoe. a nh vekaffafk tr yrfiec aq rsc drscxe ad xordec tr grhe tgnf ye gni cenoadei. nfi a nh frt ceqeccafk tr qcnfxrad! dee aq brs xnf djrt tge tyr tgafkd a frtaxei. vb tge ynb, ygr tcnfdxcavei tge cniar aftecxejt brs deft he ondt yeeu? gnccb\n",
+      "\n",
+      "53 vrjzkcdtespiyqwbmngxaluohf -1047.3736493946644 xgncoae, tge nttnxgei frte ynd oeqt af rfe rq hb ieni icrjd ondt fakgt nfi njjencd tr ve qcrh rsc hbdtecarsd drscxe. at xrftnafd tyr cenoob dakfaqaxnft jaexed rq afteooakefxe. tge qacdt ad tgnt tge caexgdirutrc hakgt frt ceqec tr nf afiapaisno nqtec noo. at deehd tr ve tge xriefnhe qrc tge rcknfamntarf csffafk tge cntoafed. nxxrciafk tr hb rtgec drscxed tgad ad n xrooextarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnma dbhjntgadecd nfi ync xcahafnod rst rq kechnfb nfi rf tr drstg nhecaxn. ye gnpe ufryf tgnt dsxg nf rcknfadntarf ewadtd dafxe tge efi rq tge ync, vst tgad ad tge qacdt tahe a gnpe deef at fnhei. tge rtgec jaexe rq afqrchntarf ad hsxg hrce dsvtoe. a nh vekaffafk tr yrfiec aq rsc drscxe ad xordec tr grhe tgnf ye gni cenoadei. nfi a nh frt ceqeccafk tr qcnfxrad! dee aq brs xnf djrt tge tyr tgafkd a frtaxei. vb tge ynb, ygr tcnfdxcavei tge cniar aftecxejt brs deft he ondt yeeu? gnccb\n",
+      "\n",
+      "56 zrjvkcdtespihqwbmngualxoyf -1026.091865606169 ugncoae, tge nttnugei frte hnd oeqt af rfe rq yb ieni icrjd ondt fakgt nfi njjencd tr ze qcry rsc ybdtecarsd drscue. at urftnafd thr cenoob dakfaqaunft jaeued rq afteooakefue. tge qacdt ad tgnt tge caeugdirxtrc yakgt frt ceqec tr nf afiapaisno nqtec noo. at deeyd tr ze tge uriefnye qrc tge rcknfamntarf csffafk tge cntoafed. nuurciafk tr yb rtgec drscued tgad ad n urooeutarf rq crsted, nkeftd nfi dnqe grsded sdei tr tcnfdjrct fnma dbyjntgadecd nfi hnc ucayafnod rst rq kecynfb nfi rf tr drstg nyecaun. he gnpe xfrhf tgnt dsug nf rcknfadntarf ewadtd dafue tge efi rq tge hnc, zst tgad ad tge qacdt taye a gnpe deef at fnyei. tge rtgec jaeue rq afqrcyntarf ad ysug yrce dsztoe. a ny zekaffafk tr hrfiec aq rsc drscue ad uordec tr grye tgnf he gni cenoadei. nfi a ny frt ceqeccafk tr qcnfurad! dee aq brs unf djrt tge thr tgafkd a frtauei. zb tge hnb, hgr tcnfducazei tge cniar aftecuejt brs deft ye ondt heex? gnccb\n",
+      "\n",
+      "59 zrjvkcatedpihqwbxnguslmoyf -1019.2155510698342 ugncose, tge nttnugei frte hna oeqt sf rfe rq yb ieni icrja onat fskgt nfi njjenca tr ze qcry rdc ybatecsrda ardcue. st urftnsfa thr cenoob askfsqsunft jseuea rq sfteooskefue. tge qscat sa tgnt tge cseugairmtrc yskgt frt ceqec tr nf sfispsidno nqtec noo. st aeeya tr ze tge uriefnye qrc tge rcknfsxntsrf cdffsfk tge cntosfea. nuurcisfk tr yb rtgec ardcuea tgsa sa n urooeutsrf rq crdtea, nkefta nfi anqe grdaea daei tr tcnfajrct fnxs abyjntgsaeca nfi hnc ucsysfnoa rdt rq kecynfb nfi rf tr ardtg nyecsun. he gnpe mfrhf tgnt adug nf rcknfsantsrf ewsata asfue tge efi rq tge hnc, zdt tgsa sa tge qscat tsye s gnpe aeef st fnyei. tge rtgec jseue rq sfqrcyntsrf sa ydug yrce adztoe. s ny zeksffsfk tr hrfiec sq rdc ardcue sa uoraec tr grye tgnf he gni cenosaei. nfi s ny frt ceqeccsfk tr qcnfursa! aee sq brd unf ajrt tge thr tgsfka s frtsuei. zb tge hnb, hgr tcnfaucszei tge cnisr sftecuejt brd aeft ye onat heem? gnccb\n",
+      "\n",
+      "63 zelvkcatrdpmhjwbxngusqioyf -1017.7604294276406 ugncosr, tgr nttnugrm fetr hna orjt sf efr ej yb mrnm mcela onat fskgt nfm nllrnca te zr jcey edc ybatrcseda aedcur. st ueftnsfa the crnoob askfsjsunft lsrura ej sftrooskrfur. tgr jscat sa tgnt tgr csrugameitec yskgt fet crjrc te nf sfmspsmdno njtrc noo. st arrya te zr tgr uemrfnyr jec tgr ecknfsxntsef cdffsfk tgr cntosfra. nuuecmsfk te yb etgrc aedcura tgsa sa n ueoorutsef ej cedtra, nkrfta nfm anjr gedara darm te tcnfalect fnxs abylntgsarca nfm hnc ucsysfnoa edt ej krcynfb nfm ef te aedtg nyrcsun. hr gnpr ifehf tgnt adug nf ecknfsantsef rwsata asfur tgr rfm ej tgr hnc, zdt tgsa sa tgr jscat tsyr s gnpr arrf st fnyrm. tgr etgrc lsrur ej sfjecyntsef sa ydug yecr adztor. s ny zrksffsfk te hefmrc sj edc aedcur sa uoearc te geyr tgnf hr gnm crnosarm. nfm s ny fet crjrccsfk te jcnfuesa! arr sj bed unf alet tgr the tgsfka s fetsurm. zb tgr hnb, hge tcnfaucszrm tgr cnmse sftrcurlt bed arft yr onat hrri? gnccb\n",
+      "\n",
+      "401 ytmpcnrhakvslzdfqigeoxwbju -1014.7565957992581 eginboa, hga ihhiegas utha lir bazh ou tua tz jf sais sntmr birh uocgh ius immainr ht ya zntj tkn jfrhanotkr rtknea. oh etuhiour hlt naibbf rocuozoeiuh moaear tz ouhabbocauea. hga zonrh or hgih hga noaegrstwhtn jocgh uth nazan ht iu ousovoskib izhan ibb. oh raajr ht ya hga etsauija ztn hga tnciuoqihotu nkuuouc hga nihbouar. ieetnsouc ht jf thgan rtknear hgor or i etbbaehotu tz ntkhar, icauhr ius riza gtkrar kras ht hniurmtnh uiqo rfjmihgoranr ius lin enojouibr tkh tz canjiuf ius tu ht rtkhg ijanoei. la giva wutlu hgih rkeg iu tnciuorihotu adorhr rouea hga aus tz hga lin, ykh hgor or hga zonrh hoja o giva raau oh uijas. hga thgan moaea tz ouztnjihotu or jkeg jtna rkyhba. o ij yacouuouc ht ltusan oz tkn rtknea or ebtran ht gtja hgiu la gis naiboras. ius o ij uth nazannouc ht zniuetor! raa oz ftk eiu rmth hga hlt hgoucr o uthoeas. yf hga lif, lgt hniurenoyas hga nisot ouhaneamh ftk rauh ja birh laaw? ginnf\n",
+      "\n",
+      "11879 jtlqogfshdxnbrcwzeamupkvyi -991.2276834904978 maegvuh, sah essemahn itsh bef vhrs ui tih tr yw nhen ngtlf vefs iuoas ein ellhegf st jh rgty tdg ywfshgutdf ftdgmh. us mtiseuif sbt ghevvw fuoiurumeis luhmhf tr uishvvuohimh. sah rugfs uf saes sah guhmafntkstg yuoas its ghrhg st ei uinuxundev ershg evv. us fhhyf st jh sah mtnhieyh rtg sah tgoeiuzesuti gdiiuio sah gesvuihf. emmtgnuio st yw tsahg ftdgmhf sauf uf e mtvvhmsuti tr gtdshf, eohisf ein ferh atdfhf dfhn st sgeifltgs iezu fwylesaufhgf ein beg mguyuievf tds tr ohgyeiw ein ti st ftdsa eyhgume. bh aexh kitbi saes fdma ei tgoeiufesuti hcufsf fuimh sah hin tr sah beg, jds sauf uf sah rugfs suyh u aexh fhhi us ieyhn. sah tsahg luhmh tr uirtgyesuti uf ydma ytgh fdjsvh. u ey jhouiiuio st btinhg ur tdg ftdgmh uf mvtfhg st atyh saei bh aen ghevufhn. ein u ey its ghrhgguio st rgeimtuf! fhh ur wtd mei flts sah sbt sauiof u itsumhn. jw sah bew, bat sgeifmgujhn sah genut uishgmhls wtd fhis yh vefs bhhk? aeggw\n",
+      "\n",
+      "11882 jtlqigfshdknbrcmzeawupxvyo -988.5494150402712 waegvuh, sah essewahn otsh bef vhrs uo toh tr ym nhen ngtlf vefs ouias eon ellhegf st jh rgty tdg ymfshgutdf ftdgwh. us wtoseuof sbt ghevvm fuiouruweos luhwhf tr uoshvvuihowh. sah rugfs uf saes sah guhwafntxstg yuias ots ghrhg st eo uonukundev ershg evv. us fhhyf st jh sah wtnhoeyh rtg sah tgieouzesuto gdoouoi sah gesvuohf. ewwtgnuoi st ym tsahg ftdgwhf sauf uf e wtvvhwsuto tr gtdshf, eihosf eon ferh atdfhf dfhn st sgeofltgs oezu fmylesaufhgf eon beg wguyuoevf tds tr ihgyeom eon to st ftdsa eyhguwe. bh aekh xotbo saes fdwa eo tgieoufesuto hcufsf fuowh sah hon tr sah beg, jds sauf uf sah rugfs suyh u aekh fhho us oeyhn. sah tsahg luhwh tr uortgyesuto uf ydwa ytgh fdjsvh. u ey jhiuoouoi st btonhg ur tdg ftdgwh uf wvtfhg st atyh saeo bh aen ghevufhn. eon u ey ots ghrhgguoi st rgeowtuf! fhh ur mtd weo flts sah sbt sauoif u otsuwhn. jm sah bem, bat sgeofwgujhn sah genut uoshgwhls mtd fhos yh vefs bhhx? aeggm\n",
+      "\n",
+      "38275 ylupsroeakjbiwgxzdmchqftvn -978.2449056535245 cmdrtha, ema deedcmab nlea ido tawe hn lna lw vx badb brluo tdoe nhsme dnb duuadro el ya wrlv lkr vxoearhlko olkrca. he clnedhno eil radttx ohsnhwhcdne uhacao lw hneatthsanca. ema whroe ho emde ema rhacmoblfelr vhsme nle rawar el dn hnbhjhbkdt dwear dtt. he oaavo el ya ema clbandva wlr ema lrsdnhzdehln rknnhns ema rdethnao. dcclrbhns el vx lemar olkrcao emho ho d clttacehln lw rlkeao, dsaneo dnb odwa mlkoao koab el erdnoulre ndzh oxvudemhoaro dnb idr crhvhndto lke lw sarvdnx dnb ln el olkem dvarhcd. ia mdja fnlin emde okcm dn lrsdnhodehln aghoeo ohnca ema anb lw ema idr, yke emho ho ema whroe ehva h mdja oaan he ndvab. ema lemar uhaca lw hnwlrvdehln ho vkcm vlra okyeta. h dv yashnnhns el ilnbar hw lkr olkrca ho ctloar el mlva emdn ia mdb radthoab. dnb h dv nle rawarrhns el wrdnclho! oaa hw xlk cdn oule ema eil emhnso h nlehcab. yx ema idx, iml erdnocrhyab ema rdbhl hnearcaue xlk oane va tdoe iaaf? mdrrx\n",
+      "\n",
+      "38276 yluvsroeakjbiwgxzdmchqftpn -974.4830434072574 cmdrtha, ema deedcmab nlea ido tawe hn lna lw px badb brluo tdoe nhsme dnb duuadro el ya wrlp lkr pxoearhlko olkrca. he clnedhno eil radttx ohsnhwhcdne uhacao lw hneatthsanca. ema whroe ho emde ema rhacmoblfelr phsme nle rawar el dn hnbhjhbkdt dwear dtt. he oaapo el ya ema clbandpa wlr ema lrsdnhzdehln rknnhns ema rdethnao. dcclrbhns el px lemar olkrcao emho ho d clttacehln lw rlkeao, dsaneo dnb odwa mlkoao koab el erdnoulre ndzh oxpudemhoaro dnb idr crhphndto lke lw sarpdnx dnb ln el olkem dparhcd. ia mdja fnlin emde okcm dn lrsdnhodehln aghoeo ohnca ema anb lw ema idr, yke emho ho ema whroe ehpa h mdja oaan he ndpab. ema lemar uhaca lw hnwlrpdehln ho pkcm plra okyeta. h dp yashnnhns el ilnbar hw lkr olkrca ho ctloar el mlpa emdn ia mdb radthoab. dnb h dp nle rawarrhns el wrdnclho! oaa hw xlk cdn oule ema eil emhnso h nlehcab. yx ema idx, iml erdnocrhyab ema rdbhl hnearcaue xlk oane pa tdoe iaaf? mdrrx\n",
+      "\n",
+      "78883 beuzxnalopgyivqkwtrchjfmds -957.1987270553409 crtnmho, lro tlltcroy selo ita movl hs eso ev dk yoty yneua mtal shxrl tsy tuuotna le bo vned epn dkalonhepa aepnco. hl ceslthsa lie notmmk ahxshvhctsl uhocoa ev hslommhxosco. lro vhnal ha lrtl lro nhocrayeflen dhxrl sel novon le ts hsyhghyptm tvlon tmm. hl aooda le bo lro ceyostdo ven lro enxtshwtlhes npsshsx lro ntlmhsoa. tccenyhsx le dk elron aepncoa lrha ha t cemmoclhes ev neploa, txosla tsy atvo repaoa paoy le lntsauenl stwh akdutlrhaona tsy itn cnhdhstma epl ev xondtsk tsy es le aeplr tdonhct. io rtgo fseis lrtl apcr ts enxtshatlhes oqhala ahsco lro osy ev lro itn, bpl lrha ha lro vhnal lhdo h rtgo aoos hl stdoy. lro elron uhoco ev hsvendtlhes ha dpcr deno apblmo. h td boxhsshsx le iesyon hv epn aepnco ha cmeaon le redo lrts io rty notmhaoy. tsy h td sel novonnhsx le vntsceha! aoo hv kep cts auel lro lie lrhsxa h selhcoy. bk lro itk, ire lntsacnhboy lro ntyhe hsloncoul kep aosl do mtal ioof? rtnnk\n",
+      "\n",
+      "465709 dojzgtrasuqvmlypbeifhxkwcn -941.3015373634643 fietwhs, ais eaaefisv noas mer wsla hn ons ol cp vsev vtojr wera nhgia env ejjsetr ao ds ltoc out cprasthour routfs. ha fonaehnr amo tsewwp rhgnhlhfena jhsfsr ol hnaswwhgsnfs. ais lhtra hr aiea ais thsfirvokaot chgia noa tslst ao en hnvhqhvuew elast eww. ha rsscr ao ds ais fovsnecs lot ais otgenhbeahon tunnhng ais teawhnsr. effotvhng ao cp oaist routfsr aihr hr e fowwsfahon ol touasr, egsnar env rels ioursr ursv ao atenrjota nebh rpcjeaihrstr env met fthchnewr oua ol gstcenp env on ao rouai ecsthfe. ms ieqs knomn aiea rufi en otgenhreahon syhrar rhnfs ais snv ol ais met, dua aihr hr ais lhtra ahcs h ieqs rssn ha necsv. ais oaist jhsfs ol hnlotceahon hr cufi cots rudaws. h ec dsghnnhng ao monvst hl out routfs hr fworst ao iocs aien ms iev tsewhrsv. env h ec noa tslstthng ao ltenfohr! rss hl pou fen rjoa ais amo aihngr h noahfsv. dp ais mep, mio atenrfthdsv ais tevho hnastfsja pou rsna cs wera mssk? iettp\n",
+      "\n",
+      "1750157 qhyxutaieljkvwzdmsofrpbgcn -941.2815644870221 fostgre, ioe siisfoek nhie vsa gewi rn hne hw cd kesk kthya gsai nruoi snk syyesta ih qe wthc hlt cdaietrhla ahltfe. ri fhnisrna ivh tesggd arunrwrfsni yrefea hw rnieggruenfe. ioe wrtai ra iosi ioe trefoakhbiht cruoi nhi tewet ih sn rnkrjrklsg swiet sgg. ri aeeca ih qe ioe fhkensce wht ioe htusnrmsirhn tlnnrnu ioe tsigrnea. sffhtkrnu ih cd hioet ahltfea iora ra s fhggefirhn hw thliea, suenia snk aswe ohlaea laek ih itsnayhti nsmr adcysioraeta snk vst ftrcrnsga hli hw uetcsnd snk hn ih ahlio scetrfs. ve osje bnhvn iosi alfo sn htusnrasirhn ezraia arnfe ioe enk hw ioe vst, qli iora ra ioe wrtai irce r osje aeen ri nscek. ioe hioet yrefe hw rnwhtcsirhn ra clfo chte alqige. r sc qeurnnrnu ih vhnket rw hlt ahltfe ra fghaet ih ohce iosn ve osk tesgraek. snk r sc nhi tewettrnu ih wtsnfhra! aee rw dhl fsn ayhi ioe ivh iornua r nhirfek. qd ioe vsd, voh itsnaftrqek ioe tskrh rnietfeyi dhl aeni ce gsai veeb? osttd\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "('qhyxutaieljkvwzdmsofrpbgcn', -941.2815644870221)"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "monoalphabetic_break_hillclimbing(c4a, alphabet=keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "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
+}
diff --git a/2015/2015-challenge5.ipynb b/2015/2015-challenge5.ipynb
new file mode 100644 (file)
index 0000000..7b963ff
--- /dev/null
@@ -0,0 +1,149 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c5a = open('5a.ciphertext').read()\n",
+    "c5b = open('5b.ciphertext').read()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('cornfield', <KeywordWrapAlphabet.from_largest: 3>), -1557.5551917175146)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c5a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry, i checked out who transcribed the radio transmission like you asked. it was a junior cipher clerk in room 5. i would have offered to set up a meeting with her, but she has disappeared and hasn’t been seen since last friday. the marines saw her leave at her usual time, and she was booked out for some leave on monday and tuesday so no one noticed she was missing until today. we sent an officer out to her usual haunts and i will get back to you if we find anything. what made you ask? did you have a reason to believe she was involved in something? \n",
+      "\n",
+      "i took another look at the messages. were you referring to the typos? the word ratlines keeps being spelt as ratilines. is that important? what did you mean about our source being close to home? \n",
+      "\n",
+      "also did some digging about the reichsdoktor. seems you were right and it refers to an underground nazi organisation dedicated to rebuilding the reich. maybe they think of it as healing? a bunch of rich nazi sympathisers took over the ratlines from a group of ss officers who set them up at the tail of the war and have been active in shipping scientists, engineers and soldiers to towns across south america. if our source has inside information then maybe we could intercept the lines and pick up some of the high value targets the french are after. what was “die alchemisten project”? \n",
+      "\n",
+      "the enclosed message was handed to the marines, but they didn’t get a name. initial analysis shows it must be a vigenere cipher with period two so it should be reasonably straightforward to crack. \n",
+      "\n",
+      "all the best, charlie \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c5a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('de', -885.6842458313828)"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = vigenere_frequency_break(c5b, max_key_length=2)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "the first item in our little auction will be the location of a safehouse in the uk sector of berlin it is a minor stopover on the rat lines but you never know you might get lucky and find someone interesting hiding there at the very least you will inconvenience the reichs doktor if you take possession of it how much would that be worth to you do i hear a bid of five hundred thousand francs from our french friends perhaps the british would pay more or maybe they can not afford to i wonder how they feel about that perhaps you should ask them if you want to outbid your so called friends then leave the money in unmarked treasury bills in locker at the far end of the platform in friedrichstrasse i will leave the details in locker you will find the key in do not try to double cross me it will not work and our little game will end before it has even properly begun\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c5b), key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "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
+}
diff --git a/2015/2015-challenge6.ipynb b/2015/2015-challenge6.ipynb
new file mode 100644 (file)
index 0000000..e01a50c
--- /dev/null
@@ -0,0 +1,275 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c6a = sanitise(open('6a.ciphertext').read())\n",
+    "c6b = sanitise(open('6b.ciphertext').read())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('hammering', <KeywordWrapAlphabet.from_largest: 3>), -2247.716859509375)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c6a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "freslitiacehartaypoinseailinthareagevtiaeceyiaepptestwboarinartayptwmthhegthctpifktwupenwinartasenhfsipaodartsewiomthhegtpstaayunliktlyfoinfiwtnfthoidigustyousjuniosfiprtsfltskcehinvolvtwmigrabtcosarfrtfkingrtsbefkgsounwenwbenkeffounahareaihellimtenacrtniheiwarthousftcehflohtaoromtbuaarinkingebouaiaiemnoahustiamekthhtnhtaoarinkhrtceharthousftartmthhegthhaillkttpfomingenwiemguthhingareahrtrehgonthoartstmuhabthomtoartshousftdosousinatlligtnfthomtaringihboartsingmtebouaartaontodartmthhegthcrywothousenaegonihakttpaeunainguhebouaousellithiaihnoaliktartaringhctestbtingehktwaobiwdosestaringhctestliktlyaoriwtdsomontenoartsedatsellenyceyidolloctwontodousdstnfrfollteguthaodsitwsifrhasehhtenwceafrtwrtsasyaopifkupartktydsomlofktshttmhaorevtbttnefonifoulwnaflteslyhttcreacehgoingonbuahrtwiwnahttmaobtebltaooptnlofktsenwltdaobviouhlyuphtaedatshrtrewgontiaookelookealofktsiarehedelhtbefkhoiemguthhingartmontycehaektnbuanoaringpsoviwtwintxfrengtfoulwyouwigesounwciaryousfonaefahinartbsiaihrenwsuhhientmbehhithenwhttidartyestgtaaingarthemthosaodfommunifeaionhmeybtyoufoulwcesnartmbyartceywitelfrtmihatnpsojtfacehartfowtnemtdosartnezieaombombtddosairewesuninciarartmwusingartcescrtnctctstasyingaokttpartisrenwhoddartrtevyceatshupplystmtmbtsartbombinginvtmoskareacehuhosseartsousnoswifellithenyceyiaihhaillaophtfstahoartdefaouspsoaegonihaknochebouaiaihhignidifenaihuhptfaartktyaoarihcroltmyhatsylithinartisiwtnaiayidctkntccroartyctstcoskingdosctmigrabtebltaodigustouacreaartyestupaoontlehaaringefaingonerunfriaookelookeahomtodartdstnfrwtewwsophedatsartdsitwsifrhasehhtinfiwtnaenwdounwarteaaefrtwfommunifeaionirevtnarewaimtaofsefkiabuaiarinkiameybtevigtntstegeinbuairevtnarewefrenftaoasybebbegthasifkoniaytagivtiaaoyousblefkfrembtsenwhttcreaartyfenmektodiaellartbtharessy\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c6a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'icrdvsfshmrghcfhpzysxdrhsvsxfghcrhnrkfshrmrpshrzzfrdflayhcsxhcfhpzflwfggrnfgmfzsiufljzrxlsxhcfhdrxgidszhyehcfdrlsywfggrnfzdfhhpjxvsufvpiysxislfxifgysesnjdfpyjdtjxsydiszcfdivfdumrgsxkyvkflwsnchafmydhcicfiusxncfdariundyjxlrxlarxuriiyjxhghcrhsgrvvswfrxhmcfxsgrslhcfgyjdifmrgivygfhycywfajhhcsxusxnrayjhshsrwxyhgjdfshwrufggfxgfhyhcsxugcfmrghcfgyjdifhcfwfggrnfgghsvvuffziywsxnrxlsrwnjfggsxnhcrhgcfcrgnyxfgyhcfdfwjghafgywfyhcfdgyjdifeydyjdsxhfvvsnfxifgywfhcsxnsgayhcfdsxnwfrayjhhcfhyxfyehcfwfggrnfgmcplyfgyjdrxhrnyxsghuffzhrjxhsxnjgrayjhyjdrvvsfgshsgxyhvsufhcfhcsxngmfrdfafsxnrguflhyasleydrdfhcsxngmfrdfvsufvphycslfedywyxfrxyhcfdrehfdrvvrxpmrpseyvvymflyxfyeyjdedfxiciyvvfrnjfghyedsfldsicghdrggfrxlmrhicflcfdhdphyzsiujzhcfufpedywvyiufdgffwghycrkfaffxriyxsiyjvlxhivfrdvpgffmcrhmrgnysxnyxajhgcflslxhgffwhyafravfhyyzfxvyiufdrxlvfehyaksyjgvpjzgfhrehfdgcfcrlnyxfshyyurvyyurhvyiufdshcrgrervgfariugysrwnjfggsxnhcfwyxfpmrghrufxajhxyhcsxnzdykslflsxfoicrxnfiyjvlpyjlsnrdyjxlmshcpyjdiyxhrihgsxhcfadshsgcrxldjggsrxfwarggsfgrxlgffsehcfprdfnfhhsxnhcfgrwfgydhyeiywwjxsirhsyxgwrpafpyjiyjvlmrdxhcfwaphcfmrplsfrvicfwsghfxzdytfihmrghcfiylfxrwfeydhcfxrqsrhywaywafeeydhscrlrdjxsxmshchcfwljdsxnhcfmrdmcfxmfmfdfhdpsxnhyuffzhcfsdcrxlgyeehcfcfrkpmrhfdgjzzvpdfwfwafdhcfaywasxnsxkfwyduhcrhmrgjgyddrhcfdyjdxydlsirvvsfgrxpmrpshsgghsvvhyzgfidfhgyhcferihyjdzdyhrnyxsghuxymgrayjhshsggsnxsesirxhsgjgzfihhcfufphyhcsgmcyvfwpghfdpvsfgsxhcfsdslfxhshpsemfuxfmmcyhcfpmfdfmydusxneydmfwsnchafravfhyesnjdfyjhmcrhhcfprdfjzhyyxfvrghhcsxnrihsxnyxrcjxicshyyurvyyurhgywfyehcfedfxiclfrlldyzgrehfdhcfedsfldsicghdrggfsxislfxhrxleyjxlhcfrhhricfliywwjxsirhsyxscrkfxhcrlhswfhyidriushajhshcsxushwrpafrksnfxfdfrnrsxajhscrkfxhcrlricrxifhyhdparaarnfghdsiuyxshpfhnskfshhypyjdavriuicrwafdrxlgffmcrhhcfpirxwrufyeshrvvhcfafghcrddp'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "c6a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'CHARLIE IT WAS THE TYPO IN RAT I LINES THAT GAVE IT AWAY IT APPEARED BOTH IN THE TYPED MESSAGES WE PICKED UP AND IN THE TRANSCRIPT OF THE RADIO MESSAGE PRETTY UNLIKELY COINCIDENCE SO I FIGURE YOUR JUNIOR CIPHER CLERK WAS INVOLVED MIGHT BE WORTH CHECKING HER BACKGROUND AND BANK ACCOUNTS THAT IS ALL I MEANT WHEN I SAID THE SOURCE WAS CLOSE TO HOME BUT THINKING ABOUT IT I AM NOT SURE IT MAKES SENSE TO THINK SHE WAS THE SOURCE THE MESSAGES STILL KEEP COMING AND I AM GUESSING THAT SHE HAS GONE SO THERE MUST BE SOME OTHER SOURCE FOR OUR INTELLIGENCE SOMETHING IS BOTHERING ME ABOUT THE TONE OF THE MESSAGES WHY DOES OUR ANTAGONIST KEEP TAUNTING US ABOUT OUR ALLIES IT IS NOT LIKE THE THINGS WE ARE BEING ASKED TO BID FOR ARE THINGS WE ARE LIKELY TO HIDE FROM ONE ANOTHER AFTER ALL ANYWAY I FOLLOWED ONE OF OUR FRENCH COLLEAGUES TO FRIEDRICHSTRASSE AND WATCHED HER TRY TO PICKUP THE KEY FROM LOCKER SEEMS TO HAVE BEEN A CON I COULDNT CLEARLY SEE WHAT WAS GOING ON BUT SHE DIDNT SEEM TO BE ABLE TO OPEN LOCKER AND LEFT OBVIOUSLY UPSET AFTER SHE HAD GONE I TOOK A LOOK AT LOCKER IT HAS A FALSE BACK SO I AM GUESSING THE MONEY WAS TAKEN BUT NOTHING PROVIDED IN EXCHANGE COULD YOU DIG AROUND WITH YOUR CONTACTS IN THE BRITISH AND RUSSIAN EMBASSIES AND SEE IF THEY ARE GETTING THE SAME SORT OF COMMUNICATIONS MAYBE YOU COULD WARN THEM BY THE WAY DIE ALCHEMIST EN PROJECT WAS THE CODENAME FOR THE NAZI ATOM BOMB EFFORT I HAD A RUN IN WITH THEM DURING THE WAR WHEN WE WERE TRYING TO KEEP THEIR HANDS OFF THE HEAVY WATER SUPPLY REMEMBER THE BOMBING IN VE MORK THAT WAS US OR RATHER OUR NORDIC ALLIES ANYWAY IT IS STILL TOP SECRET SO THE FACT OUR PROTAGONIST KNOWS ABOUT IT IS SIGNIFICANT I SUSPECT THE KEY TO THIS WHOLE MYSTERY LIES IN THEIR IDENTITY IF WE KNEW WHO THEY WERE WORKING FOR WE MIGHT BE ABLE TO FIGURE OUT WHAT THEY ARE UP TO ONE LAST THING ACTING ON A HUNCH I TOOK A LOOK AT SOME OF THE FRENCH DEAD DROPS AFTER THE FRIEDRICHSTRASSE INCIDENT AND FOUND THE ATTACHED COMMUNICATION I HAVENT HAD TIME TO CRACK IT BUT I THINK IT MAYBE AVI GENERE AGAIN BUT I HAVENT HAD A CHANCE TO TRY BABBAGE STRICK ON IT YET GIVE IT TO YOUR BLACK CHAMBER AND SEE WHAT THEY CAN MAKE OF IT ALL THE BEST HARRY'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "translations = {'c': 'H', 'r': 'A', 'd': 'R', 'p': 'Y', 'i': 'C', 'd': 'R', 'v': 'L', 's': 'I', 'f': 'E', \n",
+    "                'h': 'T', 'a': 'B', 'g': 'S', 'm': 'W', 'y': 'O', 'z': 'P', 'n': 'G', 'j': 'U', 't': 'J',\n",
+    "               'x': 'N', 'k': 'V', 'l': 'D', 'w': 'M', 'u': 'K', 'e': 'F', 'q': 'Z', 'o': 'X'}\n",
+    "translation_table = ''.maketrans(translations)\n",
+    "plaintext = ' '.join(segment(c6a.translate(translation_table)))\n",
+    "plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'BHRFESTCUVDWGXYZAIJKLMNOP'"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join(translations[l] for l in sorted(translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'railfencstuvwxyzdghjkmopq'"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "inverted_translations = {translations[a]: a for a in translations}\n",
+    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'railfencstuvwxyzbdghjkmopq'"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of('railfences', wrap_alphabet=KeywordWrapAlphabet.from_last)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charlie it was the typo in rat i lines that gave it away it appeared both in the typed messages we picked up and in the transcript of the radio message pretty unlikely coincidence so i figure your junior cipher clerk was involved might be worth checking her background and bank accounts that is all i meant when i said the source was close to home but thinking about it i am not sure it makes sense to think she was the source the messages still keep coming and i am guessing that she has gone so there must be some other source for our intelligence something is bothering me about the tone of the messages why does our antagonist keep taunting us about our allies it is not like the things we are being asked to bid for are things we are likely to hide from one another after all anyway i followed one of our french colleagues to friedrichstrasse and watched her try to pickup the key from locker seems to have been a con i couldnt clearly see what was going on but she didnt seem to be able to open locker and left obviously upset after she had gone i took a look at locker it has a false back so i am guessing the money was taken but nothing provided in exchange could you dig around with your contacts in the british and russian embassies and see if they are getting the same sort of communications maybe you could warn them by the way die alchemist en project was the codename for the nazi atom bomb effort i had a run in with them during the war when we were trying to keep their hands off the heavy water supply remember the bombing in ve mork that was us or rather our nordic allies anyway it is still top secret so the fact our protagonist knows about it is significant i suspect the key to this whole mystery lies in their identity if we knew who they were working for we might be able to figure out what they are up to one last thing acting on a hunch i took a look at some of the french dead drops after the friedrichstrasse incident and found the attached communication i havent had time to crack it but i think it maybe avi genere again but i havent had a chance to try babbage strick on it yet give it to your black chamber and see what they can make of it all the best harry\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(c6a, 'railfences', wrap_alphabet=KeywordWrapAlphabet.from_last))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('kremlin', -908.5396262316657)"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = vigenere_frequency_break(c6b)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "the americans have robbed you rather than trying to outbid you they got to the lockers first and arranged to steal your money and the valuable intelligence i provided for you they can not be trusted none of your allies can be trusted they believe that they can cheat you but they do not understand that you can only cheat in a game and this is not a game if you try to playa game of chess like your allies we will find ourselves in a stalemate you have been warned so let us start again i can let you have the address of another safehouse at a small discount on our original price and i will include the identity of a british double agent working in your embassy shall we say four hundred thousand francs to be paid directly to an account of my choosing if you want to know more about the treachery of your so called friends then let us meet in the park by the british embassy on friday at eleven\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(vigenere_decipher(sanitise(c6b), key_b)))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "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
+}
diff --git a/2015/2015-challenge7.ipynb b/2015/2015-challenge7.ipynb
new file mode 100644 (file)
index 0000000..4fb1a18
--- /dev/null
@@ -0,0 +1,1580 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c7a = sanitise(open('7a.ciphertext').read())\n",
+    "c7b = sanitise(open('7b.ciphertext').read())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(('annmarie', <KeywordWrapAlphabet.from_largest: 3>), -1865.8708508162845)"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "(key_a_word, key_a_wrap), score = keyword_break_mp(c7a)\n",
+    "(key_a_word, key_a_wrap), score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "dhorlieithinkiknacchotisgainganfutineewtadhedkobecthingsfebareirepartcemoyhoveonappartunityhereidhedkewthedipherdlerksfodkgraunwonwitturnsautsheischiterussionherbomilylebtmasdacinfutshehosrelotivesinthegulogotpermshedleorlyhosnalavebarthesavietgavernmentsaiomstillnatsurechashecoscarkingbarfutithinkthisiskeyintelligendeinthemeontimeihovefeencotdhingthefritstheyseemtahovefeenindantodtcithaurbrienwsinthereidhswaktaronwtheyinturnhovefeencotdhingthebrendhitseemslikeceoreollcarkingogoinstaneonatherchidhireollywiwntexpedtonwgivenchotcereowinthebrendhwadumentlostceekiwantthinkthotisodaindiwendemyacnguessisthottherussionsknacchotisgainganonwthotaurfesthapeabundaveringitistafreokintatheirhqonwtrytabinwsamethingthereunbartunotelyoddarwingtamysaurdeyuritheyhovetokentausingonecdiphersalitoirebarordhivestarogeabtapsedretbilessaevenibcemonogetasteoltherelevontbileitcilltokeolatabdamputingtafreokthedipheriottodhofriebmessogebramyuriendryptewusingonomsdadipherkeycarwlengthissixinchidhhewesdrifesthedipheritisverydleversimpletaimplementfutoweviltadrodkonwmyanehapeisthotcedonolsabinwthedipherkeychileinthehqarotleostportabitiplontaenterintcaceeksanwedemfersixteenththerussionsorehastingolorgeprapogonwoeventosportabtheinternotianolefouousstellungcithleowingpalitfuramemfersinottenwondemastabthesedurityteomcillfeaddupiewciththotonwhqseduritycillferelotivelylightcithludkicillgetinonwautciththebilesceneewthotnightonwthencedongettathefattamabthechalereidhswaktarstrotogemollthefesthorry\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(keyword_decipher(c7a, key_a_word, wrap_alphabet=key_a_wrap))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'A': 'a',\n",
+       " 'B': 'o',\n",
+       " 'C': 'p',\n",
+       " 'D': 'q',\n",
+       " 'E': 'f',\n",
+       " 'F': 'r',\n",
+       " 'G': 's',\n",
+       " 'H': 't',\n",
+       " 'I': 'e',\n",
+       " 'J': 'u',\n",
+       " 'K': 'v',\n",
+       " 'L': 'w',\n",
+       " 'M': 'c',\n",
+       " 'N': 'b',\n",
+       " 'O': 'x',\n",
+       " 'P': 'y',\n",
+       " 'Q': 'z',\n",
+       " 'R': 'd',\n",
+       " 'S': 'g',\n",
+       " 'T': 'h',\n",
+       " 'U': 'i',\n",
+       " 'V': 'j',\n",
+       " 'W': 'k',\n",
+       " 'X': 'l',\n",
+       " 'Y': 'm',\n",
+       " 'Z': 'n'}"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "trans_a = {p.upper(): c for p, c in zip(keyword_cipher_alphabet_of(key_a_word, wrap_alphabet=key_a_wrap), string.ascii_lowercase, )}\n",
+    "trans_a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "translations = {\n",
+    " 'A': 'o',\n",
+    " 'B': 'a',\n",
+    " 'C': 'p',\n",
+    " 'D': 'q',\n",
+    " 'E': 'b',\n",
+    " 'F': 'r',\n",
+    " 'G': 's',\n",
+    " 'H': 't',\n",
+    " 'I': 'e',\n",
+    " 'J': 'u',\n",
+    " 'K': 'v',\n",
+    " 'L': 'd',\n",
+    " 'M': 'w',\n",
+    " 'N': 'f',\n",
+    " 'O': 'x',\n",
+    " 'P': 'y',\n",
+    " 'Q': 'z',\n",
+    " 'R': 'c',\n",
+    " 'S': 'g',\n",
+    " 'T': 'h',\n",
+    " 'U': 'i',\n",
+    " 'V': 'j',\n",
+    " 'W': 'k',\n",
+    " 'X': 'l',\n",
+    " 'Y': 'm',\n",
+    " 'Z': 'n'}\n",
+    "translation_table = ''.maketrans(translations)\n",
+    "plaintext = ' '.join(segment(c7a.upper().translate(translation_table)))\n",
+    "plaintext"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'oapqbrsteuvdwfxyzcghijklmn'"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "''.join(translations[l] for l in sorted(translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'BERLINSTUVWXYZACDFGHJKMOPQ'"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "inverted_translations = {translations[a]: a for a in translations}\n",
+    "''.join(inverted_translations[l] for l in sorted(inverted_translations))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'berlinstuvwxyzacdfghjkmopq'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "keyword_cipher_alphabet_of('berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "charlie i think i know what is going on but i need to check a few things before i report we may have an opportunity here i checked the cipher clerks background and it turns out she is white russian her family left moscow in but she has relatives in the gulag at perm she clearly has no love for the soviet government so i am still not sure who she was working for but i think this is key intelligence in the meantime i have been watching the brits they seem to have been in contact with our friends in the reichs doktor and they in turn have been watching the french it seems like we are all working against one another which i really didnt expect and given what we read in the french document last week i dont think that is a coincidence my own guess is that the russians know what is going on and that our best hope of uncovering it is to break into their hq and try to find something there unfortunately according to my source yuri they have taken to using a new cipher solitaire for archive storage of top secret files so even if we manage to steal the relevant file it will take alot of computing to break the cipher i attach a brief message from yuri encrypted using an amsco cipher keyword length is six in which he describes the cipher it is very clever simple to implement but a devil to crack and my one hope is that we can also find the cipher key while in the hq or atleast part of it i plan to enter in two weeks on december sixteenth the russians are hosting a large propaganda event as part of the international ebau ausstellung with leading politburo members in attendance most of the security team will be occupied with that and hq security will be relatively light with luck i will get in and out with the files we need that night and then we can get to the bottom of the whole reichs doktor stratagem all the best harry\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(keyword_decipher(c7a, 'berlin', wrap_alphabet=KeywordWrapAlphabet.from_largest))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{(0, 1, 2, 3, 4, 5): (0, 1, 2, 3, 4, 5),\n",
+       " (0, 1, 2, 3, 5, 4): (0, 1, 2, 3, 5, 4),\n",
+       " (0, 1, 2, 4, 3, 5): (0, 1, 2, 4, 3, 5),\n",
+       " (0, 1, 2, 4, 5, 3): (0, 1, 2, 4, 5, 3),\n",
+       " (0, 1, 2, 5, 3, 4): (0, 1, 2, 5, 3, 4),\n",
+       " (0, 1, 2, 5, 4, 3): (0, 1, 2, 5, 4, 3),\n",
+       " (0, 1, 3, 2, 4, 5): (0, 1, 3, 2, 4, 5),\n",
+       " (0, 1, 3, 2, 5, 4): (0, 1, 3, 2, 5, 4),\n",
+       " (0, 1, 3, 4, 2, 5): (0, 1, 3, 4, 2, 5),\n",
+       " (0, 1, 3, 4, 5, 2): (0, 1, 3, 4, 5, 2),\n",
+       " (0, 1, 3, 5, 2, 4): (0, 1, 3, 5, 2, 4),\n",
+       " (0, 1, 3, 5, 4, 2): (0, 1, 3, 5, 4, 2),\n",
+       " (0, 1, 4, 2, 3, 5): (0, 1, 4, 2, 3, 5),\n",
+       " (0, 1, 4, 2, 5, 3): (0, 1, 4, 2, 5, 3),\n",
+       " (0, 1, 4, 3, 2, 5): (0, 1, 4, 3, 2, 5),\n",
+       " (0, 1, 4, 3, 5, 2): (0, 1, 4, 3, 5, 2),\n",
+       " (0, 1, 4, 5, 2, 3): (0, 1, 4, 5, 2, 3),\n",
+       " (0, 1, 4, 5, 3, 2): (0, 1, 4, 5, 3, 2),\n",
+       " (0, 1, 5, 2, 3, 4): (0, 1, 5, 2, 3, 4),\n",
+       " (0, 1, 5, 2, 4, 3): (0, 1, 5, 2, 4, 3),\n",
+       " (0, 1, 5, 3, 2, 4): (0, 1, 5, 3, 2, 4),\n",
+       " (0, 1, 5, 3, 4, 2): (0, 1, 5, 3, 4, 2),\n",
+       " (0, 1, 5, 4, 2, 3): (0, 1, 5, 4, 2, 3),\n",
+       " (0, 1, 5, 4, 3, 2): (0, 1, 5, 4, 3, 2),\n",
+       " (0, 2, 1, 3, 4, 5): (0, 2, 1, 3, 4, 5),\n",
+       " (0, 2, 1, 3, 5, 4): (0, 2, 1, 3, 5, 4),\n",
+       " (0, 2, 1, 4, 3, 5): (0, 2, 1, 4, 3, 5),\n",
+       " (0, 2, 1, 4, 5, 3): (0, 2, 1, 4, 5, 3),\n",
+       " (0, 2, 1, 5, 3, 4): (0, 2, 1, 5, 3, 4),\n",
+       " (0, 2, 1, 5, 4, 3): (0, 2, 1, 5, 4, 3),\n",
+       " (0, 2, 3, 1, 4, 5): (0, 2, 3, 1, 4, 5),\n",
+       " (0, 2, 3, 1, 5, 4): (0, 2, 3, 1, 5, 4),\n",
+       " (0, 2, 3, 4, 1, 5): (0, 2, 3, 4, 1, 5),\n",
+       " (0, 2, 3, 4, 5, 1): (0, 2, 3, 4, 5, 1),\n",
+       " (0, 2, 3, 5, 1, 4): (0, 2, 3, 5, 1, 4),\n",
+       " (0, 2, 3, 5, 4, 1): (0, 2, 3, 5, 4, 1),\n",
+       " (0, 2, 4, 1, 3, 5): (0, 2, 4, 1, 3, 5),\n",
+       " (0, 2, 4, 1, 5, 3): (0, 2, 4, 1, 5, 3),\n",
+       " (0, 2, 4, 3, 1, 5): (0, 2, 4, 3, 1, 5),\n",
+       " (0, 2, 4, 3, 5, 1): (0, 2, 4, 3, 5, 1),\n",
+       " (0, 2, 4, 5, 1, 3): (0, 2, 4, 5, 1, 3),\n",
+       " (0, 2, 4, 5, 3, 1): (0, 2, 4, 5, 3, 1),\n",
+       " (0, 2, 5, 1, 3, 4): (0, 2, 5, 1, 3, 4),\n",
+       " (0, 2, 5, 1, 4, 3): (0, 2, 5, 1, 4, 3),\n",
+       " (0, 2, 5, 3, 1, 4): (0, 2, 5, 3, 1, 4),\n",
+       " (0, 2, 5, 3, 4, 1): (0, 2, 5, 3, 4, 1),\n",
+       " (0, 2, 5, 4, 1, 3): (0, 2, 5, 4, 1, 3),\n",
+       " (0, 2, 5, 4, 3, 1): (0, 2, 5, 4, 3, 1),\n",
+       " (0, 3, 1, 2, 4, 5): (0, 3, 1, 2, 4, 5),\n",
+       " (0, 3, 1, 2, 5, 4): (0, 3, 1, 2, 5, 4),\n",
+       " (0, 3, 1, 4, 2, 5): (0, 3, 1, 4, 2, 5),\n",
+       " (0, 3, 1, 4, 5, 2): (0, 3, 1, 4, 5, 2),\n",
+       " (0, 3, 1, 5, 2, 4): (0, 3, 1, 5, 2, 4),\n",
+       " (0, 3, 1, 5, 4, 2): (0, 3, 1, 5, 4, 2),\n",
+       " (0, 3, 2, 1, 4, 5): (0, 3, 2, 1, 4, 5),\n",
+       " (0, 3, 2, 1, 5, 4): (0, 3, 2, 1, 5, 4),\n",
+       " (0, 3, 2, 4, 1, 5): (0, 3, 2, 4, 1, 5),\n",
+       " (0, 3, 2, 4, 5, 1): (0, 3, 2, 4, 5, 1),\n",
+       " (0, 3, 2, 5, 1, 4): (0, 3, 2, 5, 1, 4),\n",
+       " (0, 3, 2, 5, 4, 1): (0, 3, 2, 5, 4, 1),\n",
+       " (0, 3, 4, 1, 2, 5): (0, 3, 4, 1, 2, 5),\n",
+       " (0, 3, 4, 1, 5, 2): (0, 3, 4, 1, 5, 2),\n",
+       " (0, 3, 4, 2, 1, 5): (0, 3, 4, 2, 1, 5),\n",
+       " (0, 3, 4, 2, 5, 1): (0, 3, 4, 2, 5, 1),\n",
+       " (0, 3, 4, 5, 1, 2): (0, 3, 4, 5, 1, 2),\n",
+       " (0, 3, 4, 5, 2, 1): (0, 3, 4, 5, 2, 1),\n",
+       " (0, 3, 5, 1, 2, 4): (0, 3, 5, 1, 2, 4),\n",
+       " (0, 3, 5, 1, 4, 2): (0, 3, 5, 1, 4, 2),\n",
+       " (0, 3, 5, 2, 1, 4): (0, 3, 5, 2, 1, 4),\n",
+       " (0, 3, 5, 2, 4, 1): (0, 3, 5, 2, 4, 1),\n",
+       " (0, 3, 5, 4, 1, 2): (0, 3, 5, 4, 1, 2),\n",
+       " (0, 3, 5, 4, 2, 1): (0, 3, 5, 4, 2, 1),\n",
+       " (0, 4, 1, 2, 3, 5): (0, 4, 1, 2, 3, 5),\n",
+       " (0, 4, 1, 2, 5, 3): (0, 4, 1, 2, 5, 3),\n",
+       " (0, 4, 1, 3, 2, 5): (0, 4, 1, 3, 2, 5),\n",
+       " (0, 4, 1, 3, 5, 2): (0, 4, 1, 3, 5, 2),\n",
+       " (0, 4, 1, 5, 2, 3): (0, 4, 1, 5, 2, 3),\n",
+       " (0, 4, 1, 5, 3, 2): (0, 4, 1, 5, 3, 2),\n",
+       " (0, 4, 2, 1, 3, 5): (0, 4, 2, 1, 3, 5),\n",
+       " (0, 4, 2, 1, 5, 3): (0, 4, 2, 1, 5, 3),\n",
+       " (0, 4, 2, 3, 1, 5): (0, 4, 2, 3, 1, 5),\n",
+       " (0, 4, 2, 3, 5, 1): (0, 4, 2, 3, 5, 1),\n",
+       " (0, 4, 2, 5, 1, 3): (0, 4, 2, 5, 1, 3),\n",
+       " (0, 4, 2, 5, 3, 1): (0, 4, 2, 5, 3, 1),\n",
+       " (0, 4, 3, 1, 2, 5): (0, 4, 3, 1, 2, 5),\n",
+       " (0, 4, 3, 1, 5, 2): (0, 4, 3, 1, 5, 2),\n",
+       " (0, 4, 3, 2, 1, 5): (0, 4, 3, 2, 1, 5),\n",
+       " (0, 4, 3, 2, 5, 1): (0, 4, 3, 2, 5, 1),\n",
+       " (0, 4, 3, 5, 1, 2): (0, 4, 3, 5, 1, 2),\n",
+       " (0, 4, 3, 5, 2, 1): (0, 4, 3, 5, 2, 1),\n",
+       " (0, 4, 5, 1, 2, 3): (0, 4, 5, 1, 2, 3),\n",
+       " (0, 4, 5, 1, 3, 2): (0, 4, 5, 1, 3, 2),\n",
+       " (0, 4, 5, 2, 1, 3): (0, 4, 5, 2, 1, 3),\n",
+       " (0, 4, 5, 2, 3, 1): (0, 4, 5, 2, 3, 1),\n",
+       " (0, 4, 5, 3, 1, 2): (0, 4, 5, 3, 1, 2),\n",
+       " (0, 4, 5, 3, 2, 1): (0, 4, 5, 3, 2, 1),\n",
+       " (0, 5, 1, 2, 3, 4): (0, 5, 1, 2, 3, 4),\n",
+       " (0, 5, 1, 2, 4, 3): (0, 5, 1, 2, 4, 3),\n",
+       " (0, 5, 1, 3, 2, 4): (0, 5, 1, 3, 2, 4),\n",
+       " (0, 5, 1, 3, 4, 2): (0, 5, 1, 3, 4, 2),\n",
+       " (0, 5, 1, 4, 2, 3): (0, 5, 1, 4, 2, 3),\n",
+       " (0, 5, 1, 4, 3, 2): (0, 5, 1, 4, 3, 2),\n",
+       " (0, 5, 2, 1, 3, 4): (0, 5, 2, 1, 3, 4),\n",
+       " (0, 5, 2, 1, 4, 3): (0, 5, 2, 1, 4, 3),\n",
+       " (0, 5, 2, 3, 1, 4): (0, 5, 2, 3, 1, 4),\n",
+       " (0, 5, 2, 3, 4, 1): (0, 5, 2, 3, 4, 1),\n",
+       " (0, 5, 2, 4, 1, 3): (0, 5, 2, 4, 1, 3),\n",
+       " (0, 5, 2, 4, 3, 1): (0, 5, 2, 4, 3, 1),\n",
+       " (0, 5, 3, 1, 2, 4): (0, 5, 3, 1, 2, 4),\n",
+       " (0, 5, 3, 1, 4, 2): (0, 5, 3, 1, 4, 2),\n",
+       " (0, 5, 3, 2, 1, 4): (0, 5, 3, 2, 1, 4),\n",
+       " (0, 5, 3, 2, 4, 1): (0, 5, 3, 2, 4, 1),\n",
+       " (0, 5, 3, 4, 1, 2): (0, 5, 3, 4, 1, 2),\n",
+       " (0, 5, 3, 4, 2, 1): (0, 5, 3, 4, 2, 1),\n",
+       " (0, 5, 4, 1, 2, 3): (0, 5, 4, 1, 2, 3),\n",
+       " (0, 5, 4, 1, 3, 2): (0, 5, 4, 1, 3, 2),\n",
+       " (0, 5, 4, 2, 1, 3): (0, 5, 4, 2, 1, 3),\n",
+       " (0, 5, 4, 2, 3, 1): (0, 5, 4, 2, 3, 1),\n",
+       " (0, 5, 4, 3, 1, 2): (0, 5, 4, 3, 1, 2),\n",
+       " (0, 5, 4, 3, 2, 1): (0, 5, 4, 3, 2, 1),\n",
+       " (1, 0, 2, 3, 4, 5): (1, 0, 2, 3, 4, 5),\n",
+       " (1, 0, 2, 3, 5, 4): (1, 0, 2, 3, 5, 4),\n",
+       " (1, 0, 2, 4, 3, 5): (1, 0, 2, 4, 3, 5),\n",
+       " (1, 0, 2, 4, 5, 3): (1, 0, 2, 4, 5, 3),\n",
+       " (1, 0, 2, 5, 3, 4): (1, 0, 2, 5, 3, 4),\n",
+       " (1, 0, 2, 5, 4, 3): (1, 0, 2, 5, 4, 3),\n",
+       " (1, 0, 3, 2, 4, 5): (1, 0, 3, 2, 4, 5),\n",
+       " (1, 0, 3, 2, 5, 4): (1, 0, 3, 2, 5, 4),\n",
+       " (1, 0, 3, 4, 2, 5): (1, 0, 3, 4, 2, 5),\n",
+       " (1, 0, 3, 4, 5, 2): (1, 0, 3, 4, 5, 2),\n",
+       " (1, 0, 3, 5, 2, 4): (1, 0, 3, 5, 2, 4),\n",
+       " (1, 0, 3, 5, 4, 2): (1, 0, 3, 5, 4, 2),\n",
+       " (1, 0, 4, 2, 3, 5): (1, 0, 4, 2, 3, 5),\n",
+       " (1, 0, 4, 2, 5, 3): (1, 0, 4, 2, 5, 3),\n",
+       " (1, 0, 4, 3, 2, 5): (1, 0, 4, 3, 2, 5),\n",
+       " (1, 0, 4, 3, 5, 2): (1, 0, 4, 3, 5, 2),\n",
+       " (1, 0, 4, 5, 2, 3): (1, 0, 4, 5, 2, 3),\n",
+       " (1, 0, 4, 5, 3, 2): (1, 0, 4, 5, 3, 2),\n",
+       " (1, 0, 5, 2, 3, 4): (1, 0, 5, 2, 3, 4),\n",
+       " (1, 0, 5, 2, 4, 3): (1, 0, 5, 2, 4, 3),\n",
+       " (1, 0, 5, 3, 2, 4): (1, 0, 5, 3, 2, 4),\n",
+       " (1, 0, 5, 3, 4, 2): (1, 0, 5, 3, 4, 2),\n",
+       " (1, 0, 5, 4, 2, 3): (1, 0, 5, 4, 2, 3),\n",
+       " (1, 0, 5, 4, 3, 2): (1, 0, 5, 4, 3, 2),\n",
+       " (1, 2, 0, 3, 4, 5): (1, 2, 0, 3, 4, 5),\n",
+       " (1, 2, 0, 3, 5, 4): (1, 2, 0, 3, 5, 4),\n",
+       " (1, 2, 0, 4, 3, 5): (1, 2, 0, 4, 3, 5),\n",
+       " (1, 2, 0, 4, 5, 3): (1, 2, 0, 4, 5, 3),\n",
+       " (1, 2, 0, 5, 3, 4): (1, 2, 0, 5, 3, 4),\n",
+       " (1, 2, 0, 5, 4, 3): (1, 2, 0, 5, 4, 3),\n",
+       " (1, 2, 3, 0, 4, 5): (1, 2, 3, 0, 4, 5),\n",
+       " (1, 2, 3, 0, 5, 4): (1, 2, 3, 0, 5, 4),\n",
+       " (1, 2, 3, 4, 0, 5): (1, 2, 3, 4, 0, 5),\n",
+       " (1, 2, 3, 4, 5, 0): (1, 2, 3, 4, 5, 0),\n",
+       " (1, 2, 3, 5, 0, 4): (1, 2, 3, 5, 0, 4),\n",
+       " (1, 2, 3, 5, 4, 0): (1, 2, 3, 5, 4, 0),\n",
+       " (1, 2, 4, 0, 3, 5): (1, 2, 4, 0, 3, 5),\n",
+       " (1, 2, 4, 0, 5, 3): (1, 2, 4, 0, 5, 3),\n",
+       " (1, 2, 4, 3, 0, 5): (1, 2, 4, 3, 0, 5),\n",
+       " (1, 2, 4, 3, 5, 0): (1, 2, 4, 3, 5, 0),\n",
+       " (1, 2, 4, 5, 0, 3): (1, 2, 4, 5, 0, 3),\n",
+       " (1, 2, 4, 5, 3, 0): (1, 2, 4, 5, 3, 0),\n",
+       " (1, 2, 5, 0, 3, 4): (1, 2, 5, 0, 3, 4),\n",
+       " (1, 2, 5, 0, 4, 3): (1, 2, 5, 0, 4, 3),\n",
+       " (1, 2, 5, 3, 0, 4): (1, 2, 5, 3, 0, 4),\n",
+       " (1, 2, 5, 3, 4, 0): (1, 2, 5, 3, 4, 0),\n",
+       " (1, 2, 5, 4, 0, 3): (1, 2, 5, 4, 0, 3),\n",
+       " (1, 2, 5, 4, 3, 0): (1, 2, 5, 4, 3, 0),\n",
+       " (1, 3, 0, 2, 4, 5): (1, 3, 0, 2, 4, 5),\n",
+       " (1, 3, 0, 2, 5, 4): (1, 3, 0, 2, 5, 4),\n",
+       " (1, 3, 0, 4, 2, 5): (1, 3, 0, 4, 2, 5),\n",
+       " (1, 3, 0, 4, 5, 2): (1, 3, 0, 4, 5, 2),\n",
+       " (1, 3, 0, 5, 2, 4): (1, 3, 0, 5, 2, 4),\n",
+       " (1, 3, 0, 5, 4, 2): (1, 3, 0, 5, 4, 2),\n",
+       " (1, 3, 2, 0, 4, 5): (1, 3, 2, 0, 4, 5),\n",
+       " (1, 3, 2, 0, 5, 4): (1, 3, 2, 0, 5, 4),\n",
+       " (1, 3, 2, 4, 0, 5): (1, 3, 2, 4, 0, 5),\n",
+       " (1, 3, 2, 4, 5, 0): (1, 3, 2, 4, 5, 0),\n",
+       " (1, 3, 2, 5, 0, 4): (1, 3, 2, 5, 0, 4),\n",
+       " (1, 3, 2, 5, 4, 0): (1, 3, 2, 5, 4, 0),\n",
+       " (1, 3, 4, 0, 2, 5): (1, 3, 4, 0, 2, 5),\n",
+       " (1, 3, 4, 0, 5, 2): (1, 3, 4, 0, 5, 2),\n",
+       " (1, 3, 4, 2, 0, 5): (1, 3, 4, 2, 0, 5),\n",
+       " (1, 3, 4, 2, 5, 0): (1, 3, 4, 2, 5, 0),\n",
+       " (1, 3, 4, 5, 0, 2): (1, 3, 4, 5, 0, 2),\n",
+       " (1, 3, 4, 5, 2, 0): (1, 3, 4, 5, 2, 0),\n",
+       " (1, 3, 5, 0, 2, 4): (1, 3, 5, 0, 2, 4),\n",
+       " (1, 3, 5, 0, 4, 2): (1, 3, 5, 0, 4, 2),\n",
+       " (1, 3, 5, 2, 0, 4): (1, 3, 5, 2, 0, 4),\n",
+       " (1, 3, 5, 2, 4, 0): (1, 3, 5, 2, 4, 0),\n",
+       " (1, 3, 5, 4, 0, 2): (1, 3, 5, 4, 0, 2),\n",
+       " (1, 3, 5, 4, 2, 0): (1, 3, 5, 4, 2, 0),\n",
+       " (1, 4, 0, 2, 3, 5): (1, 4, 0, 2, 3, 5),\n",
+       " (1, 4, 0, 2, 5, 3): (1, 4, 0, 2, 5, 3),\n",
+       " (1, 4, 0, 3, 2, 5): (1, 4, 0, 3, 2, 5),\n",
+       " (1, 4, 0, 3, 5, 2): (1, 4, 0, 3, 5, 2),\n",
+       " (1, 4, 0, 5, 2, 3): (1, 4, 0, 5, 2, 3),\n",
+       " (1, 4, 0, 5, 3, 2): (1, 4, 0, 5, 3, 2),\n",
+       " (1, 4, 2, 0, 3, 5): (1, 4, 2, 0, 3, 5),\n",
+       " (1, 4, 2, 0, 5, 3): (1, 4, 2, 0, 5, 3),\n",
+       " (1, 4, 2, 3, 0, 5): (1, 4, 2, 3, 0, 5),\n",
+       " (1, 4, 2, 3, 5, 0): (1, 4, 2, 3, 5, 0),\n",
+       " (1, 4, 2, 5, 0, 3): (1, 4, 2, 5, 0, 3),\n",
+       " (1, 4, 2, 5, 3, 0): (1, 4, 2, 5, 3, 0),\n",
+       " (1, 4, 3, 0, 2, 5): (1, 4, 3, 0, 2, 5),\n",
+       " (1, 4, 3, 0, 5, 2): (1, 4, 3, 0, 5, 2),\n",
+       " (1, 4, 3, 2, 0, 5): (1, 4, 3, 2, 0, 5),\n",
+       " (1, 4, 3, 2, 5, 0): (1, 4, 3, 2, 5, 0),\n",
+       " (1, 4, 3, 5, 0, 2): (1, 4, 3, 5, 0, 2),\n",
+       " (1, 4, 3, 5, 2, 0): (1, 4, 3, 5, 2, 0),\n",
+       " (1, 4, 5, 0, 2, 3): (1, 4, 5, 0, 2, 3),\n",
+       " (1, 4, 5, 0, 3, 2): (1, 4, 5, 0, 3, 2),\n",
+       " (1, 4, 5, 2, 0, 3): (1, 4, 5, 2, 0, 3),\n",
+       " (1, 4, 5, 2, 3, 0): (1, 4, 5, 2, 3, 0),\n",
+       " (1, 4, 5, 3, 0, 2): (1, 4, 5, 3, 0, 2),\n",
+       " (1, 4, 5, 3, 2, 0): (1, 4, 5, 3, 2, 0),\n",
+       " (1, 5, 0, 2, 3, 4): (1, 5, 0, 2, 3, 4),\n",
+       " (1, 5, 0, 2, 4, 3): (1, 5, 0, 2, 4, 3),\n",
+       " (1, 5, 0, 3, 2, 4): (1, 5, 0, 3, 2, 4),\n",
+       " (1, 5, 0, 3, 4, 2): (1, 5, 0, 3, 4, 2),\n",
+       " (1, 5, 0, 4, 2, 3): (1, 5, 0, 4, 2, 3),\n",
+       " (1, 5, 0, 4, 3, 2): (1, 5, 0, 4, 3, 2),\n",
+       " (1, 5, 2, 0, 3, 4): (1, 5, 2, 0, 3, 4),\n",
+       " (1, 5, 2, 0, 4, 3): (1, 5, 2, 0, 4, 3),\n",
+       " (1, 5, 2, 3, 0, 4): (1, 5, 2, 3, 0, 4),\n",
+       " (1, 5, 2, 3, 4, 0): (1, 5, 2, 3, 4, 0),\n",
+       " (1, 5, 2, 4, 0, 3): (1, 5, 2, 4, 0, 3),\n",
+       " (1, 5, 2, 4, 3, 0): (1, 5, 2, 4, 3, 0),\n",
+       " (1, 5, 3, 0, 2, 4): (1, 5, 3, 0, 2, 4),\n",
+       " (1, 5, 3, 0, 4, 2): (1, 5, 3, 0, 4, 2),\n",
+       " (1, 5, 3, 2, 0, 4): (1, 5, 3, 2, 0, 4),\n",
+       " (1, 5, 3, 2, 4, 0): (1, 5, 3, 2, 4, 0),\n",
+       " (1, 5, 3, 4, 0, 2): (1, 5, 3, 4, 0, 2),\n",
+       " (1, 5, 3, 4, 2, 0): (1, 5, 3, 4, 2, 0),\n",
+       " (1, 5, 4, 0, 2, 3): (1, 5, 4, 0, 2, 3),\n",
+       " (1, 5, 4, 0, 3, 2): (1, 5, 4, 0, 3, 2),\n",
+       " (1, 5, 4, 2, 0, 3): (1, 5, 4, 2, 0, 3),\n",
+       " (1, 5, 4, 2, 3, 0): (1, 5, 4, 2, 3, 0),\n",
+       " (1, 5, 4, 3, 0, 2): (1, 5, 4, 3, 0, 2),\n",
+       " (1, 5, 4, 3, 2, 0): (1, 5, 4, 3, 2, 0),\n",
+       " (2, 0, 1, 3, 4, 5): (2, 0, 1, 3, 4, 5),\n",
+       " (2, 0, 1, 3, 5, 4): (2, 0, 1, 3, 5, 4),\n",
+       " (2, 0, 1, 4, 3, 5): (2, 0, 1, 4, 3, 5),\n",
+       " (2, 0, 1, 4, 5, 3): (2, 0, 1, 4, 5, 3),\n",
+       " (2, 0, 1, 5, 3, 4): (2, 0, 1, 5, 3, 4),\n",
+       " (2, 0, 1, 5, 4, 3): (2, 0, 1, 5, 4, 3),\n",
+       " (2, 0, 3, 1, 4, 5): (2, 0, 3, 1, 4, 5),\n",
+       " (2, 0, 3, 1, 5, 4): (2, 0, 3, 1, 5, 4),\n",
+       " (2, 0, 3, 4, 1, 5): (2, 0, 3, 4, 1, 5),\n",
+       " (2, 0, 3, 4, 5, 1): (2, 0, 3, 4, 5, 1),\n",
+       " (2, 0, 3, 5, 1, 4): (2, 0, 3, 5, 1, 4),\n",
+       " (2, 0, 3, 5, 4, 1): (2, 0, 3, 5, 4, 1),\n",
+       " (2, 0, 4, 1, 3, 5): (2, 0, 4, 1, 3, 5),\n",
+       " (2, 0, 4, 1, 5, 3): (2, 0, 4, 1, 5, 3),\n",
+       " (2, 0, 4, 3, 1, 5): (2, 0, 4, 3, 1, 5),\n",
+       " (2, 0, 4, 3, 5, 1): (2, 0, 4, 3, 5, 1),\n",
+       " (2, 0, 4, 5, 1, 3): (2, 0, 4, 5, 1, 3),\n",
+       " (2, 0, 4, 5, 3, 1): (2, 0, 4, 5, 3, 1),\n",
+       " (2, 0, 5, 1, 3, 4): (2, 0, 5, 1, 3, 4),\n",
+       " (2, 0, 5, 1, 4, 3): (2, 0, 5, 1, 4, 3),\n",
+       " (2, 0, 5, 3, 1, 4): (2, 0, 5, 3, 1, 4),\n",
+       " (2, 0, 5, 3, 4, 1): (2, 0, 5, 3, 4, 1),\n",
+       " (2, 0, 5, 4, 1, 3): (2, 0, 5, 4, 1, 3),\n",
+       " (2, 0, 5, 4, 3, 1): (2, 0, 5, 4, 3, 1),\n",
+       " (2, 1, 0, 3, 4, 5): (2, 1, 0, 3, 4, 5),\n",
+       " (2, 1, 0, 3, 5, 4): (2, 1, 0, 3, 5, 4),\n",
+       " (2, 1, 0, 4, 3, 5): (2, 1, 0, 4, 3, 5),\n",
+       " (2, 1, 0, 4, 5, 3): (2, 1, 0, 4, 5, 3),\n",
+       " (2, 1, 0, 5, 3, 4): (2, 1, 0, 5, 3, 4),\n",
+       " (2, 1, 0, 5, 4, 3): (2, 1, 0, 5, 4, 3),\n",
+       " (2, 1, 3, 0, 4, 5): (2, 1, 3, 0, 4, 5),\n",
+       " (2, 1, 3, 0, 5, 4): (2, 1, 3, 0, 5, 4),\n",
+       " (2, 1, 3, 4, 0, 5): (2, 1, 3, 4, 0, 5),\n",
+       " (2, 1, 3, 4, 5, 0): (2, 1, 3, 4, 5, 0),\n",
+       " (2, 1, 3, 5, 0, 4): (2, 1, 3, 5, 0, 4),\n",
+       " (2, 1, 3, 5, 4, 0): (2, 1, 3, 5, 4, 0),\n",
+       " (2, 1, 4, 0, 3, 5): (2, 1, 4, 0, 3, 5),\n",
+       " (2, 1, 4, 0, 5, 3): (2, 1, 4, 0, 5, 3),\n",
+       " (2, 1, 4, 3, 0, 5): (2, 1, 4, 3, 0, 5),\n",
+       " (2, 1, 4, 3, 5, 0): (2, 1, 4, 3, 5, 0),\n",
+       " (2, 1, 4, 5, 0, 3): (2, 1, 4, 5, 0, 3),\n",
+       " (2, 1, 4, 5, 3, 0): (2, 1, 4, 5, 3, 0),\n",
+       " (2, 1, 5, 0, 3, 4): (2, 1, 5, 0, 3, 4),\n",
+       " (2, 1, 5, 0, 4, 3): (2, 1, 5, 0, 4, 3),\n",
+       " (2, 1, 5, 3, 0, 4): (2, 1, 5, 3, 0, 4),\n",
+       " (2, 1, 5, 3, 4, 0): (2, 1, 5, 3, 4, 0),\n",
+       " (2, 1, 5, 4, 0, 3): (2, 1, 5, 4, 0, 3),\n",
+       " (2, 1, 5, 4, 3, 0): (2, 1, 5, 4, 3, 0),\n",
+       " (2, 3, 0, 1, 4, 5): (2, 3, 0, 1, 4, 5),\n",
+       " (2, 3, 0, 1, 5, 4): (2, 3, 0, 1, 5, 4),\n",
+       " (2, 3, 0, 4, 1, 5): (2, 3, 0, 4, 1, 5),\n",
+       " (2, 3, 0, 4, 5, 1): (2, 3, 0, 4, 5, 1),\n",
+       " (2, 3, 0, 5, 1, 4): (2, 3, 0, 5, 1, 4),\n",
+       " (2, 3, 0, 5, 4, 1): (2, 3, 0, 5, 4, 1),\n",
+       " (2, 3, 1, 0, 4, 5): (2, 3, 1, 0, 4, 5),\n",
+       " (2, 3, 1, 0, 5, 4): (2, 3, 1, 0, 5, 4),\n",
+       " (2, 3, 1, 4, 0, 5): (2, 3, 1, 4, 0, 5),\n",
+       " (2, 3, 1, 4, 5, 0): (2, 3, 1, 4, 5, 0),\n",
+       " (2, 3, 1, 5, 0, 4): (2, 3, 1, 5, 0, 4),\n",
+       " (2, 3, 1, 5, 4, 0): (2, 3, 1, 5, 4, 0),\n",
+       " (2, 3, 4, 0, 1, 5): (2, 3, 4, 0, 1, 5),\n",
+       " (2, 3, 4, 0, 5, 1): (2, 3, 4, 0, 5, 1),\n",
+       " (2, 3, 4, 1, 0, 5): (2, 3, 4, 1, 0, 5),\n",
+       " (2, 3, 4, 1, 5, 0): (2, 3, 4, 1, 5, 0),\n",
+       " (2, 3, 4, 5, 0, 1): (2, 3, 4, 5, 0, 1),\n",
+       " (2, 3, 4, 5, 1, 0): (2, 3, 4, 5, 1, 0),\n",
+       " (2, 3, 5, 0, 1, 4): (2, 3, 5, 0, 1, 4),\n",
+       " (2, 3, 5, 0, 4, 1): (2, 3, 5, 0, 4, 1),\n",
+       " (2, 3, 5, 1, 0, 4): (2, 3, 5, 1, 0, 4),\n",
+       " (2, 3, 5, 1, 4, 0): (2, 3, 5, 1, 4, 0),\n",
+       " (2, 3, 5, 4, 0, 1): (2, 3, 5, 4, 0, 1),\n",
+       " (2, 3, 5, 4, 1, 0): (2, 3, 5, 4, 1, 0),\n",
+       " (2, 4, 0, 1, 3, 5): (2, 4, 0, 1, 3, 5),\n",
+       " (2, 4, 0, 1, 5, 3): (2, 4, 0, 1, 5, 3),\n",
+       " (2, 4, 0, 3, 1, 5): (2, 4, 0, 3, 1, 5),\n",
+       " (2, 4, 0, 3, 5, 1): (2, 4, 0, 3, 5, 1),\n",
+       " (2, 4, 0, 5, 1, 3): (2, 4, 0, 5, 1, 3),\n",
+       " (2, 4, 0, 5, 3, 1): (2, 4, 0, 5, 3, 1),\n",
+       " (2, 4, 1, 0, 3, 5): (2, 4, 1, 0, 3, 5),\n",
+       " (2, 4, 1, 0, 5, 3): (2, 4, 1, 0, 5, 3),\n",
+       " (2, 4, 1, 3, 0, 5): (2, 4, 1, 3, 0, 5),\n",
+       " (2, 4, 1, 3, 5, 0): (2, 4, 1, 3, 5, 0),\n",
+       " (2, 4, 1, 5, 0, 3): (2, 4, 1, 5, 0, 3),\n",
+       " (2, 4, 1, 5, 3, 0): (2, 4, 1, 5, 3, 0),\n",
+       " (2, 4, 3, 0, 1, 5): (2, 4, 3, 0, 1, 5),\n",
+       " (2, 4, 3, 0, 5, 1): (2, 4, 3, 0, 5, 1),\n",
+       " (2, 4, 3, 1, 0, 5): (2, 4, 3, 1, 0, 5),\n",
+       " (2, 4, 3, 1, 5, 0): (2, 4, 3, 1, 5, 0),\n",
+       " (2, 4, 3, 5, 0, 1): (2, 4, 3, 5, 0, 1),\n",
+       " (2, 4, 3, 5, 1, 0): (2, 4, 3, 5, 1, 0),\n",
+       " (2, 4, 5, 0, 1, 3): (2, 4, 5, 0, 1, 3),\n",
+       " (2, 4, 5, 0, 3, 1): (2, 4, 5, 0, 3, 1),\n",
+       " (2, 4, 5, 1, 0, 3): (2, 4, 5, 1, 0, 3),\n",
+       " (2, 4, 5, 1, 3, 0): (2, 4, 5, 1, 3, 0),\n",
+       " (2, 4, 5, 3, 0, 1): (2, 4, 5, 3, 0, 1),\n",
+       " (2, 4, 5, 3, 1, 0): (2, 4, 5, 3, 1, 0),\n",
+       " (2, 5, 0, 1, 3, 4): (2, 5, 0, 1, 3, 4),\n",
+       " (2, 5, 0, 1, 4, 3): (2, 5, 0, 1, 4, 3),\n",
+       " (2, 5, 0, 3, 1, 4): (2, 5, 0, 3, 1, 4),\n",
+       " (2, 5, 0, 3, 4, 1): (2, 5, 0, 3, 4, 1),\n",
+       " (2, 5, 0, 4, 1, 3): (2, 5, 0, 4, 1, 3),\n",
+       " (2, 5, 0, 4, 3, 1): (2, 5, 0, 4, 3, 1),\n",
+       " (2, 5, 1, 0, 3, 4): (2, 5, 1, 0, 3, 4),\n",
+       " (2, 5, 1, 0, 4, 3): (2, 5, 1, 0, 4, 3),\n",
+       " (2, 5, 1, 3, 0, 4): (2, 5, 1, 3, 0, 4),\n",
+       " (2, 5, 1, 3, 4, 0): (2, 5, 1, 3, 4, 0),\n",
+       " (2, 5, 1, 4, 0, 3): (2, 5, 1, 4, 0, 3),\n",
+       " (2, 5, 1, 4, 3, 0): (2, 5, 1, 4, 3, 0),\n",
+       " (2, 5, 3, 0, 1, 4): (2, 5, 3, 0, 1, 4),\n",
+       " (2, 5, 3, 0, 4, 1): (2, 5, 3, 0, 4, 1),\n",
+       " (2, 5, 3, 1, 0, 4): (2, 5, 3, 1, 0, 4),\n",
+       " (2, 5, 3, 1, 4, 0): (2, 5, 3, 1, 4, 0),\n",
+       " (2, 5, 3, 4, 0, 1): (2, 5, 3, 4, 0, 1),\n",
+       " (2, 5, 3, 4, 1, 0): (2, 5, 3, 4, 1, 0),\n",
+       " (2, 5, 4, 0, 1, 3): (2, 5, 4, 0, 1, 3),\n",
+       " (2, 5, 4, 0, 3, 1): (2, 5, 4, 0, 3, 1),\n",
+       " (2, 5, 4, 1, 0, 3): (2, 5, 4, 1, 0, 3),\n",
+       " (2, 5, 4, 1, 3, 0): (2, 5, 4, 1, 3, 0),\n",
+       " (2, 5, 4, 3, 0, 1): (2, 5, 4, 3, 0, 1),\n",
+       " (2, 5, 4, 3, 1, 0): (2, 5, 4, 3, 1, 0),\n",
+       " (3, 0, 1, 2, 4, 5): (3, 0, 1, 2, 4, 5),\n",
+       " (3, 0, 1, 2, 5, 4): (3, 0, 1, 2, 5, 4),\n",
+       " (3, 0, 1, 4, 2, 5): (3, 0, 1, 4, 2, 5),\n",
+       " (3, 0, 1, 4, 5, 2): (3, 0, 1, 4, 5, 2),\n",
+       " (3, 0, 1, 5, 2, 4): (3, 0, 1, 5, 2, 4),\n",
+       " (3, 0, 1, 5, 4, 2): (3, 0, 1, 5, 4, 2),\n",
+       " (3, 0, 2, 1, 4, 5): (3, 0, 2, 1, 4, 5),\n",
+       " (3, 0, 2, 1, 5, 4): (3, 0, 2, 1, 5, 4),\n",
+       " (3, 0, 2, 4, 1, 5): (3, 0, 2, 4, 1, 5),\n",
+       " (3, 0, 2, 4, 5, 1): (3, 0, 2, 4, 5, 1),\n",
+       " (3, 0, 2, 5, 1, 4): (3, 0, 2, 5, 1, 4),\n",
+       " (3, 0, 2, 5, 4, 1): (3, 0, 2, 5, 4, 1),\n",
+       " (3, 0, 4, 1, 2, 5): (3, 0, 4, 1, 2, 5),\n",
+       " (3, 0, 4, 1, 5, 2): (3, 0, 4, 1, 5, 2),\n",
+       " (3, 0, 4, 2, 1, 5): (3, 0, 4, 2, 1, 5),\n",
+       " (3, 0, 4, 2, 5, 1): (3, 0, 4, 2, 5, 1),\n",
+       " (3, 0, 4, 5, 1, 2): (3, 0, 4, 5, 1, 2),\n",
+       " (3, 0, 4, 5, 2, 1): (3, 0, 4, 5, 2, 1),\n",
+       " (3, 0, 5, 1, 2, 4): (3, 0, 5, 1, 2, 4),\n",
+       " (3, 0, 5, 1, 4, 2): (3, 0, 5, 1, 4, 2),\n",
+       " (3, 0, 5, 2, 1, 4): (3, 0, 5, 2, 1, 4),\n",
+       " (3, 0, 5, 2, 4, 1): (3, 0, 5, 2, 4, 1),\n",
+       " (3, 0, 5, 4, 1, 2): (3, 0, 5, 4, 1, 2),\n",
+       " (3, 0, 5, 4, 2, 1): (3, 0, 5, 4, 2, 1),\n",
+       " (3, 1, 0, 2, 4, 5): (3, 1, 0, 2, 4, 5),\n",
+       " (3, 1, 0, 2, 5, 4): (3, 1, 0, 2, 5, 4),\n",
+       " (3, 1, 0, 4, 2, 5): (3, 1, 0, 4, 2, 5),\n",
+       " (3, 1, 0, 4, 5, 2): (3, 1, 0, 4, 5, 2),\n",
+       " (3, 1, 0, 5, 2, 4): (3, 1, 0, 5, 2, 4),\n",
+       " (3, 1, 0, 5, 4, 2): (3, 1, 0, 5, 4, 2),\n",
+       " (3, 1, 2, 0, 4, 5): (3, 1, 2, 0, 4, 5),\n",
+       " (3, 1, 2, 0, 5, 4): (3, 1, 2, 0, 5, 4),\n",
+       " (3, 1, 2, 4, 0, 5): (3, 1, 2, 4, 0, 5),\n",
+       " (3, 1, 2, 4, 5, 0): (3, 1, 2, 4, 5, 0),\n",
+       " (3, 1, 2, 5, 0, 4): (3, 1, 2, 5, 0, 4),\n",
+       " (3, 1, 2, 5, 4, 0): (3, 1, 2, 5, 4, 0),\n",
+       " (3, 1, 4, 0, 2, 5): (3, 1, 4, 0, 2, 5),\n",
+       " (3, 1, 4, 0, 5, 2): (3, 1, 4, 0, 5, 2),\n",
+       " (3, 1, 4, 2, 0, 5): (3, 1, 4, 2, 0, 5),\n",
+       " (3, 1, 4, 2, 5, 0): (3, 1, 4, 2, 5, 0),\n",
+       " (3, 1, 4, 5, 0, 2): (3, 1, 4, 5, 0, 2),\n",
+       " (3, 1, 4, 5, 2, 0): (3, 1, 4, 5, 2, 0),\n",
+       " (3, 1, 5, 0, 2, 4): (3, 1, 5, 0, 2, 4),\n",
+       " (3, 1, 5, 0, 4, 2): (3, 1, 5, 0, 4, 2),\n",
+       " (3, 1, 5, 2, 0, 4): (3, 1, 5, 2, 0, 4),\n",
+       " (3, 1, 5, 2, 4, 0): (3, 1, 5, 2, 4, 0),\n",
+       " (3, 1, 5, 4, 0, 2): (3, 1, 5, 4, 0, 2),\n",
+       " (3, 1, 5, 4, 2, 0): (3, 1, 5, 4, 2, 0),\n",
+       " (3, 2, 0, 1, 4, 5): (3, 2, 0, 1, 4, 5),\n",
+       " (3, 2, 0, 1, 5, 4): (3, 2, 0, 1, 5, 4),\n",
+       " (3, 2, 0, 4, 1, 5): (3, 2, 0, 4, 1, 5),\n",
+       " (3, 2, 0, 4, 5, 1): (3, 2, 0, 4, 5, 1),\n",
+       " (3, 2, 0, 5, 1, 4): (3, 2, 0, 5, 1, 4),\n",
+       " (3, 2, 0, 5, 4, 1): (3, 2, 0, 5, 4, 1),\n",
+       " (3, 2, 1, 0, 4, 5): (3, 2, 1, 0, 4, 5),\n",
+       " (3, 2, 1, 0, 5, 4): (3, 2, 1, 0, 5, 4),\n",
+       " (3, 2, 1, 4, 0, 5): (3, 2, 1, 4, 0, 5),\n",
+       " (3, 2, 1, 4, 5, 0): (3, 2, 1, 4, 5, 0),\n",
+       " (3, 2, 1, 5, 0, 4): (3, 2, 1, 5, 0, 4),\n",
+       " (3, 2, 1, 5, 4, 0): (3, 2, 1, 5, 4, 0),\n",
+       " (3, 2, 4, 0, 1, 5): (3, 2, 4, 0, 1, 5),\n",
+       " (3, 2, 4, 0, 5, 1): (3, 2, 4, 0, 5, 1),\n",
+       " (3, 2, 4, 1, 0, 5): (3, 2, 4, 1, 0, 5),\n",
+       " (3, 2, 4, 1, 5, 0): (3, 2, 4, 1, 5, 0),\n",
+       " (3, 2, 4, 5, 0, 1): (3, 2, 4, 5, 0, 1),\n",
+       " (3, 2, 4, 5, 1, 0): (3, 2, 4, 5, 1, 0),\n",
+       " (3, 2, 5, 0, 1, 4): (3, 2, 5, 0, 1, 4),\n",
+       " (3, 2, 5, 0, 4, 1): (3, 2, 5, 0, 4, 1),\n",
+       " (3, 2, 5, 1, 0, 4): (3, 2, 5, 1, 0, 4),\n",
+       " (3, 2, 5, 1, 4, 0): (3, 2, 5, 1, 4, 0),\n",
+       " (3, 2, 5, 4, 0, 1): (3, 2, 5, 4, 0, 1),\n",
+       " (3, 2, 5, 4, 1, 0): (3, 2, 5, 4, 1, 0),\n",
+       " (3, 4, 0, 1, 2, 5): (3, 4, 0, 1, 2, 5),\n",
+       " (3, 4, 0, 1, 5, 2): (3, 4, 0, 1, 5, 2),\n",
+       " (3, 4, 0, 2, 1, 5): (3, 4, 0, 2, 1, 5),\n",
+       " (3, 4, 0, 2, 5, 1): (3, 4, 0, 2, 5, 1),\n",
+       " (3, 4, 0, 5, 1, 2): (3, 4, 0, 5, 1, 2),\n",
+       " (3, 4, 0, 5, 2, 1): (3, 4, 0, 5, 2, 1),\n",
+       " (3, 4, 1, 0, 2, 5): (3, 4, 1, 0, 2, 5),\n",
+       " (3, 4, 1, 0, 5, 2): (3, 4, 1, 0, 5, 2),\n",
+       " (3, 4, 1, 2, 0, 5): (3, 4, 1, 2, 0, 5),\n",
+       " (3, 4, 1, 2, 5, 0): (3, 4, 1, 2, 5, 0),\n",
+       " (3, 4, 1, 5, 0, 2): (3, 4, 1, 5, 0, 2),\n",
+       " (3, 4, 1, 5, 2, 0): (3, 4, 1, 5, 2, 0),\n",
+       " (3, 4, 2, 0, 1, 5): (3, 4, 2, 0, 1, 5),\n",
+       " (3, 4, 2, 0, 5, 1): (3, 4, 2, 0, 5, 1),\n",
+       " (3, 4, 2, 1, 0, 5): (3, 4, 2, 1, 0, 5),\n",
+       " (3, 4, 2, 1, 5, 0): (3, 4, 2, 1, 5, 0),\n",
+       " (3, 4, 2, 5, 0, 1): (3, 4, 2, 5, 0, 1),\n",
+       " (3, 4, 2, 5, 1, 0): (3, 4, 2, 5, 1, 0),\n",
+       " (3, 4, 5, 0, 1, 2): (3, 4, 5, 0, 1, 2),\n",
+       " (3, 4, 5, 0, 2, 1): (3, 4, 5, 0, 2, 1),\n",
+       " (3, 4, 5, 1, 0, 2): (3, 4, 5, 1, 0, 2),\n",
+       " (3, 4, 5, 1, 2, 0): (3, 4, 5, 1, 2, 0),\n",
+       " (3, 4, 5, 2, 0, 1): (3, 4, 5, 2, 0, 1),\n",
+       " (3, 4, 5, 2, 1, 0): (3, 4, 5, 2, 1, 0),\n",
+       " (3, 5, 0, 1, 2, 4): (3, 5, 0, 1, 2, 4),\n",
+       " (3, 5, 0, 1, 4, 2): (3, 5, 0, 1, 4, 2),\n",
+       " (3, 5, 0, 2, 1, 4): (3, 5, 0, 2, 1, 4),\n",
+       " (3, 5, 0, 2, 4, 1): (3, 5, 0, 2, 4, 1),\n",
+       " (3, 5, 0, 4, 1, 2): (3, 5, 0, 4, 1, 2),\n",
+       " (3, 5, 0, 4, 2, 1): (3, 5, 0, 4, 2, 1),\n",
+       " (3, 5, 1, 0, 2, 4): (3, 5, 1, 0, 2, 4),\n",
+       " (3, 5, 1, 0, 4, 2): (3, 5, 1, 0, 4, 2),\n",
+       " (3, 5, 1, 2, 0, 4): (3, 5, 1, 2, 0, 4),\n",
+       " (3, 5, 1, 2, 4, 0): (3, 5, 1, 2, 4, 0),\n",
+       " (3, 5, 1, 4, 0, 2): (3, 5, 1, 4, 0, 2),\n",
+       " (3, 5, 1, 4, 2, 0): (3, 5, 1, 4, 2, 0),\n",
+       " (3, 5, 2, 0, 1, 4): (3, 5, 2, 0, 1, 4),\n",
+       " (3, 5, 2, 0, 4, 1): (3, 5, 2, 0, 4, 1),\n",
+       " (3, 5, 2, 1, 0, 4): (3, 5, 2, 1, 0, 4),\n",
+       " (3, 5, 2, 1, 4, 0): (3, 5, 2, 1, 4, 0),\n",
+       " (3, 5, 2, 4, 0, 1): (3, 5, 2, 4, 0, 1),\n",
+       " (3, 5, 2, 4, 1, 0): (3, 5, 2, 4, 1, 0),\n",
+       " (3, 5, 4, 0, 1, 2): (3, 5, 4, 0, 1, 2),\n",
+       " (3, 5, 4, 0, 2, 1): (3, 5, 4, 0, 2, 1),\n",
+       " (3, 5, 4, 1, 0, 2): (3, 5, 4, 1, 0, 2),\n",
+       " (3, 5, 4, 1, 2, 0): (3, 5, 4, 1, 2, 0),\n",
+       " (3, 5, 4, 2, 0, 1): (3, 5, 4, 2, 0, 1),\n",
+       " (3, 5, 4, 2, 1, 0): (3, 5, 4, 2, 1, 0),\n",
+       " (4, 0, 1, 2, 3, 5): (4, 0, 1, 2, 3, 5),\n",
+       " (4, 0, 1, 2, 5, 3): (4, 0, 1, 2, 5, 3),\n",
+       " (4, 0, 1, 3, 2, 5): (4, 0, 1, 3, 2, 5),\n",
+       " (4, 0, 1, 3, 5, 2): (4, 0, 1, 3, 5, 2),\n",
+       " (4, 0, 1, 5, 2, 3): (4, 0, 1, 5, 2, 3),\n",
+       " (4, 0, 1, 5, 3, 2): (4, 0, 1, 5, 3, 2),\n",
+       " (4, 0, 2, 1, 3, 5): (4, 0, 2, 1, 3, 5),\n",
+       " (4, 0, 2, 1, 5, 3): (4, 0, 2, 1, 5, 3),\n",
+       " (4, 0, 2, 3, 1, 5): (4, 0, 2, 3, 1, 5),\n",
+       " (4, 0, 2, 3, 5, 1): (4, 0, 2, 3, 5, 1),\n",
+       " (4, 0, 2, 5, 1, 3): (4, 0, 2, 5, 1, 3),\n",
+       " (4, 0, 2, 5, 3, 1): (4, 0, 2, 5, 3, 1),\n",
+       " (4, 0, 3, 1, 2, 5): (4, 0, 3, 1, 2, 5),\n",
+       " (4, 0, 3, 1, 5, 2): (4, 0, 3, 1, 5, 2),\n",
+       " (4, 0, 3, 2, 1, 5): (4, 0, 3, 2, 1, 5),\n",
+       " (4, 0, 3, 2, 5, 1): (4, 0, 3, 2, 5, 1),\n",
+       " (4, 0, 3, 5, 1, 2): (4, 0, 3, 5, 1, 2),\n",
+       " (4, 0, 3, 5, 2, 1): (4, 0, 3, 5, 2, 1),\n",
+       " (4, 0, 5, 1, 2, 3): (4, 0, 5, 1, 2, 3),\n",
+       " (4, 0, 5, 1, 3, 2): (4, 0, 5, 1, 3, 2),\n",
+       " (4, 0, 5, 2, 1, 3): (4, 0, 5, 2, 1, 3),\n",
+       " (4, 0, 5, 2, 3, 1): (4, 0, 5, 2, 3, 1),\n",
+       " (4, 0, 5, 3, 1, 2): (4, 0, 5, 3, 1, 2),\n",
+       " (4, 0, 5, 3, 2, 1): (4, 0, 5, 3, 2, 1),\n",
+       " (4, 1, 0, 2, 3, 5): (4, 1, 0, 2, 3, 5),\n",
+       " (4, 1, 0, 2, 5, 3): (4, 1, 0, 2, 5, 3),\n",
+       " (4, 1, 0, 3, 2, 5): (4, 1, 0, 3, 2, 5),\n",
+       " (4, 1, 0, 3, 5, 2): (4, 1, 0, 3, 5, 2),\n",
+       " (4, 1, 0, 5, 2, 3): (4, 1, 0, 5, 2, 3),\n",
+       " (4, 1, 0, 5, 3, 2): (4, 1, 0, 5, 3, 2),\n",
+       " (4, 1, 2, 0, 3, 5): (4, 1, 2, 0, 3, 5),\n",
+       " (4, 1, 2, 0, 5, 3): (4, 1, 2, 0, 5, 3),\n",
+       " (4, 1, 2, 3, 0, 5): (4, 1, 2, 3, 0, 5),\n",
+       " (4, 1, 2, 3, 5, 0): (4, 1, 2, 3, 5, 0),\n",
+       " (4, 1, 2, 5, 0, 3): (4, 1, 2, 5, 0, 3),\n",
+       " (4, 1, 2, 5, 3, 0): (4, 1, 2, 5, 3, 0),\n",
+       " (4, 1, 3, 0, 2, 5): (4, 1, 3, 0, 2, 5),\n",
+       " (4, 1, 3, 0, 5, 2): (4, 1, 3, 0, 5, 2),\n",
+       " (4, 1, 3, 2, 0, 5): (4, 1, 3, 2, 0, 5),\n",
+       " (4, 1, 3, 2, 5, 0): (4, 1, 3, 2, 5, 0),\n",
+       " (4, 1, 3, 5, 0, 2): (4, 1, 3, 5, 0, 2),\n",
+       " (4, 1, 3, 5, 2, 0): (4, 1, 3, 5, 2, 0),\n",
+       " (4, 1, 5, 0, 2, 3): (4, 1, 5, 0, 2, 3),\n",
+       " (4, 1, 5, 0, 3, 2): (4, 1, 5, 0, 3, 2),\n",
+       " (4, 1, 5, 2, 0, 3): (4, 1, 5, 2, 0, 3),\n",
+       " (4, 1, 5, 2, 3, 0): (4, 1, 5, 2, 3, 0),\n",
+       " (4, 1, 5, 3, 0, 2): (4, 1, 5, 3, 0, 2),\n",
+       " (4, 1, 5, 3, 2, 0): (4, 1, 5, 3, 2, 0),\n",
+       " (4, 2, 0, 1, 3, 5): (4, 2, 0, 1, 3, 5),\n",
+       " (4, 2, 0, 1, 5, 3): (4, 2, 0, 1, 5, 3),\n",
+       " (4, 2, 0, 3, 1, 5): (4, 2, 0, 3, 1, 5),\n",
+       " (4, 2, 0, 3, 5, 1): (4, 2, 0, 3, 5, 1),\n",
+       " (4, 2, 0, 5, 1, 3): (4, 2, 0, 5, 1, 3),\n",
+       " (4, 2, 0, 5, 3, 1): (4, 2, 0, 5, 3, 1),\n",
+       " (4, 2, 1, 0, 3, 5): (4, 2, 1, 0, 3, 5),\n",
+       " (4, 2, 1, 0, 5, 3): (4, 2, 1, 0, 5, 3),\n",
+       " (4, 2, 1, 3, 0, 5): (4, 2, 1, 3, 0, 5),\n",
+       " (4, 2, 1, 3, 5, 0): (4, 2, 1, 3, 5, 0),\n",
+       " (4, 2, 1, 5, 0, 3): (4, 2, 1, 5, 0, 3),\n",
+       " (4, 2, 1, 5, 3, 0): (4, 2, 1, 5, 3, 0),\n",
+       " (4, 2, 3, 0, 1, 5): (4, 2, 3, 0, 1, 5),\n",
+       " (4, 2, 3, 0, 5, 1): (4, 2, 3, 0, 5, 1),\n",
+       " (4, 2, 3, 1, 0, 5): (4, 2, 3, 1, 0, 5),\n",
+       " (4, 2, 3, 1, 5, 0): (4, 2, 3, 1, 5, 0),\n",
+       " (4, 2, 3, 5, 0, 1): (4, 2, 3, 5, 0, 1),\n",
+       " (4, 2, 3, 5, 1, 0): (4, 2, 3, 5, 1, 0),\n",
+       " (4, 2, 5, 0, 1, 3): (4, 2, 5, 0, 1, 3),\n",
+       " (4, 2, 5, 0, 3, 1): (4, 2, 5, 0, 3, 1),\n",
+       " (4, 2, 5, 1, 0, 3): (4, 2, 5, 1, 0, 3),\n",
+       " (4, 2, 5, 1, 3, 0): (4, 2, 5, 1, 3, 0),\n",
+       " (4, 2, 5, 3, 0, 1): (4, 2, 5, 3, 0, 1),\n",
+       " (4, 2, 5, 3, 1, 0): (4, 2, 5, 3, 1, 0),\n",
+       " (4, 3, 0, 1, 2, 5): (4, 3, 0, 1, 2, 5),\n",
+       " (4, 3, 0, 1, 5, 2): (4, 3, 0, 1, 5, 2),\n",
+       " (4, 3, 0, 2, 1, 5): (4, 3, 0, 2, 1, 5),\n",
+       " (4, 3, 0, 2, 5, 1): (4, 3, 0, 2, 5, 1),\n",
+       " (4, 3, 0, 5, 1, 2): (4, 3, 0, 5, 1, 2),\n",
+       " (4, 3, 0, 5, 2, 1): (4, 3, 0, 5, 2, 1),\n",
+       " (4, 3, 1, 0, 2, 5): (4, 3, 1, 0, 2, 5),\n",
+       " (4, 3, 1, 0, 5, 2): (4, 3, 1, 0, 5, 2),\n",
+       " (4, 3, 1, 2, 0, 5): (4, 3, 1, 2, 0, 5),\n",
+       " (4, 3, 1, 2, 5, 0): (4, 3, 1, 2, 5, 0),\n",
+       " (4, 3, 1, 5, 0, 2): (4, 3, 1, 5, 0, 2),\n",
+       " (4, 3, 1, 5, 2, 0): (4, 3, 1, 5, 2, 0),\n",
+       " (4, 3, 2, 0, 1, 5): (4, 3, 2, 0, 1, 5),\n",
+       " (4, 3, 2, 0, 5, 1): (4, 3, 2, 0, 5, 1),\n",
+       " (4, 3, 2, 1, 0, 5): (4, 3, 2, 1, 0, 5),\n",
+       " (4, 3, 2, 1, 5, 0): (4, 3, 2, 1, 5, 0),\n",
+       " (4, 3, 2, 5, 0, 1): (4, 3, 2, 5, 0, 1),\n",
+       " (4, 3, 2, 5, 1, 0): (4, 3, 2, 5, 1, 0),\n",
+       " (4, 3, 5, 0, 1, 2): (4, 3, 5, 0, 1, 2),\n",
+       " (4, 3, 5, 0, 2, 1): (4, 3, 5, 0, 2, 1),\n",
+       " (4, 3, 5, 1, 0, 2): (4, 3, 5, 1, 0, 2),\n",
+       " (4, 3, 5, 1, 2, 0): (4, 3, 5, 1, 2, 0),\n",
+       " (4, 3, 5, 2, 0, 1): (4, 3, 5, 2, 0, 1),\n",
+       " (4, 3, 5, 2, 1, 0): (4, 3, 5, 2, 1, 0),\n",
+       " (4, 5, 0, 1, 2, 3): (4, 5, 0, 1, 2, 3),\n",
+       " (4, 5, 0, 1, 3, 2): (4, 5, 0, 1, 3, 2),\n",
+       " (4, 5, 0, 2, 1, 3): (4, 5, 0, 2, 1, 3),\n",
+       " (4, 5, 0, 2, 3, 1): (4, 5, 0, 2, 3, 1),\n",
+       " (4, 5, 0, 3, 1, 2): (4, 5, 0, 3, 1, 2),\n",
+       " (4, 5, 0, 3, 2, 1): (4, 5, 0, 3, 2, 1),\n",
+       " (4, 5, 1, 0, 2, 3): (4, 5, 1, 0, 2, 3),\n",
+       " (4, 5, 1, 0, 3, 2): (4, 5, 1, 0, 3, 2),\n",
+       " (4, 5, 1, 2, 0, 3): (4, 5, 1, 2, 0, 3),\n",
+       " (4, 5, 1, 2, 3, 0): (4, 5, 1, 2, 3, 0),\n",
+       " (4, 5, 1, 3, 0, 2): (4, 5, 1, 3, 0, 2),\n",
+       " (4, 5, 1, 3, 2, 0): (4, 5, 1, 3, 2, 0),\n",
+       " (4, 5, 2, 0, 1, 3): (4, 5, 2, 0, 1, 3),\n",
+       " (4, 5, 2, 0, 3, 1): (4, 5, 2, 0, 3, 1),\n",
+       " (4, 5, 2, 1, 0, 3): (4, 5, 2, 1, 0, 3),\n",
+       " (4, 5, 2, 1, 3, 0): (4, 5, 2, 1, 3, 0),\n",
+       " (4, 5, 2, 3, 0, 1): (4, 5, 2, 3, 0, 1),\n",
+       " (4, 5, 2, 3, 1, 0): (4, 5, 2, 3, 1, 0),\n",
+       " (4, 5, 3, 0, 1, 2): (4, 5, 3, 0, 1, 2),\n",
+       " (4, 5, 3, 0, 2, 1): (4, 5, 3, 0, 2, 1),\n",
+       " (4, 5, 3, 1, 0, 2): (4, 5, 3, 1, 0, 2),\n",
+       " (4, 5, 3, 1, 2, 0): (4, 5, 3, 1, 2, 0),\n",
+       " (4, 5, 3, 2, 0, 1): (4, 5, 3, 2, 0, 1),\n",
+       " (4, 5, 3, 2, 1, 0): (4, 5, 3, 2, 1, 0),\n",
+       " (5, 0, 1, 2, 3, 4): (5, 0, 1, 2, 3, 4),\n",
+       " (5, 0, 1, 2, 4, 3): (5, 0, 1, 2, 4, 3),\n",
+       " (5, 0, 1, 3, 2, 4): (5, 0, 1, 3, 2, 4),\n",
+       " (5, 0, 1, 3, 4, 2): (5, 0, 1, 3, 4, 2),\n",
+       " (5, 0, 1, 4, 2, 3): (5, 0, 1, 4, 2, 3),\n",
+       " (5, 0, 1, 4, 3, 2): (5, 0, 1, 4, 3, 2),\n",
+       " (5, 0, 2, 1, 3, 4): (5, 0, 2, 1, 3, 4),\n",
+       " (5, 0, 2, 1, 4, 3): (5, 0, 2, 1, 4, 3),\n",
+       " (5, 0, 2, 3, 1, 4): (5, 0, 2, 3, 1, 4),\n",
+       " (5, 0, 2, 3, 4, 1): (5, 0, 2, 3, 4, 1),\n",
+       " (5, 0, 2, 4, 1, 3): (5, 0, 2, 4, 1, 3),\n",
+       " (5, 0, 2, 4, 3, 1): (5, 0, 2, 4, 3, 1),\n",
+       " (5, 0, 3, 1, 2, 4): (5, 0, 3, 1, 2, 4),\n",
+       " (5, 0, 3, 1, 4, 2): (5, 0, 3, 1, 4, 2),\n",
+       " (5, 0, 3, 2, 1, 4): (5, 0, 3, 2, 1, 4),\n",
+       " (5, 0, 3, 2, 4, 1): (5, 0, 3, 2, 4, 1),\n",
+       " (5, 0, 3, 4, 1, 2): (5, 0, 3, 4, 1, 2),\n",
+       " (5, 0, 3, 4, 2, 1): (5, 0, 3, 4, 2, 1),\n",
+       " (5, 0, 4, 1, 2, 3): (5, 0, 4, 1, 2, 3),\n",
+       " (5, 0, 4, 1, 3, 2): (5, 0, 4, 1, 3, 2),\n",
+       " (5, 0, 4, 2, 1, 3): (5, 0, 4, 2, 1, 3),\n",
+       " (5, 0, 4, 2, 3, 1): (5, 0, 4, 2, 3, 1),\n",
+       " (5, 0, 4, 3, 1, 2): (5, 0, 4, 3, 1, 2),\n",
+       " (5, 0, 4, 3, 2, 1): (5, 0, 4, 3, 2, 1),\n",
+       " (5, 1, 0, 2, 3, 4): (5, 1, 0, 2, 3, 4),\n",
+       " (5, 1, 0, 2, 4, 3): (5, 1, 0, 2, 4, 3),\n",
+       " (5, 1, 0, 3, 2, 4): (5, 1, 0, 3, 2, 4),\n",
+       " (5, 1, 0, 3, 4, 2): (5, 1, 0, 3, 4, 2),\n",
+       " (5, 1, 0, 4, 2, 3): (5, 1, 0, 4, 2, 3),\n",
+       " (5, 1, 0, 4, 3, 2): (5, 1, 0, 4, 3, 2),\n",
+       " (5, 1, 2, 0, 3, 4): (5, 1, 2, 0, 3, 4),\n",
+       " (5, 1, 2, 0, 4, 3): (5, 1, 2, 0, 4, 3),\n",
+       " (5, 1, 2, 3, 0, 4): (5, 1, 2, 3, 0, 4),\n",
+       " (5, 1, 2, 3, 4, 0): (5, 1, 2, 3, 4, 0),\n",
+       " (5, 1, 2, 4, 0, 3): (5, 1, 2, 4, 0, 3),\n",
+       " (5, 1, 2, 4, 3, 0): (5, 1, 2, 4, 3, 0),\n",
+       " (5, 1, 3, 0, 2, 4): (5, 1, 3, 0, 2, 4),\n",
+       " (5, 1, 3, 0, 4, 2): (5, 1, 3, 0, 4, 2),\n",
+       " (5, 1, 3, 2, 0, 4): (5, 1, 3, 2, 0, 4),\n",
+       " (5, 1, 3, 2, 4, 0): (5, 1, 3, 2, 4, 0),\n",
+       " (5, 1, 3, 4, 0, 2): (5, 1, 3, 4, 0, 2),\n",
+       " (5, 1, 3, 4, 2, 0): (5, 1, 3, 4, 2, 0),\n",
+       " (5, 1, 4, 0, 2, 3): (5, 1, 4, 0, 2, 3),\n",
+       " (5, 1, 4, 0, 3, 2): (5, 1, 4, 0, 3, 2),\n",
+       " (5, 1, 4, 2, 0, 3): (5, 1, 4, 2, 0, 3),\n",
+       " (5, 1, 4, 2, 3, 0): (5, 1, 4, 2, 3, 0),\n",
+       " (5, 1, 4, 3, 0, 2): (5, 1, 4, 3, 0, 2),\n",
+       " (5, 1, 4, 3, 2, 0): (5, 1, 4, 3, 2, 0),\n",
+       " (5, 2, 0, 1, 3, 4): (5, 2, 0, 1, 3, 4),\n",
+       " (5, 2, 0, 1, 4, 3): (5, 2, 0, 1, 4, 3),\n",
+       " (5, 2, 0, 3, 1, 4): (5, 2, 0, 3, 1, 4),\n",
+       " (5, 2, 0, 3, 4, 1): (5, 2, 0, 3, 4, 1),\n",
+       " (5, 2, 0, 4, 1, 3): (5, 2, 0, 4, 1, 3),\n",
+       " (5, 2, 0, 4, 3, 1): (5, 2, 0, 4, 3, 1),\n",
+       " (5, 2, 1, 0, 3, 4): (5, 2, 1, 0, 3, 4),\n",
+       " (5, 2, 1, 0, 4, 3): (5, 2, 1, 0, 4, 3),\n",
+       " (5, 2, 1, 3, 0, 4): (5, 2, 1, 3, 0, 4),\n",
+       " (5, 2, 1, 3, 4, 0): (5, 2, 1, 3, 4, 0),\n",
+       " (5, 2, 1, 4, 0, 3): (5, 2, 1, 4, 0, 3),\n",
+       " (5, 2, 1, 4, 3, 0): (5, 2, 1, 4, 3, 0),\n",
+       " (5, 2, 3, 0, 1, 4): (5, 2, 3, 0, 1, 4),\n",
+       " (5, 2, 3, 0, 4, 1): (5, 2, 3, 0, 4, 1),\n",
+       " (5, 2, 3, 1, 0, 4): (5, 2, 3, 1, 0, 4),\n",
+       " (5, 2, 3, 1, 4, 0): (5, 2, 3, 1, 4, 0),\n",
+       " (5, 2, 3, 4, 0, 1): (5, 2, 3, 4, 0, 1),\n",
+       " (5, 2, 3, 4, 1, 0): (5, 2, 3, 4, 1, 0),\n",
+       " (5, 2, 4, 0, 1, 3): (5, 2, 4, 0, 1, 3),\n",
+       " (5, 2, 4, 0, 3, 1): (5, 2, 4, 0, 3, 1),\n",
+       " (5, 2, 4, 1, 0, 3): (5, 2, 4, 1, 0, 3),\n",
+       " (5, 2, 4, 1, 3, 0): (5, 2, 4, 1, 3, 0),\n",
+       " (5, 2, 4, 3, 0, 1): (5, 2, 4, 3, 0, 1),\n",
+       " (5, 2, 4, 3, 1, 0): (5, 2, 4, 3, 1, 0),\n",
+       " (5, 3, 0, 1, 2, 4): (5, 3, 0, 1, 2, 4),\n",
+       " (5, 3, 0, 1, 4, 2): (5, 3, 0, 1, 4, 2),\n",
+       " (5, 3, 0, 2, 1, 4): (5, 3, 0, 2, 1, 4),\n",
+       " (5, 3, 0, 2, 4, 1): (5, 3, 0, 2, 4, 1),\n",
+       " (5, 3, 0, 4, 1, 2): (5, 3, 0, 4, 1, 2),\n",
+       " (5, 3, 0, 4, 2, 1): (5, 3, 0, 4, 2, 1),\n",
+       " (5, 3, 1, 0, 2, 4): (5, 3, 1, 0, 2, 4),\n",
+       " (5, 3, 1, 0, 4, 2): (5, 3, 1, 0, 4, 2),\n",
+       " (5, 3, 1, 2, 0, 4): (5, 3, 1, 2, 0, 4),\n",
+       " (5, 3, 1, 2, 4, 0): (5, 3, 1, 2, 4, 0),\n",
+       " (5, 3, 1, 4, 0, 2): (5, 3, 1, 4, 0, 2),\n",
+       " (5, 3, 1, 4, 2, 0): (5, 3, 1, 4, 2, 0),\n",
+       " (5, 3, 2, 0, 1, 4): (5, 3, 2, 0, 1, 4),\n",
+       " (5, 3, 2, 0, 4, 1): (5, 3, 2, 0, 4, 1),\n",
+       " (5, 3, 2, 1, 0, 4): (5, 3, 2, 1, 0, 4),\n",
+       " (5, 3, 2, 1, 4, 0): (5, 3, 2, 1, 4, 0),\n",
+       " (5, 3, 2, 4, 0, 1): (5, 3, 2, 4, 0, 1),\n",
+       " (5, 3, 2, 4, 1, 0): (5, 3, 2, 4, 1, 0),\n",
+       " (5, 3, 4, 0, 1, 2): (5, 3, 4, 0, 1, 2),\n",
+       " (5, 3, 4, 0, 2, 1): (5, 3, 4, 0, 2, 1),\n",
+       " (5, 3, 4, 1, 0, 2): (5, 3, 4, 1, 0, 2),\n",
+       " (5, 3, 4, 1, 2, 0): (5, 3, 4, 1, 2, 0),\n",
+       " (5, 3, 4, 2, 0, 1): (5, 3, 4, 2, 0, 1),\n",
+       " (5, 3, 4, 2, 1, 0): (5, 3, 4, 2, 1, 0),\n",
+       " (5, 4, 0, 1, 2, 3): (5, 4, 0, 1, 2, 3),\n",
+       " (5, 4, 0, 1, 3, 2): (5, 4, 0, 1, 3, 2),\n",
+       " (5, 4, 0, 2, 1, 3): (5, 4, 0, 2, 1, 3),\n",
+       " (5, 4, 0, 2, 3, 1): (5, 4, 0, 2, 3, 1),\n",
+       " (5, 4, 0, 3, 1, 2): (5, 4, 0, 3, 1, 2),\n",
+       " (5, 4, 0, 3, 2, 1): (5, 4, 0, 3, 2, 1),\n",
+       " (5, 4, 1, 0, 2, 3): (5, 4, 1, 0, 2, 3),\n",
+       " (5, 4, 1, 0, 3, 2): (5, 4, 1, 0, 3, 2),\n",
+       " (5, 4, 1, 2, 0, 3): (5, 4, 1, 2, 0, 3),\n",
+       " (5, 4, 1, 2, 3, 0): (5, 4, 1, 2, 3, 0),\n",
+       " (5, 4, 1, 3, 0, 2): (5, 4, 1, 3, 0, 2),\n",
+       " (5, 4, 1, 3, 2, 0): (5, 4, 1, 3, 2, 0),\n",
+       " (5, 4, 2, 0, 1, 3): (5, 4, 2, 0, 1, 3),\n",
+       " (5, 4, 2, 0, 3, 1): (5, 4, 2, 0, 3, 1),\n",
+       " (5, 4, 2, 1, 0, 3): (5, 4, 2, 1, 0, 3),\n",
+       " (5, 4, 2, 1, 3, 0): (5, 4, 2, 1, 3, 0),\n",
+       " (5, 4, 2, 3, 0, 1): (5, 4, 2, 3, 0, 1),\n",
+       " (5, 4, 2, 3, 1, 0): (5, 4, 2, 3, 1, 0),\n",
+       " (5, 4, 3, 0, 1, 2): (5, 4, 3, 0, 1, 2),\n",
+       " (5, 4, 3, 0, 2, 1): (5, 4, 3, 0, 2, 1),\n",
+       " (5, 4, 3, 1, 0, 2): (5, 4, 3, 1, 0, 2),\n",
+       " (5, 4, 3, 1, 2, 0): (5, 4, 3, 1, 2, 0),\n",
+       " (5, 4, 3, 2, 0, 1): (5, 4, 3, 2, 0, 1),\n",
+       " (5, 4, 3, 2, 1, 0): (5, 4, 3, 2, 1, 0)}"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions6 = {t: t for t in set(itertools.permutations(list(range(6))))}\n",
+    "transpositions6"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(((2, 4, 3, 5, 0, 1), (1, 2), <AmscoFillStyle.reverse_each_row: 3>),\n",
+       " -1437.9908206760847)"
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_b, score = amsco_break(c7b, translist=transpositions6)\n",
+    "key_b, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[[AmscoSlice(index=0, start=0, end=1),\n",
+       "  AmscoSlice(index=1, start=1, end=3),\n",
+       "  AmscoSlice(index=2, start=3, end=4),\n",
+       "  AmscoSlice(index=3, start=4, end=6),\n",
+       "  AmscoSlice(index=4, start=6, end=7),\n",
+       "  AmscoSlice(index=5, start=7, end=9)],\n",
+       " [AmscoSlice(index=6, start=9, end=11),\n",
+       "  AmscoSlice(index=7, start=11, end=12),\n",
+       "  AmscoSlice(index=8, start=12, end=14),\n",
+       "  AmscoSlice(index=9, start=14, end=15),\n",
+       "  AmscoSlice(index=10, start=15, end=17),\n",
+       "  AmscoSlice(index=11, start=17, end=18)],\n",
+       " [AmscoSlice(index=12, start=18, end=19),\n",
+       "  AmscoSlice(index=13, start=19, end=21),\n",
+       "  AmscoSlice(index=14, start=21, end=22),\n",
+       "  AmscoSlice(index=15, start=22, end=24),\n",
+       "  AmscoSlice(index=16, start=24, end=25),\n",
+       "  AmscoSlice(index=17, start=25, end=27)],\n",
+       " [AmscoSlice(index=18, start=27, end=29),\n",
+       "  AmscoSlice(index=19, start=29, end=30),\n",
+       "  AmscoSlice(index=20, start=30, end=32),\n",
+       "  AmscoSlice(index=21, start=32, end=33),\n",
+       "  AmscoSlice(index=22, start=33, end=35),\n",
+       "  AmscoSlice(index=23, start=35, end=36)],\n",
+       " [AmscoSlice(index=24, start=36, end=37),\n",
+       "  AmscoSlice(index=25, start=37, end=39),\n",
+       "  AmscoSlice(index=26, start=39, end=40),\n",
+       "  AmscoSlice(index=27, start=40, end=42),\n",
+       "  AmscoSlice(index=28, start=42, end=43),\n",
+       "  AmscoSlice(index=29, start=43, end=45)],\n",
+       " [AmscoSlice(index=30, start=45, end=47),\n",
+       "  AmscoSlice(index=31, start=47, end=48),\n",
+       "  AmscoSlice(index=32, start=48, end=50),\n",
+       "  AmscoSlice(index=33, start=50, end=51),\n",
+       "  AmscoSlice(index=34, start=51, end=53),\n",
+       "  AmscoSlice(index=35, start=53, end=54)],\n",
+       " [AmscoSlice(index=36, start=54, end=55),\n",
+       "  AmscoSlice(index=37, start=55, end=57),\n",
+       "  AmscoSlice(index=38, start=57, end=58),\n",
+       "  AmscoSlice(index=39, start=58, end=60),\n",
+       "  AmscoSlice(index=40, start=60, end=61),\n",
+       "  AmscoSlice(index=41, start=61, end=63)],\n",
+       " [AmscoSlice(index=42, start=63, end=65),\n",
+       "  AmscoSlice(index=43, start=65, end=66),\n",
+       "  AmscoSlice(index=44, start=66, end=68),\n",
+       "  AmscoSlice(index=45, start=68, end=69),\n",
+       "  AmscoSlice(index=46, start=69, end=71),\n",
+       "  AmscoSlice(index=47, start=71, end=72)],\n",
+       " [AmscoSlice(index=48, start=72, end=73),\n",
+       "  AmscoSlice(index=49, start=73, end=75),\n",
+       "  AmscoSlice(index=50, start=75, end=76),\n",
+       "  AmscoSlice(index=51, start=76, end=78),\n",
+       "  AmscoSlice(index=52, start=78, end=79),\n",
+       "  AmscoSlice(index=53, start=79, end=81)],\n",
+       " [AmscoSlice(index=54, start=81, end=83),\n",
+       "  AmscoSlice(index=55, start=83, end=84),\n",
+       "  AmscoSlice(index=56, start=84, end=86),\n",
+       "  AmscoSlice(index=57, start=86, end=87),\n",
+       "  AmscoSlice(index=58, start=87, end=89),\n",
+       "  AmscoSlice(index=59, start=89, end=90)],\n",
+       " [AmscoSlice(index=60, start=90, end=91),\n",
+       "  AmscoSlice(index=61, start=91, end=93),\n",
+       "  AmscoSlice(index=62, start=93, end=94),\n",
+       "  AmscoSlice(index=63, start=94, end=96),\n",
+       "  AmscoSlice(index=64, start=96, end=97),\n",
+       "  AmscoSlice(index=65, start=97, end=99)],\n",
+       " [AmscoSlice(index=66, start=99, end=101),\n",
+       "  AmscoSlice(index=67, start=101, end=102),\n",
+       "  AmscoSlice(index=68, start=102, end=104),\n",
+       "  AmscoSlice(index=69, start=104, end=105),\n",
+       "  AmscoSlice(index=70, start=105, end=107),\n",
+       "  AmscoSlice(index=71, start=107, end=108)],\n",
+       " [AmscoSlice(index=72, start=108, end=109),\n",
+       "  AmscoSlice(index=73, start=109, end=111),\n",
+       "  AmscoSlice(index=74, start=111, end=112),\n",
+       "  AmscoSlice(index=75, start=112, end=114),\n",
+       "  AmscoSlice(index=76, start=114, end=115),\n",
+       "  AmscoSlice(index=77, start=115, end=117)],\n",
+       " [AmscoSlice(index=78, start=117, end=119),\n",
+       "  AmscoSlice(index=79, start=119, end=120),\n",
+       "  AmscoSlice(index=80, start=120, end=122),\n",
+       "  AmscoSlice(index=81, start=122, end=123),\n",
+       "  AmscoSlice(index=82, start=123, end=125),\n",
+       "  AmscoSlice(index=83, start=125, end=126)],\n",
+       " [AmscoSlice(index=84, start=126, end=127),\n",
+       "  AmscoSlice(index=85, start=127, end=129),\n",
+       "  AmscoSlice(index=86, start=129, end=130),\n",
+       "  AmscoSlice(index=87, start=130, end=132),\n",
+       "  AmscoSlice(index=88, start=132, end=133),\n",
+       "  AmscoSlice(index=89, start=133, end=135)],\n",
+       " [AmscoSlice(index=90, start=135, end=137),\n",
+       "  AmscoSlice(index=91, start=137, end=138),\n",
+       "  AmscoSlice(index=92, start=138, end=140),\n",
+       "  AmscoSlice(index=93, start=140, end=141),\n",
+       "  AmscoSlice(index=94, start=141, end=143),\n",
+       "  AmscoSlice(index=95, start=143, end=144)],\n",
+       " [AmscoSlice(index=96, start=144, end=145),\n",
+       "  AmscoSlice(index=97, start=145, end=147),\n",
+       "  AmscoSlice(index=98, start=147, end=148),\n",
+       "  AmscoSlice(index=99, start=148, end=150),\n",
+       "  AmscoSlice(index=100, start=150, end=151),\n",
+       "  AmscoSlice(index=101, start=151, end=153)],\n",
+       " [AmscoSlice(index=102, start=153, end=155),\n",
+       "  AmscoSlice(index=103, start=155, end=156),\n",
+       "  AmscoSlice(index=104, start=156, end=158),\n",
+       "  AmscoSlice(index=105, start=158, end=159),\n",
+       "  AmscoSlice(index=106, start=159, end=161),\n",
+       "  AmscoSlice(index=107, start=161, end=162)],\n",
+       " [AmscoSlice(index=108, start=162, end=163),\n",
+       "  AmscoSlice(index=109, start=163, end=165),\n",
+       "  AmscoSlice(index=110, start=165, end=166),\n",
+       "  AmscoSlice(index=111, start=166, end=168),\n",
+       "  AmscoSlice(index=112, start=168, end=169),\n",
+       "  AmscoSlice(index=113, start=169, end=171)],\n",
+       " [AmscoSlice(index=114, start=171, end=173),\n",
+       "  AmscoSlice(index=115, start=173, end=174),\n",
+       "  AmscoSlice(index=116, start=174, end=176),\n",
+       "  AmscoSlice(index=117, start=176, end=177),\n",
+       "  AmscoSlice(index=118, start=177, end=179),\n",
+       "  AmscoSlice(index=119, start=179, end=180)],\n",
+       " [AmscoSlice(index=120, start=180, end=181),\n",
+       "  AmscoSlice(index=121, start=181, end=183),\n",
+       "  AmscoSlice(index=122, start=183, end=184),\n",
+       "  AmscoSlice(index=123, start=184, end=186),\n",
+       "  AmscoSlice(index=124, start=186, end=187),\n",
+       "  AmscoSlice(index=125, start=187, end=189)],\n",
+       " [AmscoSlice(index=126, start=189, end=191),\n",
+       "  AmscoSlice(index=127, start=191, end=192),\n",
+       "  AmscoSlice(index=128, start=192, end=194),\n",
+       "  AmscoSlice(index=129, start=194, end=195),\n",
+       "  AmscoSlice(index=130, start=195, end=197),\n",
+       "  AmscoSlice(index=131, start=197, end=198)],\n",
+       " [AmscoSlice(index=132, start=198, end=199),\n",
+       "  AmscoSlice(index=133, start=199, end=201),\n",
+       "  AmscoSlice(index=134, start=201, end=202),\n",
+       "  AmscoSlice(index=135, start=202, end=204),\n",
+       "  AmscoSlice(index=136, start=204, end=205),\n",
+       "  AmscoSlice(index=137, start=205, end=207)],\n",
+       " [AmscoSlice(index=138, start=207, end=209),\n",
+       "  AmscoSlice(index=139, start=209, end=210),\n",
+       "  AmscoSlice(index=140, start=210, end=212),\n",
+       "  AmscoSlice(index=141, start=212, end=213),\n",
+       "  AmscoSlice(index=142, start=213, end=215),\n",
+       "  AmscoSlice(index=143, start=215, end=216)],\n",
+       " [AmscoSlice(index=144, start=216, end=217),\n",
+       "  AmscoSlice(index=145, start=217, end=219),\n",
+       "  AmscoSlice(index=146, start=219, end=220),\n",
+       "  AmscoSlice(index=147, start=220, end=222),\n",
+       "  AmscoSlice(index=148, start=222, end=223),\n",
+       "  AmscoSlice(index=149, start=223, end=225)],\n",
+       " [AmscoSlice(index=150, start=225, end=227),\n",
+       "  AmscoSlice(index=151, start=227, end=228),\n",
+       "  AmscoSlice(index=152, start=228, end=230),\n",
+       "  AmscoSlice(index=153, start=230, end=231),\n",
+       "  AmscoSlice(index=154, start=231, end=233),\n",
+       "  AmscoSlice(index=155, start=233, end=234)],\n",
+       " [AmscoSlice(index=156, start=234, end=235),\n",
+       "  AmscoSlice(index=157, start=235, end=237),\n",
+       "  AmscoSlice(index=158, start=237, end=238),\n",
+       "  AmscoSlice(index=159, start=238, end=240),\n",
+       "  AmscoSlice(index=160, start=240, end=241),\n",
+       "  AmscoSlice(index=161, start=241, end=243)],\n",
+       " [AmscoSlice(index=162, start=243, end=245),\n",
+       "  AmscoSlice(index=163, start=245, end=246),\n",
+       "  AmscoSlice(index=164, start=246, end=248),\n",
+       "  AmscoSlice(index=165, start=248, end=249),\n",
+       "  AmscoSlice(index=166, start=249, end=251),\n",
+       "  AmscoSlice(index=167, start=251, end=252)],\n",
+       " [AmscoSlice(index=168, start=252, end=253),\n",
+       "  AmscoSlice(index=169, start=253, end=255),\n",
+       "  AmscoSlice(index=170, start=255, end=256),\n",
+       "  AmscoSlice(index=171, start=256, end=258),\n",
+       "  AmscoSlice(index=172, start=258, end=259),\n",
+       "  AmscoSlice(index=173, start=259, end=261)],\n",
+       " [AmscoSlice(index=174, start=261, end=263),\n",
+       "  AmscoSlice(index=175, start=263, end=264),\n",
+       "  AmscoSlice(index=176, start=264, end=266),\n",
+       "  AmscoSlice(index=177, start=266, end=267),\n",
+       "  AmscoSlice(index=178, start=267, end=269),\n",
+       "  AmscoSlice(index=179, start=269, end=270)],\n",
+       " [AmscoSlice(index=180, start=270, end=271),\n",
+       "  AmscoSlice(index=181, start=271, end=273),\n",
+       "  AmscoSlice(index=182, start=273, end=274),\n",
+       "  AmscoSlice(index=183, start=274, end=276),\n",
+       "  AmscoSlice(index=184, start=276, end=277),\n",
+       "  AmscoSlice(index=185, start=277, end=279)],\n",
+       " [AmscoSlice(index=186, start=279, end=281),\n",
+       "  AmscoSlice(index=187, start=281, end=282),\n",
+       "  AmscoSlice(index=188, start=282, end=284),\n",
+       "  AmscoSlice(index=189, start=284, end=285),\n",
+       "  AmscoSlice(index=190, start=285, end=287),\n",
+       "  AmscoSlice(index=191, start=287, end=288)],\n",
+       " [AmscoSlice(index=192, start=288, end=289),\n",
+       "  AmscoSlice(index=193, start=289, end=291),\n",
+       "  AmscoSlice(index=194, start=291, end=292),\n",
+       "  AmscoSlice(index=195, start=292, end=294),\n",
+       "  AmscoSlice(index=196, start=294, end=295),\n",
+       "  AmscoSlice(index=197, start=295, end=297)],\n",
+       " [AmscoSlice(index=198, start=297, end=299),\n",
+       "  AmscoSlice(index=199, start=299, end=300),\n",
+       "  AmscoSlice(index=200, start=300, end=302),\n",
+       "  AmscoSlice(index=201, start=302, end=303),\n",
+       "  AmscoSlice(index=202, start=303, end=305),\n",
+       "  AmscoSlice(index=203, start=305, end=306)],\n",
+       " [AmscoSlice(index=204, start=306, end=307),\n",
+       "  AmscoSlice(index=205, start=307, end=309),\n",
+       "  AmscoSlice(index=206, start=309, end=310),\n",
+       "  AmscoSlice(index=207, start=310, end=312),\n",
+       "  AmscoSlice(index=208, start=312, end=313),\n",
+       "  AmscoSlice(index=209, start=313, end=315)],\n",
+       " [AmscoSlice(index=210, start=315, end=317),\n",
+       "  AmscoSlice(index=211, start=317, end=318),\n",
+       "  AmscoSlice(index=212, start=318, end=320),\n",
+       "  AmscoSlice(index=213, start=320, end=321),\n",
+       "  AmscoSlice(index=214, start=321, end=323),\n",
+       "  AmscoSlice(index=215, start=323, end=324)],\n",
+       " [AmscoSlice(index=216, start=324, end=325),\n",
+       "  AmscoSlice(index=217, start=325, end=327),\n",
+       "  AmscoSlice(index=218, start=327, end=328),\n",
+       "  AmscoSlice(index=219, start=328, end=330),\n",
+       "  AmscoSlice(index=220, start=330, end=331),\n",
+       "  AmscoSlice(index=221, start=331, end=333)],\n",
+       " [AmscoSlice(index=222, start=333, end=335),\n",
+       "  AmscoSlice(index=223, start=335, end=336),\n",
+       "  AmscoSlice(index=224, start=336, end=338),\n",
+       "  AmscoSlice(index=225, start=338, end=339),\n",
+       "  AmscoSlice(index=226, start=339, end=341),\n",
+       "  AmscoSlice(index=227, start=341, end=342)],\n",
+       " [AmscoSlice(index=228, start=342, end=343),\n",
+       "  AmscoSlice(index=229, start=343, end=345),\n",
+       "  AmscoSlice(index=230, start=345, end=346),\n",
+       "  AmscoSlice(index=231, start=346, end=348),\n",
+       "  AmscoSlice(index=232, start=348, end=349),\n",
+       "  AmscoSlice(index=233, start=349, end=351)],\n",
+       " [AmscoSlice(index=234, start=351, end=353),\n",
+       "  AmscoSlice(index=235, start=353, end=354),\n",
+       "  AmscoSlice(index=236, start=354, end=356),\n",
+       "  AmscoSlice(index=237, start=356, end=357),\n",
+       "  AmscoSlice(index=238, start=357, end=359),\n",
+       "  AmscoSlice(index=239, start=359, end=360)],\n",
+       " [AmscoSlice(index=240, start=360, end=361),\n",
+       "  AmscoSlice(index=241, start=361, end=363),\n",
+       "  AmscoSlice(index=242, start=363, end=364),\n",
+       "  AmscoSlice(index=243, start=364, end=366),\n",
+       "  AmscoSlice(index=244, start=366, end=367),\n",
+       "  AmscoSlice(index=245, start=367, end=369)],\n",
+       " [AmscoSlice(index=246, start=369, end=371),\n",
+       "  AmscoSlice(index=247, start=371, end=372),\n",
+       "  AmscoSlice(index=248, start=372, end=374),\n",
+       "  AmscoSlice(index=249, start=374, end=375),\n",
+       "  AmscoSlice(index=250, start=375, end=377),\n",
+       "  AmscoSlice(index=251, start=377, end=378)],\n",
+       " [AmscoSlice(index=252, start=378, end=379),\n",
+       "  AmscoSlice(index=253, start=379, end=381),\n",
+       "  AmscoSlice(index=254, start=381, end=382),\n",
+       "  AmscoSlice(index=255, start=382, end=384),\n",
+       "  AmscoSlice(index=256, start=384, end=385),\n",
+       "  AmscoSlice(index=257, start=385, end=387)],\n",
+       " [AmscoSlice(index=258, start=387, end=389),\n",
+       "  AmscoSlice(index=259, start=389, end=390),\n",
+       "  AmscoSlice(index=260, start=390, end=392),\n",
+       "  AmscoSlice(index=261, start=392, end=393),\n",
+       "  AmscoSlice(index=262, start=393, end=395),\n",
+       "  AmscoSlice(index=263, start=395, end=396)],\n",
+       " [AmscoSlice(index=264, start=396, end=397),\n",
+       "  AmscoSlice(index=265, start=397, end=399),\n",
+       "  AmscoSlice(index=266, start=399, end=400),\n",
+       "  AmscoSlice(index=267, start=400, end=402),\n",
+       "  AmscoSlice(index=268, start=402, end=403),\n",
+       "  AmscoSlice(index=269, start=403, end=405)],\n",
+       " [AmscoSlice(index=270, start=405, end=407),\n",
+       "  AmscoSlice(index=271, start=407, end=408),\n",
+       "  AmscoSlice(index=272, start=408, end=410),\n",
+       "  AmscoSlice(index=273, start=410, end=411),\n",
+       "  AmscoSlice(index=274, start=411, end=413),\n",
+       "  AmscoSlice(index=275, start=413, end=414)],\n",
+       " [AmscoSlice(index=276, start=414, end=415),\n",
+       "  AmscoSlice(index=277, start=415, end=417),\n",
+       "  AmscoSlice(index=278, start=417, end=418),\n",
+       "  AmscoSlice(index=279, start=418, end=420),\n",
+       "  AmscoSlice(index=280, start=420, end=421),\n",
+       "  AmscoSlice(index=281, start=421, end=423)],\n",
+       " [AmscoSlice(index=282, start=423, end=425),\n",
+       "  AmscoSlice(index=283, start=425, end=426),\n",
+       "  AmscoSlice(index=284, start=426, end=428),\n",
+       "  AmscoSlice(index=285, start=428, end=429),\n",
+       "  AmscoSlice(index=286, start=429, end=431),\n",
+       "  AmscoSlice(index=287, start=431, end=432)],\n",
+       " [AmscoSlice(index=288, start=432, end=433),\n",
+       "  AmscoSlice(index=289, start=433, end=435),\n",
+       "  AmscoSlice(index=290, start=435, end=436),\n",
+       "  AmscoSlice(index=291, start=436, end=438),\n",
+       "  AmscoSlice(index=292, start=438, end=439),\n",
+       "  AmscoSlice(index=293, start=439, end=441)],\n",
+       " [AmscoSlice(index=294, start=441, end=443),\n",
+       "  AmscoSlice(index=295, start=443, end=444),\n",
+       "  AmscoSlice(index=296, start=444, end=446),\n",
+       "  AmscoSlice(index=297, start=446, end=447),\n",
+       "  AmscoSlice(index=298, start=447, end=449),\n",
+       "  AmscoSlice(index=299, start=449, end=450)],\n",
+       " [AmscoSlice(index=300, start=450, end=451),\n",
+       "  AmscoSlice(index=301, start=451, end=453),\n",
+       "  AmscoSlice(index=302, start=453, end=454),\n",
+       "  AmscoSlice(index=303, start=454, end=456),\n",
+       "  AmscoSlice(index=304, start=456, end=457),\n",
+       "  AmscoSlice(index=305, start=457, end=459)],\n",
+       " [AmscoSlice(index=306, start=459, end=461),\n",
+       "  AmscoSlice(index=307, start=461, end=462),\n",
+       "  AmscoSlice(index=308, start=462, end=464),\n",
+       "  AmscoSlice(index=309, start=464, end=465),\n",
+       "  AmscoSlice(index=310, start=465, end=467),\n",
+       "  AmscoSlice(index=311, start=467, end=468)],\n",
+       " [AmscoSlice(index=312, start=468, end=469),\n",
+       "  AmscoSlice(index=313, start=469, end=471),\n",
+       "  AmscoSlice(index=314, start=471, end=472),\n",
+       "  AmscoSlice(index=315, start=472, end=474),\n",
+       "  AmscoSlice(index=316, start=474, end=475),\n",
+       "  AmscoSlice(index=317, start=475, end=477)],\n",
+       " [AmscoSlice(index=318, start=477, end=479),\n",
+       "  AmscoSlice(index=319, start=479, end=480),\n",
+       "  AmscoSlice(index=320, start=480, end=482),\n",
+       "  AmscoSlice(index=321, start=482, end=483),\n",
+       "  AmscoSlice(index=322, start=483, end=485),\n",
+       "  AmscoSlice(index=323, start=485, end=486)],\n",
+       " [AmscoSlice(index=324, start=486, end=487),\n",
+       "  AmscoSlice(index=325, start=487, end=489),\n",
+       "  AmscoSlice(index=326, start=489, end=490),\n",
+       "  AmscoSlice(index=327, start=490, end=492),\n",
+       "  AmscoSlice(index=328, start=492, end=493),\n",
+       "  AmscoSlice(index=329, start=493, end=495)],\n",
+       " [AmscoSlice(index=330, start=495, end=497),\n",
+       "  AmscoSlice(index=331, start=497, end=498),\n",
+       "  AmscoSlice(index=332, start=498, end=500),\n",
+       "  AmscoSlice(index=333, start=500, end=501),\n",
+       "  AmscoSlice(index=334, start=501, end=503),\n",
+       "  AmscoSlice(index=335, start=503, end=504)],\n",
+       " [AmscoSlice(index=336, start=504, end=505),\n",
+       "  AmscoSlice(index=337, start=505, end=507),\n",
+       "  AmscoSlice(index=338, start=507, end=508),\n",
+       "  AmscoSlice(index=339, start=508, end=510),\n",
+       "  AmscoSlice(index=340, start=510, end=511),\n",
+       "  AmscoSlice(index=341, start=511, end=513)],\n",
+       " [AmscoSlice(index=342, start=513, end=515),\n",
+       "  AmscoSlice(index=343, start=515, end=516),\n",
+       "  AmscoSlice(index=344, start=516, end=518),\n",
+       "  AmscoSlice(index=345, start=518, end=519),\n",
+       "  AmscoSlice(index=346, start=519, end=521),\n",
+       "  AmscoSlice(index=347, start=521, end=522)],\n",
+       " [AmscoSlice(index=348, start=522, end=523),\n",
+       "  AmscoSlice(index=349, start=523, end=525),\n",
+       "  AmscoSlice(index=350, start=525, end=526),\n",
+       "  AmscoSlice(index=351, start=526, end=528),\n",
+       "  AmscoSlice(index=352, start=528, end=529),\n",
+       "  AmscoSlice(index=353, start=529, end=531)],\n",
+       " [AmscoSlice(index=354, start=531, end=533),\n",
+       "  AmscoSlice(index=355, start=533, end=534),\n",
+       "  AmscoSlice(index=356, start=534, end=536),\n",
+       "  AmscoSlice(index=357, start=536, end=537),\n",
+       "  AmscoSlice(index=358, start=537, end=539),\n",
+       "  AmscoSlice(index=359, start=539, end=540)],\n",
+       " [AmscoSlice(index=360, start=540, end=541),\n",
+       "  AmscoSlice(index=361, start=541, end=543),\n",
+       "  AmscoSlice(index=362, start=543, end=544),\n",
+       "  AmscoSlice(index=363, start=544, end=546),\n",
+       "  AmscoSlice(index=364, start=546, end=547),\n",
+       "  AmscoSlice(index=365, start=547, end=549)],\n",
+       " [AmscoSlice(index=366, start=549, end=551),\n",
+       "  AmscoSlice(index=367, start=551, end=552),\n",
+       "  AmscoSlice(index=368, start=552, end=554),\n",
+       "  AmscoSlice(index=369, start=554, end=555),\n",
+       "  AmscoSlice(index=370, start=555, end=557),\n",
+       "  AmscoSlice(index=371, start=557, end=558)],\n",
+       " [AmscoSlice(index=372, start=558, end=559),\n",
+       "  AmscoSlice(index=373, start=559, end=561),\n",
+       "  AmscoSlice(index=374, start=561, end=562),\n",
+       "  AmscoSlice(index=375, start=562, end=564),\n",
+       "  AmscoSlice(index=376, start=564, end=565),\n",
+       "  AmscoSlice(index=377, start=565, end=567)],\n",
+       " [AmscoSlice(index=378, start=567, end=569),\n",
+       "  AmscoSlice(index=379, start=569, end=570),\n",
+       "  AmscoSlice(index=380, start=570, end=572),\n",
+       "  AmscoSlice(index=381, start=572, end=573),\n",
+       "  AmscoSlice(index=382, start=573, end=575),\n",
+       "  AmscoSlice(index=383, start=575, end=576)],\n",
+       " [AmscoSlice(index=384, start=576, end=577),\n",
+       "  AmscoSlice(index=385, start=577, end=579),\n",
+       "  AmscoSlice(index=386, start=579, end=580),\n",
+       "  AmscoSlice(index=387, start=580, end=582),\n",
+       "  AmscoSlice(index=388, start=582, end=583),\n",
+       "  AmscoSlice(index=389, start=583, end=585)],\n",
+       " [AmscoSlice(index=390, start=585, end=587),\n",
+       "  AmscoSlice(index=391, start=587, end=588),\n",
+       "  AmscoSlice(index=392, start=588, end=590),\n",
+       "  AmscoSlice(index=393, start=590, end=591),\n",
+       "  AmscoSlice(index=394, start=591, end=593),\n",
+       "  AmscoSlice(index=395, start=593, end=594)],\n",
+       " [AmscoSlice(index=396, start=594, end=595),\n",
+       "  AmscoSlice(index=397, start=595, end=597),\n",
+       "  AmscoSlice(index=398, start=597, end=598),\n",
+       "  AmscoSlice(index=399, start=598, end=600),\n",
+       "  AmscoSlice(index=400, start=600, end=601),\n",
+       "  AmscoSlice(index=401, start=601, end=603)],\n",
+       " [AmscoSlice(index=402, start=603, end=605),\n",
+       "  AmscoSlice(index=403, start=605, end=606),\n",
+       "  AmscoSlice(index=404, start=606, end=608),\n",
+       "  AmscoSlice(index=405, start=608, end=609),\n",
+       "  AmscoSlice(index=406, start=609, end=611),\n",
+       "  AmscoSlice(index=407, start=611, end=612)]]"
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "amsco_transposition_positions(c7b, 'abcdef', \n",
+    "      fillpattern=(1, 2),\n",
+    "      fillstyle=AmscoFillStyle.reverse_each_row)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {
+    "collapsed": false,
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['stager',\n",
+       " 'staler',\n",
+       " 'stalin',\n",
+       " 'stamen',\n",
+       " 'sucker',\n",
+       " 'tucker',\n",
+       " 'twangs',\n",
+       " 'twerps',\n",
+       " 'twirls',\n",
+       " 'staffer',\n",
+       " 'stagers',\n",
+       " 'stagger',\n",
+       " 'stalins',\n",
+       " 'stamens',\n",
+       " 'stamina',\n",
+       " 'stammer',\n",
+       " 'statler',\n",
+       " 'suckers',\n",
+       " 'sudsier',\n",
+       " 'swagger',\n",
+       " 'tubbier',\n",
+       " 'tycoons',\n",
+       " 'loadable',\n",
+       " 'noblemen',\n",
+       " 'rubidium',\n",
+       " 'staffers',\n",
+       " 'staggers',\n",
+       " 'staminas',\n",
+       " 'stammers',\n",
+       " 'standard',\n",
+       " 'steelier',\n",
+       " 'submerse',\n",
+       " 'swaggers',\n",
+       " 'tubbiest',\n",
+       " 'tuitions',\n",
+       " 'twenties',\n",
+       " 'stalemate',\n",
+       " 'staleness',\n",
+       " 'stalinist',\n",
+       " 'stammerer',\n",
+       " 'standards',\n",
+       " 'submerses',\n",
+       " 'swaggerer',\n",
+       " 'stalemates',\n",
+       " 'stalenesss',\n",
+       " 'stammerers',\n",
+       " 'stepsister',\n",
+       " 'succulence',\n",
+       " 'statistical',\n",
+       " 'stepsisters',\n",
+       " 'succulences',\n",
+       " 'statistician',\n",
+       " 'statisticians']"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "transpositions[key_b[0]]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "security protocol solitaire comrades under a decree from moscow we are confined to using a new high security stream cipher stolen from the americans the solitaire cipher all files classified top secret and above are to be archived using this method this new field cipher has been tested and proven to match the security of the fi alka machine without the overhead of the technology you will need only a deck of cards to implement the cipher the key to be used will be provided and distributed on a one time pad and you must destroy the key as you use it the key consists of a random shuffle of a full deck of cards together with two distinguishable jokers agents should be freely able to carry this equipment without arousing suspicion\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(sanitise(\n",
+    "                amsco_transposition_decipher(sanitise(c7b), \n",
+    "                                             keyword=transpositions[key_b[0]][0], \n",
+    "                                             fillpattern=key_b[1],\n",
+    "                                             fillstyle=key_b[2])\n",
+    "            ))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "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
+}
diff --git a/2015/2015-challenge8.ipynb b/2015/2015-challenge8.ipynb
new file mode 100644 (file)
index 0000000..8f6195b
--- /dev/null
@@ -0,0 +1,98 @@
+{
+ "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",
+    "%matplotlib inline\n",
+    "\n",
+    "from cipherbreak import *\n",
+    "\n",
+    "c8a = sanitise(open('8a.ciphertext').read())\n",
+    "c8b = sanitise(open('8b.ciphertext').read())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('charlie', -2104.8140749325567)"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "key_a, score = vigenere_frequency_break(c8a)\n",
+    "key_a, score"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "harry i am so sorry we went into the russian hq last night without you but the station chief wanted it to be his team that got the glory i am really grateful to you for coming back and putting us on the right track though the stolen file from soviet headquarters was as you expected encrypted with the solitaire cipher fortunately the cipher clerk who managed the encryption was incredibly careless i found a sheet of burnt paper in the bin which gave me a list of thirty eight cards and i am hoping that this is a large part of the key it will still be hard to break but maybe not impossible especially as the erased part was still intact there maybe another clue in that the page appears to have been torn from an economics textbook i found on the desk anyway i figure the chemists at langley may help us to reconstruct the whole key given time though i wouldnt expect them to manage more than one card a day given how careful they will have to be not to destroy the document it will take usa while to crack this but maybe time is on our side with christmas things seem to be quiet and i am hoping that within the next three weeks we may know precisely what the soviets were trying to do here whatever the outcome i think it is clear that the future of europe is not likely to be settled for a while i hear rumours everyday about shortages in the soviet bloc and border controls are going up in places you wouldnt expect to prevent largescale migration there are problems in greece and turkey and divisions between the british and french and the brits are having real trouble paying off their war debts whether or not we crack the reichs doktor mystery i think there is going to be plenty for you to do i know we had to work hard to persuade you to flyover but we really do need you here even the chief recognizes that so if i can i want to persuade you to stay francois and i are being posted to paris kind of a thankyou for our work on this project but icant go unless i know the berlin station has someone i trust hope youll agree to take the job charlie\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(' '.join(segment(vigenere_decipher(c8a, key_a))))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "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
+}
index d26d74f04d392d7ce9b2ce6c0e6399d356469a3c..5b46ad58dfb3ac020da7176de388d8927481d088 100644 (file)
--- a/SIGNED.md
+++ b/SIGNED.md
@@ -3,19 +3,19 @@
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
-iQIcBAABCAAGBQJWjX6wAAoJEJPB2e07PgbqhgsP/2YEJGETmbYlwtwWyKL2q/DN
-ICr7LSmgmPnelBgiOXF4JjhpEdmhuhT6XErTzyVcTmm6aXIdijncMD3qISvYePjk
-VfYd2RbRpA61J/5oZabxOxnaxOvLUSOp1BK0akmNOdi0aPJVm9fatYJMsuWdzwCL
-0hOklUUL2kvDFHRVYgupl57+dTDMWlTOH/es0izL+ZUDqMZcjyDiN3aVNjrHihDe
-RNeOgOod7FLb+GNMC9k5l1O6JovTgrcrw6a+6nyBbBKVcubeY+GS1CKfg0JaFiuM
-f8ewiGBixzV93A+c/nojHIR1jCdzBA91/mYUWmxSUP2kz9MS4HAh2ASbEYR0N6oM
-gJ5JGCHW5BuyTYwJ0xiHoia8GVw64Bw9J/Q6qomZBodw3DNjWXDnZcyrzYFzKuhI
-uP6NK+79Uc5PevDlOV60tLnY869ynXYY4uKIr6TT5NRFdvQi6OVHEBSryUolnnxQ
-YfVwFPNPPPAD+yLrgecD+f6VQjczy3um0pHthaOZwbgX4Sk0I2B/Nq40j/7K/iW6
-kVR2n1/R1wuVekMYpd58F/IUz+wk0JNvrr7O6usUAVEOPo33jCUsuS9wljYAwzqP
-vesbeWXRFGyN0rQDHgSfQivTqG5BL2XV4Nf+uWzeTOSwzAziO4MRHrzgGbo3aMAo
-4xz7E+Wi448R2zkNiUsS
-=vzqt
+iQIcBAABCAAGBQJWjpTaAAoJEJPB2e07Pgbqh6IP/3ZEzWXxCdqrHoXYRRuRvP3U
+7Q8FJro7m+dW0gV3R+0BvcJx7hmepvU8Hr4O4RLTQ3AWnlVSorMGFgOoZ3XLYvZl
+YACQU4q8Cy3PB2nm8/Mcj/yLVyiyGanxYaxGhBoYSUnaE6ncJ8wod3iGHwQouIgA
+sQmaJSoBj0RuYCcTlg8ipOmwZ/doNjKcFbmJQx7BRdlaQ1QQtqyDJgX6y0e4snU0
+ktcu0dCwroyAzu+HXQE5prhsB3x3UHzTq3VwIIgeNnO/Hye9LXgrT8fSdY54YndU
+E/S/gUD8/jB5TFTdHVmAEQAqg/YHXc49o1taPU+NU6hSl9EDmhM7CacBu+//VUy4
+VXjFFWJV9YFX6yhaNHSS5Vuz7h8oXKOQwGYa4dMlrGl912MnOHl+WjCDjcHL+0ht
+cFfEq3OgQDL4Q7Eln1bW7VwYDcpId1yNYcuHvd+h3bSzAxNtMcjH3Sim7EDcFP2z
+n6nuwFNdfY+drpAllw1df8QotFP8vkiA3O9sUtTIJkECmu9vGqJDfujhBOhPNQxk
+9bwSIWhXz0yvt3V7P/ds2PRGBB67ejkWOEEMhI/94yu/prZaeZQsm49ULoqz+6z/
+3eGlgz/Y0RRjlgorl7VwOwacuqb5w++WZ2CX4O5oylkxOtC/rkuOTFvwsas2c3sy
+as4QzMxXGkYvRCKzUvR7
+=gSfT
 -----END PGP SIGNATURE-----
 
 ```
@@ -69,6 +69,8 @@ size     exec  file                                               contents
 1340               1a.plaintext                                   cbdaac33a7943a752ba5dd21cf7af23bdbdd22e4a5feb0bccecce45d605d0581                                                                 
 1495               1b.ciphertext                                  2e0389e2c7d3156892f7d361ee79f86eb79d34812fca37d8ce692cb6f3976446                                                                 
 1495               1b.plaintext                                   717b1f8955515a5d5d2f049f0ffe137820d71f8b2a1689e1a29ec30ed7c9d473                                                                 
+121429             2013-challenge6.ipynb                          4169b040ef2d648af0c5678c22756ab31933f663ec7f38fb27a0af81c8c8d4b8                                                                 
+25749              2013-challenge7.ipynb                          a651b44828eeb79c82f63eb00ba0f8d5a3f406e104cb1a59601a61f0aee7432b                                                                 
 1135               2a.ciphertext                                  85ad3dac4751a8db90f391d0f06935a5ef2118d9ac72e05fe0518d7f77bff058                                                                 
 1135               2a.plaintext                                   11cdf7c462c536085daced417023adaeff2f6b7a6162ccd12b340b079bd36b48                                                                 
 926                2b.ciphertext                                  0fc59b28e4cd2db0aa9f28a603e2b25988a6688f05f90a59b205088093721340                                                                 
@@ -85,11 +87,17 @@ size     exec  file                                               contents
 1565               7b.ciphertext                                  adeef9d9e985c534c40acee5c6734d04195895a32efd9452a89cafef1fdc91b8                                                                 
 182                mona-lisa-words.txt                            d7d05c9c86f6282fa66df5f4ca795c89f01cef88a9ce8c921ce4484b3d6078a7                                                                 
 1190               solutions.txt                                  bd14d8cb1b6694ee4b07d7f38f4df7931e89c10247f101878b6056647bf67cee                                                                 
-135303           2013-challenge6.ipynb                            5b37a8b10db4c8d9831827a2acdffdcdb65369557d15b3e08a900ee8e088da73                                                                 
-31542            2013-challenge7.ipynb                            6de8c15b9cca8b166be4ab86df94898544803e7ed46f8042e363414bed1d2dcc                                                                 
                  2014/                                                                                                                                                                             
 735                1a.ciphertext                                  3adb9e2747c6e3b4033c8042a6dcccb7c2e45988d64c5c78ec0a2c472dc88f95                                                                 
 610                1b.ciphertext                                  bc11485a47af830fa0ded0b07feebf042c0a6956dc71daa60b525067e96c220a                                                                 
+4061               2014-challenge1.ipynb                          a1d569b4c7d6d359a9c131244276fbbb61c035e7ffbdb6e224beabf3190c73e5                                                                 
+23543              2014-challenge2.ipynb                          92c301162a49bdda75ec939f77c015a025626bc728365d296187d764a89ef1bc                                                                 
+24088              2014-challenge3.ipynb                          e0db661b881ee1bc3d51e0edfa958b709677dace6eef7125ae9e034e131ca6c8                                                                 
+28626              2014-challenge4.ipynb                          11db485e9db34673b920635fbeeec85eeb85f776aabc687ebbd114a87039f38d                                                                 
+21102              2014-challenge5.ipynb                          085151062fb8b3d7f8d6d7cff5b73ec3053b5d22383301f416a2a29e6b5ab53e                                                                 
+34054              2014-challenge6.ipynb                          0e6f30c7296fe16b107ee5df2676e988c8b450b1cbf0e7347bf6e2ac9191f068                                                                 
+38294              2014-challenge7.ipynb                          176ead363cc1970d243ea2e7f7ba49eadc617058ad5144044ce4c8c0e9375c16                                                                 
+187296             2014-challenge8.ipynb                          11fb5200127f954536176cc3b3e4258ee3005fbe0c19e0138e6b9d18c290a71f                                                                 
 767                2a.ciphertext                                  3881a4f1fc0fadc064bc27d3052800b5eb497e833b208c2cee381b466c9b1db8                                                                 
 398                2b.ciphertext                                  78faf9d7a0aad25a9fa72f886c398bc0b684a389bc5624ab4514e93685157a93                                                                 
 958                3a.ciphertext                                  0d0524b194961bdbe6fe200cfe983a9338abcca5adabb6776769387967a50711                                                                 
@@ -104,17 +112,17 @@ size     exec  file                                               contents
 988                7b.ciphertext                                  cfb66667a8011226be0be7c98e9deb7efa02e9a53cad67743baf166c20136ada                                                                 
 1391               8a.ciphertext                                  ac2b18d13ef44be0fb233d2455c51897b4df59491bbdd23ef82fbd9490bc86b1                                                                 
 7001               8b.ciphertext                                  8d7e366e8fbb5766717481eeec77b089d3e8f9e708ac198d56176cb0882a9472                                                                 
-3882             2014-challenge1.ipynb                            07715f100d97af32ad5a13b56ade2f5753e17e32404e2eda0dcb9634736298f5                                                                 
-28071            2014-challenge2.ipynb                            1535404ae5a412160c82d19e38f7069a2eaca600bd433e77877bd13e14929e6b                                                                 
-29190            2014-challenge3.ipynb                            1454c5e5014eac93c42e88611f3f6b3f014bf70a8e9d8e87ef4725f8d12a27b7                                                                 
-32758            2014-challenge4.ipynb                            1794b0b2c6fd4630f6d9ffe15ffdad52d04af23082eddc920ec02ba4740032e4                                                                 
-23322            2014-challenge5.ipynb                            fb3bb531c62ed943528715cc19e800293e3cd4a176ce3a3fe01e7e585386907e                                                                 
-40307            2014-challenge6.ipynb                            5085a4ae2a562c87983cbff817ac89826973341551980563ae0c77ab747a5dff                                                                 
-44472            2014-challenge7.ipynb                            9800d39c881f22f67f1182f6ca73bbf40a123d0deb598a6009f545f421955241                                                                 
-188080           2014-challenge8.ipynb                            c59bcfbb39e48e6e151cc0c86fe48add67844954cf3c65d560bbda0c972a8376                                                                 
                  2015/                                                                                                                                                                             
 874                1a.ciphertext                                  5d0d71f24522e1c05127feb601bf8dc82566f3d2795fb51c4a60e22d900bb5eb                                                                 
 394                1b.ciphertext                                  a35e8265aea45ab5f7c5eb141e5e65c85ecc24c7d87f3e8197dfe6795a7d3226                                                                 
+3835               2015-challenge1.ipynb                          4c9d020904f448c1a8c6443d5a8d6da48d615ce61508e67670ce01ac1c4c5b2e                                                                 
+4307               2015-challenge2.ipynb                          702cb83d7b0c52b2ddf360d475e5e1acaaee0419c4a82c17e32a009ce559e352                                                                 
+4199               2015-challenge3.ipynb                          7116fb88f407edd43695d00229479ba5413368a5cb3c2bfb083d7e47f732ff05                                                                 
+32985              2015-challenge4.ipynb                          7c8a2e5d7a2e210431ae273a2a298daea2cb58b71cdb549f0e87a7754990680e                                                                 
+5251               2015-challenge5.ipynb                          20037e3678a1290aaacdec2b4baeba315385bc2ff233a84272e6424ebdeecd23                                                                 
+14285              2015-challenge6.ipynb                          0cd2bbd2f67683f696275cd6041d26a54d7cc43971ca0bef8daf91d5b61a80de                                                                 
+76477              2015-challenge7.ipynb                          de19305ec9c87c0c7d7db34cdf54f8dc67bca1330b15876835c4208167d662ed                                                                 
+3953               2015-challenge8.ipynb                          6959c7a98353bda0028003491d2e558670f61ff5b0714756c8e18db93398c1be                                                                 
 1193               2a.ciphertext                                  412db1381dcb01f858bf848e48ada16aa4603cbb348c1f092ae39b06d2efa5f9                                                                 
 544                2b.ciphertext                                  5ff59d7cff1c4d27dee6414769bdbcfb0b0ab9c5931e772bf9f6442eeb9b6855                                                                 
 898                3a.ciphertext                                  5a9f89002db8520dbad882565a0130d3a462ed967e9cebeca828e9f727a267c4                                                                 
@@ -134,14 +142,6 @@ size     exec  file                                               contents
 10000              pysol.zip                                      64e25c247e877f37285db635fcb5dea101e0c531fdbfe5000bcc088c22caad79|68d878fb019198e691d321be1dd6744fae0b48da9c4e705c34f96e351b00fbed
 5281               sol.py                                         dbea0e836eb158a26407ca3b74289d24fa7eae16ed1093eb7c598767a150fccc|e50319aa995f934a4cbd52bc28d8f49f376e62470170690cdbed7352f67a7942
 2195               sol.py.zip                                     4c22e57eaacd8a91ef9b0c338429e400210a03dec9fbacec4a45fe1faed50720|1fd0a62af53125eacfa11016088451e2c58269d98aaef74c320730ebc7601b66
-3620             2015-challenge1.ipynb                            2ab544f48c22a3a2e665b03ae094ac2de04aee8bdb37366209276a937d248d6a                                                                 
-4092             2015-challenge2.ipynb                            58c2aeca6c73a8fef71d0cc8321469358803f392c02fd44631dd0b25c2755f4a                                                                 
-3987             2015-challenge3.ipynb                            dfec26ba881c7ad0af54d072aeba4d08162661e863266936963130548ff86b65                                                                 
-8030             2015-challenge4.ipynb                            f77ead0eae7fcd67039d500a31ad1748a4df115905adecd0e93e56f72bbdcfa0                                                                 
-5039             2015-challenge5.ipynb                            b0c28829c329d7a2752f4991006e6d78a10415d7609b893b80b3bdb788d6e533                                                                 
-14079            2015-challenge6.ipynb                            7bd1dcff4b764d75e002622ce6a4cc3c00625aa311ef886e5a436822660c565c                                                                 
-76275            2015-challenge7.ipynb                            c48d71ef5c105dff987981c05ce4a9d2cce382e6d54358d7e2a3b6fe9fc74f10                                                                 
-3741             2015-challenge8.ipynb                            d66fca286b89099f3ca296f1f8283f22c12ae9e5480192f2bdb316a46fd07f43                                                                 
 18025            LICENSE                                          a01259a1b522cf0de95824f9860613b453153eebac468e96196d5d7dba84786c                                                                 
 7999             LJ!-Qt!-Fghxft-dferts%3B-hsjeukaxxn-sfedw.ipynb  429b6c6995096ff19c28a5ee342bef8ea4774200bdf9aaf6268de3cb8b28df28                                                                 
 61               README.md                                        277247b410300ee16477b12ca54ad878d81c8061f6134e2e1cadccaf299de3a3                                                                 
@@ -150,8 +150,8 @@ size     exec  file                                               contents
 16832            cadenus-ciphers.ipynb                            50e49b3ec5e6440b86fe13472b9f4ab9e133e5665c7280b2abf7a6b57bb8a89a                                                                 
 514              caesar_break_parameter_trials.csv                6586223bcc00e06e3ff79d107202d6c29ef962a6dd544add00610c5907407e85|1cb7cc77831ef3ef4f994a9ea77e82a841b38acdde45ede9cedbe7a54f1e8e46
 318              cipher-training.sublime-project                  58e5d5b4e54fb29abecaef2d41266e3355adccb8b6a70bd595e509bd07c16587                                                                 
-42052            cipher.py                                        4ae3835f58782e76f8dc747ce46ae461c11236cf3397ee32adec8e974cf06153                                                                 
-28736            cipherbreak.py                                   cbda3e76773ad3125e00360622d1e01eccf376d4e783617c925cc4c557e97d86                                                                 
+42922            cipher.py                                        58637b8946b4fb973b19a374a2066a896d86c928dacaa1ccd2252e6f8bb6e810                                                                 
+28908            cipherbreak.py                                   0fb22645ddce4e04c7e441a1f7bdc0e4a397a3c9b2cfb3098bcb213e79a361c9                                                                 
 11564            count_1edit.txt                                  3bf563ef032ba151ec1a4b2d1f33f50c49f4a47e4dc5b8152394bc5b63f57655|b5fbacbebcc25f5011ce97bc9ac967a09c50eef28b4aa98379a6c426df6ac08b
 223              count_1l.txt                                     335388d457db6ef1da05d8b55ab879e9be7d4e021085efc8d9dfeac0e4a79aa9                                                                 
 4956241          count_1w.txt                                     51df159fd3de12b20e403c108f526e96dbd723d9cabdd5f17955cdc16059e690                                                                 
@@ -163,7 +163,7 @@ size     exec  file                                               contents
 3027             find_best_caesar_break_parameters.py             0347d80309179d937a88fd1c8684490a513ccd086366c5a0dd55b8a2fe5c565f                                                                 
 1236             find_wikipedia_titles.py                         f040bf855dfec7fff9d8e5eba2fb509179bc53bc02a20b26b7fc61fef983aa45                                                                 
 37128            hill-ciphers.ipynb                               ce802c2be807b4565858b568d3a82c65a3957aa625344189f8f2a055237b3fdd                                                                 
-5516             language_models.py                               9f6c60892b385a8443202edda95074eb28e2b66981e25e27f4153b887e2c9ee3                                                                 
+5645             language_models.py                               bfd5b60cdef8af20cdb061b24a1691f569984be3be333782c3d76e3370e16d14                                                                 
 368              lettercount.py                                   ed36497d62cf75b91994055e4a18848b2fabe5ce793cd76a77fabfc94d81d4f3                                                                 
 592              make-cracking-dictionary.py                      71791e64e4853cd9ca292cb436bbe8c72dd60f509811174df93ed2067683d5c1                                                                 
 7077             norms.py                                         a657a36c1741e6f3a513386b318fcc99e6b11f98ec64a48284b47462ff2acf30                                                                 
index eb0a169162851fff86bd6dfe6be3cf8064608dbe..266237a65a70b070e2ea8bc41d49f273477eda2c 100644 (file)
--- a/cipher.py
+++ b/cipher.py
@@ -836,11 +836,17 @@ def amsco_transposition_encipher(message, keyword,
     'hotelerelh'
     >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(2, 1))
     'hetelorlhe'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'encode')
+    'etecstthhomoerereenisxip'
     >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2))
+    'hetcsoeisterereipexthomn'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2), fillstyle=AmscoFillStyle.continuous)
     'hecsoisttererteipexhomen'
     >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(2, 1))
-    'heetcisooestrrepeixthemn'
+    'heecisoosttrrtepeixhemen'
     >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2))
+    'hxtomephescieretoeisnter'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2), fillstyle=AmscoFillStyle.continuous)
     'hxomeiphscerettoisenteer'
     """
     grid = amsco_transposition_positions(message, keyword, 
@@ -861,11 +867,17 @@ def amsco_transposition_decipher(message, keyword,
     'hellothere'
     >>> amsco_transposition_decipher('hetelorlhe', 'acb', fillpattern=(2, 1))
     'hellothere'
-    >>> amsco_transposition_decipher('hecsoisttererteipexhomen', 'cipher', fillpattern=(1, 2))
+    >>> amsco_transposition_decipher('etecstthhomoerereenisxip', 'encode')
     'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('heetcisooestrrepeixthemn', 'cipher', fillpattern=(2, 1))
+    >>> amsco_transposition_decipher('hetcsoeisterereipexthomn', 'cipher', fillpattern=(1, 2))
     'hereissometexttoencipher'
-    >>> amsco_transposition_decipher('hxomeiphscerettoisenteer', 'cipher', fillpattern=(1, 3, 2))
+    >>> amsco_transposition_decipher('hecsoisttererteipexhomen', 'cipher', fillpattern=(1, 2), fillstyle=AmscoFillStyle.continuous)
+    'hereissometexttoencipher'
+    >>> amsco_transposition_decipher('heecisoosttrrtepeixhemen', 'cipher', fillpattern=(2, 1))
+    'hereissometexttoencipher'
+    >>> amsco_transposition_decipher('hxtomephescieretoeisnter', 'cipher', fillpattern=(1, 3, 2))
+    'hereissometexttoencipher'
+    >>> amsco_transposition_decipher('hxomeiphscerettoisenteer', 'cipher', fillpattern=(1, 3, 2), fillstyle=AmscoFillStyle.continuous)
     'hereissometexttoencipher'
     """
 
index 120a89e4f82ec07561a0fa2ced9940344eafc60c..0ac8ae57f7ed11a443dfedc8366ddc51086eda8c 100644 (file)
@@ -199,23 +199,27 @@ def keyword_break_worker(message, keyword, wrap_alphabet, fitness):
     return (keyword, wrap_alphabet), fit
 
 def monoalphabetic_break_hillclimbing(message, max_iterations=10000000, 
-        fitness=Pletters):
+        alphabet=None, fitness=Pletters):
     ciphertext = unaccent(message).lower()
-    alphabet = list(string.ascii_lowercase)
-    random.shuffle(alphabet)
-    alphabet = ''.join(alphabet)
+    if not alphabet:
+        alphabet = list(string.ascii_lowercase)
+        random.shuffle(alphabet)
+        alphabet = ''.join(alphabet)
     return monoalphabetic_break_hillclimbing_worker(ciphertext, alphabet,
                                                     max_iterations, fitness)
 
 def monoalphabetic_break_hillclimbing_mp(message, workers=10, 
-        max_iterations = 10000000, fitness=Pletters, chunksize=1):
+        max_iterations = 10000000, alphabet=None, fitness=Pletters, chunksize=1):
     worker_args = []
     ciphertext = unaccent(message).lower()
     for i in range(workers):
-        alphabet = list(string.ascii_lowercase)
-        random.shuffle(alphabet)
-        alphabet = ''.join(alphabet)
-        worker_args.append((ciphertext, alphabet, max_iterations, fitness))
+        if alphabet:
+            this_alphabet = alphabet
+        else:
+            this_alphabet = list(string.ascii_lowercase)
+            random.shuffle(this_alphabet)
+            this_alphabet = ''.join(this_alphabet)
+        worker_args.append((ciphertext, this_alphabet, max_iterations, fitness))
     with Pool() as pool:
         breaks = pool.starmap(monoalphabetic_break_hillclimbing_worker,
                               worker_args, chunksize)
index f1877b70d8169ee12372cf028e284f4d14f6183b..bf00875c43e134fd2b46327e80c56c8468c60e58 100644 (file)
@@ -9,6 +9,7 @@ import collections
 import unicodedata
 import itertools
 from math import log10
+import os 
 
 unaccent_specials = ''.maketrans({"’": "'"})
 
@@ -60,7 +61,7 @@ def sanitise(text):
 def datafile(name, sep='\t'):
     """Read key,value pairs from file.
     """
-    with open(name, 'r') as f:
+    with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), name), 'r') as f:
         for line in f:
             splits = line.split(sep)
             yield [splits[0], int(splits[1])]
@@ -74,7 +75,7 @@ normalised_english_bigram_counts = norms.normalise(english_bigram_counts)
 english_trigram_counts = collections.Counter(dict(datafile('count_3l.txt')))
 normalised_english_trigram_counts = norms.normalise(english_trigram_counts)
 
-with open('words.txt', 'r') as f:
+with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'words.txt'), 'r') as f:
     keywords = [line.rstrip() for line in f]