{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "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) " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from cipher.caesar import *\n", "from cipher.affine import *\n", "from cipher.keyword_cipher import *\n", "from cipher.column_transposition import *\n", "from cipher.vigenere import *\n", "from support.text_prettify import *\n", "from support.utilities import *\n", "from support.plot_frequency_histogram import *\n", "import re" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "challenge_number = 8\n", "plaintext_a_filename = f'{challenge_number}a.plaintext'\n", "plaintext_b_filename = f'{challenge_number}b.plaintext'\n", "ciphertext_a_filename = f'{challenge_number}a.ciphertext'\n", "ciphertext_b_filename = f'{challenge_number}b.ciphertext'" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "ca = open(ciphertext_a_filename).read()\n", "cb = open(ciphertext_b_filename).read()\n", "\n", "rwa = wcat(cat(reversed(w)) for w in ca.split())\n", "ra = cat(reversed(ca))\n", "sca = sanitise(ca)\n", "rsca = cat(reversed(sca))\n", "pca = letters(ca)\n", "pta = depunctuate(ca)\n", "\n", "scb = sanitise(cb)\n", "pcb = letters(cb)\n", "rscb = cat(reversed(scb))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/matplotlib/figure.py:445: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n", " % get_backend())\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAEi9JREFUeJzt3W2wXVV9x/Hvr8SnqmN4uGaYJBodMyq+AOGWQrEdJdoRUEOniE+VSNO5dYpVazttbO3YF+0MvimVGUubim2wVkUsTarUygQtox0sF3lQQEukpEkK5KqAIqNW+++LszJeYsg9Nzk35y7u9zNz5qy99tpn/08S+N21zj77pqqQJKk3PzPuAiRJOhQGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUvLxl0AwHHHHVdr1qwZdxmSpEXgpptu+mZVTcw1blEE2Jo1a5ienh53GZKkRSDJzmHGuYQoSeqSASZJ6pIBJknqkgEmSeqSASZJ6pIBJknqkgEmSeqSASZJ6pIBJknqkgEmSerSoriVlCRptNZs+vQRP+c9F59zRM/nDEyS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUpTkDLMnzk9wy6/GdJO9MckySa5Pc1Z6PbuOT5NIkO5LcluTkhX8bkqSlZs4Aq6qvV9VJVXUScArwCHA1sAnYXlVrge1tG+AsYG17TAGXLUThkqSlbb5LiOuAb1TVTmA9sKX1bwHObe31wBU1cAOwPMnxI6lWkqRmvgH2euCjrb2iqu5t7fuAFa29Etg165jdrU+SpJEZOsCSPBF4DfCJ/fdVVQE1nxMnmUoynWR6ZmZmPodKkjSvGdhZwJer6v62ff++pcH2vLf17wFWzzpuVet7lKraXFWTVTU5MTEx/8olSUvafALsDfxk+RBgG7ChtTcAW2f1X9CuRjwNeGjWUqMkSSMx1O8DS/JU4BXAb87qvhi4MslGYCdwfuu/Bjgb2MHgisULR1atJEnNUAFWVd8Djt2v71sMrkrcf2wBF42kOkmSHoN34pAkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHVpqABLsjzJVUm+luTOJKcnOSbJtUnuas9Ht7FJcmmSHUluS3Lywr4FSdJSNOwM7P3AZ6rqBcCJwJ3AJmB7Va0FtrdtgLOAte0xBVw20oolSWKIAEvyDOCXgMsBquqHVfUgsB7Y0oZtAc5t7fXAFTVwA7A8yfEjr1yStKQNMwN7DjAD/G2Sm5N8MMlTgRVVdW8bcx+worVXArtmHb+79UmSNDLDBNgy4GTgsqp6MfA9frJcCEBVFVDzOXGSqSTTSaZnZmbmc6gkSUMF2G5gd1V9qW1fxSDQ7t+3NNie97b9e4DVs45f1foepao2V9VkVU1OTEwcav2SpCVqzgCrqvuAXUme37rWAXcA24ANrW8DsLW1twEXtKsRTwMemrXUKEnSSCwbctxvAx9J8kTgbuBCBuF3ZZKNwE7g/Db2GuBsYAfwSBsrSdJIDRVgVXULMHmAXesOMLaAiw6zLkmSDso7cUiSumSASZK6ZIBJkrpkgEmSumSASZK6ZIBJkrpkgEmSumSASZK6ZIBJkrpkgEmSumSASZK6ZIBJkrpkgEmSumSASZK6ZIBJkrpkgEmSumSASZK6ZIBJkrpkgEmSurRs3AVI0uPBmk2fPuLnvOfic474ORcTZ2CSpC4ZYJKkLhlgkqQuGWCSpC4ZYJKkLg0VYEnuSfKVJLckmW59xyS5Nsld7fno1p8klybZkeS2JCcv5BuQJC1N85mBvayqTqqqyba9CdheVWuB7W0b4CxgbXtMAZeNqlhJkvY5nCXE9cCW1t4CnDur/4oauAFYnuT4wziPJEk/ZdgAK+CzSW5KMtX6VlTVva19H7CitVcCu2Ydu7v1SZI0MsPeieMlVbUnyTOBa5N8bfbOqqokNZ8TtyCcAnjWs541n0MlSRpuBlZVe9rzXuBq4FTg/n1Lg+15bxu+B1g96/BVrW//19xcVZNVNTkxMXHo70CStCTNGWBJnprk6fvawC8DXwW2ARvasA3A1tbeBlzQrkY8DXho1lKjJEkjMcwS4grg6iT7xv9DVX0myY3AlUk2AjuB89v4a4CzgR3AI8CFI69akrTkzRlgVXU3cOIB+r8FrDtAfwEXjaQ6SZIeg3fikCR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1adh7IUrSorJm06eP+DnvuficI35OPTZnYJKkLhlgkqQuGWCSpC4ZYJKkLhlgkqQueRWipKF41Z8WG2dgkqQuGWCSpC4ZYJKkLhlgkqQuGWCSpC4ZYJKkLhlgkqQuGWCSpC4ZYJKkLhlgkqQuDR1gSY5KcnOST7Xt5yT5UpIdST6e5Imt/0lte0fbv2ZhSpckLWXzmYG9A7hz1vb7gEuq6nnAA8DG1r8ReKD1X9LGSZI0UkMFWJJVwDnAB9t2gDOBq9qQLcC5rb2+bdP2r2vjJUkamWFnYH8B/D7wf237WODBqvpR294NrGztlcAugLb/oTZekqSRmTPAkrwK2FtVN43yxEmmkkwnmZ6ZmRnlS0uSloBhZmBnAK9Jcg/wMQZLh+8HlifZ9/vEVgF7WnsPsBqg7X8G8K39X7SqNlfVZFVNTkxMHNabkCQtPXMGWFW9u6pWVdUa4PXAdVX1JuBzwHlt2AZga2tva9u0/ddVVY20aknSknc43wP7A+BdSXYw+Izr8tZ/OXBs638XsOnwSpQk6actm3vIT1TV54HPt/bdwKkHGPN94LUjqE2SpMfknTgkSV0ywCRJXTLAJEldMsAkSV0ywCRJXTLAJEldMsAkSV0ywCRJXZrXF5klHTlrNn36iJ/znovPOeLnlA6VMzBJUpcMMElSlwwwSVKXDDBJUpcMMElSlwwwSVKXDDBJUpcMMElSlwwwSVKXDDBJUpcMMElSlwwwSVKXDDBJUpcMMElSlwwwSVKXDDBJUpfm/IWWSZ4MXA88qY2/qqrem+Q5wMeAY4GbgDdX1Q+TPAm4AjgF+Bbwuqq6Z4Hql0bGXyAp9WWYGdgPgDOr6kTgJOCVSU4D3gdcUlXPAx4ANrbxG4EHWv8lbZwkSSM1Z4DVwMNt8wntUcCZwFWtfwtwbmuvb9u0/euSZGQVS5LEkJ+BJTkqyS3AXuBa4BvAg1X1ozZkN7CytVcCuwDa/ocYLDPu/5pTSaaTTM/MzBzeu5AkLTlDBVhV/biqTgJWAacCLzjcE1fV5qqarKrJiYmJw305SdISM6+rEKvqQeBzwOnA8iT7LgJZBexp7T3AaoC2/xkMLuaQJGlk5gywJBNJlrf2U4BXAHcyCLLz2rANwNbW3ta2afuvq6oaZdGSJM15GT1wPLAlyVEMAu/KqvpUkjuAjyX5U+Bm4PI2/nLgw0l2AN8GXr8AdUuSlrg5A6yqbgNefID+uxl8HrZ///eB146kOj2u+b0rSYdjmBmYHicMDEmPJ95KSpLUJQNMktQlA0yS1KXH1Wdgi+0znsVWjyQ9njgDkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1ac4AS7I6yeeS3JHk9iTvaP3HJLk2yV3t+ejWnySXJtmR5LYkJy/0m5AkLT3DzMB+BPxuVZ0AnAZclOQEYBOwvarWAtvbNsBZwNr2mAIuG3nVkqQlb84Aq6p7q+rLrf1d4E5gJbAe2NKGbQHObe31wBU1cAOwPMnxI69ckrSkzeszsCRrgBcDXwJWVNW9bdd9wIrWXgnsmnXY7tYnSdLIDB1gSZ4GfBJ4Z1V9Z/a+qiqg5nPiJFNJppNMz8zMzOdQSZKGC7AkT2AQXh+pqn9s3ffvWxpsz3tb/x5g9azDV7W+R6mqzVU1WVWTExMTh1q/JGmJGuYqxACXA3dW1Z/P2rUN2NDaG4Cts/ovaFcjngY8NGupUZKkkVg2xJgzgDcDX0lyS+v7Q+Bi4MokG4GdwPlt3zXA2cAO4BHgwpFWLEkSQwRYVX0ByGPsXneA8QVcdJh1SZJ0UN6JQ5LUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1CUDTJLUJQNMktQlA0yS1KU5AyzJh5LsTfLVWX3HJLk2yV3t+ejWnySXJtmR5LYkJy9k8ZKkpWuYGdjfAa/cr28TsL2q1gLb2zbAWcDa9pgCLhtNmZIkPdqcAVZV1wPf3q97PbCltbcA587qv6IGbgCWJzl+VMVKkrTPoX4GtqKq7m3t+4AVrb0S2DVr3O7WJ0nSSB32RRxVVUDN97gkU0mmk0zPzMwcbhmSpCXmUAPs/n1Lg+15b+vfA6yeNW5V6/spVbW5qiaranJiYuIQy5AkLVWHGmDbgA2tvQHYOqv/gnY14mnAQ7OWGiVJGpllcw1I8lHgpcBxSXYD7wUuBq5MshHYCZzfhl8DnA3sAB4BLlyAmiVJmjvAquoNj7Fr3QHGFnDR4RYlSdJcvBOHJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLCxJgSV6Z5OtJdiTZtBDnkCQtbSMPsCRHAR8AzgJOAN6Q5IRRn0eStLQtxAzsVGBHVd1dVT8EPgasX4DzSJKWsIUIsJXArlnbu1ufJEkjk6oa7Qsm5wGvrKrfaNtvBn6+qt6237gpYKptPh/4+kgLmZ/jgG+O8fz7s56Ds565LbaarOfgrOfRnl1VE3MNWrYAJ94DrJ61var1PUpVbQY2L8D55y3JdFVNjruOfazn4KxnboutJus5OOs5NAuxhHgjsDbJc5I8EXg9sG0BziNJWsJGPgOrqh8leRvwr8BRwIeq6vZRn0eStLQtxBIiVXUNcM1CvPYCWRRLmbNYz8FZz9wWW03Wc3DWcwhGfhGHJElHgreSkiR1aUkHWJI1Sb467joeS5I/SfJ7465jsVhsf1+LrZ59kvz7uGtQv5K8PcmdST4y7lrmsiCfgUkan6r6hXHXoK79FvDyqto97kLmsqRnYM2yJB9pP3FcleRnx1lMkj9K8p9JvsDgC95jleSP242Zv5Dko4tlRpjkuUluTvJzYy7lqCR/k+T2JJ9N8pQx10OSh8ddwz5JLkhyW5Jbk3x4EdTzT0luan9fU3MfseD1/FqS/0hyS5K/bveSHWc9fwU8F/iXJL8zzlqGYYANQuIvq+qFwHcY/PQxFklOYfC9uZOAs4Gx/s+5hcOvAicyuDnzovhiY5LnA58E3lJVN465nLXAB6rqRcCDDP68BCR5EfAe4MyqOhF4x5hLAvj1qjqFwb/ltyc5dlyFJHkh8DrgjKo6Cfgx8KZx1QNQVW8F/gd4WVVdMs5ahmGAwa6q+mJr/z3wkjHW8ovA1VX1SFV9h/F/AfwMYGtVfb+qvgv885jrAZgAtgJvqqpbx10M8F9VdUtr3wSsGWMti82ZwCeq6psAVfXtMdcDg9C6FbiBwR2D1o6xlnXAKcCNSW5p288dYz3d8TMw2P97BH6vYHF7CPhvBj9o3DHmWgB+MKv9Y2DsS4g6sCQvBV4OnF5VjyT5PPDkcZYEbKmqd4+xhq45A4NnJTm9td8IfGGMtVwPnJvkKUmeDrx6jLUAfBF4dZInJ3ka8Kox1wPwQ+BXgAuSvHHcxeigrgNeu2+ZLskxY67nGcADLbxeAJw25nq2A+cleSYM/nySPHvMNXXFGdjgLvgXJfkQg5/oLxtXIVX15SQfB24F9jK4r+TYVNWNSbYBtwH3A19hMAMaq6r6XpJXAdcmebiqxr3UqgOoqtuT/Bnwb0l+DNwMvGWMJX0GeGuSOxn8d3/DGGuhqu5I8h7gs0l+Bvhf4CJg5zjr6ol34tBBJXlaVT3crs68Hpiqqi+Puy5JcgamuWxOcgKDzwq2GF6SFgtnYJKkLnkRhySpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUv/D/eKgjHokfDqAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(scb)\n", "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAFQlJREFUeJzt3X+0ZWV93/H3R7CgggLOzRRHzCV2TBbJiphM0EbLwiU1Ik0HktSgBtGSjCtBk1jt6pjWqFWTafOry2WqwUjELoOlQQoNVBwJWVRFYUAYGIh1GsYwOMDkB6jxRwt++8fZVw6He+45595z5s4z9/1a6657zj7Pc57v3mfv+7n7x903VYUkSa15wmoXIEnSchhgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJh2+2gUArFu3rubn51e7DEnSQeDmm2/+66qaG9XuoAiw+fl5duzYsdplSJIOAkm+PE47DyFKkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkpp0UNxKSpJ0cJrfetXYbfdsO3OGlTyee2CSpCYZYJKkJhlgkqQmGWCSpCaNDLAkJyS5LsmdSXYl+ZVu+juS3Jvk1u7r5X193ppkd5IvJvmJWc6AJGltGucqxIeBN1fVLUmOBm5Osr177feq6rf7Gyc5CTgH+EHgGcCnkjynqh6ZZuGSpLVt5B5YVe2rqlu6x18D7gI2LNFlM/Cxqvp2Vd0N7AZOmUaxkiQtmOgcWJJ54HnA57tJb0iyM8lFSY7tpm0A7unrtpelA0+SpImNHWBJjgIuA361qr4KvB94NnAysA/4nUkGTrIlyY4kO/bv3z9JV0mSxguwJE+kF14fraqPA1TV/VX1SFV9B/ggjx4mvBc4oa/7M7tpj1FVF1bVpqraNDc3t5J5kCStQeNchRjgQ8BdVfW7fdOP72t2NnBH9/hK4JwkRyQ5EdgI3Di9kiVJGu8qxBcC5wK3J7m1m/ZrwCuTnAwUsAd4PUBV7UpyKXAnvSsYL/AKREnStI0MsKr6NJBFXrp6iT7vAd6zgrokSVqSd+KQJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNenw1S5AkjR781uvGrvtnm1nzrCS6XEPTJLUJANMktQkA0yS1CQDTJLUJANMktSkkQGW5IQk1yW5M8muJL/STT8uyfYkX+q+H9tNT5L3JtmdZGeSH5n1TEiS1p5x9sAeBt5cVScBLwAuSHISsBW4tqo2Atd2zwHOADZ2X1uA90+9aknSmjcywKpqX1Xd0j3+GnAXsAHYDFzcNbsYOKt7vBn4SPV8DjgmyfFTr1yStKZNdA4syTzwPODzwPqq2te9dB+wvnu8Abinr9vebpokSVMzdoAlOQq4DPjVqvpq/2tVVUBNMnCSLUl2JNmxf//+SbpKkjRegCV5Ir3w+mhVfbybfP/CocHu+wPd9HuBE/q6P7Ob9hhVdWFVbaqqTXNzc8utX5K0Ro1zFWKADwF3VdXv9r10JXBe9/g84Iq+6a/prkZ8AfBQ36FGSZKmYpyb+b4QOBe4Pcmt3bRfA7YBlyY5H/gy8IrutauBlwO7gW8Ar5tqxZIkMUaAVdWngQx5+SWLtC/gghXWJUnSkrwThySpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkjAyzJRUkeSHJH37R3JLk3ya3d18v7Xntrkt1JvpjkJ2ZVuCRpbRtnD+zDwMsWmf57VXVy93U1QJKTgHOAH+z6/Ockh02rWEmSFhw+qkFVXZ9kfsz32wx8rKq+DdydZDdwCnDDsiuUJAEwv/Wqidrv2XbmjCo5OKzkHNgbkuzsDjEe203bANzT12ZvN02SpKlaboC9H3g2cDKwD/idSd8gyZYkO5Ls2L9//zLLkCStVcsKsKq6v6oeqarvAB+kd5gQ4F7ghL6mz+ymLfYeF1bVpqraNDc3t5wyJElr2LICLMnxfU/PBhauULwSOCfJEUlOBDYCN66sREmSHm/kRRxJLgFOA9Yl2Qu8HTgtyclAAXuA1wNU1a4klwJ3Ag8DF1TVI7MpXZK0lo1zFeIrF5n8oSXavwd4z0qKkqQDaZKr+/qv7DsQ/Qb76lHeiUOS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KTDV7sASZqG+a1XTdR+z7YzZ1SJDhT3wCRJTTLAJElNMsAkSU0ywCRJTTLAJElNMsAkSU3yMnpJMzHJZe39l7R7ObzG5R6YJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSSMDLMlFSR5IckfftOOSbE/ype77sd30JHlvkt1Jdib5kVkWL0lau8bZA/sw8LKBaVuBa6tqI3Bt9xzgDGBj97UFeP90ypQk6bFGBlhVXQ/87cDkzcDF3eOLgbP6pn+kej4HHJPk+GkVK0nSguWeA1tfVfu6x/cB67vHG4B7+trt7aY9TpItSXYk2bF///5lliFJWqtWfBFHVRVQy+h3YVVtqqpNc3NzKy1DkrTGLDfA7l84NNh9f6Cbfi9wQl+7Z3bTJEmaquUG2JXAed3j84Ar+qa/prsa8QXAQ32HGiVJmpqRd6NPcglwGrAuyV7g7cA24NIk5wNfBl7RNb8aeDmwG/gG8LoZ1CxJ0ugAq6pXDnnpJYu0LeCClRYlSdIo3olDktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktSkkX8HJmltm9961dht92w7c4aVSI/lHpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSYevdgGSZm9+61UTtd+z7cwZVSJNj3tgkqQmGWCSpCYZYJKkJnkOTFoFk5yT6j8f5bks6VEGmLQCyw0iSSvnIURJUpNWtAeWZA/wNeAR4OGq2pTkOOC/AvPAHuAVVfV3KytTkqTHmsYe2Iur6uSq2tQ93wpcW1UbgWu755IkTdUsDiFuBi7uHl8MnDWDMSRJa9xKA6yATya5OcmWbtr6qtrXPb4PWL/CMSRJepyVXoX4oqq6N8n3ANuT/EX/i1VVSWqxjl3gbQF41rOetcIyJElrzYr2wKrq3u77A8DlwCnA/UmOB+i+PzCk74VVtamqNs3Nza2kDEnSGrTsAEvylCRHLzwGXgrcAVwJnNc1Ow+4YqVFSpI0aCWHENcDlydZeJ8/rqpPJLkJuDTJ+cCXgVesvExJkh5r2QFWVX8JPHeR6X8DvGQlRUkHkrdnktrknTgkSU0ywCRJTTLAJElNMsAkSU0ywCRJTfL/gemQ4dWE0triHpgkqUkGmCSpSQaYJKlJngPTQWeSc1mex5LWLgNMM2MQSZolA2yNWO4Vel7ZJ+lg5TkwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpO8F2JjvEGuJPW4ByZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSl9GvEi+Hl6SVcQ9MktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KSZBViSlyX5YpLdSbbOahxJ0to0kwBLchjw+8AZwEnAK5OcNIuxJElr06xuJXUKsLuq/hIgyceAzcCdMxpvRSa5rRM8emun5faTJK3crAJsA3BP3/O9wPNnNNZ3eX9BSVo7UlXTf9PkZ4CXVdXPd8/PBZ5fVW/oa7MF2NI9/X7gi1Mv5FHrgL8+hPutxpjO4/T7rcaYzuP0+63GmC3N4zi+t6rmRraqqql/Af8YuKbv+VuBt85irDHr2XEo92upVufx4BrTeXQeD/Q8TvNrVlch3gRsTHJikn8AnANcOaOxJElr0EzOgVXVw0neAFwDHAZcVFW7ZjGWJGltmtk/tKyqq4GrZ/X+E7rwEO+3GmM6j9PvtxpjOo/T77caY7Y0j1Mzk4s4JEmaNW8lJUlq0iEVYEnmk9wxMO21Sd43Zv/PTmPMaVjqfac5ZpI/T7JpzLYTLZ9hdY47ZpJfTnJXko8OTN+TZN0ktSy31mn0W2p+F5ZpktOS/OkE4y76WST5cPdnLMuq9WAw5jIdtm6taB7717kkb5lWveOMd6D6Lufn3ErGm6WZnQNrUVX9+GrXcDBbheXzS8DpVbX3AI97wCx3mbquzswvAacDP38gx1vmOr6svitYdw667fGQ2gPrl+T7knwBmANO6H4L/lKSty/R5+t9j/91kpuS7EzyzhHDHZbkg0l2Jflkkicl+UdJPpXktiS3JHn2wFhv6252/OkklyR5S5If7drfBlwwyXwm+bEk/6sb65Ykj1tJFxuze+ncJLcmuSPJKWMun3+T5Pau3m2TLJtxxkzyAeD7gP+Z5M1d311J/hDIEjUutlx/ofssb0tyWZInj1vrBH37P4t/kuRj3W+rlwNPWqLP1/uePjXJVV39H0gydPtc6Jee93V9PgV8z7A+Q2p9fpLf6lvXXz+k/WLL9dlJPpHk5m7d+4Ex+y25bXQW+yzG3T4W6ztOrd9d54A3Ac9NckN6Pzd+YRnL9be79XtnkjcuNV63Pd3Q9f1sku8fMU5/37cl+aNue9yZ5KdH9F1Yd45Kcm33GdyeZPOY4/3bJBclubGrd2i/mVvtP0Sb5hcwD9xB784eXwCeC7wW2Ac8nd4PkjuATUP6f737/lJ6V9iEXsj/KXDqEmM+DJzcPb8U+Dng88DZ3bQjgSf39fkx4NZu+tHAl4C3ADsXxgF+C7hjgvl8MnBk9/pGBv7IcIkx/xz4YNfm1GFjDiyfM4DPLswTcNyEy2asMYE99P7a/73Ar3fTzgQKWLdI+2Hz+PS+Nu8G3jhBrUv2HfJZ/Ct6fzoC8MPd+45a504DvkXvh8RhwHbgZ8b4LH6qa3sY8AzgwWH9htS6Bfh33etHADuAE8dcrtcCG7s2zwf+bMx+Q7eNEZ/FyO1jib5L1rrIOvcO4DZ6PzPW0bs13jMmWK6/CPwJcPiIbWRhvKf2tT0duGyMn3cLff8D8J/6ph87ot/CunM48NTu8TpgN92FfSPG+w3g57ppxwD/G3jKqHpn8XUoHkKcA64Afqqq7kzyPGB7Vf0NQJKPAy+it6EO89Lu6wvd86PohcL1Q9rfXVW3do9vBk4ENlTV5QBV9a2B9i8EruimfyvJ/+imH1NVC2P8F3pBMe58Pg14X5KTgUeA54w5JsAlXZ3XJ3lqkmOq6sElxj4d+KOq+kbX72+XaDu4bOaXMeap9H5QU1VXJfm7Ie2GzeMPJXk3vY3tKHp/nzhureP0Hfws3kkvdKmqnUl2Dhlv0I316A2wL6G3nv7JiD6nApdU1SPAV5L82Yj2g7W+DfjhPHre7Gn01vW7+/ostlyPBH4c+G/Jd3eIjxgYa7F+T2LpbWPBYp/FuNvHYn1H1bqYK6rqm8A3k1xH7ybl/31I28Hl+uvAB6rqYRi5jUBvuV+cZCO9X9CeOEZ9C06nd7MIurGGbR+DAvxGklOB79C7h+164L4R/V4K/PM8egTnSOBZwF0T1DwVh2KAPQT8Fb2Nf+Hu94N/KzDqbwcC/GZV/cGYY3677/Ej9H7YzdrgfL4JuJ/eb39PoPfb/LgmXT6TGFw2C4fTZjnmoA8DZ1XVbUleS29vZzGL1TpO38XWueU4EMtksNbQ26scFurDPAF4sKpOnnJ9CwY/i+NX0Hc9y6t1ks9jpevAu4DrqursJPP0jlLM2qvpBe+PVtX/S7KHXhiNEuCnq2qW968dy6F4Duz/AmcDr0nyqm7aP01yXHrnX84CPjPiPa4B/mWSowCSbEgy1rmFzteAvUnO6vofkceeO/kM8JNJjuzG+Gfd9AeTvKh7/OoRYwzO59OAfVX1HeBceoeU+g0bE+BnuzpfBDxUVQ+NGHs78LqFeUpy3Ij2i5lkzOuBV3XtzwCOHdJu2DweDexL8kRGL9dB4/Qd/Cz66/0heocRx3FKerdfewK95fPpMfpcD/xsksOSHA+8eET7wVqvAX6xmz+SPCfJUwb6LLZcvwHcneRfdP2S5Llj9PsmS28bwzzIZNtHv6+OUetiNne1P53eLy43LdF2cLluB16f5PBuzFHbyNOAe7vHrx2jtn7b6TsnmGTY9rHYmA904fVi4HvH7HcN8MZ0u7PdUa5VcSgGGFX19/Q2ljfRO7Z8I3AZvWPol1XVUocPqapPAn8M3JDkdnqHcY6esIxzgV/uDh99FviHfe9/E717Q+6kd8L4dnq/wb0O+P0kt7LEhQp979M/n3uA89I7wf0DwN8PtB02JvQO73wB+ABw/hjjfqJ7rx1drWNdbjxgkjHfCZyaZBe9Q4l/NaSuYfP4NnrnXT4D/MWEdY7Vd+Cz+D/AUUnuAv49vcNY47gJeB+9QzF3A5eP0edyeueW7gQ+AtwwqsNArfd1fW9J71LwP2DgyMwSy/XVwPndOreL3v/8G6ff0G1jhIm2jwFL1jrETuA64HPAu6rqK0s1HliuX6G3nu7sxnzVUn2B/wj8ZrdNTHpk7N3AseldMHIbo3+JWfBRYFP3M+41jL9tvIveIc6d3Tb5rgnrnRrvxLFKkhxVVV/vfvu8HthSVbccamMeaGthHlfDcpern4dm6VA8B9aKC5OcRO+Y88UHaKNejTEPtLUwj6thucvVz0Mz4x6YJKlJh+Q5MEnSoc8AkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXp/wMuzXS3xlEXKwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fc = collections.Counter(chunks(scb, 2))\n", "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'fe': 'e',\n", " 'ia': 't',\n", " 'fc': 'o',\n", " 'fb': 'a',\n", " 'kc': 'i',\n", " 'fa': 'n',\n", " 'he': 'h',\n", " 'gc': 's',\n", " 'hd': 'r',\n", " 'ge': 'd',\n", " 'ke': 'l',\n", " 'ib': 'u',\n", " 'id': 'm',\n", " 'kd': 'w',\n", " 'ha': 'y',\n", " 'ga': 'c',\n", " 'fd': 'f',\n", " 'hb': 'g',\n", " 'gb': 'p',\n", " 'ic': 'b',\n", " 'ka': 'v',\n", " 'gd': 'k',\n", " 'ie': 'x',\n", " 'hc': 'j',\n", " 'kb': 'q'}" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "p_common = [p[0] for p in collections.Counter(chunks(scb, 2)).most_common()]\n", "e_common = [p[0] for p in english_counts.most_common()]\n", "bsubs = {p: c for p, c in zip(p_common, e_common)}\n", "bsubs" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'actseleitsocourhonankoreitiupstyeinvtsanpatahtsitoureccorthtowontiantsehobaethfvgroxvmirhahlooyelihyvdoitsanpoctsehobaeteygaremihhtokelfvsahleitstseuhhrceelhontseinpertsitmehtarugmatseiwsmirmecapstanathguggethtitehmesibetraeltowontianatfutanomreidahetsitmewinondvleceitattsemivmecoupstcihwahyfvtikanponathyapstanogenmirourgodatawainhsibehsrunkcroytsewoncdawtinltsevneelireihontowoncronttseebadebentsetsreitocnuwdeiryahhadehfihelanwufilalnotpabetseytseyettdetocapstanhteiltsevsibewonbanweltseyhedbehtsittseyillowtraneocyutuiddvihhurellehtruwtaonmaddgrotewtuhinltsitgeiwewinfeyiantianelunlertsehsedteroctsenuwdeiruyfredditsevlonotheeytoheetsittsedonpermewomerantsahhsilomtseyoretsetmohalehmaddanbehtantseheimcudmeigonhfecoredonpatmaddfeaygohhafdetocapstitiddmatsouttsetsreitoctotidinnasaditaoninlmsentsitlivwoyehmemaddiddfeenhdibelfvmsoeberahyorerutsdehhdoheinlmemaddfetsehdibehtsegraweocmannanpyapstfemorheitcarhtasogeltsittsehgiweriwemoudlsedguhturnanptseyahhadehcroymeigonhocmirtowirraerhocgeiweinlkennelvheeyeltosibetsitanyanlmsensehetsahgropriytodinlontseyoonfvmannanptsehgiweriwetseilyanahtritaonsogeltoehtifdahstsehugreyiwvoctsewigatidahthvhteyoberwoyyunahywomanpoureneyaehinlhettanpourseirthinlyanlhontsewonjuehtocinemcrontaerfutfreqsnebheeyhunleterrelinlebenfecoretsediunwsocigoddoxatseiyerawingufdawahfepannanptopetforeltsetsreitocnuwdeirmirahrahanpinltsegeiwegrotehthmsawsireantenleltogrebentatireenwouripanpoureneyaehtofedaebetsittsevwinmanmirahuniboalifdetohurbabeatmeyuhtcapstatnomonouromnteryhfecoretsenuwdeirirhenidhpromtoogomercudacourdeilerhmaddnotiwtoctsearomnbodataontsenamaddgroboketserejuarelwoncrontitaonamaddwonbanwetseytsittseruhhainhsibehifotipeltsedunirgropriyinlkaddeloritteygteltokaddourihtroniuthtseruhhainhmaddneberfeifdetogrobetsittsevireannowentinlourgodatawainhinlpeneridhmaddfecorweltohtrakefiwktseruhhainhmaddehwiditeanorlertonotdookmeikinlonwetsevsibewoyyatteltseyhedbehtseremaddfenoturnanpfiwktseuniboalifdemirmaddsibetofecoupsttoathwonwduhaon'" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "comcb = cat(bsubs[p] for p in chunks(scb, 2))\n", "comcb" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('ifwlecpsazkdynogjrhtubmxvq', -6624.359993210847)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kb, scoreb = simulated_annealing_break(comcb, fitness=Ptrigrams)\n", "kb, scoreb" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'ifthedeathofoursoninkoreataughtmeanythingitisthatoureffortstocontainthesovietsbyproxywarsisdoomedasmyloathingofthesovietempirewasstokedbyhisdeaththeussrfeedsontheangerthatwestirupwitheachwarwefightinitspuppetstateswehavetriedtocontainitbutinowrealisethatwecanonlydefeatitthewaywefoughtfascismbytakingonitsmightinopenwarourpoliticianshaveshrunkfromtheconflictandtheyneedareasontoconfronttheevileventhethreatofnuclearmissilesbasedincubadidnotgivethemthemettletofightinsteadtheyhaveconvincedthemselvesthatthemaddoctrineofmutuallyassureddestructionwillprotectusandthatpeacecanbemaintainedundertheshelterofthenuclearumbrellatheydonotseemtoseethatthelongerwecowerinthisshadowthemorethetwosideswillinvestintheseawfulweaponsbeforelongitwillbeimpossibletofightatallwithoutthethreatoftotalannihilationandwhenthatdaycomeswewillallbeenslavedbywhoeverismoreruthlessloseandwewillbetheslavesthepriceofwinningmightbeworseatfirstihopedthatthespaceracewouldhelpusturningthemissilesfromweaponsofwartocarriersofpeaceandkennedyseemedtohavethatinmindwhenhesethisprogramtolandonthemoonbywinningthespaceracetheadministrationhopedtoestablishthesupremacyofthecapitalistsystemovercommunismcowingourenemiesandsettingourheartsandmindsontheconquestofanewfrontierbutbrezhnevseemsundeterredandevenbeforethelaunchofapolloxitheamericanpublicisbeginningtogetboredthethreatofnuclearwarisrisingandthepeaceprotestswhichareintendedtopreventitareencouragingourenemiestobelievethattheycanwinwarisunavoidabletosurviveitwemustfightitnowonourowntermsbeforethenucleararsenalsgrowtoopowerfulifourleaderswillnotactoftheirownvolitiontheniwillprovoketherequiredconfrontationiwillconvincethemthattherussianshavesabotagedthelunarprogramandkilledorattemptedtokillourastronautstherussianswillneverbeabletoprovethattheyareinnocentandourpoliticiansandgeneralswillbeforcedtostrikebacktherussianswillescalateinordertonotlookweakandoncetheyhavecommittedthemselvestherewillbenoturningbacktheunavoidablewarwillhavetobefoughttoitsconclusion'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pb = keyword_decipher(comcb, kb, KeywordWrapAlphabet.from_last)\n", "pb" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "if the death of our son in korea taught me anything it is that our efforts to contain the soviets by\n", "proxy wars is doomed as my loathing of the soviet empire was stoked by his death the ussr feeds on\n", "the anger that we stir up with each war we fight in its puppet states we have tried to contain it\n", "but i now realise that we can only defeat it the way we fought fascism by taking on its might in\n", "open war our politicians have shrunk from the conflict and they need a reason to confront the evil\n", "even the threat of nuclear missiles based in cuba did not give them the mettle to fight instead they\n", "have convinced themselves that the mad doctrine of mutually assured destruction will protect us and\n", "that peace can be maintained under the shelter of the nuclear umbrella they do not seem to see that\n", "the longer we cower in this shadow the more the two sides will invest in these awful weapons before\n", "long it will be impossible to fight at all without the threat of total annihilation and when that\n", "day comes we will all be enslaved by whoever is more ruthless lose and we will be the slaves the\n", "price of winning might be worse at first i hoped that the space race would help us turning the\n", "missiles from weapons of war to carriers of peace and kennedy seemed to have that in mind when he\n", "set his program to landon the moon by winning the space race the administration hoped to establish\n", "the supremacy of the capitalist system over communism cowing our enemies and setting our hearts and\n", "minds on the conquest of a new frontier but brezhnev seems undeterred and even before the launch of\n", "apollo xi the american public is beginning to get bored the threat of nuclear war is rising and the\n", "peace protests which are intended to prevent it are encouraging our enemies to believe that they can\n", "win war is unavoidable to survive it we must fight it now on our own terms before the nuclear\n", "arsenals grow too powerful if our leaders will not act of their own volition then i will provoke the\n", "required confrontation i will convince them that the russians have sabotaged the lunar program and\n", "killed or attempted to kill our astronauts the russians will never be able to prove that they are\n", "innocent and our politicians and generals will be forced to strike back the russians will escalate\n", "in order to not look weak and once they have committed themselves there will be no turning back the\n", "unavoidable war will have to be fought to its conclusion\n" ] } ], "source": [ "print(lcat(tpack(segment(pb))))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2430" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "open(plaintext_b_filename, 'w').write(lcat(tpack(segment(pb))))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 4 }