Added AMSCO ciphers, done challenge 7
authorNeil Smith <neil.git@njae.me.uk>
Mon, 8 Dec 2014 17:08:53 +0000 (17:08 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Mon, 8 Dec 2014 17:08:53 +0000 (17:08 +0000)
2013-challenge7.ipynb
2014-challenge7.ipynb [new file with mode: 0644]
2014/7a.ciphertext [new file with mode: 0644]
2014/7b.ciphertext [new file with mode: 0644]
cipher.py
cipherbreak.py

index d7d18f4e9dc27aae1d0e35f9d57d3342eef5423e..df220ab061003ca1f34c7972a5d5c745dbb650b3 100644 (file)
@@ -1,6 +1,7 @@
 {
  "metadata": {
-  "name": ""
+  "name": "",
+  "signature": "sha256:f1a5a36cab6e0c7ddd88d11606576a341e061c4e87c77676dfffeff0c585a596"
  },
  "nbformat": 3,
  "nbformat_minor": 0,
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "from cipherbreak import *\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 *"
+     ],
+     "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",
@@ -23,7 +40,7 @@
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 1
+     "prompt_number": 2
     },
     {
      "cell_type": "code",
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 2
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(frequencies(sanitise(c7a)))"
-     ],
-     "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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\n3n777S6nGT16dMDPxe9//3vl5OQoJydHy5Yt67aXQLe1b24/3b12tbW1GjVqlEpLS5WTk6O6ujqf\ntUePHtXll1+uvLw85eTkaNWqVT5rFy5cqE8++UT5+flasGCBz7qTPXxz9LtkyRItWrSoy9pf/epX\npwSfrz0MDz/8sP7whz9Ikm6//XYVFRVJkjZt2qTrr7/+tPq3335bubm5am9v19GjR5Wdna2ampou\ne7j//vtPeb3uuecePfbYYz7X709/+pPy8/OVn5+vESNG6JJLLvFZ2yeF8zTzWNfc3GxZlmW1tbVZ\n2dnZ1ueff95l3d69ey2bzWa98cYblmVZVllZmbVkyZIua99//30rMzPTO6+Ty+jKtm3brJycHOvY\nsWPW4cOHrZEjR1pLly7tsrampsaaPn26dfz4ccuyLOu2226zVqxY4Xf90tPTfa7TSdXV1VZeXp7V\n3t5utba2WhkZGT572Lt3rxUXF2ft3LnTsizLKikpsV544QW/8x80aJDfx0OZZu/evVZ2drb10Ucf\nWfn5+dZ7773Xo3meXK/333/f6uzstMaNG2eVlZVZlmVZa9assWbMmOFzmkCei5Ovc1tbm3XkyBFr\nzJgx1o4dO3z2Eui2Fsz2c3Le/fr1s9566y2fNSetXr3auvnmm72/Hzp0yGdtbW2tlZ2d3e08T/bw\nzdolS5ZY5eXlXdbu2LHDmjJlivd3h8Nh1dXVnVa3detWa9asWZZlWdb3v/99a8KECdZXX31llZeX\nW0899VSX87733nutO++80/rpT3962kdrvqm2ttYqKCiwLMuyOjo6rPPPP9/ve/qkr776yiosLLTW\nrVvXbW1fwggqjJYtW6a8vDxNnDhRdXV1+ve//+2zdtiwYZo4caIk6frrr9eWLVu6rNu0aZNKSko0\ndOhQSVJiYqLPeb722muaOXOmBgwYoMGDB+uKK67wudtl48aNeuedd3TBBRcoPz9fmzZt0t69ewNd\nVZ9ef/11zZgxQ/3799egQYM0ffp0v7t+RowYobFjx0qSxo0bp9ra2h73EIpPP/1UM2bM0IsvvhiW\n44MjRozQmDFjZLPZNGbMGE2dOlWSlJ2d7XMdA30utmzZopkzZ+qcc87RwIEDNXPmTL322ms+ewl0\nWwtm+zlp+PDhGj9+vN8aSRo7dqw2bNighQsXasuWLUpISPBZ290yQ5WXl6dPP/1UDQ0N2rlzpxIT\nE5Wamnpa3ckRdGtrqwYMGKCJEydq27Zt2rJliwoLC7uc93333af169dr27Ztmj9/vs8ehg8frqSk\nJL377rtav369CgoK/L6nT/r5z3+uoqIiXX755YGvcB8Q1tPMY5nH49HGjRu1detWDRgwQBdffLHa\n29t91n/zGIZlWT6PadhstoDfsP9b2910paWlWrx4cUDzDlSwPZx99tnen8866yy/u58iaciQIRo+\nfLhee+01ZWVl9Xh+31yvfv36qX///t6fjx8/3u00/p6Lrp5jf8fEQt3WAtnuBg4c2G2NJGVkZGjH\njh165ZVXdO+996qoqEi//vWvA5rWn7i4uFN2TXe3/cyaNUurV69WY2Ojrr322i5r4uPjNWLECD3/\n/POaNGmSxo4dq02bNunjjz/2uW189tlnOnr0qDo6OnTs2DGde+65Pnu46aab9Nxzz6mpqUllZWXd\nruPzzz+v/fv3x+RxOUZQYXL48GElJiZqwIAB+uijj7R161a/9fv27fPWvPjiiz7/Z3bJJZfo73//\nu5qbmyXJ+29XLrroIlVWVuqLL75Qa2ur1q1b5/OPUVFRkVavXq3//ve/3vnu27ev2/XszuTJk/Xy\nyy+rvb1dR44c0SuvvBIVJxT0799f//jHP7RixQqtXLmyt9vxq7CwUJWVlTp27JiOHj2qyspKn9uP\nFPi2Fsz2E6yGhgYNGDBA1113ne68805t377dZ+3gwYPV2toa0Hztdrs+/fRTNTc3q729XevWrfNb\nf80112jlypVavXq1Zs2a5bOusLBQS5Ys0ZQpU1RYWKgnn3xSBQUFPut/8pOf6IEHHtCcOXO6PW52\n5ZVXqqqqStu2bdO0adP81r7zzjtaunRpr56Y1JsYQYXJpZdeqieffFIOh0OjRo3y7lLpis1m06hR\no/T444+rrKxMY8aM0W233dZlrcPh0D333KMpU6borLPOUkFBgZ599tkua/Pz83XNNdcoNzdXycnJ\nfne9jB49Wg888ICKi4vV2dmp+Ph4LV++XN/97nf99t2dCy64QFdccYXGjh0ru92unJwcfetb3wp4\nnt0tI5Q/mIFMY7PZdO6552rdunVyuVwaPHiwfvjDH4Y8T3/r5W8EE8gy8vPzdeONN3pf35tvvlm5\nubk+ewl0W/vf7efCCy/sdhQV6Ouxa9cu3XXXXd7RpL/TyJOSkjR58mTl5OTosssu8/u9cvHx8brv\nvvs0fvx4paamyuFw+O3J4XDoyJEjSktLk91u91lXWFioxYsXa+LEiTrnnHN0zjnn+Az2FStW6Oyz\nz9a1116rzs5OTZo0SR6PR06n02fPl1xyiRITE7t9/h5//HEdPHhQF198sSTpwgsv1FNPPeV3mr6E\nD+oi7I4ePaqBAweqra1NU6ZM0dNPP628vLxe6eXzzz/v1WNbva22tlbTp0/Xrl27gp520aJFGjRo\nkO64444IdBa7Ojs7NW7cOK1evVrnn39+b7djNHbxIexuueUW5efna9y4cbr66qt7LZwOHDigSZMm\n6a677uqV5ZuiJ7vpomH3bDSpqalRRkaGpk6dSjgFgBEUAMBIjKAAAEYioAAARiKgAABGIqAAAEYi\noAAARiKgAABG+j/og6x5jaDpPwAAAABJRU5ErkJggg==\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xb55607cc>"
-       ]
-      }
-     ],
      "prompt_number": 3
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "c7af = frequencies(sanitise(c7a))\n",
-      "plot_frequency_histogram(c7af, sort_key=lambda l: c7af[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
-      {
-       "metadata": {},
-       "output_type": "display_data",
-       "png": "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\nf14NDQ0qKSnxO253X4+uar31kZaWph07dujVV1/Vfffdp4KCAv3mN7/xOvYLL7yg/fv3+91H8u0e\n/Pn888919OhRtbW16dixYzr33HO7rIuKiuq0adrb6xYdHa0RI0bohRde0KRJkzR27Fht2rRJn3zy\nSZfrRk/X91mzZmn16tWqr6/Xdddd152nGBI9Wd9Csc57PB5t3LhRW7du1aBBg3TJJZeotbW11+P2\nJ8yggqCgoECrV6/Wf//7X0lSY2Oj9u3b57X+4osvVnl5ub788ks1Nzdr3bp1xu80HThwoP7xj39o\nxYoVWrlyZZ/0sG/fPm3dulWS9NJLL3X51/pJV111lSoqKrRt2zZNmzbN57iTJ0/WK6+8otbWVh05\nckSvvvqq19cjPz9f5eXlOnbsmI4ePary8nKvfdTV1WnQoEG6/vrrddddd2n79u1ee3j33Xe1dOnS\nbh0Ic+mll+rvf/+7GhsbJanjX29++tOf6sEHH9ScOXN87nex2+367LPP1NjYqNbWVq1bt85rbX5+\nvpYsWaIpU6YoPz9fTz31lPLy8rqs7en6fu2112rlypVavXq1Zs2a5fO59VRMTIyam5u7VduT9S0U\nDh8+rLi4OA0aNEgff/xxRy+RhBlUEIwePVoPPvigCgsL1d7erujoaC1fvlznn39+l/W5ubm69tpr\nlZ2drcTERF100UV+/2r359s137zu6/HdDUabzaZzzz1X69atk8vlUkxMjH70ox/1uBd/y/B136hR\no/TEE0+opKREY8aM0e233+61Pjo6Wpdeeqni4uL8Lv/CCy/UlVdeqbFjx8putysrK0vf+c53uqzN\nzc3VTTfd1LFZ9JZbblF2dnaXtbt27dLdd9/dMaP1dXjzE088oYMHD+qSSy6RJF100UV6+umnu6x1\nOBy69957NWXKFJ111lnKy8vTc88912XtihUrdPbZZ+u6665Te3u7Jk2aJI/HI6fTeVptdHS07r//\nfo0fP17JyclyOBw+g3rx4sWaOHGizjnnHJ1zzjle38C/vb7726TscDh05MgRpaSkyG63+6w9qbvr\nWEJCgiZPnqysrCxdfvnlPr+zrifrW0/X+e70e9lll+mpp56Sw+HQqFGjOjY3RhI+qGuARYsWaciQ\nIbrzzjv7upU+88UXXwR12317e7vGjRun1atX64ILLvBbf/ToUQ0ePFgtLS2aMmWKnnnmGeXk5ASl\nF/Q/1dXVmj59unbt2tXXrUQ0NvEZwvRNfKF04MABTZo0SXfffXdQxquqqlJaWpqmTp3arXCSpFtv\nvVW5ubkaN26crrnmGsIJEf07aQpmUAAAIzGDAgAYiYACABiJgAIAGImAAgAYiYACABiJgAIAGOn/\nARTQq3riH9t+AAAAAElFTkSuQmCC\n",
-       "text": [
-        "<matplotlib.figure.Figure at 0xaeb102cc>"
-       ]
-      }
-     ],
-     "prompt_number": 5
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "plot_frequency_histogram(normalised_english_counts, sort_key=lambda l: normalised_english_counts[l])"
+      "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": "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",
+       "output_type": "pyout",
+       "prompt_number": 4,
        "text": [
-        "<matplotlib.figure.Figure at 0xaeae5cec>"
+        "<matplotlib.axes.AxesSubplot at 0x7fc957f09160>"
        ]
-      }
-     ],
-     "prompt_number": 6
-    },
-    {
-     "cell_type": "code",
-     "collapsed": false,
-     "input": [
-      "c7bf = frequencies(sanitise(c7b))\n",
-      "plot_frequency_histogram(c7bf, sort_key=lambda l: c7bf[l])"
-     ],
-     "language": "python",
-     "metadata": {},
-     "outputs": [
+      },
       {
        "metadata": {},
        "output_type": "display_data",
-       "png": "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\nZWWllZWVZbW0tFjHjx+3UlJS/K7PMwJ9PTt27LCmTp1qWZZlfe9737NGjRplffXVV1ZJSYn1/PPP\n+3wt77//vtXW1mYNHz7cKi4utizLstavX29NmjTJ5zKTk5P9rsczznymm5ubrRMnTlhDhw61du/e\n7bOmqqrKKigosE6fPm1ZlmXde++91sqVK33WVFdXWzk5OZZlWVZra6s1cODAgP4vtHednlnWN/8v\nhAIjqIvgZz/7mfLy8nTjjTf6bfvaa69p8uTJ6tGjh3r37q2bbrrJ7+6dYcOGafPmzZo3b562b9+u\nmJgYn+2zsrL0ySefqK6uTnv27FFsbKwSExP99u3RRx/Vpk2btHPnTs2ZM8dv+zP69eun0aNHS5Jm\nzJih7du3+2wfzHuwdetWFRYWqm/fvpKk2NhYv/365JNPNGnSJL300kud/l3M4sWLlZWVpdGjR6um\npkb//Oc//db0799fI0eO7NR+tXfdSNKAAQM0bNgwSdLw4cNVXV3ts/3rr7+uSZMmqXv37urVq5cK\nCgoC3mUZqDMj4OPHj6tHjx4aPXq0du7cqe3btys3N/eCdQMGDNDQoUNls9k0dOhQjR8/XpKUnp7u\n93W1x/bt2zV58mRdccUV6tmzpyZPnqzXXnvNZ82WLVv0zjvvaMSIEcrOztbWrVt18OBBnzX9+/dX\nXFyc3n33XW3atEk5OTkB/V9o7zqVFPJ1KIX4MHP4t2LFCh0+fDjgfbU2m+2sFR/IhyAlJUW7d+/W\nK6+8okceeUR5eXn61a9+5bNm6tSpWrdunerr63XbbbcF1LdPP/1UJ0+eVGtrq06dOqUrr7wyoLpv\nfo9gWZbf7xWCeQ/+tyYQffr0Uf/+/fXaa68pLS0toJqoqKizdrMEsrvS4/Foy5Yt2rFjh3r06KHr\nrrtOLS0tfut69uwZUJ86or3rRpIuv/xy7/XLLrvM73sQzPpsr+joaA0YMEArVqzQmDFjNGzYMG3d\nulUff/yxz3X7zdfSrVs3de/e3Xv99OnTIevf+d6DQN7roqIiLViwoF3LuvPOO7V8+XI1NDSouLg4\noJr2rtPOwgiqC73zzjtatGhRu75Evfbaa1VeXq4vvvhCx48f18aNG/1+kOvq6tSjRw/dfvvteuCB\nB7Rr1y6/y7n11lu1evVqrVu3TlOnTg2obz/+8Y/1+OOPa/r06e3a53zo0CHt2LFDkvTSSy/5/ItW\nCu49uP766/XXv/5VjY2NkuT915fu3bvrb3/7m1auXKnVq1cH9Frsdrs++eQTNTY2qqWlRRs3bvRb\nc+zYMcXGxqpHjx766KOPvO+FCdq7boIxduxYvfzyy2ppadGJEyf0yiuvdMrBD7m5uVq4cKHGjRun\n3NxcPffcc8rJyQn5coKRm5ur8vJynTp1SidPnlR5ebnf9zovL0/r1q3Tv//9b0lff6YPHTrkd1k3\n33yzKioqtHPnTk2YMCEk/T+f3r176/jx4yF9TkZQXWjp0qX6/PPPdd1110mSrrnmGj3//PM+a7Kz\ns3XrrbcqMzNT8fHxuuaaa/z+xbl37149+OCD3r8AAzn00+Fw6MSJE0pKSpLdbvfbfuXKlbr88st1\n2223qa2tTWPGjJHH45HT6fRbO3jwYC1dulTFxcUaOnSo7r33Xp/t//c9CGQ3l8Ph0MMPP6xx48bp\nsssuU05Ojl588UWfNTabTVdeeaU2btwol8ul3r176wc/+IHPmujoaD366KMaOXKkEhMT5XA4/G5s\nb7jhBj333HNyOBwaPHiwd5eaP8FsxNtTY7PZ2r1uzrcMf8scMWKEbrrpJg0bNkx2u10ZGRn61re+\nFXAfA5Wbm6sFCxZo9OjRuuKKK3TFFVf4DQFfryWQkX6gsrOzdccdd3g/y3fddZcyMzN91gwZMkSP\nP/648vPz1dbWpujoaJWVlenqq6/2WRcdHa3rr79esbGxAfexvetUkuLi4jR27FhlZGRo4sSJITkf\nID/UvcTMnz9fvXr10v3333+xuxKU6upqFRQUaO/evRe7K7iITp48qZ49e6q5uVnjxo3TsmXLlJWV\ndbG7FZba2to0fPhwrVu3TgMHDrzY3WkXdvFdgkz+LUggLvX+o+PuvvtuZWdna/jw4ZoyZQrh1Emq\nqqqUkpKi8ePHX3LhJDGCAgAYihEUAMBIBBQAwEgEFADASAQUAMBIBBQAwEgEFADASP8PW/f+Q9EK\neawAAAAASUVORK5CYII=\n",
+       "png": "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\n",
        "text": [
-        "<matplotlib.figure.Figure at 0xaeb95f8c>"
+        "<matplotlib.figure.Figure at 0x7fc957f08978>"
        ]
       }
      ],
-     "prompt_number": 7
+     "prompt_number": 4
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "plot_frequency_histogram(c7bf)"
+      "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": "display_data",
-       "png": "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\nrClTplhHjhyxLMuybr31Vmvp0qVB+8rMzAx6v7+ptrbWKigosNrb260DBw5YWVlZQce2a9cuKyEh\nwdq2bZtlWZZVVlZmPf/880H76tevn+1x7dq1y8rNzbU+/PBDq7Cw0Hr33Xdt19rt59j9eO+996zO\nzk5r1KhRVkVFhWVZlrVy5Upr6tSpAetCuf/HtoG2tjbr4MGD1ogRI6ytW7cGHV+o22c429qxvnr1\n6mW9+eabQdtalmWtWLHCuummm7p+37dvn606v99v5ebm2mp7bFzfbL9w4UKrsrIyYM3WrVutCRMm\ndP3ucrms+vr6U7bftGmTNX36dMuyLOt73/ueNWbMGOurr76yKisrrSeffDJgX/fcc491xx13WD/9\n6U9P+NrPyfj9fquoqMiyLMvq6OiwLrjgAluvIZZlWV999ZVVXFxsrV692lb7YJhBRdnixYtVUFCg\nsWPHqr6+Xv/617+C1gwaNEhjx46VJF133XXauHFjwPbr169XWVmZBg4cKElKTk4O2serr76qadOm\nqU+fPurfv7+uuOKKoLtQ1q1bp7ffflsXXnihCgsLtX79eu3atStoX6F67bXXNHXqVPXu3Vv9+vXT\nlClTbO3eGTJkiEaOHClJGjVqlPx+f8TH9sknn2jq1Kl64YUXeuyzwiFDhmjEiBFyOBwaMWKEJk2a\nJEnKzc0NeJ9Cvf8bN27UtGnTdM4556hv376aNm2aXn311aDjC3X7DGdbO2bw4MEaPXq0rbYjR47U\n2rVrNW/ePG3cuFFJSUm26uyOpTsKCgr0ySefqLGxUdu2bVNycrLS09NP2f7Y7PzAgQPq06ePxo4d\nq82bN2vjxo0qLi4O2Ne9996rNWvWaPPmzZozZ07QsQ0ePFgpKSl65513tGbNGhUVFdl6DZGkn//8\n5yopKdHll19uq30wET3MHIH5fD6tW7dOmzZtUp8+fTRx4kS1t7cHrfvm5xWWZQX9/MLhcIT8n+x/\na+zWl5eXa8GCBSH1Fapwx3b22Wd3/XzWWWfZ2vUUqgEDBmjw4MF69dVXlZOTE/Hbl46/H7169VLv\n3r27fj5y5IitOjv3/2SPs53Pyrq7fYayrfbt29d226ysLG3dulUvv/yy7rnnHpWUlOjXv/617Xq7\nEhISjtu1bXc7mz59ulasWKGmpiZdc801AdsmJiZqyJAheu655zRu3DiNHDlS69ev10cffRR0u/v0\n00916NAhdXR06PDhwzr33HODju3GG2/Us88+q+bmZlVUVNi6P88995z27NkT0c/vmEFF0f79+5Wc\nnKw+ffroww8/1KZNm2zV7d69u6vtCy+8EPQd0yWXXKK//e1vamlpkaSufwO5+OKLVV1drS+++EIH\nDhzQ6tWrg77QlJSUaMWKFfrPf/7T1c/u3bvt3KWQjB8/Xi+99JLa29t18OBBvfzyy8YcZNC7d2/9\n/e9/19KlS7Vs2bLTPZxuKS4uVnV1tQ4fPqxDhw6puro66LYmhb59hrOthaOxsVF9+vTRtddeqzvu\nuENbtmyxVde/f38dOHDAdj9Op1OffPKJWlpa1N7ertWrV9uqu/rqq7Vs2TKtWLFC06dPD9q+uLhY\nCxcu1IQJE1RcXKwnnnhCRUVFQet+8pOf6P7779fMmTNtfaYmHf2svKamRps3b9bkyZODtn/77be1\naNGiiB/4xAwqii699FI98cQTcrlcGjZsWNdukUAcDoeGDRumxx57TBUVFRoxYoRuvfXWgDUul0t3\n3323JkyYoLPOOktFRUV65plnAtYUFhbq6quvVn5+vlJTU23tRhk+fLjuv/9+lZaWqrOzU4mJiVqy\nZInOP//8oPcpFBdeeKGuuOIKjRw5Uk6nU3l5efrWt74VtO5/+wl1NmCHw+HQueeeq9WrV8vj8ah/\n//76wQ9+ENF+At2PQLcT6v0vLCzUDTfc0PXc33TTTcrPzw86vlC3z//d1i666CLbs6hQHrft27fr\nzjvv7Jp12j10PCUlRePHj1deXp4uu+yyoOe1S0xM1L333qvRo0crPT1dLpfL1jhdLpcOHjyojIwM\nOZ3OoO2Li4u1YMECjR07Vuecc47OOeecoG8Gli5dqrPPPlvXXHONOjs7NW7cOPl8Prnd7qD36ZJL\nLlFycrKt+/LYY4/p888/18SJEyVJF110kZ588smgdcHwRV2cEQ4dOqS+ffuqra1NEyZM0FNPPaWC\ngoLTPay45/f7NWXKFG3fvj3s25g/f7769eun22+/PYIjQ3d0dnZq1KhRWrFihS644ILTNg528eGM\ncPPNN6uwsFCjRo3SVVddRTgZJBK750zZZQuprq5OWVlZmjRp0mkNJ4kZFADAUMygAABGIqAAAEYi\noAAARiKgAABGIqAAAEYioAAARvp/fPP9PvjmFnQAAAAASUVORK5CYII=\n",
+       "output_type": "pyout",
+       "prompt_number": 10,
        "text": [
-        "<matplotlib.figure.Figure at 0xaeaa372c>"
+        "<matplotlib.axes.AxesSubplot at 0x7fc957efdc18>"
        ]
-      }
-     ],
-     "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",
+       "png": "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\nuwAAAABJRU5ErkJggg==\n",
        "text": [
-        "<matplotlib.figure.Figure at 0xaeb47b6c>"
+        "<matplotlib.figure.Figure at 0x7fc957eadb00>"
        ]
       }
      ],
-     "prompt_number": 9
+     "prompt_number": 10
     },
     {
      "cell_type": "code",
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 10,
+       "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": 10
+     "prompt_number": 5
     },
     {
      "cell_type": "code",
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 12,
+       "prompt_number": 6,
        "text": [
-        "('hp', 0.03214089578198264)"
+        "('hp', -2071.4841308636614)"
        ]
       }
      ],
-     "prompt_number": 12
+     "prompt_number": 6
     },
     {
      "cell_type": "code",
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 15,
+       "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": 15
+     "prompt_number": 7
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "vigenere_frequency_break(sanitise(c7b))"
+      "railfence_break(sanitise(c7b))"
      ],
      "language": "python",
      "metadata": {},
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 16,
+       "prompt_number": 8,
        "text": [
-        "('aattuualptaaauaaaa', 0.10312795085805967)"
+        "(2, -4150.8334806309485)"
        ]
       }
      ],
-     "prompt_number": 16
+     "prompt_number": 8
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
-      "' '.join(segment(vigenere_decipher(sanitise(c7b),'aattuualptaaauaaaa' )))"
+      "' '.join(segment(railfence_decipher(sanitise(c7b), 2)))"
      ],
      "language": "python",
      "metadata": {},
       {
        "metadata": {},
        "output_type": "pyout",
-       "prompt_number": 17,
+       "prompt_number": 9,
        "text": [
-        "'ttmaqoehqveytelettkf vfantitlnhhttprnmews qrfwquefetnntmmohpun kit a murvsoegeomjsemwelpo yotkcoytmamvgijtrhtk pcrnydlmautreryrciti man rtxrnmzeatctythrycyb obmmisfdefehefyfnvws note neetztxkrqcavlennemh tmeemnnfvulnntneyfrt a ohtmohynxzxnzontunrg hubfooznoirdgkiztyqh eodatncnenpgyccwfmai masxprjmmtoktyiheouf jnteemaetxhkyutyaatk ausmmfuccthuyotxmltn tythhtootmnrnusztdsm mkoiyftfhharuianbwha eixyetfoatnboksfiheu ywcrthbfulmrsaetmlpu ymhtryamodjafttteaff ttnwmqtfzwbhntypttmt are dldnrkyhsacctyerfamm tgomtxzumtmtmtanskid jfpoxhothtoaixvidebb ooeryykftffteelratyh qyurtemtvgeutvsfrheo tcmhyalioyuemnefknco trqiitaonfouaywtmmoo that eu uhpyhnzxttontfaaxnsn of lioptnrtovvxzdiepexy not etielahfcariewfhwwh yiwlvmuudehtbbfvvawi ytkbozvrifacjsiwaagb let now oalfdorpballhktfqtku at hvnxwllfmodtqsluhycv lhiyytejglmrzfdemded dweicjqisrnvlmhudewl kb dgcmklhyhkjalxdosdtq in lfs gewambhlohuwejeltww tbjgeudeucklmxatceud same rpfmjtqmorshwzndcgkm zhieuzasrsoekzgbtbqh rktiwgcavlneuqrzhibj leljrlayqybgewqgrkth wlpiyshwfsillxicblls ebwhcyfkrvmhiomkotdo iwmfahyniseiszwfshlt cxrmaotikmnuachvqdov mmatibzhfoadvloawzke nqrcnrgbxrwfdkctsxxa iejzlnerryfidtbwhxbd hluhtfswwnclgdtwwdvk lhazobmargsgwwtopasg men rl on york rodr keewdeelujkdlellythc wexcfrqxagrdiyunehkn ikfruurtslqbdjrcvujp kxghfbldgmistthujsot bids iwcdsiajaqmanpigbcp zoxlurhnlgrtfifiguor gsm mntfcwavanbilwysatnl mvpnafbhzhwxnrzirhra'"
+        "'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": 17
+     "prompt_number": 9
     },
     {
      "cell_type": "code",
diff --git a/2014-challenge7.ipynb b/2014-challenge7.ipynb
new file mode 100644 (file)
index 0000000..35d298f
--- /dev/null
@@ -0,0 +1,387 @@
+{
+ "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": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD+CAYAAAAnIY4eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGfhJREFUeJztnX2wJFV5xn+XXQWFe929pS7r5xBKAlLqKpoiKsWNQWKM\nEipGIomRawhlRIVNmYRdK5HdVMUgKROixiRAYBfByPoRIqkE2ay340cQJbDL4mYRN94IplhSLusu\nJhqQmz9OD7dn7vT0nDMzp98+9/lVTc10z3n6PV/9Ts/T3TMghBBCCCGEEEIIIYQQQgghhBBCCCGE\nEEIIMVKuAfYDuwvrpoHtwDeBW4FVhfc2AvcBe4EzI9VRCCFEH04DXkpnIr8c+L389SXAZfnrFwI7\ngScBLeBbwBFRaimEEKIvLToT+V5gTf762HwZ3NH4JYVytwCnjrtyQgix3Ak5Yl6Ds1vIn9tJ/VnA\nA4VyDwDPDq+aEEKIQRjW+ljIH/3eF0IIMUZWBmj24yyVB4G1wEP5+u8Czy2Ue06+roPjjz9+Yd++\nfQFhhRBiWbMLWNfrjZAj8s8B5+WvzwNuKqx/C/Bk4DjgBcDXusX79u1jYWGh5+PSSy8tfa9pGqv1\nksZuvaSxWy8LGuAlZUm56oj8b4HTgacD9wPvx12lsg04H5gHzsnL7snX7wEeAy7E01qZn5/3KW5a\nY7Ve0titlzR262VdU5XIzy1Zf0bJ+g/kDyGEEJFYUUPMTZs2ber5xqpVq2i1Wl4bs6qxWi9p7NZL\nGrv1sqDZvHkzwOZemgmvCKNhIfd7hBBCDMjExASU5GxTd15mWZaMxmq9pLFbL2ns1su6xlQiF0II\n4Y+sFSGEaACNsVaEEEL4YyqRW/ag5PWlo7FaL2ns1su6xlQiF0II4Y88ciGEaADyyIUQImFMJXLL\nHpS8vnQ0Vusljd16WdeYSuRCCCH8kUcuhBANQB65EEIkjKlEbtmDkteXjsZqvaSxWy/rGlOJXAgh\nhD/yyEXjmJqa5vDhh3u+Nzm5mkOHDkSukRDjp59HrkQuGoeb0GVzaALNL5EijTnZadmDktdnVwN+\nGsttWe4aq/WyrjGVyIUQQvgja0U0DlkrYjnSGGtFCCGEP6YSuWUPSl6fXY088nQ0VutlXWMqkQsh\nhPBHHrloHPLIxXLEtEc+NTXNxMTEksfU1HTdVRNCJETKuab2RO7u0FvIH3NPvC67c68bq76V1Xql\nqJFHno5mnDFSzTVgIJELIYQYjto98nK/U16n6I08chFC03ONaY9cCCHEcBhL5Jm/wqhvZbVeKWrk\nkaejsTpnQuPIIxdCCDEQ8shF45BHLkJoeq6RRy6EEAljLJFn/gpDvlXZDQeD3nRgqS1N0sgjT0dj\ndc6ExpFH3kDKbjjwuelACCF8GcYj3wi8FXgc2A28HTgauBF4PjAPnAMc7NIl65HLu42D+lmE0PRc\nMw6PvAVcALwMeBGwAngLsAHYDpwA7MiXhRBCjJHQRH4IeBR4KrAyf/4v4Cxga15mK3C232Yz74rY\n9a1ixJAmV409hjTyyK32GYQn8gPAh4Dv4BL4QdyR+Bpgf15mf74shBBijKwM1B0PrMdZLN8HPoXz\ny4u0z/QtYXZ2llarVViTATP5I+so2/50mpmZ6bncXlf2ftnyoNv3XV6sf/dydbyZmZmAeLbaH6s9\nhRbQjY++qe2P0Z6pqenSk/STk6s5dOjAyNvjW963/U3aP7MsY8uWLQBd+XIpoSc7fwV4LfCb+fKv\nA6cCrwF+BngQWIu7dOPELq1OdoqhUD/HIbV+bnquGcfJzr24xP2UfMNnAHuAm4Hz8jLnATf5bTbz\nrsjSIzQrmhgxpMlVY48hDcSY0ym1JaYm1FrZBVwH3IG7/PBO4EpgEtgGnM/i5YdixJR95W1/3RVC\nLC/0WysjJNZX0ZT6LITUvvJbJbV+bvp+o99aEUKIhDGWyDN/hVnfKkaMeHEsa+SRx9HII7erMZbI\nhRBC+CKPfITII49Dat6tVVLr56bvN/LIhRAiYYwl8sxfYda3ihEjXhzLGnnkcTTyyO1qjCVyIYQQ\nvsgjHyHyyOOQmndrldT6uen7jTxyIYRIGGOJPPNXmPWtYsSIF8eyRh55HI08crsaY4lcCCGEL/LI\nR4g88jik5t1aJbV+bvp+I49cCCESxlgiz/wVZn2rGDHixbGskUc+mGZqapqJiYklj6mp6UEjja1u\noeVDNantN8YSuRBiXLjfsG//A+PcE6/L/s5NNAd55CNEHnkcUvNuY+E7b1Lr56bvN/LIhRAiYYwl\n8sxfYda3ihEjXhzLGnnk/pqQeSOP3K4m9D87G0XZf1yC/udSCNF8loVHXr93HStOM7y+YUnNu42F\nPPJm7zfyyIUQImGMJfLMX2HWH4sRI14cyxp55P4aeeRx4ug6ciGEEAMhjzypOM3w+oYlNe82FvLI\nm73fyCMXQoiEMZbIM3+FWX8sRox4cSxr5JH7a+SRx4kjj1wIIcRAyCNPKk4zvL5hSc27jYU88mbv\nN/LIhRAiYYwl8sxfYdYfixEjXhzLGnnk/hp55HHiyCMXQggxEPLIa45T9oNe/X7Mq+le37Ck5t3G\nQh55s/ebfh75svj1Q8ss/mtL9/o6PmOFEE3EmLWS+SvM+mP+Maz6ltY18sj9NVbnmuX2Wx5PY4lc\nCCGEL8N8f18FXA2cjPMG3g7cB9wIPB+YB84BDnbp5JEPpCmvV9O9vmFJzbuNhTzyZu8347qO/M+B\nfwROAl4M7AU2ANuBE4Ad+bIQQogxEprInwacBlyTLz8GfB84C9iar9sKnO232cy7Inb9Mf8YVn1L\n6xp55P4aq3PNcvstj2doIj8O+G/gWuBO4CrgaGANsD8vsz9fFkIIMUZCPfKXA7cBrwS+DlwBHAbe\nDawulDsATHdp5ZEPpJFHXkZq3m0s5JE3e78Zx3XkD+SPr+fLnwY2Ag8Cx+bPa4GHeolnZ2dptVqF\nNRkwU3hdeCf/mjEzMzPUcmcsCvFcmWG3315euv3+7VksM1j5qvaMqr+sLy/SXp5ZXDPC8Uxt2X9+\n+pW3vtyk9mRZxpYtWwC68uVo+SLupCbAJuDy/HFJvm4DcFkP3UIRYAEW8sdc4XVnuTLm5uYqy3TG\niBVnritm7zgh7Y/RZ5Y1w46npbbE1PjOm1j7zTDlfTRN328o/3o01J2d7wFuAJ4M7MNdfrgC2Aac\nz+Llh0IIIcaIfmtFHnnjSM27jYU88mbvN/o9ciGESBhjiTzzV5i9htQ/htVre61rdB25v8bqXLPc\nfsvjaSyRCyGE8EUeuTzyxpGadxsLeeTN3m/kkQshRMIYS+SZv8KsP+Yfw6pvaV0jj9xfY3WuWW7/\noHGmpqaZmJhY8pia6r7Jfbg4RYwlciGEaDaL//q1AMw98brXXzqOCnnknv+lCeX/pymPPA6pebex\nkEceZ78ZVxz9Z2cAZf+l6d7T/2kKIexgzFrJ/BVm/cEYMcI0lr1beeRxNFbnmuX2W45jLJELIYTw\nRR75CP1BeeRxSM27jYU88nQ9ch2RCyFEwzGWyDN/hVl/MEaMMI1l71YeeRyN1blmuf2W4+iqFSHE\nyAi5bFcMjzxyeeSNIzXvNhYxPHLLYyOPXIgxUXY7s88tzZbiCFEHxhJ55q8w6w/GiBGmseTddt7O\nHHpLs2+cOYoxB4ljqc9GobE6Py2333IceeRipJR5pPJHhRgf8sjlkY8Uqz6sZe82FlbHJhbyyIUQ\nQpjFWCLP/BVm/cEYMcI0ln1Iq2Nj2e9OaWwst99yHGOJXAghhC/yyM16t/LI69akhtWxiYU8ciGE\nEGYxlsgzf4VZfzBGjDCNZR/S6thY9rtTGhvL7bccx1giF0II4Ys8crPerTzyujWpYXVsYiGPXAgh\nhFmMJfLMX2HWH4wRI0xj2Ye0NDbD/tCWPHJ/jeX2W45jLJELYYdhf2hLiFjIIzfr3cojb6LGMlbH\nJhbyyIUQA1Fmx+g3z8U4MZbIM3+FWX8wRowwjWUfsuljU2bHDGrFLPexsdx+y3GMJXIhhBC+yCM3\n68PKI09Lo7Gpuw/kkZezArgLuDlfnga2A98EbgVWDbl9IYQQFQybyC8G9rD48bMBl8hPAHbkyx5k\n3hWw6w/GiBGmsexDamziaKz2geX2W44zTCJ/DvB64GoWD/fPArbmr7cCZw+xfSGEEAMwjEf+KeAD\nwBTwO8AbgYeB1YVtHygst5FHPpBGHnlaGo1N3X0gj3wpbwAewvnjZR8G7WuwhBBCjJGVgbpX4myU\n1wNH4Y7KPw7sB44FHgTW4pL9EmZnZ2m1WoU1GTBDLz+p7RfNzMz0XL7iiitYt25d6ftL/aYM2Ams\n74jRv3ybpXXsjudfvq1ZWrZX+aX1uwJYl+ur+yvLMnbu3Mn69esHLv9Ea2ZmKsv7tqez/ODt6dT6\njmexfOf7dY2n73wOHc/w+TxYexY17WW/+Wmt/cXl7n2hX/lFwvfPLMvYsmULQFe+HA+ns3jVyuXA\nJfnrDcBlPcovFAEWYCF/zBVed5YrY25urrJMZ4zB4gyvmevS+2rK2x+jz0I1vnVr5tiMdjyLLMex\nCWlLiCbW2IwrDn0cjlFcR3468F7cEfo0sA14HjAPnAMc7Cqf1ymvgDzyEo088rQ0Gpu6+yBlj1w3\nBDVwx1eyaKJGY1N3H6ScyI3dop/5K8xeQxsjRpjG8rW6Gps4Gqt9YLn9luMYS+RCCCF8kbXSwK/i\n+vreRM1ox2ZqarrnLypOTq7m0KEDPTVWx6asLdC/Pb6kbK2EXn4ohKiRxZ/L7V5fx7HZcJS1xb3X\nvPbUgTFrJfNXmPUHY8QYXDPsHx7Y7ecQTYwYYZq0+jlE4x/Dsnctj1yMlGH/8EAIYRd55A30VC37\n6lZ92Po19fuwKY1NCJbHZvDtNuLyQyGEEL4YS+SZv8KspxgjRjyN3X4O0cSIEaZJq59DNP4xLHvX\nseLoqhUhaibkUkIhisgjN+sPyiNPS1P/eKY0NiFY3Qf8tiuPXAghTDLs5cHGEnnmrzDrKcaIEU9j\nt59DNDFiSBOm8Y9h2bseNM6wlwcbS+RCCCF8kUdu1h+s31MNISUfNrXxTGlsQrC6DwyqkUcuhBAJ\nYyyRZ/4Ks95tjBjxNHb7OUQTI4Y0YRr/GCl45MNqjCVyIYQQvsgjN+sP1u+phpCSD5vaeKY0NiFY\n3QcG1cgjF0KIhDGWyDN/hVnfKkaMeBq7/RyiiRFDmjCNfwx55OYSuRBCCF/kkZv1B+v3VENIyYdN\nbTxTGpsQrO4Dg2rkkQshRMIYS+SZv8KsbxUjRjyN3X4O0cSIIU2Yxj+GPHL9Hrnog34nW4hmII/c\nrD/YPE81RFN/P8fSaGzkkcsjF0IIUYKxRJ75K8z6VjFiSBOmiRFDmjCNfwx55OYSuRBCCF/kkZv1\nB5vnqYZo6u/nWBqNjTxyeeQdDPv/dkIIkRLGEnk2UKlh/9/OqtcnTSxNjBjShGn8Y8gjN5fIhRBC\n+NJIjzwlr8+qPxpLU38/x9JobEapKbtZDcpvWEvZI9ednUKIxrFor/Z6r47j03oJtVaeizOnvwHc\nA1yUr58GtgPfBG4FVvltNguoilVNjBjShGlixJAmTBMjRpgmRY/8UeC3gZOBU4F3AScBG3CJ/ARg\nR74shBBijIzqO8hNwEfzx+nAfuBY3EfLiV1l5ZEPpGmepxqiqb+fY2k0NnY1zffIR3HVSgt4KXA7\nsAaXxMmf14xg+0IIIfow7MnOY4DPABcDh7vea1/ovYTZ2VlarVZhTQbM0MsbavtSMzMzHcuLXAGs\ny/WDlM+AncD6jhj9y7dZWsfueP7l25qlZXuVj9X+WO3pLA9xxrNYvvN9jWdZ+aVle5dva9rLvu3p\nLN8uU9d4FpeLscv6d7Tj6d5bmi9Hy5OAz1OcQbAXZ6kArM2Xu1koAizAQv6YK7zuLDeMprN8LM1c\nl95XM7r2W9Y0c2yWx3hqbDqZm5sbqNy4xsaV6U2oRz4BbAW+hzvp2ebyfN0HcSc6V7H0hGdep3xD\n8vpKNM3zVEM09fdzLI3Gxq6m+R55qLXyKuCtwN3AXfm6jcBlwDbgfGAeOCdw+0IIIQYk9GTnl3Pt\nOtyJzpcCtwAHgDNwlx+eCRz022wWUBWrmhgxpAnTxIghTZgmRowwTYrXkQshhDCCfmvFrKZ5nmqI\npv5+jqXR2NjVNN8j1xG5EEI0HGOJPEtIEyOGNGGaGDGkCdPEiBGmkUcuhBBibMgjN6tpnqcaoqm/\nn2NpNDZ2NfLIhRBC1IyxRJ4lpIkRQ5owTYwY0oRpYsQI08gjF0IIMTbkkZvVNM9TDdHU38+xNBob\nuxp55EIIIWrGWCLPEtLEiCFNmCZGDGnCNDFihGnkkQshhBgb8sjNaprnqYZo6u/nWBqNjV2NPHIh\nhBA1YyyRZwlpYsSQJkwTI4Y0YZoYMcI08siFEEKMDXnkZjXN81RDNPX3cyyNxsauRh65EEKImjGW\nyLOENDFiSBOmiRFDmjBNjBhhGnnkQgghxoY8crOa5nmqIZr6+zmWRmNjVyOPXAghRM0YS+RZQpoY\nMaQJ08SIIU2YJkaMMI1lj3xlQBQhhFgWTE1Nc/jww0vWT06u5tChAzXUqDfyyM1qmuephmjq7+dY\nGo2NXU0zxkYeuRBCJIyxRJ4lpIkRQ5owTYwY0oRpYsRIT2MskQshhPBFHrlZTTN8u2E19fdzLI3G\nxq6mGWMjj1wIIRLGWCLPEtLEiCFNmCZGDGnCNDFipKcxlsiFEEL4Io/crKYZvt2wmvr7OZZGY2NX\n04yxkUcuhBAJM45E/jpgL3AfcImfNAsIZ1UTI4Y0YZoYMaQJ08SIkZ5m1Il8BfBRXDJ/IXAucNLg\n8p0BIa1qrNZLGrv1ksZuvWxrRp3Ifwr4FjAPPAp8EvjFweUHA0Ja1VitlzR26yWN3XrZ1ow6kT8b\nuL+w/EC+TgghxJgYdSIvO408IPMJaWLEkCZMEyOGNGGaGDHS04z68sNTgU04jxxgI/A48MFCmZ3A\nS0YcVwghUmcXsC5GoJXAPqAFPBmXtD1OdgohhLDAzwP34k56bqy5LkIIIYQQQtimjlv0u5kGXgAc\nWVj3xT7lnwJcCLwad3L1S8BfAj8cUX3eW3i9wGIftU/k/mmJ7gjg14DjgD8EngccC3xtRPUq1q+7\nXt8H/o3yC1CPAt6Es7za/9O6kNdzFHwFeBXwCEtPeC8AB4A/Af6ih/YUXN2LvAH4hxHVDeAVwPtY\n2v4X99GE9tk64DQW5+auivIh87nXHCi+7p6jE8Bz6LyizAqX9lg3yrm5LKj7Fv0LgH8BbgE2A5/H\nnSztx3W4m40+jLv56GTg4wNoVheWp4FrSspOAsfgEsw7gWfhLqH8LeBlfWJ8DPhp4Ffz5Ufydb1o\n13d9Rb17cUpel3a93oGzs66i/E7avwfOwl3b/0j++EFJ2a/kz48Ah7seh0o0r8qfj8H1X/Exldf5\nohLtVcCLCsvnAu8vKdurTlV1A7gBuBaXmN+YP87qUx78+qzNxcD1wDOANfnrsna3CZnPZXOz3f+9\n+KeKbfbiHNz4AfwB8Hf03weg88KGfuva/IDF/v0xbi63KmK8F//Lmq/H5ZsTPTQv7LFupkJzEZ25\nZhC+APxC17orPbdRK/fgjkjaR5In4iZLP/YMuK5IryPVqtunvkTnTjGZryvjrq5nKD8a24PbCe/G\nfah0P6rqdUxh+RjcN5inAv9eormnYpsxeFbJ+p8A7sSN/QW49j1txLG/Ul1kCSF9ths4urB8dL6u\nHyHz2XduAmzF3bDnQ7vur8bdN/4G4PYKzV091lX1QZEjcQd3/dgEfAP4MvBu3IdmFa/BHf1vB74N\nfIbqA6l7cAdHE7j96yPAVys0f4Q7P7gNd/XeIK7Ht3H7cPHbSa9+NMsd+fNO3FdZqJ7E1+OOfNuc\nSvURzC46E+Q01ZPr3kKdyF/f26f87bifKGgPwDMoH4yLcEn3R7hBLD7+o6Jee3FXBLU5slCvsnhX\n0t9GqJufxPXHLbgdZtScCfwN7mj/Tfnjlyo0IX22G3dg0uYpVM+zkPnsOzfbmh/j5tfu/HF3haZ9\nsHMZzjaE8jn2znyb/1PY/m7cRdE3VMQpMo1LhIPwElzivBfYMUD5lbj+fR/wHar77Gjct6Sv4pL6\n+xjMxTgCl8Q/iWvLB4Dj+5S/K6/bx4CbgVV4JvKV1UXGyv24ryE34T4pH6b8avj2DrESd4R1P85L\nex7VA/Ih4Dbcp+QE8GbcBOjHdTh/+7O55mzcUU0ZH8F9m3gmbuB+Gfj9krIfzh9/hfta7MMNuA+N\nm/J6vRH4BG7SdX8ItvtsBfB23AfFj/J1VR7xuOlOcNO4HeB2Rl+383AfFitx9zW0+WwfzWn499m1\nuPoX50yZhdfm5fSez7v7xPOdmwA/V/F+L76L+0B7LS6ZH0V5IvsEzr65jMWjWHC21/f6xCjOgyNw\n+8+g/vhDwIP59p9RUXYHbh+5DXck//Jc34/HgP/FfSAfhfsQfLyvwvF4Xq/9uA/P1cCngX8GfrdP\nrAuBWdy3Ky97xsLJzjYzOD/uFuD/erzf6qNdAP6zYvsn475eLeA8qaojf3BeZPvE1Rep/pQ8CfjZ\n/PUOyq2OYXkFzpdewCWBO0rKtSq2Mz+6KnnTqnh/foSx7sVZNz53HrdK1s9X6E6h88Rl1Zwpi1MV\nz3duhnA07sjybtyvma7Fnc+4dYQxWoXXj+GS36MVmgtx/v0zgU8BN1K9P/8ZLnn/EPhXnH1zGy5R\nl7EL+Bzug+XpwF/jPtTf3EdzMfA23IfL1biDu0dxH1L30fvI/B35ttucArwL+I2KNgmxrLgW90Eu\n0uCPCb/DcRJ4D+7A70cVZV/RY93bKjSbgeeXvNfr5OlIsHRELsS42Is7ErJkLYm4vAf3DeYU3Dz4\nUv74Qp2VGhV1e+RCxOB11UVE4hyFO1d2J9XWjRBCCCGEEEIIIYQQQgghhBBCCCGEEKKS/wcZLgJy\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/7a.ciphertext b/2014/7a.ciphertext
new file mode 100644 (file)
index 0000000..597b991
--- /dev/null
@@ -0,0 +1 @@
+VEYJM YJKRZ ILYSY JEYDO RULCS RCJNM OIDDE UGURL OGFSN WCRLH CKHGH MWKEJ XLYKT LAGFL ALVTM GKYYO MVLMG KYJOS FDRZE PWAQG NRZEQ ZINOA QFORK CSLTJ WDUSS RZARL HCNAJ NEQZA BBAKE EBATJ GOIKL GCERZ EBJID LWMGD USSNM LJWDG FTMLH CEEAZ ALASK SNBTL MUKCV TFWIL DERHR CKUKS BJQTF WCPWW FSDYD RCSDW SBYFD MFEBL HCNEQ KEJOH GUHUS SJMCI QFMJU QOIRZ OSLTF WSFAP UWWMM LBZAT WHYVN MADCS TFSTR ZEDVA FSDZW ELGPC JARAN EANRZ EQWWY LEPKS CSHMJ SCASL GLMFG CJAKQ SRWRW LHCUU RSWYQ OLLHC KTYJB MSRBK IBWCJ WAPWD YFAPW AMXAP GULVF GNEKW TCJSQ IUYJE UATFS DGKTG FCRAV CHARL EPFOD TOJLS DSSRW NCVTM JEGFF MJCCV DCUKN DARWS GKAUK OKWTF ANEDI IWTFA SMFAQ MBPWS AMEKA SQAOL SCMMP JWODQ EYJSY YOUZE LLHCQ FGLTC VAJGC YDSFA PUATF SJSJY PAGEW DGFSN WCRAO LKYQL EKLHC VEACP JSTCK CYFCY JRWSC PSNCV EQAGL WDRGD CHLMQ ALJOT SRCEO RWONW RYLEB NEFAC JWDCK IEFEB XOPMN BWRQW AMHEP STGGN QAWYK AJJEY VYAGN AWRLW DYTOS LTFWR CXEPW NAWTM LHCUA ZDEQA NRZEJ SSRHA PLODL HCXDY DOETU RLHCF EVLSC UTGGN FSSKW RCSLJ QWMJR GWDGL IQWNA JYNLE BOIRZ AKGRC KEAMR CEOBA FGWDY ESAGT PSNQH OQATG GNAAP FWRYF DRWLJ KUQOH YLTFW YUWRC JEYDL WMPRG WFSTG VOLLU LVEPK TYFDG KHMOT FWWFG LCSSQ WMZDY GKPMO EPWDR ZEQGR RGFAG MNMTG FGRZE WEUQL BCVOG FGGKR CSLJQ ILLEL KITWA LVWMM LBTUP FTFJO SYHYT ARLEP QILVA WKILL HYLTG EERZE GJILL EPUEN LMGYH RFORU ARUHY FYRZI LYUQW FSDBS LTFWY ASNFS RBDYF SVCZI HSCIW DYDOA SLQGC IWTGF TFWMG VDJWO DLHCG CCSNA SNWGU EWTKW AAZAP LSFGW GFGRZ EBWEN KEYUA ZDEQA NRZEP WGGGN GVOLL IKSGG FERZE SKWGD LZWAN JOZDE KTURA TKSYL WEBKO KWDGH LMEAA QTMYE RLHCX UJDCM NEPSG CEANK FPGMR ZEMEA LAGMN EPFMC FTGXI YERGY HRATG KILLH CARZW SRANR WRCKT QLOND AWSLM FGUWA JDHYN EYDOR LOJGS CZEPW
diff --git a/2014/7b.ciphertext b/2014/7b.ciphertext
new file mode 100644 (file)
index 0000000..fb8e3dc
--- /dev/null
@@ -0,0 +1 @@
+ANWAE CNNDR TWTAN IREOA HSRDN TIEER DCTEW AYERE VAAAR PIOER OBSED ESCRE HLAOI TITHS DTRIN OSEPE PLTHT NIDTW SDULE DLHOT PEATE RHAAR EDEOA IODTA HREGE ROTHW HTSUR ETEEI NWIGI RESET POWIC OOONI TSEUD SEECH ACTEO FIILE ONEWI OTACT EODTE UNEAH SEDAP TRYEM RONMO MLEXO NTKEM EOYVI TSTEE NHANT RERTI EINEO TNDLH POPLY ITEWI TRSED EEVDY CFRMN SNAYP INMTE ENEEI NAHIN EPRIT EDEHV ELEAO RELLL VMOCN AHNCE PHERO HJUUV EHAUT ATHTT ETOAS IPOWW NEEDS ELOPG DESLF EDTER FCAAT EHJAS DTRPR LESEE RETET ECNEO RRSGC KAMII WAEFU TIASH AONGC THSRE NREHT RSTHH ACEIN WTPRL OGHET ODAER ALOEE DEATS OMLDW EDTWE FSBEL EVPDT EONOI GNSAV FTEGS EBOMC EHATI ETNRS PTONT HUSOR ECRED ENDCE TLWAE HESED RNCVE RACUH OIHAL EINAE MEUNH ERDES TTSTA SIPED EYLEE EMTII SIIGO THNTS SFOLN ITRET RWHEM TKHHS WTORC SSNER EROHT EENCS APEBL IRCNT HULEO FENRS ROMRN SHMAD DAODE ATIHI OROUT WEVTH APECE ETOVT ERDLE ADITE WDOTT TTCAT KMBHT HEICW ANTNI SEDWA TXANK EABOV OANMS WLPRG AISPO DFOGN DPEDE SWRDA CTTRE FHDES YABER RETLA VOD
index 91e64e51e6f6fc403f088dd44b20db11b5f4593a..f7e3ece485cf1800a1e1d703959b10f05b217cf2 100644 (file)
--- a/cipher.py
+++ b/cipher.py
@@ -2,7 +2,7 @@ import string
 import collections
 import math
 from enum import Enum
-from itertools import zip_longest, cycle, chain
+from itertools import zip_longest, cycle, chain, count
 import numpy as np
 from numpy import matrix
 from numpy import linalg
@@ -671,6 +671,111 @@ def hill_decipher(matrix, message, fillvalue='a'):
     return hill_encipher(inverse_matrix, message, fillvalue)          
 
 
+# Where each piece of text ends up in the AMSCO transpositon cipher.
+# 'index' shows where the slice appears in the plaintext, with the slice
+# from 'start' to 'end'
+AmscoSlice = collections.namedtuple('AmscoSlice', ['index', 'start', 'end'])
+
+def amsco_transposition_positions(message, keyword, 
+      fillpattern=(1, 2),
+      fillcolumnwise=False,
+      emptycolumnwise=True):
+    """Creates the grid for the AMSCO transposition cipher. Each element in the
+    grid shows the index of that slice and the start and end positions of the
+    plaintext that go to make it up.
+
+    >>> amsco_transposition_positions(string.ascii_lowercase, 'freddy', \
+        fillpattern=(1, 2)) # doctest:  +NORMALIZE_WHITESPACE
+    [[AmscoSlice(index=3, start=4, end=6),
+     AmscoSlice(index=2, start=3, end=4),
+     AmscoSlice(index=0, start=0, end=1),
+     AmscoSlice(index=1, start=1, end=3),
+     AmscoSlice(index=4, start=6, end=7)],
+    [AmscoSlice(index=8, start=12, end=13),
+     AmscoSlice(index=7, start=10, end=12),
+     AmscoSlice(index=5, start=7, end=9),
+     AmscoSlice(index=6, start=9, end=10),
+     AmscoSlice(index=9, start=13, end=15)],
+    [AmscoSlice(index=13, start=19, end=21),
+     AmscoSlice(index=12, start=18, end=19),
+     AmscoSlice(index=10, start=15, end=16),
+     AmscoSlice(index=11, start=16, end=18),
+     AmscoSlice(index=14, start=21, end=22)],
+    [AmscoSlice(index=18, start=27, end=28),
+     AmscoSlice(index=17, start=25, end=27),
+     AmscoSlice(index=15, start=22, end=24),
+     AmscoSlice(index=16, start=24, end=25),
+     AmscoSlice(index=19, start=28, end=30)]]
+    """
+    transpositions = transpositions_of(keyword)
+    fill_iterator = cycle(fillpattern)
+    indices = count()
+    message_length = len(message)
+
+    current_position = 0
+    grid = []
+    while current_position < message_length:
+        row = []
+        for _ in range(len(transpositions)):
+            index = next(indices)
+            gap = next(fill_iterator)
+            row += [AmscoSlice(index, current_position, current_position + gap)]
+            current_position += gap
+        grid += [row]
+    return [transpose(r, transpositions) for r in grid]
+
+def amsco_transposition_encipher(message, keyword, fillpattern=(1,2)):
+    """AMSCO transposition encipher.
+
+    >>> amsco_transposition_encipher('hellothere', 'abc', fillpattern=(1, 2))
+    'hoteelhler'
+    >>> amsco_transposition_encipher('hellothere', 'abc', fillpattern=(2, 1))
+    'hetelhelor'
+    >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(1, 2))
+    'hotelerelh'
+    >>> amsco_transposition_encipher('hellothere', 'acb', fillpattern=(2, 1))
+    'hetelorlhe'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 2))
+    'hecsoisttererteipexhomen'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(2, 1))
+    'heetcisooestrrepeixthemn'
+    >>> amsco_transposition_encipher('hereissometexttoencipher', 'cipher', fillpattern=(1, 3, 2))
+    'hxomeiphscerettoisenteer'
+    """
+    grid = amsco_transposition_positions(message, keyword, fillpattern=fillpattern)
+    ct_as_grid = [[message[s.start:s.end] for s in r] for r in grid]
+    return combine_every_nth(ct_as_grid)
+
+
+def amsco_transposition_decipher(message, keyword, fillpattern=(1,2)):
+    """AMSCO transposition decipher
+
+    >>> amsco_transposition_decipher('hoteelhler', 'abc', fillpattern=(1, 2))
+    'hellothere'
+    >>> amsco_transposition_decipher('hetelhelor', 'abc', fillpattern=(2, 1))
+    'hellothere'
+    >>> amsco_transposition_decipher('hotelerelh', 'acb', fillpattern=(1, 2))
+    'hellothere'
+    >>> amsco_transposition_decipher('hetelorlhe', 'acb', fillpattern=(2, 1))
+    'hellothere'
+    >>> amsco_transposition_decipher('hecsoisttererteipexhomen', 'cipher', fillpattern=(1, 2))
+    'hereissometexttoencipher'
+    >>> amsco_transposition_decipher('heetcisooestrrepeixthemn', 'cipher', fillpattern=(2, 1))
+    'hereissometexttoencipher'
+    >>> amsco_transposition_decipher('hxomeiphscerettoisenteer', 'cipher', fillpattern=(1, 3, 2))
+    'hereissometexttoencipher'
+    """
+
+    grid = amsco_transposition_positions(message, keyword, fillpattern=fillpattern)
+    transposed_sections = [s for c in [l for l in zip(*grid)] for s in c]
+    plaintext_list = [''] * len(transposed_sections)
+    current_pos = 0
+    for slice in transposed_sections:
+        plaintext_list[slice.index] = message[current_pos:current_pos-slice.start+slice.end][:len(message[slice.start:slice.end])]
+        current_pos += len(message[slice.start:slice.end])
+    return ''.join(plaintext_list)
+
+
 class PocketEnigma(object):
     """A pocket enigma machine
     The wheel is internally represented as a 26-element list self.wheel_map, 
index b1af48c2e40d1ba60b948e75c758ab162f242233..8a4d7b14942f2e9873eeb73b6ca270ba7ac21af7 100644 (file)
@@ -464,6 +464,59 @@ def railfence_break(message, max_key_length=20,
                                for i in range(2, max_key_length+1)])
     return max(results, key=lambda k: k[1])
 
+def amsco_break(message, translist=transpositions, patterns = [(1, 2), (2, 1)],
+                                  fitness=Pbigrams, 
+                                  chunksize=500):
+    """Breaks an AMSCO transposition cipher using a dictionary and
+    n-gram frequency analysis
+
+    >>> amsco_break(amsco_transposition_encipher(sanitise( \
+            "It is a truth universally acknowledged, that a single man in \
+             possession of a good fortune, must be in want of a wife. However \
+             little known the feelings or views of such a man may be on his \
+             first entering a neighbourhood, this truth is so well fixed in \
+             the minds of the surrounding families, that he is considered the \
+             rightful property of some one or other of their daughters."), \
+        'encipher'), \
+        translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \
+                   (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \
+                   (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \
+        patterns=[(1, 2)]) # doctest: +ELLIPSIS
+    (((2, 0, 5, 3, 1, 4, 6), (1, 2)), -709.4646722...)
+    >>> amsco_break(amsco_transposition_encipher(sanitise( \
+            "It is a truth universally acknowledged, that a single man in \
+             possession of a good fortune, must be in want of a wife. However \
+             little known the feelings or views of such a man may be on his \
+             first entering a neighbourhood, this truth is so well fixed in \
+             the minds of the surrounding families, that he is considered the \
+             rightful property of some one or other of their daughters."), \
+        'encipher', fillpattern=(2, 1)), \
+        translist={(2, 0, 5, 3, 1, 4, 6): ['encipher'], \
+                   (5, 0, 6, 1, 3, 4, 2): ['fourteen'], \
+                   (6, 1, 0, 4, 5, 3, 2): ['keyword']}, \
+        patterns=[(1, 2), (2, 1)], fitness=Ptrigrams) # doctest: +ELLIPSIS
+    (((2, 0, 5, 3, 1, 4, 6), (2, 1)), -997.0129085...)
+    """
+    with Pool() as pool:
+        helper_args = [(message, trans, pattern, fitness)
+                       for trans in translist.keys()
+                       for pattern in patterns]
+        # Gotcha: the helper function here needs to be defined at the top level
+        #   (limitation of Pool.starmap)
+        breaks = pool.starmap(amsco_break_worker, helper_args, chunksize) 
+        return max(breaks, key=lambda k: k[1])
+
+def amsco_break_worker(message, transposition,
+        pattern, fitness):
+    plaintext = amsco_transposition_decipher(message, transposition,
+        fillpattern=pattern)
+    fit = fitness(sanitise(plaintext))
+    logger.debug('AMSCO transposition break attempt using key {0} and pattern'
+                         '{1} gives fit of {2} and decrypt starting: {3}'.format(
+                             transposition, pattern, fit, 
+                             sanitise(plaintext)[:50]))
+    return (transposition, pattern), fit
+
 
 def hill_break(message, matrix_size=2, fitness=Pletters, 
     number_of_solutions=1, chunksize=500):