{ "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) \n", "\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import collections\n", "import string\n", "%matplotlib inline\n", "\n", "from cipher.vigenere import *\n", "from cipher.cadenus import *\n", "from support.utilities import *\n", "from support.text_prettify import *\n", "from support.language_models import *\n", "from support.plot_frequency_histogram import *\n", "\n", "c8a = open('8a.ciphertext').read()\n", "c8b = open('8b.ciphertext').read().strip()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAD7CAYAAACWq8i5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAGXNJREFUeJzt3X+0XWV95/H3p1B+TAsSNKYsgsZOM1rK+ANSSFdtR6WFgJ2GTpXBtpJxKJkW7KLj9Ec67ZQR6xTbaW0Z23RYkhrUqaLVIa1gmhW11iqYIBQEyuIWZUgWQiT8cLTV4nznj/OkHq7nnPvckHAuyfu11lln7+9+nv3sc+6593P2j3NuqgpJknp8y7Q3QJL09GFoSJK6GRqSpG6GhiSpm6EhSepmaEiSuhkakqRuhoYkqZuhIUnqdui0N2Bfe9aznlXLli2b9mZI0tPKTTfd9MWqWjxXuwMuNJYtW8b27dunvRmS9LSS5N6edh6ekiR1MzQkSd0MDUlSN0NDktTN0JAkdTM0JEndDA1JUjdDQ5LU7YD7cN+BbNm6D42sf/7yVz7FWyLpYOWehiSpm6EhSepmaEiSuhkakqRuhoYkqZuhIUnqZmhIkroZGpKkboaGJKmboSFJ6mZoSJK6GRqSpG5zhkaS5ye5Zej2WJKfT3Jski1J7m73i1r7JLkiyUySW5OcPLSuNa393UnWDNVPSXJb63NFkrT6yDEkSdMxZ2hU1V1V9eKqejFwCvAV4IPAOmBrVS0HtrZ5gLOA5e22FlgPgwAALgVOA04FLh0KgfXAhUP9VrX6uDEkSVMw38NTpwN/V1X3AquBja2+ETinTa8Grq6BG4BjkhwHnAlsqardVfUwsAVY1ZYdXVU3VFUBV89a16gxJElTMN/QOA/4kza9pKrub9NfAJa06eOB+4b67Gi1SfUdI+qTxniCJGuTbE+yfdeuXfN8SJKkXt2hkeQw4EeB981e1vYQah9u1zeZNEZVXVlVK6pqxeLFi/fnZkjSQW0+expnAZ+pqgfa/APt0BLt/sFW3wmcMNRvaatNqi8dUZ80hiRpCuYTGq/hG4emADYBe66AWgNcO1Q/v11FtRJ4tB1i2gyckWRROwF+BrC5LXssycp21dT5s9Y1agxJ0hR0/Y/wJN8G/DDwH4bKlwPXJLkAuBc4t9WvA84GZhhcafU6gKraneRNwLbW7rKq2t2mLwLeARwJXN9uk8aQJE1BV2hU1ZeBZ86qPcTgaqrZbQu4eMx6NgAbRtS3AyeNqI8cQ5I0HX4iXJLUzdCQJHUzNCRJ3QwNSVI3Q0OS1M3QkCR1MzQkSd0MDUlSN0NDktTN0JAkdTM0JEndDA1JUjdDQ5LUzdCQJHUzNCRJ3QwNSVI3Q0OS1M3QkCR16wqNJMckeX+Sv01yZ5LvS3Jski1J7m73i1rbJLkiyUySW5OcPLSeNa393UnWDNVPSXJb63NFkrT6yDEkSdPRu6fx+8CHq+oFwIuAO4F1wNaqWg5sbfMAZwHL220tsB4GAQBcCpwGnApcOhQC64ELh/qtavVxY0iSpmDO0EjyDOAHgasAquprVfUIsBrY2JptBM5p06uBq2vgBuCYJMcBZwJbqmp3VT0MbAFWtWVHV9UNVVXA1bPWNWoMSdIU9OxpPA/YBfxxkpuTvD3JtwFLqur+1uYLwJI2fTxw31D/Ha02qb5jRJ0JYzxBkrVJtifZvmvXro6HJEnaGz2hcShwMrC+ql4CfJlZh4naHkLt+83rG6OqrqyqFVW1YvHixftzMyTpoNYTGjuAHVV1Y5t/P4MQeaAdWqLdP9iW7wROGOq/tNUm1ZeOqDNhDEnSFMwZGlX1BeC+JM9vpdOBO4BNwJ4roNYA17bpTcD57SqqlcCj7RDTZuCMJIvaCfAzgM1t2WNJVrarps6fta5RY0iSpuDQznY/B7w7yWHAPcDrGATONUkuAO4Fzm1trwPOBmaAr7S2VNXuJG8CtrV2l1XV7jZ9EfAO4Ejg+nYDuHzMGJKkKegKjaq6BVgxYtHpI9oWcPGY9WwANoyobwdOGlF/aNQYkqTp8BPhkqRuhoYkqZuhIUnqZmhIkroZGpKkbr2X3ErS1C1b96GR9c9f/sqneEsOXu5pSJK6GRqSpG6GhiSpm6EhSepmaEiSuhkakqRuhoYkqZuhIUnqZmhIkroZGpKkboaGJKmboSFJ6mZoSJK6dYVGks8nuS3JLUm2t9qxSbYkubvdL2r1JLkiyUySW5OcPLSeNa393UnWDNVPaeufaX0zaQxJ0nTM56vRX15VXxyaXwdsrarLk6xr878MnAUsb7fTgPXAaUmOBS4FVgAF3JRkU1U93NpcCNwIXAesAq6fMIZ00Bn3teDgV4PrqfNkDk+tBja26Y3AOUP1q2vgBuCYJMcBZwJbqmp3C4otwKq27OiquqGqCrh61rpGjSFJmoLe0CjgL5LclGRtqy2pqvvb9BeAJW36eOC+ob47Wm1SfceI+qQxniDJ2iTbk2zftWtX50OSJM1X7+Gpl1bVziTPBrYk+dvhhVVVSWrfb17fGFV1JXAlwIoVK/brdkjSwawrNKpqZ7t/MMkHgVOBB5IcV1X3t0NMD7bmO4EThrovbbWdwMtm1T/W6ktHtGfCGF3815CStG/NeXgqybclOWrPNHAG8FlgE7DnCqg1wLVtehNwfruKaiXwaDvEtBk4I8midhXUGcDmtuyxJCvbVVPnz1rXqDEkSVPQs6exBPhguwr2UOB/VdWHk2wDrklyAXAvcG5rfx1wNjADfAV4HUBV7U7yJmBba3dZVe1u0xcB7wCOZHDV1PWtfvmYMSRJUzBnaFTVPcCLRtQfAk4fUS/g4jHr2gBsGFHfDpzUO4YkaTr8RLgkqZuhIUnqZmhIkroZGpKkboaGJKmboSFJ6mZoSJK6GRqSpG6GhiSpm6EhSepmaEiSuhkakqRuhoYkqZuhIUnqZmhIkrr1/o9waZ/yX/FKT0+Ghp60cQEAhsA4Pmd6uvLwlCSpW3doJDkkyc1J/rzNPy/JjUlmkrw3yWGtfnibn2nLlw2t41da/a4kZw7VV7XaTJJ1Q/WRY0iSpmM+exqXAHcOzb8FeGtVfRfwMHBBq18APNzqb23tSHIicB7wPcAq4A9bEB0C/AFwFnAi8JrWdtIYkqQp6DqnkWQp8ErgzcAbkgR4BfATrclG4L8C64HVbRrg/cDbWvvVwHuq6qvA55LMAKe2djNVdU8b6z3A6iR3ThhD0tOcF0M8PfXuafwe8EvA/2vzzwQeqarH2/wO4Pg2fTxwH0Bb/mhr/0/1WX3G1SeN8QRJ1ibZnmT7rl27Oh+SJGm+5gyNJD8CPFhVNz0F27NXqurKqlpRVSsWL1487c2RpANWz+Gp7wd+NMnZwBHA0cDvA8ckObTtCSwFdrb2O4ETgB1JDgWeATw0VN9juM+o+kMTxpAkTcGcexpV9StVtbSqljE4kf2RqvpJ4KPAq1qzNcC1bXpTm6ct/0hVVauf166ueh6wHPg0sA1Y3q6UOqyNsan1GTeGJGkKnsznNH6ZwUnxGQbnH65q9auAZ7b6G4B1AFV1O3ANcAfwYeDiqvp624t4PbCZwdVZ17S2k8aQJE3BvD4RXlUfAz7Wpu/hG1c/Dbf5B+DVY/q/mcEVWLPr1wHXjaiPHEOSNB1+IlyS1M3vnpL0pPmZi4OHexqSpG6GhiSpm6EhSepmaEiSuhkakqRuhoYkqZuhIUnqZmhIkroZGpKkboaGJKmboSFJ6mZoSJK6GRqSpG6GhiSpm6EhSepmaEiSus0ZGkmOSPLpJH+T5PYkb2z15yW5MclMkvcmOazVD2/zM235sqF1/Uqr35XkzKH6qlabSbJuqD5yDEnSdPTsaXwVeEVVvQh4MbAqyUrgLcBbq+q7gIeBC1r7C4CHW/2trR1JTgTOA74HWAX8YZJDkhwC/AFwFnAi8JrWlgljSJKmYM7QqIH/22a/td0KeAXw/lbfCJzTple3edry05Ok1d9TVV+tqs8BM8Cp7TZTVfdU1deA9wCrW59xY0iSpqDrnEbbI7gFeBDYAvwd8EhVPd6a7ACOb9PHA/cBtOWPAs8crs/qM67+zAljzN6+tUm2J9m+a9eunockSdoLXaFRVV+vqhcDSxnsGbxgv27VPFXVlVW1oqpWLF68eNqbI0kHrHldPVVVjwAfBb4POCbJoW3RUmBnm94JnADQlj8DeGi4PqvPuPpDE8aQJE1Bz9VTi5Mc06aPBH4YuJNBeLyqNVsDXNumN7V52vKPVFW1+nnt6qrnAcuBTwPbgOXtSqnDGJws39T6jBtDkjQFh87dhOOAje0qp28BrqmqP09yB/CeJL8B3Axc1dpfBbwzyQywm0EIUFW3J7kGuAN4HLi4qr4OkOT1wGbgEGBDVd3e1vXLY8aQJE3BnKFRVbcCLxlRv4fB+Y3Z9X8AXj1mXW8G3jyifh1wXe8YkqTp8BPhkqRuhoYkqZuhIUnq1nMiXPvBsnUfGln//OWvfIq3RJL6uachSermnoY0i3uB0njuaUiSuhkakqRuhoYkqZuhIUnqZmhIkroZGpKkboaGJKmboSFJ6mZoSJK6GRqSpG6GhiSpm6EhSepmaEiSus0ZGklOSPLRJHckuT3JJa1+bJItSe5u94taPUmuSDKT5NYkJw+ta01rf3eSNUP1U5Lc1vpckSSTxpAkTUfPnsbjwH+qqhOBlcDFSU4E1gFbq2o5sLXNA5wFLG+3tcB6GAQAcClwGnAqcOlQCKwHLhzqt6rVx40hSZqCOUOjqu6vqs+06S8BdwLHA6uBja3ZRuCcNr0auLoGbgCOSXIccCawpap2V9XDwBZgVVt2dFXdUFUFXD1rXaPGkCRNwbzOaSRZBrwEuBFYUlX3t0VfAJa06eOB+4a67Wi1SfUdI+pMGGP2dq1Nsj3J9l27ds3nIUmS5qE7NJJ8O/CnwM9X1WPDy9oeQu3jbXuCSWNU1ZVVtaKqVixevHh/boYkHdS6/t1rkm9lEBjvrqoPtPIDSY6rqvvbIaYHW30ncMJQ96WtthN42az6x1p96Yj2k8aQpC7++959q+fqqQBXAXdW1e8OLdoE7LkCag1w7VD9/HYV1Urg0XaIaTNwRpJF7QT4GcDmtuyxJCvbWOfPWteoMSRJU9Czp/H9wGuB25Lc0mr/GbgcuCbJBcC9wLlt2XXA2cAM8BXgdQBVtTvJm4Btrd1lVbW7TV8EvAM4Eri+3ZgwhiRpCuYMjar6BJAxi08f0b6Ai8esawOwYUR9O3DSiPpDo8aQJE2HnwiXJHXrOhEuaTJPtupg4Z6GJKmboSFJ6mZoSJK6GRqSpG6eCJekJ2nchRBw4F0M4Z6GJKmboSFJ6ubhKUl6mlgIh8EMjX3AD3ZJOlgYGgewhfCuRNKBxXMakqRuhoYkqZuhIUnqZmhIkrp5IlxP4MlzSZO4pyFJ6jZnaCTZkOTBJJ8dqh2bZEuSu9v9olZPkiuSzCS5NcnJQ33WtPZ3J1kzVD8lyW2tzxVJMmkMSdL09OxpvANYNau2DthaVcuBrW0e4CxgebutBdbDIACAS4HTgFOBS4dCYD1w4VC/VXOMIUmakjlDo6o+DuyeVV4NbGzTG4FzhupX18ANwDFJjgPOBLZU1e6qehjYAqxqy46uqhuqqoCrZ61r1BiSpCnZ2xPhS6rq/jb9BWBJmz4euG+o3Y5Wm1TfMaI+aYxvkmQtgz0bnvOc58z3sUgHLC9s0L72pE+Etz2E2gfbstdjVNWVVbWiqlYsXrx4f26KJB3U9nZP44Ekx1XV/e0Q04OtvhM4Yajd0lbbCbxsVv1jrb50RPtJY+xXfvmgJI23t3sam4A9V0CtAa4dqp/frqJaCTzaDjFtBs5IsqidAD8D2NyWPZZkZbtq6vxZ6xo1hiRpSubc00jyJwz2Ep6VZAeDq6AuB65JcgFwL3Bua34dcDYwA3wFeB1AVe1O8iZgW2t3WVXtObl+EYMrtI4Erm83JowhSZqSOUOjql4zZtHpI9oWcPGY9WwANoyobwdOGlF/aNQYkqTp8RPhkqRuhoYkqZuhIUnq5rfcStIQPxA5mXsakqRuhoYkqZuHp3RA8xP+0r7lnoYkqZuhIUnqZmhIkroZGpKkboaGJKmboSFJ6mZoSJK6GRqSpG6GhiSpm6EhSepmaEiSui340EiyKsldSWaSrJv29kjSwWxBf2FhkkOAPwB+GNgBbEuyqarumO6WaRr88kEdSJ6u/7djQYcGcCowU1X3ACR5D7AaMDSk/eTp+sdMo+3rN1upqiezPftVklcBq6rqp9v8a4HTqur1s9qtBda22ecDd41Y3bOAL85zE+wz/z4Ldbvss3C3yz4LY7ueW1WL51xDVS3YG/Aq4O1D868F3raX69pun/3fZ6Ful30W7nbZZ+Fu16jbQj8RvhM4YWh+aatJkqZgoYfGNmB5kuclOQw4D9g05W2SpIPWgj4RXlWPJ3k9sBk4BNhQVbfv5equtM9T0mehbpd9Fu522Wfhbtc3WdAnwiVJC8tCPzwlSVpADA1JUjdDQ9KTkoET5m6pA8EBHxpJFiU5NckP7rnN0f6IJG9I8oEkf5rkPyY54qna3gnblSQ/leTX2/xzkpw6pu072/0lT+U27g9JPtHuv5TksVm3R5N8LslFE/qfMqL2I/tzm/enJC9K8vp2e1FH+/3+eq7BidHr5tsvyauTHNWmf61t48kT2r+lp/Zktefr+Hn2eVeSC5O8YB59ThxRe9kcfX4uyaJ5btvWJGfPqu31CfED+kR4kp8GLmHw+Y5bgJXAp6rqFRP6XAN8CXhXK/0EcExVvXpCn43AJVX1SJtfBPxOVf37We3eMGl7q+p3J4yxHvh/wCuq6rvbGH9RVd87ou0dwA8B1wMvAzJrnN0Txhm1jY8CN1XVLWP6HA78OLCMoSvyquqycePsK0meCXyyqp4/ZvlngPOr6rNt/jXAz1fVaft4O1YAvwo8l8FzEAZ/T184oc+8nrf2JuBC4AOt9GPAlVX1PyaMsTev53m/TtvvwNuqatukvrP63FpVL0zyUuA3gN8Gfn3czybJZ6rq5FHrmGOcXx/zOMY9z5cC5wK7gfcC76uqB+YY4+XAD7TbPwduBj5eVb8/oc9ngXcCvwUc0e5XVNX3TejzGww+evAZYAOwueb4I57kHuA+4CNV9cZW+6bnsteCvuR2H7gE+F7ghqp6eXsX8N/m6HNSVQ2/A/ho+yM8yQv3BAZAVT2c5CUj2h3V7p/ftmvPZ07+NfDpOcY4rapOTnLz0BiHjWn7R8BW4DuBm3hiaFSrj7Oi3f6szf8IcCvwM0neV1W/NaLPtbRgAb466UEk+URVvTTJl9q2/NOiwcOqoyf1n62qHprj3dmrgPcn+QkGv9DnA2eM2bbZ2zSfbXs38IvAbQzCvUf389ZcwOB18OW2vW8BPgWMDQ327vW8gtGvz7sn9DkN+Mkk9wJfpiM0ga+3+1cyCL8PtT+KT5DkZ4GLgO9McuvQoqOAv57jsdC2Z48jGLym7xzXuP1hfWOSFwL/FvjLJDuq6ocm9Ploko8zeN5eDvwM8D3A2NBg8Jy9BfhkeyzvBr5/0gOpql9L8l8YvIZfB7ytvTG4qqr+bky3R4DTgSuS/BnwU5PGmNOT/Uj5Qr4B29r9LcDhbfr2Ofq8C1g5NH8acPUcff4GWDQ0fyxw24T2HweOGpo/isG7kklj3MjgsyqfafOLgZvn6LN+L56zjwPfPjT/7cBfAkcCd4zp89lp/6zneEz/gsGXXH4YOHI/jfGJvegzr+eNQSAdMTR/xKTXWWuzN6/nvXl9PnfUbY4+fw78T+Ae4BjgcOBvRrR7BoO9sT+Ztf5j9/JndTjwsY523wH8HINgunWOtluBG4C3Av8GeHbH+g9jsHd1CzADnDePx/Ai4PeAvwXWM9iz+a0xbW8emv537XW0Y2+eu6o64Pc0diQ5BvjfwJYkDwP3jmqY5DYG7zK/Ffhkkv/T5p/L4Aczye8An0ryvjb/auDNE9ovAb42NP+1VpvkCuCDwLOTvJnBO+hfm9Shqn52jnWO8mye+K73H4ElVfX3Sca9G/5kkn9ZVbftxXj7xdDPc49jGYTujUmoOQ5p7IVLk7ydwR+Pf3qequoD47vM+3n7Ywbb/8E2fw5w1Rx9TuEbr2eA5wB37Xl+xjwP8359VtXI36s5nAusAv57VT2S5DgGe2uz1/0ogz2y1+zFGKP8MwaHrEdq58jOZfDG7H3AhTX3v2O4lcFzfRKDbX0kyaeq6u8n9NnGYG/zexl8keAfJfnxmnzo8BIGe8tfBN4O/GJV/WOSb2GwJ/hLI7r90Z6JqnpH+9lfPMfjGeuAPqcxLMm/YvCO5cNV9bURy587qf9cvxTtpNaecyUfmfQiS/KrDF6Uw7/8762q35xjjBcw2M0MsLWqxu5i76226/tjDF7MMDg0sYlBMF5ZVT851HbPH+ZDgeUM3jF+lb5DE/vVk/157sV47wJeANzONw5PVc06rzWrzx3AdwGfo/N5ayeKX9pm/6qqbp5ju+b9POzt63OhmvUG4hAGYXBZVb1tTPvfZPB4R57Dm2Osoxi8m/8F4Duq6vAJbVdU1fZZtddW1Tsn9Hkjg2/GGPVz++798Tfhm8Y5WEJjoWm//D/QZj8+1y//U6md1N1zbPWvZ7+wh9o9pX+YF7Ikd9WYk/ET+ox8/hbC87aQX5/zNet5fhx4oKoe38djvJ7B83UK8HngrxiE+kf25TgLgaEh7QNJ/hj47Y7DGDoAJfkFBkFx074OpIXG0JD2gSR3MrjUsvtQk/R0ZGhI+8BCPtQk7UuGhiSp2wH/NSKSpH3H0JAkdTM0JEndDA1JUrf/D01s6fDIlGlbAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs = pd.Series(english_counts)\n", "freqs.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs_8a = pd.Series(collections.Counter([l.lower() for l in c8a if l in string.ascii_letters]))\n", "freqs_8a.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'nyvlggsyglchxfeuytqcesqxpziufiggrbjhpayncruyfpsxufiupskyrectmmcncruyregxigrlglbtiblmecebzsvrlpuxpbibjajrljreobajrlufigjehbezywtmgjyxfqxictsgrdgtbjafyoocwtmjblctwwucqmgofrlfmrfrlfwlbtijlwuypmchjqxicrfchumtsmzjbimyvhcuvyrugxjcwpdtpuisrlfdhbaencyqumufeogrhcrjmytqsmsxjmrcsxjrmttiswzvjrfpecjitnidgemdssaitasvjhuyofgxpsxgmvvqfvrxiyxxmymbxfjpufigbeufeuuiiyzfavbaofbxicmsamqfisqwpgrtribbmtskhcwuuimcxufinbitrvpwxsmnbljppytuixgpmlifbgpmtfpeugsodvpkxicsnyrjeswcvokioreoyvnchggkirishiuyrerlfdpjeluasorvpjwzqxfkwgpsnyhsmrfkiblaigpfuiociersflwvpiuusufmoewpliufeuuiemrprwflhdpmuggbjmodsskeugsoygsmwtrlfzecypnyreyftrvbgxblhuusufeuuivqiblsoavjrmdyplcchcrfpeugsonvprsdmpplxiyxdfeolimemwcrufimczfjsgasnkmukiorxicjeylbtitfsxlmobiwcppnmoexigwqjeogenqyscxiyxufizummjvfgrtreucxictpuisqyqnpzumufmoyjfuqplxiqfvrajrlmsglrlfwajjpomxhsitqxiyxxcoomabzsvrmuyreuixgpmnyugxpsxpdfvqmocwtdssjsoeiomyhfxpasncyqumufeqjeomjpsvpurumiynppgxjrmorlfkiblxjkixcrpuoomaufeurlfgvigkicwuqidsvjrcdmqnsrjaeugsoqescioavznxfbytgrhygbbioswdgticvtmafaeoqxbpxisrugrhrlsmyhfxichbrecywfdssmxicvjlxfpgfnxtuidyrdpedixigwnycccxicfscelrlsmyhfaffewcffcrmmslgrhdssgrufiggkirehymoqxufigbemcxtlsuqgscajryqypmrlfzitrlbpvz'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c8as = sanitise(c8a)\n", "c8as" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('bye', -1461.9840974270046)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key_a, score = vigenere_frequency_break(c8as)\n", "key_a, score" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "mark i cracked what appears to be the final document about the trojan deployment and i think i have\n", "an idea about how to deal with it and with the flag day associates the principal weakness of any\n", "system like the one they have installed is the need to provide large quantities of power the fda\n", "came up with an ingenious solution but it is very vulnerable special forces could take it out for us\n", "but that would tell the fda that we have cracked their ciphers so instead i suggest we let them\n", "destroy trojan for us we will need cooperation from the omani government an armed fighter jet and\n", "the flight control systems from a drone meanwhile we need to ensure two things one that we do not\n", "send critical information across the ba balm and abstrait and two that we use an on critical key\n", "generation protocol on that channel given the level of commitment the fda have shown in developing\n", "this plan i am sure that they will reinstate the powersupply within a few months but with luck they\n", "will not guess that we know about it and we will put it out of business for long enough to come up\n", "with a plan of our own to exploit it in the meantime we now know that their highest security\n", "communications are encrypted using a caden us cipher so we can start hunting through the database\n", "for other intercepts we can crack this maybe the breakthrough we have been looking for in the fight\n", "against the fda lets not screw it up all the best harry\n" ] } ], "source": [ "print(prettify(vigenere_decipher(c8as, key_a)))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "875.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(c8b) / 8" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['00000',\n", " '00101',\n", " '00010',\n", " '00000',\n", " '00100',\n", " '10100',\n", " '01110',\n", " '10011',\n", " '10011',\n", " '00000',\n", " '00010',\n", " '10011',\n", " '00111',\n", " '10001',\n", " '01000',\n", " '01110',\n", " '01011',\n", " '00100',\n", " '10011',\n", " '00010',\n", " '10010',\n", " '00100',\n", " '10001',\n", " '10011',\n", " '00111',\n", " '10010',\n", " '00111',\n", " '10011',\n", " '10001',\n", " '00000',\n", " '00111',\n", " '01010',\n", " '11000',\n", " '01110',\n", " '10001',\n", " '01111',\n", " '00101',\n", " '10001',\n", " '00110',\n", " '00100',\n", " '01110',\n", " '00000',\n", " '00011',\n", " '01111',\n", " '01111',\n", " '01001',\n", " '01101',\n", " '00110',\n", " '01011',\n", " '10011',\n", " '00100',\n", " '10001',\n", " '01101',\n", " '00100',\n", " '00101',\n", " '00100',\n", " '01110',\n", " '00101',\n", " '01000',\n", " '01110',\n", " '10001',\n", " '10011',\n", " '10010',\n", " '00011',\n", " '00011',\n", " '01110',\n", " '00100',\n", " '00100',\n", " '10100',\n", " '01100',\n", " '10010',\n", " '00010',\n", " '10001',\n", " '10100',\n", " '00100',\n", " '10001',\n", " '01101',\n", " '00101',\n", " '00100',\n", " '10011',\n", " '01011',\n", " '00000',\n", " '00000',\n", " '00101',\n", " '10010',\n", " '10011',\n", " '10110',\n", " '01000',\n", " '00100',\n", " '01101',\n", " '10011',\n", " '10001',\n", " '10101',\n", " '01110',\n", " '01110',\n", " '01101',\n", " '00100',\n", " '10001',\n", " '00111',\n", " '10100',\n", " '00000',\n", " '00111',\n", " '10001',\n", " '00000',\n", " '10101',\n", " '00100',\n", " '10001',\n", " '00100',\n", " '00100',\n", " '10011',\n", " '10010',\n", " '10101',\n", " '10010',\n", " '01000',\n", " '00100',\n", " '01011',\n", " '00111',\n", " '01011',\n", " '01110',\n", " '10010',\n", " '10011',\n", " '00011',\n", " '01110',\n", " '00000',\n", " '01011',\n", " '01110',\n", " '11000',\n", " '00000',\n", " '00100',\n", " '10010',\n", " '01100',\n", " '01101',\n", " '01101',\n", " '00011',\n", " '01000',\n", " '00110',\n", " '01101',\n", " '01101',\n", " '10001',\n", " '00111',\n", " '01110',\n", " '00111',\n", " '00111',\n", " '10011',\n", " '10010',\n", " '01101',\n", " '00000',\n", " '01110',\n", " '01000',\n", " '01011',\n", " '01101',\n", " '00010',\n", " '01101',\n", " '10010',\n", " '10010',\n", " '01000',\n", " '00010',\n", " '10001',\n", " '00100',\n", " '00000',\n", " '01101',\n", " '01101',\n", " '00100',\n", " '00100',\n", " '01000',\n", " '01000',\n", " '01000',\n", " '00100',\n", " '10001',\n", " '10110',\n", " '10011',\n", " '00000',\n", " '01101',\n", " '00100',\n", " '10010',\n", " '10001',\n", " '10101',\n", " '01110',\n", " '00110',\n", " '01000',\n", " '00100',\n", " '01000',\n", " '11000',\n", " '10110',\n", " '10010',\n", " '10010',\n", " '00011',\n", " '00110',\n", " '01111',\n", " '10101',\n", " '01110',\n", " '01000',\n", " '00000',\n", " '01000',\n", " '10010',\n", " '00000',\n", " '01110',\n", " '00000',\n", " '00100',\n", " '01110',\n", " '00000',\n", " '00100',\n", " '00011',\n", " '10001',\n", " '01101',\n", " '01000',\n", " '10011',\n", " '10001',\n", " '01101',\n", " '10111',\n", " '00100',\n", " '01000',\n", " '00110',\n", " '10001',\n", " '01111',\n", " '10010',\n", " '10010',\n", " '00111',\n", " '00000',\n", " '00011',\n", " '00111',\n", " '00011',\n", " '10011',\n", " '01110',\n", " '01000',\n", " '01111',\n", " '00000',\n", " '00000',\n", " '10011',\n", " '00100',\n", " '10111',\n", " '00100',\n", " '01101',\n", " '01101',\n", " '00100',\n", " '10010',\n", " '00000',\n", " '00110',\n", " '10001',\n", " '01110',\n", " '00001',\n", " '10011',\n", " '01011',\n", " '00100',\n", " '10010',\n", " '10001',\n", " '01101',\n", " '10001',\n", " '01110',\n", " '01000',\n", " '10001',\n", " '11000',\n", " '01111',\n", " '00001',\n", " '00110',\n", " '00100',\n", " '00011',\n", " '00010',\n", " '01011',\n", " '01011',\n", " '01000',\n", " '10110',\n", " '00000',\n", " '01011',\n", " '00000',\n", " '01011',\n", " '00100',\n", " '00100',\n", " '01101',\n", " '01000',\n", " '00110',\n", " '10001',\n", " '10001',\n", " '01101',\n", " '10110',\n", " '11000',\n", " '10001',\n", " '01011',\n", " '01000',\n", " '01100',\n", " '01011',\n", " '01111',\n", " '10010',\n", " '10011',\n", " '01110',\n", " '01011',\n", " '00100',\n", " '00101',\n", " '10011',\n", " '10001',\n", " '00011',\n", " '01100',\n", " '10100',\n", " '00000',\n", " '10001',\n", " '01000',\n", " '00100',\n", " '00100',\n", " '00100',\n", " '01000',\n", " '01000',\n", " '00000',\n", " '01110',\n", " '01011',\n", " '01101',\n", " '00100',\n", " '10110',\n", " '10010',\n", " '00000',\n", " '01110',\n", " '00111',\n", " '10001',\n", " '10011',\n", " '01011',\n", " '10010',\n", " '10011',\n", " '01110',\n", " '00001',\n", " '00100',\n", " '10011',\n", " '01101',\n", " '10010',\n", " '01011',\n", " '10101',\n", " '00101',\n", " '01000',\n", " '10101',\n", " '00011',\n", " '01110',\n", " '10101',\n", " '10011',\n", " '01111',\n", " '01110',\n", " '00000',\n", " '00100',\n", " '00100',\n", " '01000',\n", " '10010',\n", " '00010',\n", " '01000',\n", " '01110',\n", " '00111',\n", " '01000',\n", " '01111',\n", " '10010',\n", " '00100',\n", " '10101',\n", " '00100',\n", " '00100',\n", " '00011',\n", " '10011',\n", " '00100',\n", " '10110',\n", " '00101',\n", " '00000',\n", " '10001',\n", " '01101',\n", " '00111',\n", " '00100',\n", " '00001',\n", " '01011',\n", " '00100',\n", " '00000',\n", " '01110',\n", " '10011',\n", " '01110',\n", " '00111',\n", " '10011',\n", " '10011',\n", " '10011',\n", " '00100',\n", " '01111',\n", " '01101',\n", " '00010',\n", " '01010',\n", " '00000',\n", " '01110',\n", " '01101',\n", " '00111',\n", " '10110',\n", " '00100',\n", " '10011',\n", " '01100',\n", " '10101',\n", " '11000',\n", " '01111',\n", " '10001',\n", " '10001',\n", " '00100',\n", " '01110',\n", " '01101',\n", " '01101',\n", " '00000',\n", " '10010',\n", " '00110',\n", " '00011',\n", " '00100',\n", " '00011',\n", " '01110',\n", " '00100',\n", " '00100',\n", " '00100',\n", " '01110',\n", " '00000',\n", " '00000',\n", " '01100',\n", " '10011',\n", " '00010',\n", " '01000',\n", " '00010',\n", " '10011',\n", " '10011',\n", " '01000',\n", " '00101',\n", " '01101',\n", " '00000',\n", " '00011',\n", " '10001',\n", " '00100',\n", " '10010',\n", " '10001',\n", " '10011',\n", " '10010',\n", " '00100',\n", " '10001',\n", " '01110',\n", " '10010',\n", " '00100',\n", " '10011',\n", " '10001',\n", " '00111',\n", " '00010',\n", " '01000',\n", " '00010',\n", " '10011',\n", " '01111',\n", " '10010',\n", " '00000',\n", " '00000',\n", " '00100',\n", " '00111',\n", " '01011',\n", " '00011',\n", " '00111',\n", " '10010',\n", " '00101',\n", " '10111',\n", " '10010',\n", " '01110',\n", " '00000',\n", " '01110',\n", " '10011',\n", " '00010',\n", " '10011',\n", " '00001',\n", " '00001',\n", " '10010',\n", " '01110',\n", " '00100',\n", " '01000',\n", " '10001',\n", " '01101',\n", " '10010',\n", " '00000',\n", " '00011',\n", " '01011',\n", " '11000',\n", " '10011',\n", " '10001',\n", " '10001',\n", " '10100',\n", " '01101',\n", " '10001',\n", " '00010',\n", " '00100',\n", " '01111',\n", " '10011',\n", " '10011',\n", " '00111',\n", " '10001',\n", " '00100',\n", " '10100',\n", " '00111',\n", " '01101',\n", " '01010',\n", " '10011',\n", " '00000',\n", " '00010',\n", " '00100',\n", " '00010',\n", " '00100',\n", " '00100',\n", " '01011',\n", " '10001',\n", " '10110',\n", " '01101',\n", " '01000',\n", " '10001',\n", " '00100',\n", " '00100',\n", " '00100',\n", " '00000',\n", " '00100',\n", " '10010',\n", " '00100',\n", " '00100',\n", " '00100',\n", " '01000',\n", " '00011',\n", " '01000',\n", " '10010',\n", " '01110',\n", " '00110',\n", " '00010',\n", " '00100',\n", " '01110',\n", " '01100',\n", " '01101',\n", " '10001',\n", " '10011',\n", " '00100',\n", " '01001',\n", " '00111',\n", " '00000',\n", " '00110',\n", " '00000',\n", " '00001',\n", " '10010',\n", " '00100',\n", " '01101',\n", " '01000',\n", " '10011',\n", " '01011',\n", " '10110',\n", " '10011',\n", " '10001',\n", " '01101',\n", " '00001',\n", " '01100',\n", " '01000',\n", " '00100',\n", " '01011',\n", " '10010',\n", " '00000',\n", " '10001',\n", " '00100',\n", " '10011',\n", " '00100',\n", " '10010',\n", " '10001',\n", " '01101',\n", " '00110',\n", " '10010',\n", " '01101',\n", " '00111',\n", " '00100',\n", " '00001',\n", " '01000',\n", " '01110',\n", " '10010',\n", " '00011',\n", " '01000',\n", " '00100',\n", " '01101',\n", " '00000',\n", " '00101',\n", " '01011',\n", " '00100',\n", " '01000',\n", " '10010',\n", " '00000',\n", " '00111',\n", " '01110',\n", " '00010',\n", " '01000',\n", " '00101',\n", " '00100',\n", " '10101',\n", " '01100',\n", " '00101',\n", " '00000',\n", " '10011',\n", " '00000',\n", " '01101',\n", " '00000',\n", " '10011',\n", " '10001',\n", " '01101',\n", " '01000',\n", " '00000',\n", " '00110',\n", " '01101',\n", " '00111',\n", " '00000',\n", " '10011',\n", " '01101',\n", " '01100',\n", " '01000',\n", " '00001',\n", " '01101',\n", " '01000',\n", " '10100',\n", " '00101',\n", " '00100',\n", " '01101',\n", " '10001',\n", " '10011',\n", " '01110',\n", " '10011',\n", " '10011',\n", " '10001',\n", " '01101',\n", " '11000',\n", " '01111',\n", " '00000',\n", " '01000',\n", " '00011',\n", " '11000',\n", " '01000',\n", " '00100',\n", " '00110',\n", " '00011',\n", " '01101',\n", " '01100',\n", " '00100',\n", " '10001',\n", " '00111',\n", " '00111',\n", " '01000',\n", " '01110',\n", " '10011',\n", " '10001',\n", " '00100',\n", " '10011',\n", " '00010',\n", " '00100',\n", " '10010',\n", " '10010',\n", " '00100',\n", " '01000',\n", " '01011',\n", " '00011',\n", " '10001',\n", " '00001',\n", " '00010',\n", " '00100',\n", " '01111',\n", " '10001',\n", " '01000',\n", " '00110',\n", " '00000',\n", " '00100',\n", " '10010',\n", " '01110',\n", " '00000',\n", " '00011',\n", " '01011',\n", " '10011',\n", " '00000',\n", " '00111',\n", " '01000',\n", " '00100',\n", " '10101',\n", " '00100',\n", " '00001',\n", " '10001',\n", " '00010',\n", " '00100',\n", " '01101',\n", " '01011',\n", " '00100',\n", " '10101',\n", " '00000',\n", " '10010',\n", " '00000',\n", " '00011',\n", " '01101',\n", " '01101',\n", " '10011',\n", " '00111',\n", " '01101',\n", " '00100',\n", " '01000',\n", " '10011',\n", " '00100',\n", " '01000',\n", " '01000',\n", " '10010',\n", " '00000',\n", " '00111',\n", " '10100',\n", " '00111',\n", " '00111',\n", " '10100',\n", " '00000',\n", " '01100',\n", " '01110',\n", " '01101',\n", " '00100',\n", " '00101',\n", " '11000',\n", " '00111',\n", " '01011',\n", " '01110',\n", " '01101',\n", " '10110',\n", " '00111',\n", " '00000',\n", " '00100',\n", " '00100',\n", " '00100',\n", " '00100',\n", " '01110',\n", " '10010',\n", " '01101',\n", " '00100',\n", " '00100',\n", " '11000',\n", " '00000',\n", " '01101',\n", " '00100',\n", " '01000',\n", " '10010',\n", " '00100',\n", " '10011',\n", " '01110',\n", " '00110',\n", " '11000',\n", " '01000',\n", " '10011',\n", " '00100',\n", " '10001',\n", " '01011',\n", " '01000',\n", " '00111',\n", " '10011',\n", " '00010',\n", " '01100',\n", " '01000',\n", " '01110',\n", " '01000',\n", " '10001',\n", " '00000',\n", " '10001',\n", " '00101',\n", " '00011',\n", " '01110',\n", " '00100',\n", " '10011',\n", " '01101',\n", " '01000',\n", " '00111',\n", " '10011',\n", " '01101',\n", " '00100',\n", " '00111',\n", " '01000',\n", " '01000',\n", " '01010',\n", " '00000',\n", " '01100',\n", " '10001',\n", " '00011',\n", " '01100',\n", " '01101',\n", " '00000',\n", " '00011',\n", " '00000',\n", " '01101',\n", " '00000',\n", " '01110',\n", " '00011',\n", " '10010',\n", " '00100',\n", " '10010',\n", " '00100',\n", " '01000',\n", " '11000',\n", " '00010',\n", " '01011',\n", " '10010',\n", " '01000',\n", " '00000',\n", " '01101',\n", " '10011',\n", " '00000',\n", " '01110',\n", " '01011',\n", " '10011',\n", " '00010',\n", " '01000',\n", " '11000',\n", " '01100',\n", " '01000',\n", " '00011',\n", " '00100',\n", " '01101',\n", " '10011',\n", " '10011',\n", " '00111',\n", " '01011',\n", " '10011',\n", " '01101',\n", " '00011',\n", " '10111',\n", " '10011',\n", " '10011',\n", " '10011',\n", " '01100',\n", " '00000',\n", " '10010',\n", " '00001',\n", " '01011',\n", " '00100',\n", " '00000',\n", " '00100',\n", " '00100',\n", " '10011',\n", " '01011',\n", " '01000',\n", " '10010',\n", " '01000',\n", " '10001',\n", " '10011',\n", " '10110',\n", " '10011',\n", " '10100',\n", " '10001',\n", " '01111',\n", " '00101',\n", " '00000',\n", " '01000',\n", " '01011',\n", " '10011',\n", " '00100',\n", " '00000',\n", " '01110',\n", " '00100',\n", " '00101',\n", " '00100',\n", " '01000',\n", " '10010',\n", " '01000',\n", " '01000',\n", " '01000',\n", " '11000',\n", " '01000',\n", " '10010',\n", " '01000',\n", " '01010',\n", " '10101',\n", " '10011',\n", " '10110',\n", " '01000',\n", " '10010',\n", " '01111',\n", " '10001',\n", " '00001',\n", " '10010',\n", " '01000',\n", " '01101',\n", " '00100',\n", " '01011',\n", " '01111',\n", " '00111',\n", " '10001',\n", " '01100',\n", " '01110',\n", " '00111',\n", " '01000',\n", " '00000',\n", " '00110',\n", " '01101',\n", " '01011',\n", " '10010',\n", " '01011',\n", " '10101',\n", " '01000',\n", " '10011',\n", " '01110',\n", " '00011',\n", " '00000',\n", " '01000',\n", " '10010',\n", " '00011',\n", " '01111',\n", " '01101',\n", " '11000',\n", " '00011',\n", " '00011',\n", " '00010',\n", " '00000',\n", " '00000',\n", " '01110',\n", " '10011',\n", " '00000',\n", " '00111',\n", " '00010',\n", " '00100',\n", " '00111',\n", " '10011',\n", " '10100',\n", " '00100',\n", " '01000',\n", " '10001',\n", " '10001',\n", " '00100',\n", " '00011',\n", " '00000',\n", " '00100',\n", " '00010',\n", " '10011',\n", " '01110',\n", " '10010',\n", " '01101',\n", " '10001',\n", " '00111',\n", " '10101',\n", " '01101',\n", " '00000',\n", " '01110',\n", " '00011',\n", " '01110',\n", " '01000',\n", " '01010',\n", " '01110',\n", " '00100',\n", " '10011',\n", " '00010',\n", " '01000',\n", " '01101',\n", " '00100',\n", " '01101',\n", " '00100',\n", " '10100',\n", " '10001',\n", " '10001',\n", " '01000',\n", " '10010',\n", " '00011',\n", " '00010',\n", " '01110',\n", " '10100',\n", " '10001',\n", " '00000',\n", " '00110',\n", " '01011',\n", " '10101',\n", " '01000',\n", " '01100',\n", " '01100',\n", " '10100',\n", " '01111',\n", " '01111',\n", " '00011',\n", " '01000',\n", " '10011',\n", " '00100',\n", " '00000',\n", " '01101',\n", " '00011',\n", " '01000',\n", " '10011',\n", " '01100',\n", " '00000',\n", " '00000',\n", " '01000',\n", " '00000',\n", " '01000',\n", " '00100',\n", " '01011',\n", " '00100',\n", " '01110',\n", " '01101',\n", " '01101',\n", " '10001',\n", " '00100',\n", " '00100',\n", " '00011',\n", " '00000',\n", " '01110',\n", " '00011',\n", " '00001',\n", " '01110',\n", " '01000',\n", " '10100',\n", " '01100',\n", " '00100',\n", " '01011',\n", " '10001',\n", " '01110',\n", " '10011',\n", " '01101',\n", " '10011',\n", " '10011',\n", " '10011',\n", " '00110',\n", " '01000',\n", " '10011',\n", " '01101',\n", " ...]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[c for c in chunks(c8b, 5)]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0,\n", " 5,\n", " 2,\n", " 0,\n", " 4,\n", " 20,\n", " 14,\n", " 19,\n", " 19,\n", " 0,\n", " 2,\n", " 19,\n", " 7,\n", " 17,\n", " 8,\n", " 14,\n", " 11,\n", " 4,\n", " 19,\n", " 2,\n", " 18,\n", " 4,\n", " 17,\n", " 19,\n", " 7,\n", " 18,\n", " 7,\n", " 19,\n", " 17,\n", " 0,\n", " 7,\n", " 10,\n", " 24,\n", " 14,\n", " 17,\n", " 15,\n", " 5,\n", " 17,\n", " 6,\n", " 4,\n", " 14,\n", " 0,\n", " 3,\n", " 15,\n", " 15,\n", " 9,\n", " 13,\n", " 6,\n", " 11,\n", " 19,\n", " 4,\n", " 17,\n", " 13,\n", " 4,\n", " 5,\n", " 4,\n", " 14,\n", " 5,\n", " 8,\n", " 14,\n", " 17,\n", " 19,\n", " 18,\n", " 3,\n", " 3,\n", " 14,\n", " 4,\n", " 4,\n", " 20,\n", " 12,\n", " 18,\n", " 2,\n", " 17,\n", " 20,\n", " 4,\n", " 17,\n", " 13,\n", " 5,\n", " 4,\n", " 19,\n", " 11,\n", " 0,\n", " 0,\n", " 5,\n", " 18,\n", " 19,\n", " 22,\n", " 8,\n", " 4,\n", " 13,\n", " 19,\n", " 17,\n", " 21,\n", " 14,\n", " 14,\n", " 13,\n", " 4,\n", " 17,\n", " 7,\n", " 20,\n", " 0,\n", " 7,\n", " 17,\n", " 0,\n", " 21,\n", " 4,\n", " 17,\n", " 4,\n", " 4,\n", " 19,\n", " 18,\n", " 21,\n", " 18,\n", " 8,\n", " 4,\n", " 11,\n", " 7,\n", " 11,\n", " 14,\n", " 18,\n", " 19,\n", " 3,\n", " 14,\n", " 0,\n", " 11,\n", " 14,\n", " 24,\n", " 0,\n", " 4,\n", " 18,\n", " 12,\n", " 13,\n", " 13,\n", " 3,\n", " 8,\n", " 6,\n", " 13,\n", " 13,\n", " 17,\n", " 7,\n", " 14,\n", " 7,\n", " 7,\n", " 19,\n", " 18,\n", " 13,\n", " 0,\n", " 14,\n", " 8,\n", " 11,\n", " 13,\n", " 2,\n", " 13,\n", " 18,\n", " 18,\n", " 8,\n", " 2,\n", " 17,\n", " 4,\n", " 0,\n", " 13,\n", " 13,\n", " 4,\n", " 4,\n", " 8,\n", " 8,\n", " 8,\n", " 4,\n", " 17,\n", " 22,\n", " 19,\n", " 0,\n", " 13,\n", " 4,\n", " 18,\n", " 17,\n", " 21,\n", " 14,\n", " 6,\n", " 8,\n", " 4,\n", " 8,\n", " 24,\n", " 22,\n", " 18,\n", " 18,\n", " 3,\n", " 6,\n", " 15,\n", " 21,\n", " 14,\n", " 8,\n", " 0,\n", " 8,\n", " 18,\n", " 0,\n", " 14,\n", " 0,\n", " 4,\n", " 14,\n", " 0,\n", " 4,\n", " 3,\n", " 17,\n", " 13,\n", " 8,\n", " 19,\n", " 17,\n", " 13,\n", " 23,\n", " 4,\n", " 8,\n", " 6,\n", " 17,\n", " 15,\n", " 18,\n", " 18,\n", " 7,\n", " 0,\n", " 3,\n", " 7,\n", " 3,\n", " 19,\n", " 14,\n", " 8,\n", " 15,\n", " 0,\n", " 0,\n", " 19,\n", " 4,\n", " 23,\n", " 4,\n", " 13,\n", " 13,\n", " 4,\n", " 18,\n", " 0,\n", " 6,\n", " 17,\n", " 14,\n", " 1,\n", " 19,\n", " 11,\n", " 4,\n", " 18,\n", " 17,\n", " 13,\n", " 17,\n", " 14,\n", " 8,\n", " 17,\n", " 24,\n", " 15,\n", " 1,\n", " 6,\n", " 4,\n", " 3,\n", " 2,\n", " 11,\n", " 11,\n", " 8,\n", " 22,\n", " 0,\n", " 11,\n", " 0,\n", " 11,\n", " 4,\n", " 4,\n", " 13,\n", " 8,\n", " 6,\n", " 17,\n", " 17,\n", " 13,\n", " 22,\n", " 24,\n", " 17,\n", " 11,\n", " 8,\n", " 12,\n", " 11,\n", " 15,\n", " 18,\n", " 19,\n", " 14,\n", " 11,\n", " 4,\n", " 5,\n", " 19,\n", " 17,\n", " 3,\n", " 12,\n", " 20,\n", " 0,\n", " 17,\n", " 8,\n", " 4,\n", " 4,\n", " 4,\n", " 8,\n", " 8,\n", " 0,\n", " 14,\n", " 11,\n", " 13,\n", " 4,\n", " 22,\n", " 18,\n", " 0,\n", " 14,\n", " 7,\n", " 17,\n", " 19,\n", " 11,\n", " 18,\n", " 19,\n", " 14,\n", " 1,\n", " 4,\n", " 19,\n", " 13,\n", " 18,\n", " 11,\n", " 21,\n", " 5,\n", " 8,\n", " 21,\n", " 3,\n", " 14,\n", " 21,\n", " 19,\n", " 15,\n", " 14,\n", " 0,\n", " 4,\n", " 4,\n", " 8,\n", " 18,\n", " 2,\n", " 8,\n", " 14,\n", " 7,\n", " 8,\n", " 15,\n", " 18,\n", " 4,\n", " 21,\n", " 4,\n", " 4,\n", " 3,\n", " 19,\n", " 4,\n", " 22,\n", " 5,\n", " 0,\n", " 17,\n", " 13,\n", " 7,\n", " 4,\n", " 1,\n", " 11,\n", " 4,\n", " 0,\n", " 14,\n", " 19,\n", " 14,\n", " 7,\n", " 19,\n", " 19,\n", " 19,\n", " 4,\n", " 15,\n", " 13,\n", " 2,\n", " 10,\n", " 0,\n", " 14,\n", " 13,\n", " 7,\n", " 22,\n", " 4,\n", " 19,\n", " 12,\n", " 21,\n", " 24,\n", " 15,\n", " 17,\n", " 17,\n", " 4,\n", " 14,\n", " 13,\n", " 13,\n", " 0,\n", " 18,\n", " 6,\n", " 3,\n", " 4,\n", " 3,\n", " 14,\n", " 4,\n", " 4,\n", " 4,\n", " 14,\n", " 0,\n", " 0,\n", " 12,\n", " 19,\n", " 2,\n", " 8,\n", " 2,\n", " 19,\n", " 19,\n", " 8,\n", " 5,\n", " 13,\n", " 0,\n", " 3,\n", " 17,\n", " 4,\n", " 18,\n", " 17,\n", " 19,\n", " 18,\n", " 4,\n", " 17,\n", " 14,\n", " 18,\n", " 4,\n", " 19,\n", " 17,\n", " 7,\n", " 2,\n", " 8,\n", " 2,\n", " 19,\n", " 15,\n", " 18,\n", " 0,\n", " 0,\n", " 4,\n", " 7,\n", " 11,\n", " 3,\n", " 7,\n", " 18,\n", " 5,\n", " 23,\n", " 18,\n", " 14,\n", " 0,\n", " 14,\n", " 19,\n", " 2,\n", " 19,\n", " 1,\n", " 1,\n", " 18,\n", " 14,\n", " 4,\n", " 8,\n", " 17,\n", " 13,\n", " 18,\n", " 0,\n", " 3,\n", " 11,\n", " 24,\n", " 19,\n", " 17,\n", " 17,\n", " 20,\n", " 13,\n", " 17,\n", " 2,\n", " 4,\n", " 15,\n", " 19,\n", " 19,\n", " 7,\n", " 17,\n", " 4,\n", " 20,\n", " 7,\n", " 13,\n", " 10,\n", " 19,\n", " 0,\n", " 2,\n", " 4,\n", " 2,\n", " 4,\n", " 4,\n", " 11,\n", " 17,\n", " 22,\n", " 13,\n", " 8,\n", " 17,\n", " 4,\n", " 4,\n", " 4,\n", " 0,\n", " 4,\n", " 18,\n", " 4,\n", " 4,\n", " 4,\n", " 8,\n", " 3,\n", " 8,\n", " 18,\n", " 14,\n", " 6,\n", " 2,\n", " 4,\n", " 14,\n", " 12,\n", " 13,\n", " 17,\n", " 19,\n", " 4,\n", " 9,\n", " 7,\n", " 0,\n", " 6,\n", " 0,\n", " 1,\n", " 18,\n", " 4,\n", " 13,\n", " 8,\n", " 19,\n", " 11,\n", " 22,\n", " 19,\n", " 17,\n", " 13,\n", " 1,\n", " 12,\n", " 8,\n", " 4,\n", " 11,\n", " 18,\n", " 0,\n", " 17,\n", " 4,\n", " 19,\n", " 4,\n", " 18,\n", " 17,\n", " 13,\n", " 6,\n", " 18,\n", " 13,\n", " 7,\n", " 4,\n", " 1,\n", " 8,\n", " 14,\n", " 18,\n", " 3,\n", " 8,\n", " 4,\n", " 13,\n", " 0,\n", " 5,\n", " 11,\n", " 4,\n", " 8,\n", " 18,\n", " 0,\n", " 7,\n", " 14,\n", " 2,\n", " 8,\n", " 5,\n", " 4,\n", " 21,\n", " 12,\n", " 5,\n", " 0,\n", " 19,\n", " 0,\n", " 13,\n", " 0,\n", " 19,\n", " 17,\n", " 13,\n", " 8,\n", " 0,\n", " 6,\n", " 13,\n", " 7,\n", " 0,\n", " 19,\n", " 13,\n", " 12,\n", " 8,\n", " 1,\n", " 13,\n", " 8,\n", " 20,\n", " 5,\n", " 4,\n", " 13,\n", " 17,\n", " 19,\n", " 14,\n", " 19,\n", " 19,\n", " 17,\n", " 13,\n", " 24,\n", " 15,\n", " 0,\n", " 8,\n", " 3,\n", " 24,\n", " 8,\n", " 4,\n", " 6,\n", " 3,\n", " 13,\n", " 12,\n", " 4,\n", " 17,\n", " 7,\n", " 7,\n", " 8,\n", " 14,\n", " 19,\n", " 17,\n", " 4,\n", " 19,\n", " 2,\n", " 4,\n", " 18,\n", " 18,\n", " 4,\n", " 8,\n", " 11,\n", " 3,\n", " 17,\n", " 1,\n", " 2,\n", " 4,\n", " 15,\n", " 17,\n", " 8,\n", " 6,\n", " 0,\n", " 4,\n", " 18,\n", " 14,\n", " 0,\n", " 3,\n", " 11,\n", " 19,\n", " 0,\n", " 7,\n", " 8,\n", " 4,\n", " 21,\n", " 4,\n", " 1,\n", " 17,\n", " 2,\n", " 4,\n", " 13,\n", " 11,\n", " 4,\n", " 21,\n", " 0,\n", " 18,\n", " 0,\n", " 3,\n", " 13,\n", " 13,\n", " 19,\n", " 7,\n", " 13,\n", " 4,\n", " 8,\n", " 19,\n", " 4,\n", " 8,\n", " 8,\n", " 18,\n", " 0,\n", " 7,\n", " 20,\n", " 7,\n", " 7,\n", " 20,\n", " 0,\n", " 12,\n", " 14,\n", " 13,\n", " 4,\n", " 5,\n", " 24,\n", " 7,\n", " 11,\n", " 14,\n", " 13,\n", " 22,\n", " 7,\n", " 0,\n", " 4,\n", " 4,\n", " 4,\n", " 4,\n", " 14,\n", " 18,\n", " 13,\n", " 4,\n", " 4,\n", " 24,\n", " 0,\n", " 13,\n", " 4,\n", " 8,\n", " 18,\n", " 4,\n", " 19,\n", " 14,\n", " 6,\n", " 24,\n", " 8,\n", " 19,\n", " 4,\n", " 17,\n", " 11,\n", " 8,\n", " 7,\n", " 19,\n", " 2,\n", " 12,\n", " 8,\n", " 14,\n", " 8,\n", " 17,\n", " 0,\n", " 17,\n", " 5,\n", " 3,\n", " 14,\n", " 4,\n", " 19,\n", " 13,\n", " 8,\n", " 7,\n", " 19,\n", " 13,\n", " 4,\n", " 7,\n", " 8,\n", " 8,\n", " 10,\n", " 0,\n", " 12,\n", " 17,\n", " 3,\n", " 12,\n", " 13,\n", " 0,\n", " 3,\n", " 0,\n", " 13,\n", " 0,\n", " 14,\n", " 3,\n", " 18,\n", " 4,\n", " 18,\n", " 4,\n", " 8,\n", " 24,\n", " 2,\n", " 11,\n", " 18,\n", " 8,\n", " 0,\n", " 13,\n", " 19,\n", " 0,\n", " 14,\n", " 11,\n", " 19,\n", " 2,\n", " 8,\n", " 24,\n", " 12,\n", " 8,\n", " 3,\n", " 4,\n", " 13,\n", " 19,\n", " 19,\n", " 7,\n", " 11,\n", " 19,\n", " 13,\n", " 3,\n", " 23,\n", " 19,\n", " 19,\n", " 19,\n", " 12,\n", " 0,\n", " 18,\n", " 1,\n", " 11,\n", " 4,\n", " 0,\n", " 4,\n", " 4,\n", " 19,\n", " 11,\n", " 8,\n", " 18,\n", " 8,\n", " 17,\n", " 19,\n", " 22,\n", " 19,\n", " 20,\n", " 17,\n", " 15,\n", " 5,\n", " 0,\n", " 8,\n", " 11,\n", " 19,\n", " 4,\n", " 0,\n", " 14,\n", " 4,\n", " 5,\n", " 4,\n", " 8,\n", " 18,\n", " 8,\n", " 8,\n", " 8,\n", " 24,\n", " 8,\n", " 18,\n", " 8,\n", " 10,\n", " 21,\n", " 19,\n", " 22,\n", " 8,\n", " 18,\n", " 15,\n", " 17,\n", " 1,\n", " 18,\n", " 8,\n", " 13,\n", " 4,\n", " 11,\n", " 15,\n", " 7,\n", " 17,\n", " 12,\n", " 14,\n", " 7,\n", " 8,\n", " 0,\n", " 6,\n", " 13,\n", " 11,\n", " 18,\n", " 11,\n", " 21,\n", " 8,\n", " 19,\n", " 14,\n", " 3,\n", " 0,\n", " 8,\n", " 18,\n", " 3,\n", " 15,\n", " 13,\n", " 24,\n", " 3,\n", " 3,\n", " 2,\n", " 0,\n", " 0,\n", " 14,\n", " 19,\n", " 0,\n", " 7,\n", " 2,\n", " 4,\n", " 7,\n", " 19,\n", " 20,\n", " 4,\n", " 8,\n", " 17,\n", " 17,\n", " 4,\n", " 3,\n", " 0,\n", " 4,\n", " 2,\n", " 19,\n", " 14,\n", " 18,\n", " 13,\n", " 17,\n", " 7,\n", " 21,\n", " 13,\n", " 0,\n", " 14,\n", " 3,\n", " 14,\n", " 8,\n", " 10,\n", " 14,\n", " 4,\n", " 19,\n", " 2,\n", " 8,\n", " 13,\n", " 4,\n", " 13,\n", " 4,\n", " 20,\n", " 17,\n", " 17,\n", " 8,\n", " 18,\n", " 3,\n", " 2,\n", " 14,\n", " 20,\n", " 17,\n", " 0,\n", " 6,\n", " 11,\n", " 21,\n", " 8,\n", " 12,\n", " 12,\n", " 20,\n", " 15,\n", " 15,\n", " 3,\n", " 8,\n", " 19,\n", " 4,\n", " 0,\n", " 13,\n", " 3,\n", " 8,\n", " 19,\n", " 12,\n", " 0,\n", " 0,\n", " 8,\n", " 0,\n", " 8,\n", " 4,\n", " 11,\n", " 4,\n", " 14,\n", " 13,\n", " 13,\n", " 17,\n", " 4,\n", " 4,\n", " 3,\n", " 0,\n", " 14,\n", " 3,\n", " 1,\n", " 14,\n", " 8,\n", " 20,\n", " 12,\n", " 4,\n", " 11,\n", " 17,\n", " 14,\n", " 19,\n", " 13,\n", " 19,\n", " 19,\n", " 19,\n", " 6,\n", " 8,\n", " 19,\n", " 13,\n", " ...]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[(int(c, 2)) for c in chunks(c8b, 5)]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "24" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max([(int(c, 2)) for c in chunks(c8b, 5)])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'y'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max([chr(int(c, 2) + ord('a')) for c in chunks(c8b, 5)])" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'y'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max([unpos(int(c, 2)) for c in chunks(c8b, 5)])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def cadenus_letter(n, doubled='v'):\n", " letter = chr(n + ord('a'))\n", " if letter > doubled:\n", " letter = chr(n + ord('a') + 1)\n", " return letter" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def cadenus_letter(n, doubled='v'):\n", " letter = unpos(n)\n", " if letter > doubled:\n", " letter = unpos(n + 1)\n", " return letter" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('afcaeuottacthrioletcserthshtrahkzorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstxientrvoonerhuahravereetsvsielhlostdoalozaesmnndignnrhohhtsnaoilncnssicreanneeiiierxtanesrvogieizxssdgpvoiaisaoaeoaedrnitrnyeigrpsshadhdtoipaateyennesagrobtlesrnroirzpbgedcllixalaleenigrrnxzrlimlpstoleftrdmuarieeeiiaolnexsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtexfarnhebleaotohtttepnckaonhxetmvzprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfysoaotctbbsoeirnsadlztrrunrceptthreuhnktaceceelrxnireeeaeseeeidisogceomnrtejhagabsenitlxtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnzpaidziegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefzhlonxhaeeeeosneezaneisetogziterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseizclsiantaoltcizmidentthltndytttmasbleaeetlisirtxturpfailteaoefeisiiizisikvtxisprbsinelphrmohiagnlslvitodaisdpnzddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklzsogstcifzpipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoznalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghznxeintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaozaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnexonicdeemrpaolitoafesoosspfnlneeootachllirssysofpdftfrnpraeeazlonahautntcntcbaxloneftoatecvoxdlxvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroztnsosinuiuiofprda',\n", " -1814.2525644323327)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c8bl = ''.join([cadenus_letter(int(c, 2)) for c in chunks(c8b, 5)])\n", "c8bl, Pletters(c8bl)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('afcaeuottacthrioletcserthshtrahkyorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstwientrvoonerhuahravereetsvsielhlostdoaloyaesmnndignnrhohhtsnaoilncnssicreanneeiiierwtanesrvogieiywssdgpvoiaisaoaeoaedrnitrnxeigrpsshadhdtoipaatexennesagrobtlesrnroirypbgedclliwalaleenigrrnwyrlimlpstoleftrdmuarieeeiiaolnewsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtewfarnhebleaotohtttepnckaonhwetmvyprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfxsoaotctbbsoeirnsadlytrrunrceptthreuhnktaceceelrwnireeeaeseeeidisogceomnrtejhagabsenitlwtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnypaidyiegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefyhlonwhaeeeeosneeyaneisetogyiterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseiyclsiantaoltciymidentthltndxtttmasbleaeetlisirtwturpfailteaoefeisiiiyisikvtwisprbsinelphrmohiagnlslvitodaisdpnyddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklysogstcifypipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoynalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghynweintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaoyaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnewonicdeemrpaolitoafesoosspfnlneeootachllirssxsofpdftfrnpraeeaylonahautntcntcbawloneftoatecvowdlwvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroytnsosinuiuiofprda',\n", " -1760.1126100904926)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c8bl = ''.join([cadenus_letter(int(c, 2), doubled='z') for c in chunks(c8b, 5)])\n", "c8bl, Pletters(c8bl)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'y'" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "max((cl for cl in string.ascii_lowercase),\n", " key=lambda l: Pletters(cadenus_letter(int(c, 2), doubled=l) for c in chunks(c8b, 5)))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('afcaeuottacthrioletcserthshtrahkzorpfrgeoadppjnglternefeofiortsddoeeumscruernfetlaafstxientrvoonerhuahravereetsvsielhlostdoalozaesmnndignnrhohhtsnaoilncnssicreanneeiiierxtanesrvogieizxssdgpvoiaisaoaeoaedrnitrnyeigrpsshadhdtoipaateyennesagrobtlesrnroirzpbgedcllixalaleenigrrnxzrlimlpstoleftrdmuarieeeiiaolnexsaohrtlstobetnslvfivdovtpoaeeisciohipseveedtexfarnhebleaotohtttepnckaonhxetmvzprreonnasgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfysoaotctbbsoeirnsadlztrrunrceptthreuhnktaceceelrxnireeeaeseeeidisogceomnrtejhagabsenitlxtrnbmielsaretesrngsnhebiosdienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnzpaidziegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlevasadnnthneiteiisahuhhuamonefzhlonxhaeeeeosneezaneisetogziterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseizclsiantaoltcizmidentthltndytttmasbleaeetlisirtxturpfailteaoefeisiiizisikvtxisprbsinelphrmohiagnlslvitodaisdpnzddcaaotahcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmuppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienniklzsogstcifzpipvidvssmnceiasiitsnneatitomrhbnhnidprlrepoznalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghznxeintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaozaanoeeldoinhusgiteaoriecevemntratmtfpeucutahamtnexonicdeemrpaolitoafesoosspfnlneeootachllirssysofpdftfrnpraeeazlonahautntcntcbaxloneftoatecvoxdlxvnneedtiioigtegmtaheeatefaaeprrcrosheerrpalediengidrreouhvesuroztnsosinuiuiofprda',\n", " -1814.2525644323327)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c8bl = ''.join([cadenus_letter(int(c, 2), doubled='v') for c in chunks(c8b, 5)])\n", "c8bl, Pletters(c8bl)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('a', 'z')" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "min(c8bl), max(c8bl)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1400, 56.0)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(c8bl), len(c8bl) / 25" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs_8b = pd.Series(collections.Counter([l.lower() for l in c8bl if l in string.ascii_letters]))\n", "freqs_8b.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "freqs = pd.Series(english_counts)\n", "freqs.plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['afcaeuottacthrioletcserthshtrahkzorpfrgeoadppjnglternefe',\n", " 'ofiortsddoeeumscruernfetlaafstxientrvoonerhuahravereetsv',\n", " 'sielhlostdoalozaesmnndignnrhohhtsnaoilncnssicreanneeiiie',\n", " 'rxtanesrvogieizxssdgpvoiaisaoaeoaedrnitrnyeigrpsshadhdto',\n", " 'ipaateyennesagrobtlesrnroirzpbgedcllixalaleenigrrnxzrlim',\n", " 'lpstoleftrdmuarieeeiiaolnexsaohrtlstobetnslvfivdovtpoaee',\n", " 'isciohipseveedtexfarnhebleaotohtttepnckaonhxetmvzprreonn',\n", " 'asgdedoeeeoaamtcicttifnadresrtserosetrhcictpsaaehldhsfys',\n", " 'oaotctbbsoeirnsadlztrrunrceptthreuhnktaceceelrxnireeeaes',\n", " 'eeeidisogceomnrtejhagabsenitlxtrnbmielsaretesrngsnhebios',\n", " 'dienafleisahocifevmfatanatrniagnhatnmibniufenrtottrnzpai',\n", " 'dziegdnmerhhiotretcesseildrbceprigaesoadltahievebrcenlev',\n", " 'asadnnthneiteiisahuhhuamonefzhlonxhaeeeeosneezaneisetogz',\n", " 'iterlihtcmioirarfdoetnihtnehiikamrdmnadanaodseseizclsian',\n", " 'taoltcizmidentthltndytttmasbleaeetlisirtxturpfailteaoefe',\n", " 'isiiizisikvtxisprbsinelphrmohiagnlslvitodaisdpnzddcaaota',\n", " 'hcehtueirredaectosnrhvnaodoikoetcineneurrisdcouraglvimmu',\n", " 'ppditeanditmaaiaieleonnreedaodboiumelrotntttgitnrlrienni',\n", " 'klzsogstcifzpipvidvssmnceiasiitsnneatitomrhbnhnidprlrepo',\n", " 'znalsnvsdosanesitfaenltgodatteeaisicrootmsmfhauenirsghzn',\n", " 'xeintegodiileedtarnosrcaaendtcuttfdrbehtmfitoordruiaozaa',\n", " 'noeeldoinhusgiteaoriecevemntratmtfpeucutahamtnexonicdeem',\n", " 'rpaolitoafesoosspfnlneeootachllirssysofpdftfrnpraeeazlon',\n", " 'ahautntcntcbaxloneftoatecvoxdlxvnneedtiioigtegmtaheeatef',\n", " 'aaeprrcrosheerrpalediengidrreouhvesuroztnsosinuiuiofprda']" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rows = chunks(c8bl, len(c8bl) // 25)\n", "rows" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['a..ae....a..h....e..se..hsh..ah....p...e.a.pp.....e..e.e',\n", " '......s...ee..s...e...e..aa.s...e.......e.h.ah.a.e.ee.s.',\n", " 's.e.h..s...a...aes.........h.hh.s.a......ss...ea..ee...e',\n", " '...a.es.....e...ss..p...a.sa.ae.ae........e...pssha.h...',\n", " '.paa.e.e..esa......es.......p..e......a.a.ee............',\n", " '.ps...e......a..eee..a...e.sa.h...s...e..s.........p.aee',\n", " '.s...h.pse.ee..e..a..he..ea...h...ep...a..h.e....p..e...',\n", " 'as..e..eee.aa..........a..es..se..se..h....psaaeh..hs..s',\n", " '.a......s.e...sa..........ep..h.e.h...a.e.ee......eeeaes',\n", " 'eee...s...e.....e.ha.a.se...........e.sa.e.es...s.he...s',\n", " '..e.a..e.sah....e...a.a.a....a..ha.........e.........pa.',\n", " '...e....e.hh....e..esse......ep...aes.a...ah.e.e...e..e.',\n", " 'asa....h.e..e..sah.hh.a...e..h....haeeee.s.ee.a.e.se....',\n", " '..e...h.......a....e...h..eh...a.....a.a.a..sese....s.a.',\n", " '.a.........e...h.........as..eaee...s.......p.a...ea.e.e',\n", " '.s.....s......sp..s..e.ph...h.a...s......a.s.p.....aa..a',\n", " 'h.eh..e...e.ae...s..h..a......e....e.e....s.....a.......',\n", " 'pp...ea.....aa.a.e.e....ee.a.......e................e...',\n", " '...s..s.....p.p....ss...e.as...s..ea......h..h...p...ep.',\n", " '..a.s..s..sa.es...ae......a..eea.s.......s..ha.e...s.h..',\n", " '.e...e......ee..a...s..aae...........eh............a..aa',\n", " '..ee.....h.s...ea...e.e.e....a....pe....aha...e......ee.',\n", " '.pa.....a.es..ssp....ee...a.h....ss.s..p......p.aeea....',\n", " 'aha.........a....e...a.e..........ee........e...aheea.e.',\n", " 'aaep.....shee..pa.e..e......e..h.es......s.s........p..a']" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chunks(''.join([l if l in 'phase' else '.' for l in c8bl]), 56)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['aosriliaoeddaitihpkzxnraa',\n", " 'ffixppssaeizstascplneopha',\n", " 'cietascgoeeiaeoiedzaieaae',\n", " 'aolaatidtinedrlihislneoup',\n", " 'erhntooecdagnltittostlltr',\n", " 'utleelhdtifdniczuegnedinr',\n", " 'ososyeiobslnthiieasvgottc',\n", " 'tdsrefpeboemhtzsintsoiocr',\n", " 'tdtvntsesgiencmirdcddnano',\n", " 'aodonreeocsremikriioihfts',\n", " 'ceogedvoeeahiidvetfsiuech',\n", " 'teaismeaiohhtoetdmzalssbe',\n", " 'huleauearmoieinxaapnegoae',\n", " 'rmoigadmnncoirtieaieeioxr',\n", " 'iszzrrttsritiatscipsdtslr',\n", " 'ocaxoiecatfrsrhptavitesop',\n", " 'lresbexideeeaflroiitaapna',\n", " 'eusstefcljvthdtbsedfrofel',\n", " 'temdleatzhmcuonsnlvanrnfe',\n", " 'crngeirttafehedireseoiltd',\n", " 'snnpsinirgashtynhosnsenoi',\n", " 'efdvrahfratsuntevnmlrceae',\n", " 'reionoenubaeaitlnnntceetn',\n", " 'ttgirlbansnimhtparcgavoeg',\n", " 'hlnaonldrealotmhoeeoaeoci',\n", " 'saniieercntdnnardeidemtvd',\n", " 'harsrxaeeirreesmodaannaor',\n", " 'tfhazsosptnbfhboiastdtcxr',\n", " 'rsoopatrtliczilhkoittrhde',\n", " 'athaboottxaehieiodiecallo',\n", " 'hxheghhshtgplkaaebteutlxu',\n", " 'kitoerterrnroaegtosatmivh',\n", " 'zesadttrenhinmencinittrnv',\n", " 'onnecltoubagxrtliunsffsne',\n", " 'rtadlseshmtahdlsnmeidpses',\n", " 'prorltpenineamileeacreyeu',\n", " 'fviniontkemsensvnltrbusdr',\n", " 'rolixbcrtlioeaiierioecoto',\n", " 'gontaekhasbaedrtuotohufiz',\n", " 'encrltaccandeatortotttpit',\n", " 'oennanoierilonxdrnmmmadon',\n", " 'arsylsncceutsataitrsfhfis',\n", " 'dhseelhtetfanouisthmiatgo',\n", " 'puiievxpeeehedrsdtbftmfts',\n", " 'pacgnfeslsniespdcgnhotrei',\n", " 'jhrriitarrrezefpoihaonngn',\n", " 'nrepgvmaxntvasanutnurepmu',\n", " 'gaasrdvengoeneizrniedxrti',\n", " 'lvnsrozhistbeildardnroaau',\n", " 'tenhnvplrntriztdglpiunehi',\n", " 'ereaxtrdehrcsceclrrriieeo',\n", " 'reedzprheeneelaavilsacaef',\n", " 'neihroesebzntsoaiergodzap',\n", " 'etidlaofaiploieomnehzeltr',\n", " 'fsitienyeoaegaftmnpzaeoed',\n", " 'eveomensssivzneauionamnfa']" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "columns = [''.join(c) for c in zip(*rows)]\n", "columns" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'a': [(0, 0),\n", " (0, 3),\n", " (0, 9),\n", " (0, 29),\n", " (0, 41),\n", " (1, 25),\n", " (1, 26),\n", " (1, 44),\n", " (1, 47),\n", " (2, 11),\n", " (2, 15),\n", " (2, 34),\n", " (2, 47),\n", " (3, 3),\n", " (3, 24),\n", " (3, 27),\n", " (3, 29),\n", " (3, 32),\n", " (3, 50),\n", " (4, 2),\n", " (4, 3),\n", " (4, 12),\n", " (4, 38),\n", " (4, 40),\n", " (5, 13),\n", " (5, 21),\n", " (5, 28),\n", " (5, 53),\n", " (6, 18),\n", " (6, 26),\n", " (6, 39),\n", " (7, 0),\n", " (7, 11),\n", " (7, 12),\n", " (7, 23),\n", " (7, 45),\n", " (7, 46),\n", " (8, 1),\n", " (8, 15),\n", " (8, 38),\n", " (8, 53),\n", " (9, 19),\n", " (9, 21),\n", " (9, 39),\n", " (10, 4),\n", " (10, 10),\n", " (10, 20),\n", " (10, 22),\n", " (10, 24),\n", " (10, 29),\n", " (10, 33),\n", " (10, 54),\n", " (11, 34),\n", " (11, 38),\n", " (11, 42),\n", " (12, 0),\n", " (12, 2),\n", " (12, 16),\n", " (12, 22),\n", " (12, 35),\n", " (12, 46),\n", " (13, 14),\n", " (13, 31),\n", " (13, 37),\n", " (13, 39),\n", " (13, 41),\n", " (13, 54),\n", " (14, 1),\n", " (14, 25),\n", " (14, 30),\n", " (14, 46),\n", " (14, 51),\n", " (15, 30),\n", " (15, 41),\n", " (15, 51),\n", " (15, 52),\n", " (15, 55),\n", " (16, 12),\n", " (16, 23),\n", " (16, 48),\n", " (17, 6),\n", " (17, 12),\n", " (17, 13),\n", " (17, 15),\n", " (17, 27),\n", " (18, 26),\n", " (18, 35),\n", " (19, 2),\n", " (19, 11),\n", " (19, 18),\n", " (19, 26),\n", " (19, 31),\n", " (19, 45),\n", " (20, 16),\n", " (20, 23),\n", " (20, 24),\n", " (20, 51),\n", " (20, 54),\n", " (20, 55),\n", " (21, 16),\n", " (21, 29),\n", " (21, 40),\n", " (21, 42),\n", " (22, 2),\n", " (22, 8),\n", " (22, 26),\n", " (22, 48),\n", " (22, 51),\n", " (23, 0),\n", " (23, 2),\n", " (23, 12),\n", " (23, 21),\n", " (23, 48),\n", " (23, 52),\n", " (24, 0),\n", " (24, 1),\n", " (24, 16),\n", " (24, 55)],\n", " 'e': [(0, 4),\n", " (0, 17),\n", " (0, 21),\n", " (0, 39),\n", " (0, 50),\n", " (0, 53),\n", " (0, 55),\n", " (1, 10),\n", " (1, 11),\n", " (1, 18),\n", " (1, 22),\n", " (1, 32),\n", " (1, 40),\n", " (1, 49),\n", " (1, 51),\n", " (1, 52),\n", " (2, 2),\n", " (2, 16),\n", " (2, 46),\n", " (2, 50),\n", " (2, 51),\n", " (2, 55),\n", " (3, 5),\n", " (3, 12),\n", " (3, 30),\n", " (3, 33),\n", " (3, 42),\n", " (4, 5),\n", " (4, 7),\n", " (4, 10),\n", " (4, 19),\n", " (4, 31),\n", " (4, 42),\n", " (4, 43),\n", " (5, 6),\n", " (5, 16),\n", " (5, 17),\n", " (5, 18),\n", " (5, 25),\n", " (5, 38),\n", " (5, 54),\n", " (5, 55),\n", " (6, 9),\n", " (6, 11),\n", " (6, 12),\n", " (6, 15),\n", " (6, 22),\n", " (6, 25),\n", " (6, 34),\n", " (6, 44),\n", " (6, 52),\n", " (7, 4),\n", " (7, 7),\n", " (7, 8),\n", " (7, 9),\n", " (7, 26),\n", " (7, 31),\n", " (7, 35),\n", " (7, 47),\n", " (8, 10),\n", " (8, 26),\n", " (8, 32),\n", " (8, 40),\n", " (8, 42),\n", " (8, 43),\n", " (8, 50),\n", " (8, 51),\n", " (8, 52),\n", " (8, 54),\n", " (9, 0),\n", " (9, 1),\n", " (9, 2),\n", " (9, 10),\n", " (9, 16),\n", " (9, 24),\n", " (9, 36),\n", " (9, 41),\n", " (9, 43),\n", " (9, 51),\n", " (10, 2),\n", " (10, 7),\n", " (10, 16),\n", " (10, 43),\n", " (11, 3),\n", " (11, 8),\n", " (11, 16),\n", " (11, 19),\n", " (11, 22),\n", " (11, 29),\n", " (11, 35),\n", " (11, 45),\n", " (11, 47),\n", " (11, 51),\n", " (11, 54),\n", " (12, 9),\n", " (12, 12),\n", " (12, 26),\n", " (12, 36),\n", " (12, 37),\n", " (12, 38),\n", " (12, 39),\n", " (12, 43),\n", " (12, 44),\n", " (12, 48),\n", " (12, 51),\n", " (13, 2),\n", " (13, 19),\n", " (13, 26),\n", " (13, 45),\n", " (13, 47),\n", " (14, 11),\n", " (14, 29),\n", " (14, 31),\n", " (14, 32),\n", " (14, 50),\n", " (14, 53),\n", " (14, 55),\n", " (15, 21),\n", " (16, 2),\n", " (16, 6),\n", " (16, 10),\n", " (16, 13),\n", " (16, 30),\n", " (16, 35),\n", " (16, 37),\n", " (17, 5),\n", " (17, 17),\n", " (17, 19),\n", " (17, 24),\n", " (17, 25),\n", " (17, 35),\n", " (17, 52),\n", " (18, 24),\n", " (18, 34),\n", " (18, 53),\n", " (19, 13),\n", " (19, 19),\n", " (19, 29),\n", " (19, 30),\n", " (19, 47),\n", " (20, 1),\n", " (20, 5),\n", " (20, 12),\n", " (20, 13),\n", " (20, 25),\n", " (20, 37),\n", " (21, 2),\n", " (21, 3),\n", " (21, 15),\n", " (21, 20),\n", " (21, 22),\n", " (21, 24),\n", " (21, 35),\n", " (21, 46),\n", " (21, 53),\n", " (21, 54),\n", " (22, 10),\n", " (22, 21),\n", " (22, 22),\n", " (22, 49),\n", " (22, 50),\n", " (23, 17),\n", " (23, 23),\n", " (23, 34),\n", " (23, 35),\n", " (23, 44),\n", " (23, 50),\n", " (23, 51),\n", " (23, 54),\n", " (24, 2),\n", " (24, 11),\n", " (24, 12),\n", " (24, 18),\n", " (24, 21),\n", " (24, 28),\n", " (24, 33)],\n", " 'h': [(0, 12),\n", " (0, 24),\n", " (0, 26),\n", " (0, 30),\n", " (1, 42),\n", " (1, 45),\n", " (2, 4),\n", " (2, 27),\n", " (2, 29),\n", " (2, 30),\n", " (3, 49),\n", " (3, 52),\n", " (5, 30),\n", " (6, 5),\n", " (6, 21),\n", " (6, 30),\n", " (6, 42),\n", " (7, 38),\n", " (7, 48),\n", " (7, 51),\n", " (8, 30),\n", " (8, 34),\n", " (9, 18),\n", " (9, 50),\n", " (10, 11),\n", " (10, 32),\n", " (11, 10),\n", " (11, 11),\n", " (11, 43),\n", " (12, 7),\n", " (12, 17),\n", " (12, 19),\n", " (12, 20),\n", " (12, 29),\n", " (12, 34),\n", " (13, 6),\n", " (13, 23),\n", " (13, 27),\n", " (14, 15),\n", " (15, 24),\n", " (15, 28),\n", " (16, 0),\n", " (16, 3),\n", " (16, 20),\n", " (18, 42),\n", " (18, 45),\n", " (19, 44),\n", " (19, 53),\n", " (20, 38),\n", " (21, 9),\n", " (21, 41),\n", " (22, 28),\n", " (23, 1),\n", " (23, 49),\n", " (24, 10),\n", " (24, 31)],\n", " 'n': [(0, 46),\n", " (0, 52),\n", " (1, 20),\n", " (1, 33),\n", " (1, 39),\n", " (2, 19),\n", " (2, 20),\n", " (2, 24),\n", " (2, 25),\n", " (2, 33),\n", " (2, 38),\n", " (2, 40),\n", " (2, 48),\n", " (2, 49),\n", " (3, 4),\n", " (3, 36),\n", " (3, 40),\n", " (4, 8),\n", " (4, 9),\n", " (4, 22),\n", " (4, 44),\n", " (4, 49),\n", " (5, 24),\n", " (5, 40),\n", " (6, 20),\n", " (6, 36),\n", " (6, 41),\n", " (6, 54),\n", " (6, 55),\n", " (7, 22),\n", " (8, 13),\n", " (8, 23),\n", " (8, 35),\n", " (8, 47),\n", " (9, 13),\n", " (9, 25),\n", " (9, 32),\n", " (9, 46),\n", " (9, 49),\n", " (10, 3),\n", " (10, 23),\n", " (10, 27),\n", " (10, 31),\n", " (10, 35),\n", " (10, 39),\n", " (10, 44),\n", " (10, 51),\n", " (11, 6),\n", " (11, 52),\n", " (12, 4),\n", " (12, 5),\n", " (12, 8),\n", " (12, 25),\n", " (12, 32),\n", " (12, 42),\n", " (12, 47),\n", " (13, 21),\n", " (13, 25),\n", " (13, 36),\n", " (13, 40),\n", " (13, 55),\n", " (14, 12),\n", " (14, 18),\n", " (15, 20),\n", " (15, 32),\n", " (15, 46),\n", " (16, 18),\n", " (16, 22),\n", " (16, 34),\n", " (16, 36),\n", " (17, 7),\n", " (17, 21),\n", " (17, 22),\n", " (17, 40),\n", " (17, 47),\n", " (17, 53),\n", " (17, 54),\n", " (18, 22),\n", " (18, 32),\n", " (18, 33),\n", " (18, 44),\n", " (18, 46),\n", " (19, 1),\n", " (19, 5),\n", " (19, 12),\n", " (19, 20),\n", " (19, 48),\n", " (19, 55),\n", " (20, 3),\n", " (20, 18),\n", " (20, 26),\n", " (21, 0),\n", " (21, 8),\n", " (21, 26),\n", " (21, 45),\n", " (21, 49),\n", " (22, 18),\n", " (22, 20),\n", " (22, 45),\n", " (22, 55),\n", " (23, 5),\n", " (23, 8),\n", " (23, 16),\n", " (23, 32),\n", " (23, 33),\n", " (24, 22),\n", " (24, 40),\n", " (24, 45)],\n", " 'p': [(0, 35),\n", " (0, 43),\n", " (0, 44),\n", " (3, 20),\n", " (3, 46),\n", " (4, 1),\n", " (4, 28),\n", " (5, 1),\n", " (5, 51),\n", " (6, 7),\n", " (6, 35),\n", " (6, 49),\n", " (7, 43),\n", " (8, 27),\n", " (10, 53),\n", " (11, 30),\n", " (14, 44),\n", " (15, 15),\n", " (15, 23),\n", " (15, 45),\n", " (17, 0),\n", " (17, 1),\n", " (18, 12),\n", " (18, 14),\n", " (18, 49),\n", " (18, 54),\n", " (21, 34),\n", " (22, 1),\n", " (22, 16),\n", " (22, 39),\n", " (22, 46),\n", " (24, 3),\n", " (24, 15),\n", " (24, 52)],\n", " 's': [(0, 20),\n", " (0, 25),\n", " (1, 6),\n", " (1, 14),\n", " (1, 28),\n", " (1, 54),\n", " (2, 0),\n", " (2, 7),\n", " (2, 17),\n", " (2, 32),\n", " (2, 41),\n", " (2, 42),\n", " (3, 6),\n", " (3, 16),\n", " (3, 17),\n", " (3, 26),\n", " (3, 47),\n", " (3, 48),\n", " (4, 11),\n", " (4, 20),\n", " (5, 2),\n", " (5, 27),\n", " (5, 34),\n", " (5, 41),\n", " (6, 1),\n", " (6, 8),\n", " (7, 1),\n", " (7, 27),\n", " (7, 30),\n", " (7, 34),\n", " (7, 44),\n", " (7, 52),\n", " (7, 55),\n", " (8, 8),\n", " (8, 14),\n", " (8, 55),\n", " (9, 6),\n", " (9, 23),\n", " (9, 38),\n", " (9, 44),\n", " (9, 48),\n", " (9, 55),\n", " (10, 9),\n", " (11, 20),\n", " (11, 21),\n", " (11, 36),\n", " (12, 1),\n", " (12, 15),\n", " (12, 41),\n", " (12, 50),\n", " (13, 44),\n", " (13, 46),\n", " (13, 52),\n", " (14, 26),\n", " (14, 36),\n", " (15, 1),\n", " (15, 7),\n", " (15, 14),\n", " (15, 18),\n", " (15, 34),\n", " (15, 43),\n", " (16, 17),\n", " (16, 42),\n", " (18, 3),\n", " (18, 6),\n", " (18, 19),\n", " (18, 20),\n", " (18, 27),\n", " (18, 31),\n", " (19, 4),\n", " (19, 7),\n", " (19, 10),\n", " (19, 14),\n", " (19, 33),\n", " (19, 41),\n", " (19, 51),\n", " (20, 20),\n", " (21, 11),\n", " (22, 11),\n", " (22, 14),\n", " (22, 15),\n", " (22, 33),\n", " (22, 34),\n", " (22, 36),\n", " (24, 9),\n", " (24, 34),\n", " (24, 41),\n", " (24, 43)],\n", " 'v': [(1, 36),\n", " (1, 48),\n", " (1, 55),\n", " (3, 8),\n", " (3, 21),\n", " (5, 43),\n", " (5, 46),\n", " (5, 49),\n", " (6, 10),\n", " (6, 47),\n", " (10, 17),\n", " (11, 46),\n", " (11, 55),\n", " (15, 10),\n", " (15, 36),\n", " (16, 21),\n", " (16, 51),\n", " (18, 15),\n", " (18, 18),\n", " (19, 6),\n", " (21, 23),\n", " (23, 25),\n", " (23, 31),\n", " (24, 32)]}" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "letter_positions = {letter: [(r, c) for r, row in enumerate(rows) for c, char in enumerate(row) if char == letter] \n", " for letter in deduplicate('phaseseven')}\n", "letter_positions" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{0: 'a',\n", " 1: 'z',\n", " 2: 'y',\n", " 3: 'x',\n", " 4: 'v',\n", " 5: 'u',\n", " 6: 't',\n", " 7: 's',\n", " 8: 'r',\n", " 9: 'q',\n", " 10: 'p',\n", " 11: 'o',\n", " 12: 'n',\n", " 13: 'm',\n", " 14: 'l',\n", " 15: 'k',\n", " 16: 'j',\n", " 17: 'i',\n", " 18: 'h',\n", " 19: 'g',\n", " 20: 'f',\n", " 21: 'e',\n", " 22: 'd',\n", " 23: 'c',\n", " 24: 'b'}" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "keycolumn = make_cadenus_keycolumn(reverse=True)\n", "inverse_keycolumn = {v: l for l, v in keycolumn.items()}\n", "inverse_keycolumn" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "def valid_partial_solution(solution, inverse_keycolumn):\n", " row_indices = [p[0] for p in sorted(solution, key=lambda x: x[1])]\n", " row_letters = [inverse_keycolumn[i] for i in row_indices]\n", " letter_pairs = ngrams(row_letters, 2)\n", " return all(p[0] <= p[1] for p in letter_pairs)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "43005" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solutions = [[p] for p in letter_positions['p']]\n", "for letter in 'ha': #'haseseven':\n", " new_solutions = []\n", " for solution in solutions:\n", " used_columns = [p[1] for p in solution]\n", " for position in letter_positions[letter]:\n", " if position[1] not in used_columns:\n", " if valid_partial_solution(solution + [position], inverse_keycolumn):\n", " new_solutions += [solution + [position]]\n", " solutions = new_solutions\n", "len(solutions)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "valid_partial_solution(solutions[1], inverse_keycolumn)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pha',\n", " 'ruo',\n", " 'oll',\n", " 'rea',\n", " 'laa',\n", " 'tut',\n", " 'pei',\n", " 'ead',\n", " 'nrt',\n", " 'imi',\n", " 'non',\n", " 'eie',\n", " 'aed',\n", " 'mir',\n", " 'inl',\n", " 'lxi',\n", " 'eah',\n", " 'eai',\n", " 'aps',\n", " 'cnl',\n", " 'ren',\n", " 'ege',\n", " 'yoo',\n", " 'eau',\n", " 'uep']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display = []\n", "for p in solutions[1]:\n", " this_column = columns[p[1]]\n", " rotated_column = this_column[p[0]:] + this_column[:p[0]]\n", " display += [rotated_column]\n", "display_rows = [''.join(r) for r in zip(*display)]\n", "display_rows" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "def display_solution(solution, columns):\n", " display = []\n", " for p in solution:\n", " this_column = columns[p[1]]\n", " rotated_column = this_column[p[0]:] + this_column[:p[0]]\n", " display += [rotated_column]\n", " return [''.join(r) for r in zip(*display)]" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pha',\n", " 'ruo',\n", " 'ols',\n", " 'rer',\n", " 'lai',\n", " 'tul',\n", " 'pei',\n", " 'eaa',\n", " 'nro',\n", " 'ime',\n", " 'nod',\n", " 'eid',\n", " 'aea',\n", " 'mii',\n", " 'int',\n", " 'lxi',\n", " 'eah',\n", " 'eap',\n", " 'apk',\n", " 'cnz',\n", " 'rex',\n", " 'egn',\n", " 'yor',\n", " 'eaa',\n", " 'uea']" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display_solution(solutions[0], columns)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-110.74748837196742" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum(Ptrigrams(r) for r in display_rows)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "def score_solution(solution, columns):\n", " display = []\n", " for p in solution:\n", " this_column = columns[p[1]]\n", " rotated_column = this_column[p[0]:] + this_column[:p[0]]\n", " display += [rotated_column]\n", " display_rows = [''.join(r) for r in zip(*display)]\n", " return sum(Ptrigrams(r) for r in display_rows)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[([(0, 35), (0, 12), (0, 0)],\n", " ['pha',\n", " 'ruo',\n", " 'ols',\n", " 'rer',\n", " 'lai',\n", " 'tul',\n", " 'pei',\n", " 'eaa',\n", " 'nro',\n", " 'ime',\n", " 'nod',\n", " 'eid',\n", " 'aea',\n", " 'mii',\n", " 'int',\n", " 'lxi',\n", " 'eah',\n", " 'eap',\n", " 'apk',\n", " 'cnz',\n", " 'rex',\n", " 'egn',\n", " 'yor',\n", " 'eaa',\n", " 'uea'],\n", " -114.13063154833905),\n", " ([(0, 35), (0, 12), (0, 3)],\n", " ['pha',\n", " 'ruo',\n", " 'oll',\n", " 'rea',\n", " 'laa',\n", " 'tut',\n", " 'pei',\n", " 'ead',\n", " 'nrt',\n", " 'imi',\n", " 'non',\n", " 'eie',\n", " 'aed',\n", " 'mir',\n", " 'inl',\n", " 'lxi',\n", " 'eah',\n", " 'eai',\n", " 'aps',\n", " 'cnl',\n", " 'ren',\n", " 'ege',\n", " 'yoo',\n", " 'eau',\n", " 'uep'],\n", " -110.74748837196742),\n", " ([(0, 35), (0, 12), (0, 9)],\n", " ['pha',\n", " 'ruo',\n", " 'old',\n", " 'reo',\n", " 'lan',\n", " 'tur',\n", " 'pee',\n", " 'eae',\n", " 'nro',\n", " 'imc',\n", " 'nos',\n", " 'eir',\n", " 'aee',\n", " 'mim',\n", " 'ini',\n", " 'lxk',\n", " 'ear',\n", " 'eai',\n", " 'api',\n", " 'cno',\n", " 'rei',\n", " 'egh',\n", " 'yof',\n", " 'eat',\n", " 'ues'],\n", " -104.78169431178242),\n", " ([(0, 35), (0, 12), (0, 29)],\n", " ['pha',\n", " 'rut',\n", " 'olh',\n", " 'rea',\n", " 'lab',\n", " 'tuo',\n", " 'peo',\n", " 'eat',\n", " 'nrt',\n", " 'imx',\n", " 'noa',\n", " 'eie',\n", " 'aeh',\n", " 'mii',\n", " 'ine',\n", " 'lxi',\n", " 'eao',\n", " 'ead',\n", " 'api',\n", " 'cne',\n", " 'rec',\n", " 'ega',\n", " 'yol',\n", " 'eal',\n", " 'ueo'],\n", " -109.4716997212109),\n", " ([(0, 35), (0, 12), (0, 41)],\n", " ['pha',\n", " 'rur',\n", " 'ols',\n", " 'rey',\n", " 'lal',\n", " 'tus',\n", " 'pen',\n", " 'eac',\n", " 'nrc',\n", " 'ime',\n", " 'nou',\n", " 'eit',\n", " 'aes',\n", " 'mia',\n", " 'int',\n", " 'lxa',\n", " 'eai',\n", " 'eat',\n", " 'apr',\n", " 'cns',\n", " 'ref',\n", " 'egh',\n", " 'yof',\n", " 'eai',\n", " 'ues'],\n", " -101.93339111217242),\n", " ([(0, 35), (0, 12), (1, 44)],\n", " ['pha',\n", " 'ruc',\n", " 'olg',\n", " 'ren',\n", " 'laf',\n", " 'tue',\n", " 'pes',\n", " 'eal',\n", " 'nrs',\n", " 'imn',\n", " 'noi',\n", " 'eie',\n", " 'aes',\n", " 'mip',\n", " 'ind',\n", " 'lxc',\n", " 'eag',\n", " 'ean',\n", " 'aph',\n", " 'cno',\n", " 'ret',\n", " 'egr',\n", " 'yoe',\n", " 'eai',\n", " 'uep'],\n", " -108.4937247934099),\n", " ([(0, 35), (0, 12), (1, 47)],\n", " ['pha',\n", " 'rua',\n", " 'ols',\n", " 'rer',\n", " 'lad',\n", " 'tuv',\n", " 'pee',\n", " 'ean',\n", " 'nrg',\n", " 'imo',\n", " 'noe',\n", " 'ein',\n", " 'aee',\n", " 'mii',\n", " 'inz',\n", " 'lxr',\n", " 'ean',\n", " 'eai',\n", " 'ape',\n", " 'cnd',\n", " 'rex',\n", " 'egr',\n", " 'yot',\n", " 'eai',\n", " 'ueg'],\n", " -111.05157201209927),\n", " ([(0, 35), (0, 12), (2, 47)],\n", " ['pha',\n", " 'rus',\n", " 'olr',\n", " 'red',\n", " 'lav',\n", " 'tue',\n", " 'pen',\n", " 'eag',\n", " 'nro',\n", " 'ime',\n", " 'non',\n", " 'eie',\n", " 'aei',\n", " 'miz',\n", " 'inr',\n", " 'lxn',\n", " 'eai',\n", " 'eae',\n", " 'apd',\n", " 'cnx',\n", " 'rer',\n", " 'egt',\n", " 'yoi',\n", " 'eag',\n", " 'uea'],\n", " -113.41085773377256),\n", " ([(0, 35), (0, 12), (3, 50)],\n", " ['pha',\n", " 'rux',\n", " 'olt',\n", " 'rer',\n", " 'lad',\n", " 'tue',\n", " 'peh',\n", " 'ear',\n", " 'nrc',\n", " 'ims',\n", " 'noc',\n", " 'eie',\n", " 'aec',\n", " 'mil',\n", " 'inr',\n", " 'lxr',\n", " 'ear',\n", " 'eai',\n", " 'api',\n", " 'cne',\n", " 'ree',\n", " 'ego',\n", " 'yoe',\n", " 'ear',\n", " 'uee'],\n", " -107.5080042911796),\n", " ([(0, 35), (0, 12), (4, 38)],\n", " ['pha',\n", " 'rue',\n", " 'olk',\n", " 'reh',\n", " 'laa',\n", " 'tus',\n", " 'peb',\n", " 'eaa',\n", " 'nre',\n", " 'imd',\n", " 'nor',\n", " 'eit',\n", " 'aeu',\n", " 'mio',\n", " 'int',\n", " 'lxo',\n", " 'eah',\n", " 'eau',\n", " 'apf',\n", " 'cni',\n", " 'rez',\n", " 'egg',\n", " 'yoo',\n", " 'ean',\n", " 'uet'],\n", " -111.19702574254387)]" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[(s, display_solution(s, columns), score_solution(s, columns)) for s in solutions[:10]]" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[[(0, 35), (0, 12), (0, 41)],\n", " [(0, 35), (0, 12), (0, 9)],\n", " [(0, 35), (0, 12), (3, 50)],\n", " [(0, 35), (0, 12), (1, 44)],\n", " [(0, 35), (0, 12), (0, 29)],\n", " [(0, 35), (0, 12), (0, 3)],\n", " [(0, 35), (0, 12), (1, 47)],\n", " [(0, 35), (0, 12), (4, 38)],\n", " [(0, 35), (0, 12), (2, 47)],\n", " [(0, 35), (0, 12), (0, 0)]]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(solutions[:10], key=lambda s: score_solution(s, columns), reverse=True)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "solutions = sorted(solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "# for letter in 'seseven': #'haseeight':\n", "# new_solutions = []\n", "# for solution in solutions:\n", "# used_columns = [p[1] for p in solution]\n", "# for position in letter_positions[letter]:\n", "# if position[1] not in used_columns:\n", "# if valid_partial_solution(solution + [position], inverse_keycolumn):\n", "# new_solutions += [solution + [position]]\n", "# solutions = sorted(new_solutions, key=lambda s: score_solution(s, columns), reverse=True)[:10000]\n", "# len(solutions)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pha',\n", " 'reo',\n", " 'oel',\n", " 'rna',\n", " 'lea',\n", " 'tet',\n", " 'pli',\n", " 'ead',\n", " 'nat',\n", " 'ivi',\n", " 'nin',\n", " 'ele',\n", " 'asd',\n", " 'mar',\n", " 'icl',\n", " 'lai',\n", " 'eeh',\n", " 'efi',\n", " 'ars',\n", " 'cel',\n", " 'ren',\n", " 'ede',\n", " 'yzo',\n", " 'epu',\n", " 'urp']" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display_solution(solutions[0], columns)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "849" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hinted_keywords = [w for w in keywords if w[0] =='f' if len(transpositions_of(w)) == 7]\n", "len(hinted_keywords)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['fabrics',\n", " 'facings',\n", " 'faction',\n", " 'factors',\n", " 'factory',\n", " 'faculty',\n", " 'fadeout',\n", " 'failure',\n", " 'fainest',\n", " 'fainted']" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hinted_keywords[:10]" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "175" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "first_chunk = c8bl[:175]\n", "len(first_chunk)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['gatlrlnjtonethnirreh',\n", " 'raorejnptreanhriaeso',\n", " 'raohoanptraesrriasul',\n", " 'raohhanptraemrriasln',\n", " 'raorhaeptrnemsrianln',\n", " 'raonlneptrnissriaaoc',\n", " 'garhrarjtartsnnifphn',\n", " 'raoaalapteesnfriunnr',\n", " 'raonanhpterfrariutpn',\n", " 'garehhrjteaaraniessp',\n", " 'raonhalpterafnriutsp',\n", " 'fainrleptorniseirtno',\n", " 'raoaanhptemfrariunpn',\n", " 'raloannptirsrhrioalt',\n", " 'falmireptinonseiosrn',\n", " 'ralhaanptiafmrriospn',\n", " 'faeilenptnoisreirroo',\n", " 'raeoeanptneafhrirusp',\n", " 'earotktntvrugheivarj',\n", " 'gaeorhojtarernnisaep',\n", " 'gaeorhnjtarerhnisaep',\n", " 'raeooaeptareesrisaun',\n", " 'garnahrjtvenranivrep',\n", " 'raalaenptmifsrrinopo',\n", " 'faoeoepptnneareihrus',\n", " 'falhonpptnaerreirsut',\n", " 'fanroanpthiesreiaoul',\n", " 'fanhonpptraerreinsut',\n", " 'rahnaanptaofmrrisepn',\n", " 'fahrrinptaitoreisohh',\n", " 'rarrjaaptnensfrineon',\n", " 'gaaohrmjtsrrnnninapn',\n", " 'gaaarhrjtsenraninnnp',\n", " 'gasrlhrjtntnraniehrp',\n", " 'fasanomptnensneieean',\n", " 'raalrempftinsnrpiono',\n", " 'raaorejpftneanrpihes',\n", " 'ghrrlanjratnthnpfhri',\n", " 'gharnarjreaetvnpnfai',\n", " 'frtroenppxthsredoheo',\n", " 'frahoepppeaearednsus',\n", " 'raeaoalpfnsntirprlhi',\n", " 'raaiahnpfmotarrpnhis',\n", " 'froiianppnoosredhhrl',\n", " 'rahrinnpfaeeorrpsere',\n", " 'rahaaiupfaeselrpsnlr',\n", " 'raaerejpfsreanrpnpes',\n", " 'graeohnjetarrhneisap',\n", " 'fitahanpoimesrerenln',\n", " 'grtaaahjeosntrnernei',\n", " 'rotaaanpeosetrrurnni',\n", " 'roieaaopeeanfnrureep',\n", " 'rrejahnpernfarrepops',\n", " 'rrejarepernfnsrepopn',\n", " 'fopalrnpertntheuiirh',\n", " 'frpnhrlperoapneeiesd',\n", " 'foperehpernpaaeuirds',\n", " 'fopalaapersnteeuinri',\n", " 'rrjalaepensnfrreonrp',\n", " 'fopaarnpersmpreuinnd',\n", " 'roatalhpeeifnarunepr',\n", " 'gtfiehrjuterranrrrep',\n", " 'rrainanpeneofhreerep',\n", " 'filhranpoiapmrerosdn',\n", " 'rrrajaapevtnnfrevioe',\n", " 'roeaaanpeatefhrusinp',\n", " 'rreinanpeaeofhresrep',\n", " 'ronealnperrfnhrutppr',\n", " 'fioraenpohpmsreredno',\n", " 'fonprlnperrpnheutidr',\n", " 'finlrenporipsrertodo',\n", " 'rrlatajpenfisnrerpen',\n", " 'rooaeaepenfntaruhpri',\n", " 'fiairnhpomopraernhdn',\n", " 'pfomrteddsnnxstcnsno',\n", " 'rrninalpeheofnrearep',\n", " 'fonrraeperipmseunodn',\n", " 'fonrnrhperirpaeunotd',\n", " 'pfnsoaiddsoseetccrne',\n", " 'grnatahjeetonrnesire',\n", " 'grnarhrjeetnranesinp',\n", " 'ronarampeetnfnrusinp',\n", " 'roaaeaepeifresrueppn',\n", " 'finnnorpoesnsperscan',\n", " 'rosaanmpeoftnnrurpia',\n", " 'flapannpitrsrheoiilt',\n", " 'raaeoaopntaefnreieup',\n", " 'faaeorppntaevreeieuv',\n", " 'eaattktnntrogheeivrj',\n", " 'gaanthnjeteorhnniarp',\n", " 'rlaealnpitnfnhroirpr',\n", " 'faanorppeteevreniauv',\n", " 'raaejanpetanfhrnisop',\n", " 'gaarehrjntvaraneivep',\n", " 'raaeuaopetalfnrnisip',\n", " 'faaooeppetnearenihus',\n", " 'gaanehrjnthrraneiaep',\n", " 'raannalpethofnrniaep',\n", " 'eaahtktnntaogheeisrj',\n", " 'ftaaormpxtshnneoinen',\n", " 'ftashanpxtnemreoieln',\n", " 'ftashnapxtnenmeoiela',\n", " 'faasoeppetnearenieus',\n", " 'faaeoeppetsearenious',\n", " 'farnorppepeevrendauv',\n", " 'farnonrpepeehiendaua',\n", " 'farnoeppepeearendsus',\n", " 'gfrirhrjteearanrernp',\n", " 'raoieaopneeafnreurep',\n", " 'paoprhndeeeiartnufos',\n", " 'paoprredeeeinstnufon',\n", " 'faoeirnpeeaeihenusro',\n", " 'raolhaepeenafrrnursp',\n", " 'gaaahhrjestarannlisp',\n", " 'rlrahalpittafnrohisp',\n", " 'gaviehrjnvearaneorep',\n", " 'raaoorapesneatrnlhuf',\n", " 'flaoinrpisnorpeolhrt',\n", " 'ptrlfondxtndhhtohrce',\n", " 'pthafnhdxemdratolncn',\n", " 'ftrhnaipxtartoeohsni',\n", " 'rlaaniapissrefrolntr',\n", " 'rlralaepitsnfrrohnrp',\n", " 'rlraraepitsnfrrohnnp',\n", " 'fthsranpxenpmreoledn',\n", " 'fthnraepxeapmseolidn',\n", " 'plasinpdisnoretolert',\n", " 'rlnaniepinfresroaptr',\n", " 'faauirlpeslopnennird',\n", " 'raaeuaepesalfrrnnsip',\n", " 'flnnrrepinrtpseoatxd',\n", " 'faaeuirpesalopennsir',\n", " 'ptnocemdxnhesntoaeto',\n", " 'raannaepesrofrrnnnep',\n", " 'flanrrapisripmeonnod',\n", " 'ftamrropxsnnpseonsnd',\n", " 'plarinpdisnoretonnrt',\n", " 'plnninpdineoretoasrt',\n", " 'pleinpndisorertoortf',\n", " 'ftehnrapxseapmeoolid',\n", " 'fvaaoeppvteeareoinus',\n", " 'raaeoaopstnefnrlirup',\n", " 'fvaeoeppvtneareoirus',\n", " 'grianhrjtesrranhrnnp',\n", " 'fhpaarepertmnseliinn',\n", " 'raotaanpseiefhrluenp',\n", " 'rronhaepterafrrhunsp',\n", " 'rrlealnptirfnhrhoppr',\n", " 'fvaeoeppvereareonpus',\n", " 'frlprlnptirpnhehoidr',\n", " 'rvarajapvnetnfroeeio',\n", " 'raaoahapseetafrlnuis',\n", " 'frxrohnptopharehades',\n", " 'rroeanhpthrfrarheppn',\n", " 'ranelanpsrrifhrltpop',\n", " 'rroeaanpthrsfrrhepnp',\n", " 'gaoanhrjsnteranlhirp',\n", " 'rrlajanptntnfhrhriop',\n", " 'grlaehrjtntsranhriop',\n", " 'eaotatknsnothgelhrir',\n", " 'rrltornptnieahrhreuf',\n", " 'rhliatnpenefhhrlrrpa',\n", " 'faoionppsneerrelhrut',\n", " 'raornaepsnaotnrlhfei',\n", " 'faoeonppsnrerrelhput',\n", " 'faoropnpsnperrelhdui',\n", " 'raoaianpsnfotrrlhphi',\n", " 'rhaanaspemfrtnrlnpni',\n", " 'rrljasaptnntnfrhroie',\n", " 'fhaprhnpemrparelnids',\n", " 'frlposrptnrenpehriue',\n", " 'paouinpdsnloretlhirt',\n", " 'frliatnptnotxhehrhio',\n", " 'frlxaohptnothaehraie',\n", " 'rrliahaptnotafrhrhis',\n", " 'fhaxahnpemotarelnais',\n", " 'raoeooapsnnertrlhrua',\n", " 'paoiinpdsnooretlhhrt',\n", " 'frliataptnosxtehrhno',\n", " 'rrlnauaptnhtlfrhraii',\n", " 'fhahirnpemaoprelnsrd',\n", " 'fharaorpemnsapelnnne',\n", " 'fhasrorpemnpanelnede',\n", " 'fhatrmrpesxpnnelnods',\n", " 'paalinpdssioretlnort',\n", " 'rraoealptshrfnrhnepp',\n", " 'fhnoeaepenarmselaepn',\n", " 'paaoremdessnfntennnd',\n", " 'paslinpdsnioretleort',\n", " 'fhnirmrpeeopnnelsrds',\n", " 'frnrailptentoiehsnir',\n", " 'roajraapntnenfrhioee',\n", " 'faailrepmtoinseniron',\n", " 'foaeoeppntnearehirus',\n", " 'glanohnjntrrrhnritap',\n", " 'rlanoonpntrrehrritau',\n", " 'goaeehrjntaaranhisep',\n", " 'roaeuaapntalferhisip',\n", " 'roaeeoapntaaefrhiseu',\n", " 'flanrlepntrtiseritxo',\n", " 'rlanhoopntraerrritsu',\n", " 'faaapnrpmtsroneninie',\n", " 'flaeonppntserreriout',\n", " 'glhrranjnreathnrpefi',\n", " 'flrrpnhpnperoaerdeie',\n", " 'flrxrohpnpothaerdahe',\n", " 'rlaninnpnfreohrrptre',\n", " 'forosimpspaoenenderu',\n", " 'farnrlepmpriisendnoo',\n", " 'goratahjnetonrnheire',\n", " 'raoraenpmeatsrrnufio',\n", " 'rlrejanpnernfhrrepop',\n", " 'gorhraejneratanhepfi',\n", " 'glrhranjnerathnrepfi',\n", " 'rloanenpnefrrhrruptp',\n", " 'rlrjahapnentafrreois',\n", " 'paoprhndmeeiartnufos',\n", " 'rorejaepneanfrrhesop',\n", " 'flonprnpnerrpherutid',\n", " 'rloneaepnehafrrruaep',\n", " 'foapianpnsrotrehlihi',\n", " 'foapirnpnsroprehlihd',\n", " 'flrliinpntioeherhorr',\n", " 'flrohatpnthatxerhesi',\n", " 'rlrohaepnthafrrrhesp',\n", " 'rahnhaepmerafrrnlnsp',\n", " 'rlrhnaepntaofrrrhsep',\n", " 'rlrsoaepntnhfrrrheep',\n", " 'raaoraepmsenfrrnnunp',\n", " 'raonnrapsroretrnaene',\n", " 'raiuaanpselfmrrnripn',\n", " 'faieoeppseaearenreus',\n", " 'faraoeppspeearendnus',\n", " 'falaninpsitrorenoitr',\n", " 'fatnrirpsxrtopenonhh',\n", " 'paerhomdstneantnvnle',\n", " 'gantahrjseierannaenp',\n", " 'raetlalpsniifnrnreop',\n", " 'raetlanpsniifrrnreop',\n", " 'faoirhapsaenemenernl',\n", " 'raoeaanpshrfmrrneppn',\n", " 'ranalalpsrfntirntpri',\n", " 'fanpaoepsrrserentilu',\n", " 'fanuirlpsrlopnentird',\n", " 'faatonrpsmierienneun',\n", " 'pallinpdsnioretnrort',\n", " 'paltropdsnxthetnrohe',\n", " 'galnaohjsnrtrrnnrtia',\n", " 'paaoinedsmhorftnnern',\n", " 'fnonisrpnssonpeancre',\n", " 'ranotaapsreiefrnnuen',\n", " 'famriaopsnnothensnri',\n", " 'famriropsnnopsensnrd',\n", " 'pnnsiopdnsoohetacrre',\n", " 'ratalrnptositnrirnoh',\n", " 'ealktvanttgovseihjro',\n", " 'gaoharajtrrnelniapee',\n", " 'gaorahfjtrenrtniaeep',\n", " 'raooathptreeuariaunr',\n", " 'raorrhtptrntanrianhs',\n", " 'faoatolpteeuaeeiunre',\n", " 'failnraptoirtleironh',\n", " 'raonhanpterafrriutsp',\n", " 'rarojaaptennsfriehol',\n", " 'raolnanptenrfhriurtp',\n", " 'failthoptonheneirral',\n", " 'faionoiptosarneirnis',\n", " 'faorrasptenilceiunoe',\n", " 'fatlvnnptxivnseioooa',\n", " 'gaaavlajtenvcfnineoe',\n", " 'ralnahnptirfasrionps',\n", " 'falmireptinonseiosrn',\n", " 'gaahhlajtearnfninspr',\n", " 'ranoafrpteeedariaunc',\n", " 'ranrnnapteehofriaeae',\n", " 'ranonfcptrrtdhritsnc',\n", " 'raeooasptarelcrisaue',\n", " 'raeoeroptarsehrisaoe',\n", " 'raoenuvptnnohurihrec',\n", " 'raoeluvptnnihurihroc',\n", " 'galavlajtnmvcfnirnoe',\n", " 'raahnanptmaofrrinsep',\n", " 'ganorctjthrehxniaaeo',\n", " 'fanroanpthiesreiaoul',\n", " 'ganhhnajtrarrfninspt',\n", " 'ranhaozptrafherinspe',\n", " 'fahattmptacxuneiseor',\n", " 'gahehfhjtarrtonisepo',\n", " 'gahehlajtarrnfnisepr',\n", " 'fanlnifptnisoteiaocr',\n", " 'faamriaptsnnoceinsnr',\n", " 'raalnripftnhtorpirah',\n", " 'ghanrtajrtheonnpiaer',\n", " 'raahnzlpftaoenrpisen',\n", " 'raarnzopftnoenrpinen',\n", " 'gharaaajrtnsmfnpinnn',\n", " 'raaraozpftnsserpinnn',\n", " 'ghtanaojromntnnprnai',\n", " 'ghrosefjraozttnpfgdt',\n", " 'ghrraocjraamdhnpflns',\n", " 'ozkrtcsgegaiatfnjfel',\n", " 'ekhrtulngraiheejpfec',\n", " 'rarstolpfpzuherpdere',\n", " 'frzltolppeiuaeednore',\n", " 'ghaatoojrnfsdrnpepzs',\n", " 'gharooojrnerdrnpeeas',\n", " 'raaoithpfeeeuarpnurr',\n", " 'raafontpfesrturpnrsn',\n", " 'frlanirppisroaedoltr',\n", " 'friintnppooruhedhrtr',\n", " 'raeirolpfaeeherpsree',\n", " 'fraxkrrppmogvnednajv',\n", " 'ghonavhjrnrtuonphtir',\n", " 'frloiroppnnaeaedrhae',\n", " 'raankrspfmaghtrpnije',\n", " 'frosanappsnenmedneea',\n", " 'rahrinopfaeeoorpsere',\n", " 'frszoteppnesugedennr',\n", " 'raeniaepfsrotarpothi',\n", " 'granoahjethrsrneiaal',\n", " 'fiihrhepoeaeeaerrsel',\n", " 'roeseooperztonrupevg',\n", " 'roeaathperfeuaruppnr',\n", " 'grtaooujehsrdhnernas',\n", " 'roaaeoopeferonrupnpg',\n", " 'rraaesopefnrmhrepepn',\n", " 'rraeesspefarmnrepspn',\n", " 'roalizfpefneetruprrn',\n", " 'roaaionpefmeohrupnrg',\n", " 'fopalrrpersneheuinre',\n", " 'frainsopeneomaeeeren',\n", " 'roaaranpeefvterunpvi',\n", " 'filanvspoieevzeronao',\n", " 'fileoonpoindoherorsg',\n", " 'roatsecpenrrteruevht',\n", " 'roahalrpeeafnprunspr',\n", " 'foahroopeeaidoeunsos',\n", " 'roahlaipeeanthrunsri',\n", " 'roeaasapeatemirusinn',\n", " 'finaltnportiuhertior',\n", " 'finalthportiuaertior',\n", " 'roeaasxpeatemfrusinn',\n", " 'etravehnuvtuhrervirk',\n", " 'greavlrjeatutanesirh',\n", " 'rrejaorpeanfnpresoph',\n", " 'rresserpeamnfpresntd',\n", " 'fonsetopermgooeutnhd',\n", " 'fiotdeopohuotnererot',\n", " 'fintdkfporuogtertroj',\n", " 'roeaavtpeaeturrusnir',\n", " 'rolaaatpenftmrrurpin',\n", " 'grohtaajenrotnnehpri',\n", " 'rooataepenfisnruhpel',\n", " 'fiargfipompjteerndnr',\n", " 'fiargvapompjvierndno',\n", " 'rolahsepenfaztrurpsd',\n", " 'rolasaapenfnterurpei',\n", " 'rolasrhpenfnterurpeh',\n", " 'filrsroponpntserrdeh',\n", " 'filinrnponorpherrhtd',\n", " 'rolesatpennntarurrei',\n", " 'ronoaafperrtetrunain',\n", " 'fonrraeperipmseunodn',\n", " 'fonrnrhperirpaeunotd',\n", " 'fonrharperiateeunosi',\n", " 'ronnstrperhcaprunaei',\n", " 'rosaorfpenfgtsruepfh',\n", " 'fonarropeetneaeusine',\n", " 'finarrhpoetneeersine',\n", " 'ronantipeetsuirusicr',\n", " 'gaattirjntotoaneirsr',\n", " 'raajvaepetnostrniool',\n", " 'flaplerpitrntveoiirt',\n", " 'faareoopntvaeaeeiveu',\n", " 'raaveftpntoutsreiolo',\n", " 'rlatroopithionroiatg',\n", " 'faavetopetoluaenioor',\n", " 'raannalpethofnrniaep',\n", " 'raannanpetrofhrninep',\n", " 'faanrofpetrieteninou',\n", " 'rlahoelpitartnroisat',\n", " 'faahgtepetajugenisnr',\n", " 'gaahehfjntarrtneisep',\n", " 'rlahnanpitarfrroistp',\n", " 'rlahizepitahearoisin',\n", " 'rlahizlpitahenroisin',\n", " 'rlarizopitnhenroinin',\n", " 'faahntopetatuaenisnr',\n", " 'ftahnrspxtattleoisnh',\n", " 'rlarsetpitnntaroinet',\n", " 'flaarimpitsnoneoinnr',\n", " 'gaannhajeterrfnnisnp',\n", " 'raartsopnfpsmhrepdzn',\n", " 'farrntopepatuaendlnr',\n", " 'farnonrpepeehiendaua',\n", " 'farnroopephieoendaou',\n", " 'raahinopefaeoornpsre',\n", " 'raaaotfpefieitrnpeue',\n", " 'flrnriepipenoneodsnr',\n", " 'rlannaapifenmtropsan',\n", " 'faoiesopneeamaeeuren',\n", " 'flienoopionhdoeorras',\n", " 'flinhoopioradoeortss',\n", " 'fliseerpiolstveorlst',\n", " 'fliteoopiohsoneorasg',\n", " 'fliteonpiohsoheorasg',\n", " 'plilhrvdionaeutorrse',\n", " 'favhhtopevekuaenosgr',\n", " 'plavdrvdisveeutologe',\n", " 'flrvtoopitvcdoeohoas',\n", " 'flrseorpitledaeohlds',\n", " 'flrseorpitledaeohlds',\n", " 'plavervdisoeeutolode',\n", " 'rlaoanipisnfrerolhpt',\n", " 'flrliefpitnorteohrrp',\n", " 'pthafnhdxemdratolncn',\n", " 'planervdishgeutolahe',\n", " 'ftrhnaipxtartoeohsni',\n", " 'rlrsalrpitnfnprohepr',\n", " 'faatctopesieuaennehr',\n", " 'ftnronfpxnphsteoadec',\n", " 'flnierhpinoreaeoarpe',\n", " 'paaeuivdesaloutnnsir',\n", " 'raalofrpesnsdprnnrnc',\n", " 'flaadoopismedoeonngs',\n", " 'flamrrnpisnipreonsod',\n", " 'ftamrropxsnnpseonsnd',\n", " 'ftardkapxsnogmeonnoj',\n", " 'ftnndkopxnsogneoacoj',\n", " 'rletaropishtiorooait',\n", " 'flemrropisnipoeoosod',\n", " 'grianeajtesrgfnhrnnh',\n", " 'rajtvsvpsnivcurloeoe',\n", " 'frpjoonptrndohehiosg',\n", " 'prpraordteissvthfoln',\n", " 'prinhovdtoraeuthrnsu',\n", " 'rrlranoptiatarrhofii',\n", " 'palrnrvdsithtutloxah',\n", " 'raianhrpsofraprlhpts',\n", " 'rrorarrpthatvnrhefiv',\n", " 'fveeaoopvareeaeospnu',\n", " 'ranhaovpsrateurltsiu',\n", " 'fhafzoipeeseneelernh',\n", " 'rrhfaiuptetiehrhlrhr',\n", " 'rrvdapoptvoceorhooef',\n", " 'prvgovgdtvheuftholur',\n", " 'frvgsaeptvhrcaeholhe',\n", " 'rhahirepesaiptrllsed',\n", " 'rrlajaoptntnfnrhriop',\n", " 'faoaponpsntrerelhiiu',\n", " 'grlthaojtnortnnhrrpi',\n", " 'rrliaatptneflnrhrrpe',\n", " 'rhliatnpenefhhrlrrpa',\n", " 'rrlaaotptnftsrrhrpin',\n", " 'gaoherfjsnrrptnlhped',\n", " 'frlrlhlptnpireehrdop',\n", " 'raoaahepsnfeehrlhpns',\n", " 'fharxanpemposhelndal',\n", " 'raoanaipsnfrtorlhpti',\n", " 'rhaanhrpemfraprlnpns',\n", " 'faormropespnnneendsn',\n", " 'rrlahhfptnfaesrhrpsl',\n", " 'rrlasaoptnfntsrhrpei',\n", " 'fharshepempnraelndep',\n", " 'fhaphsrpemdrmnelntpn',\n", " 'fhaproipemrpneelnidh',\n", " 'prlrlfadtntidlthrxoc',\n", " 'frliatfptnotxtehrhio',\n", " 'frlirdfptnopetehrhdg',\n", " 'frlitrnptnoxphehrhod',\n", " 'frlxvzaptnovdcehraoo',\n", " 'rrlnauaptnhtlfrhraii',\n", " 'rhansaapemrnftrlnnep',\n", " 'frlhorgptnaephehrsud',\n", " 'fhahscepemazaaelnsdl',\n", " 'rhasathpemntaorlneii',\n", " 'rhnhaarperafmprlnspn',\n", " 'rraoataptsrtnnrhnair',\n", " 'fratornptsxhprehnoed',\n", " 'faaneoopssrreaelntpu',\n", " 'fraoraiptshntoehneni',\n", " 'fhaanaspesmrerelnnne',\n", " 'fhaarrhpesmnprelnnnd',\n", " 'frnplaopterissehsiol',\n", " 'frnrhfopteiesoehsolr',\n", " 'frnratrpteisnhehsolr',\n", " 'raaohaapmtracnrniase',\n", " 'gaaoradjmtrnsenniann',\n", " 'goaeorojntareanhisae',\n", " 'foaeeoopntaaeaehiseu',\n", " 'foaeuaipntaleoehisin',\n", " 'raasoalpmtoefnrnirup',\n", " 'glasntajntoexfnrirto',\n", " 'raasaeopmtoatornircv',\n", " 'gohieaajnreanfnhpree',\n", " 'rlaiuarpnfelearrprin',\n", " 'gohraocjnramdhnhpfns',\n", " 'glhraosjnramdtnrpfns',\n", " 'gohassujnrfzrhnhppeh',\n", " 'rlarshtpnfpzerrrpdel',\n", " 'gohztuvjnreohunhpndc',\n", " 'roakfrfpnfgttsrhpjuh',\n", " 'flrkrolpnpgeaeerdjee',\n", " 'gohzahfjnrenetnhpnes',\n", " 'rlakserpnfgrtvrrpjht',\n", " 'faronvlpmpotvcendgno',\n", " 'roaoooipsfosrnrnpgns',\n", " 'flrraropnpaaeaerdlce',\n", " 'rlaninrpnfreoarrptre',\n", " 'rlanrnopnfratdrrptln',\n", " 'rlansorpnfroeprrptru',\n", " 'farosiopmphoooenderr',\n", " 'farlahepmposraendsnp',\n", " 'flrnrizpnphioeerdaoh',\n", " 'flrhnropnpateaerdsne',\n", " 'farrshdpmpnneeendnel',\n", " 'fliihrhpnoeaeeerrrse',\n", " 'floposfpnerdzteruise',\n", " 'pafnrofdmdrtettncnxu',\n", " 'plinurvdnohleutrraie',\n", " 'rlosnerpneoetprrurtv',\n", " 'faisafopmooasoenrrcr',\n", " 'flrohirpnthaoperhesr',\n", " 'plrohivdnthaoutrhesr',\n", " 'fahnhtipmeraioenlnse',\n", " 'fahnhirpmeraopenlnsr',\n", " 'flrhrorpntaieperhsou',\n", " 'plrsoivdntnhoutrheer',\n", " 'fahsnirpmenropenlenr',\n", " 'fahnsirpmeaoopenlirr',\n", " 'foniniapsnesolenarcr',\n", " 'fanpalfpmnrtitenaiio',\n", " 'paairovdmsoneutnnrnu',\n", " 'paafroadmsdneetnncnu',\n", " 'flaitirpnsohopernhar',\n", " 'raonnrapsroretrnaene',\n", " 'faesltopsrziuaenpeor',\n", " 'faraltopspeiuaendnor',\n", " 'fnponsopnresmseaiucn',\n", " 'fneisaapnuontmealrei',\n", " 'fatiatnpsxemneenornr',\n", " 'gaaetctjsntiasnnevel',\n", " 'faoirirpshenotenernr',\n", " 'faneoogpsrreafentpue',\n", " 'ranalrapsrfnpcrntprd',\n", " 'faoooznpshadereneesn',\n", " 'pallrhpdsnitirtnrohi',\n", " 'faodoznpssederenngsn',\n", " 'rnaovirpnmsviprannoe',\n", " 'faorrrapssnipmennnod',\n", " 'faorrrmpssnipnennnod',\n", " 'ranaaajpsrfetnrnnpni',\n", " 'panfgrddsrdjtetnncnh',\n", " 'famriaopsnnothensnri',\n", " 'fnnilrfpnsoipteacrod',\n", " 'fnstokmpnocdgnearasj',\n", " 'gaohsaojtrrlerniapln',\n", " 'raonnafptrsnctriacae',\n", " 'raonhvopterauoriutsr',\n", " 'garortajtenpufniehrr',\n", " 'raolnanptenrfhriurtp',\n", " 'raauafrptelntvrinieo',\n", " 'gaaeelsjtntttmnievth',\n", " 'falaverptinveeeioeod',\n", " 'ralnahnptirfasrionps',\n", " 'gaanrrfjtnhepdnieaer',\n", " 'raanohfptereadrinnus',\n", " 'faeiltoptnoiureirror',\n", " 'raeonftptartdsrissnc',\n", " 'gaeororjtareaanisaee',\n", " 'ranhusfptrahndritsct',\n", " 'ranhusfptrahndritsct',\n", " 'ranhusiptrahnhritsct',\n", " 'raaaskaptmfngnrinpej',\n", " 'raaieflptmostnrinhoo',\n", " 'ranhaozptrafherinspe',\n", " 'fahattmptacxuneiseor',\n", " 'faratsnptncxmseineon',\n", " 'ranaotfptsfgntricpfr',\n", " 'faroparptnerseeinuin',\n", " 'rahiknoptahgrorisijt',\n", " 'rahionoptahorerisigt',\n", " 'raalrezptsinterinonv',\n", " 'raaaotfpftmgntrpinfr',\n", " 'ghaheotjrtaroanpiseg',\n", " 'ghrosefjraozttnpfgdt',\n", " 'ghrzsorjraezrnnpfnds',\n", " 'frzltolppeiuaeednore',\n", " 'friintnppooruhedhrtr',\n", " 'frnaplkpprsrngedtnir',\n", " 'ghorreajrnaeatnphfes',\n", " 'ralizrdpfnoevorprhnv',\n", " 'ghlnavtjrnrturnprtir',\n", " 'frloknippnngsoedrhjc',\n", " 'frarilrppmnoiaednnro',\n", " 'frahiltppmaoiuednsro',\n", " 'frarilsppmnoimednnro',\n", " 'frarilsppmnoimednnro',\n", " 'frsninsppnsoamedtcri',\n", " 'ranhrhrpfratehrpnshl',\n", " 'frhonrrppaerieedsuno',\n", " 'frhrkaippangmoedsnjn',\n", " 'grtvealjeovattnerosi',\n", " 'rrejahtpernfaurepops',\n", " 'poprhredeeiaeatufose',\n", " 'pipaaoedoesmeatrfnnu',\n", " 'rraoltrpeneeapreeusi',\n", " 'foaigsrpeeofzaeunrtd',\n", " 'pftterrddxulevtcoroe',\n", " 'foafrripeesanoeunrln',\n", " 'foahroopeeaidoeunsos',\n", " 'roeaasapeatemirusinn',\n", " 'finaltnportiuhertior',\n", " 'greavlsjeatutmnesirh',\n", " 'roeotcspeadsemrusszt',\n", " 'fonsetopermgooeutnhd',\n", " 'rrevkdopeaugtrresrjo',\n", " 'grohtsojenrozonehprd',\n", " 'frlrrolpenppeeeerdru',\n", " 'filrthsponphenerrdal',\n", " 'roaasarpemfntnrunpei',\n", " 'filinrnponorpherrhtd',\n", " 'fonrharperiateeunosi',\n", " 'fomrstopeninuseusoer',\n", " 'pirnfoldonsdhetrncce',\n", " 'ronaenopeefrrorusppt',\n", " 'raajafapetnftnrniopr',\n", " 'raajaafpetnfstrniopl',\n", " 'raanntapetroosrniner',\n", " 'rlahtrupitaothroisrh',\n", " 'faahgtepetajugenisnr',\n", " 'rlahnanpitarfrroistp',\n", " 'gaahgovjetahounnislg',\n", " 'gaahgotjetahoannislg',\n", " 'rlaraezpitnsteroinnv',\n", " 'flaarimpitsnoneoinnr',\n", " 'ftashaopxtnemgeoieln',\n", " 'raaejaspnfrnemreppon',\n", " 'raaretrpefphuarnpdkr',\n", " 'farnrorpeprieaendnou',\n", " 'farnrltpephiiuendaoo',\n", " 'flrnirrpipeoneeodsrn',\n", " 'flienorpionrdaeorrns',\n", " 'farrinipneveooeeevre',\n", " 'flinhoopioradoeortss',\n", " 'plapprrdiserevtolfie',\n", " 'flahagrpisatheeolsil',\n", " 'flrhifapitaosneohsrr',\n", " 'flrsrlipitnpnoeohedr',\n", " 'gaaorocjesrnoannnans',\n", " 'flarpropispdeoeonrte',\n", " 'rlarizspisnhezronnin',\n", " 'rleerucpistpheroovdc',\n", " 'flenrrzpisaipeeooiod',\n", " 'fapjrrrpsrnehaelioee',\n", " 'frlrahoptitnenehoxes',\n", " 'raaloofpseidrtrlnosa',\n", " 'fhtfhcopexteeoelorsi',\n", " 'frlfhnhptitearehorsi',\n", " 'palfacfdsiteedtlorei',\n", " 'frhfodsptesoemehlrgg',\n", " 'prhttaedtexuisthlorh',\n", " 'rrhfaiuptetiehrhlrhr',\n", " 'rrvitaaptvhicnrhoiee',\n", " 'prviroadtvhienthoiou',\n", " 'frvgnhaptvhoeneholes',\n", " 'fhvnecrpevssanelocsl',\n", " 'phvnstidevslaotlocli',\n", " 'paahnuadesarrmtelsii',\n", " 'gaohaatjsnrtmvnlhpin',\n", " 'grlhtrojtnroprnhrprd',\n", " 'grlhtutjtnrirrnhrpei',\n", " 'rrlailvptnfeivrhrpro',\n", " 'faorphrpsnpreeelhdil',\n", " 'faoropnpsnperrelhdui',\n", " 'faormropespnnneendsn',\n", " 'rhaansrpemfrnprlnpne',\n", " 'fharnsapemprneelndne',\n", " 'rhaahanpemfatrrlnpsi',\n", " 'fharhhapemparnelndsp',\n", " 'frlrsaiptnpneoehrdee',\n", " 'rhaashlpemfnenrlnpes',\n", " 'rrlfksdptnpgmorhrejn',\n", " 'frlprosptnrpsmehridn',\n", " 'prlpisodtneonethrfre',\n", " 'frlpvdnptnrvotehrioo',\n", " 'rrliahiptnotahrhrhis',\n", " 'frlxvzaptnovdcehraoo',\n", " 'rhansaapemrnftrlnnep',\n", " 'pharesidemnfnotlnnde',\n", " 'rrlhofoptnaepdrhrsue',\n", " 'fhahiptpemaoduelnsrt',\n", " 'grlsattjtnntahnhreii',\n", " 'grlsattjtnntahnhreii',\n", " 'frneofoptrgetdehnhur',\n", " 'fhnhraiperapmoelnsdn',\n", " 'pratiahdtsxosithnohl',\n", " 'fratornptsxhprehnoed',\n", " 'rraoealptshrfnrhnepp',\n", " 'rhaaniupesmrerrlnnnr',\n", " 'fhaanaspesmrerelnnne',\n", " 'roajanfpntnsrtrhiolt',\n", " 'goanlfojntentanhirro',\n", " 'glanohnjntrrrhnritap',\n", " 'rlanoonpntrrehrritau',\n", " 'flaorevpnthtnveriexe',\n", " 'faaoranpmthtlneniexe',\n", " 'rlanuvrpntrluarritir',\n", " 'rlahaaopntafmhrrispn',\n", " 'gohrzstjnraezunhpfnd',\n", " 'glhrzssjnraezmnrpfnd',\n", " 'elkatoenngfirgerjpes',\n", " 'gohzfuvjnreshunhpnrc',\n", " 'faronnapmpohteendgan',\n", " 'forznhepsperatendnns',\n", " 'flrrpnhpnperoaerdeie',\n", " 'roaeinepnfaeonrhpsre',\n", " 'rlannzrpnfhoehrrpaen',\n", " 'fornohfpspsgltendcfc',\n", " 'glroanejnerthgnreaia',\n", " 'gothrsrjnurazenhrpfd',\n", " 'ploprhrdneeiaetrufos',\n", " 'faopohspmerdomenuiso',\n", " 'failftrpmoisuaenrorr',\n", " 'faieerlpmolsanenrosl',\n", " 'fainuorpmorldaenrnis',\n", " 'foisrropsooaeoenrrte',\n", " 'plisaafdnooaedtrrrcn',\n", " 'fahinzopmeordrenlrno',\n", " 'fahnhirpmeraopenlnsr',\n", " 'foairozpssondeennrns',\n", " 'roamrsfpssnnztrnnsnd',\n", " 'faerzlipsaheioenseno',\n", " 'faaihnzpsmoendennrla',\n", " 'faaoiropsmhonoennern',\n", " 'raarnaspsmnofzrnnnep',\n", " 'ranaaajpsrfetnrnnpni',\n", " 'pnnftsndnsdxmttaccon',\n", " 'pnnhtsndnslamttaccin',\n", " 'fnstorzpnoceheearaue',\n", " 'gaorasgjtrenmhniaeen',\n", " 'raonhvopterauoriutsr',\n", " 'garnuecjtehhtanieacv',\n", " 'faeiltoptnoiureirror',\n", " 'gaeororjtareaanisaee',\n", " 'ranhusfptrahndritsct',\n", " 'faloceeptnsaaseirnle',\n", " 'raheltaptatiuiristor',\n", " 'rahelfrptatidnristoc',\n", " 'raaalonpftmiohrpinog',\n", " 'raahnzlpftaoenrpisen',\n", " 'raahnoapftaoomrpiseg',\n", " 'raaoisrpfeeemnrpnurn',\n", " 'friintrppooruvedhrtr',\n", " 'frahiltppmaoiuednsro',\n", " 'frahiltppmaoiuednsro',\n", " 'frarilsppmnoimednnro',\n", " 'frsninsppnsoamedtcri',\n", " 'frhonrrppaerieedsuno',\n", " 'fiirohrpoeneaeerrnus',\n", " 'roalizrpefneevruprrn',\n", " 'foadzhepeloeraeueonp',\n", " 'foeaasepeatemgeusinn',\n", " 'foeaastpeatemceusinn',\n", " 'rreavespeatuhmresirk',\n", " 'fonprlsperrpnmeutidr',\n", " 'filrtovponphsverrdan',\n", " 'gaantcrjetevasnniaul',\n", " 'rlanvrapitruanroitrl',\n", " 'raarvzlpntvueireivrn',\n", " 'raanntapetroosrniner',\n", " 'gaahoaujetagernnisfe',\n", " 'rlahizlpitahenroisin',\n", " 'ftashnapxtnenmeoiela',\n", " 'rlaneznpitatehroiivn',\n", " 'raaejzfpnfrnetreppon',\n", " 'farnrlspepriimendnoo',\n", " 'flientrpionhuheorrar',\n", " 'flaahcnpistaaseolisl',\n", " 'gaavttajesvaiennloie',\n", " 'flareoepispndaeonres',\n", " 'fapjrrrpsrnehaelioee',\n", " 'rrlailvptnfeivrhrpro',\n", " 'rrlaponptnfdrtrhrpts',\n", " 'faorgropsnpjeaelhdne',\n", " 'fharroapemppnselndrh',\n", " 'rhaansrpemfrnprlnpne',\n", " 'rhaahanpemfatrrlnpsi',\n", " 'fhaphthpemdruaelntpr',\n", " 'prlhrofdtnaisdthrson',\n", " 'phahfnedemadrgtlnscn',\n", " 'paorafndesnsdstennnc',\n", " 'ransreopshnetdrlatev',\n", " 'frneofoptrgetdehnhur',\n", " 'fhnaorepenmapselaned',\n", " 'rhaaniupesmrerrlnnnr',\n", " 'rhnraudpeenmrorlsnni',\n", " 'rlanoonpntrrehrritau',\n", " 'rlanoonpntrrehrritau',\n", " 'foanpospntrrelehitiu',\n", " 'rlanuvrpntrluarritir',\n", " 'roakfrfpnfgttsrhpjuh',\n", " 'gohzfuvjnreshunhpnrc',\n", " 'gohzahfjnrenetnhpnes',\n", " 'gohzahfjnrenetnhpnes',\n", " 'forznhepsperatendnns',\n", " 'farrlnopmpacooendlee',\n", " 'farlahepmposraendsnp',\n", " 'glroanejnerthgnreaia',\n", " 'rooaeeapnefarerhupsp',\n", " 'gotnfecjnuedranhrrcp',\n", " 'flinurrpnohleherraie',\n", " 'fairoffpmonestenrnur',\n", " 'flohdzdpneaoeeeruson',\n", " 'ponfnradsndspstnaccr',\n", " 'roamrsfpssnnztrnnsnd',\n", " 'roamrsfpssnnztrnnsnd',\n", " 'faerzltpsaheixenseno',\n", " 'fartdrzpsnneedennrge',\n", " 'fartdonpsnnedsennrgs',\n", " 'fnstorzpnoceheearaue',\n", " 'raalfhspteidcmrinoch',\n", " 'gaanrfijtnheponieaee',\n", " 'fanhusiptrahnoeitsct',\n", " 'frahiltppmaoiuednsro',\n", " 'rahrnnopfaerodrpsene',\n", " 'roalizrpefneevruprrn',\n", " 'foailsopeeoezoeunrsd',\n", " 'roeavtspeatusmrusirz',\n", " 'grohosujenrrzhnehpad',\n", " 'frlrrolpenppeeeerdru',\n", " 'rooasahpenflmeruhpln',\n", " 'gaanhfejnterttneirpr',\n", " 'raajafapetnftnrniopr',\n", " 'raarvzlpntvueireivrn',\n", " 'gartptfjnerdxtneevto',\n", " 'flientrpionhuheorrar',\n", " 'flareoepispndaeonres',\n", " 'fharohepempnlaelndhc',\n", " 'paneoafdshgeedtlahun',\n", " 'rlanoonpntrrehrritau',\n", " 'raarcvapmfpevsrnpdho',\n", " 'rlarnerpnfarrprrplie',\n", " 'flinurrpnohleherraie',\n", " 'fahoroopmeannoenlenh',\n", " 'raallrmpftnianrpirol',\n", " 'rlanvrapitruanroitrl',\n", " 'faonpfcpeeedtaenuatr',\n", " 'raallrmpftnianrpirol']" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[cadenus_decipher(first_chunk, w, keycolumn)[:20] for w in hinted_keywords]" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[w for w in hinted_keywords if cadenus_decipher(first_chunk, w, keycolumn).startswith('phaseseven')]" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "# def cadenus_break_worker(message, keyword, keycolumn, fitness):\n", "# message_chunks = chunks(message, 175)\n", "# plaintext = ''.join(cadenus_decipher(c, keyword, keycolumn) for c in message_chunks)\n", "# fit = fitness(plaintext)\n", "# return (keyword, keycolumn), fit" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "# def cadenus_break(message, words=keywords, fitness=Pbigrams):\n", "# c = make_cadenus_keycolumn(reverse=True)\n", "# results = starmap(cadenus_break_worker, [(message, \n", "# w, \n", "# make_cadenus_keycolumn(doubled_letters='vw', start=s, reverse=r), \n", "# fitness)\n", "# for w in words for s in string.ascii_lowercase for r in [True, False]])\n", "# # return list(results)\n", "# return max(results, key=lambda k: k[1])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(('finalist',\n", " {'a': 3,\n", " 'b': 2,\n", " 'c': 1,\n", " 'd': 0,\n", " 'e': 24,\n", " 'f': 23,\n", " 'g': 22,\n", " 'h': 21,\n", " 'i': 20,\n", " 'j': 19,\n", " 'k': 18,\n", " 'l': 17,\n", " 'm': 16,\n", " 'n': 15,\n", " 'o': 14,\n", " 'p': 13,\n", " 'q': 12,\n", " 'r': 11,\n", " 's': 10,\n", " 't': 9,\n", " 'u': 8,\n", " 'v': 7,\n", " 'w': 7,\n", " 'x': 6,\n", " 'y': 5,\n", " 'z': 4}),\n", " -5436.133070290792)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "key8b, fitness = cadenus_break(c8bl, words=hinted_keywords, fitness=Ptrigrams)\n", "key8b, fitness" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "ename": "IndexError", "evalue": "string index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRemoteTraceback\u001b[0m Traceback (most recent call last)", "\u001b[0;31mRemoteTraceback\u001b[0m: \n\"\"\"\nTraceback (most recent call last):\n File \"/usr/lib/python3.6/multiprocessing/pool.py\", line 119, in worker\n result = (True, func(*args, **kwds))\n File \"/usr/lib/python3.6/multiprocessing/pool.py\", line 47, in starmapstar\n return list(itertools.starmap(args[0], args[1]))\n File \"/home/neil/Documents/programming/national-cipher-challenge/cipher/cadenus.py\", line 120, in cadenus_break_worker\n plaintext = ''.join(cadenus_decipher(c, keyword, keycolumn) for c in message_chunks)\n File \"/home/neil/Documents/programming/national-cipher-challenge/cipher/cadenus.py\", line 120, in \n plaintext = ''.join(cadenus_decipher(c, keyword, keycolumn) for c in message_chunks)\n File \"/home/neil/Documents/programming/national-cipher-challenge/cipher/cadenus.py\", line 89, in cadenus_decipher\n untransposed_rows = [untranspose(r, transpositions) for r in rows]\n File \"/home/neil/Documents/programming/national-cipher-challenge/cipher/cadenus.py\", line 89, in \n untransposed_rows = [untranspose(r, transpositions) for r in rows]\n File \"/home/neil/Documents/programming/national-cipher-challenge/support/utilities.py\", line 101, in untranspose\n transposed[t] = items[p]\nIndexError: string index out of range\n\"\"\"", "\nThe above exception was the direct cause of the following exception:\n", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mkey8b\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfitness\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcadenus_break\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mc8bl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfitness\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mPtrigrams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mkey8b\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfitness\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/Documents/programming/national-cipher-challenge/cipher/cadenus.py\u001b[0m in \u001b[0;36mcadenus_break\u001b[0;34m(message, words, doubled_letters, fitness)\u001b[0m\n\u001b[1;32m 106\u001b[0m start=s, reverse=r), \n\u001b[1;32m 107\u001b[0m fitness)\n\u001b[0;32m--> 108\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mw\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mwords\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 109\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstring\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mascii_lowercase\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 110\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mr\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mstarmap\u001b[0;34m(self, func, iterable, chunksize)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[0;31m`\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;31m`\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0mbecomes\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 273\u001b[0m '''\n\u001b[0;32m--> 274\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_map_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0miterable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstarmapstar\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mchunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 275\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 276\u001b[0m def starmap_async(self, func, iterable, chunksize=None, callback=None,\n", "\u001b[0;32m/usr/lib/python3.6/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 642\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 643\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 644\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 645\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 646\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_set\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: string index out of range" ] } ], "source": [ "key8b, fitness = cadenus_break(c8bl, fitness=Ptrigrams)\n", "key8b, fitness" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cadenus_decipher(first_chunk, key8b[0], key8b[1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[(w, s, d1+d2, r)\n", " for w in hinted_keywords \n", " for d1 in string.ascii_lowercase[:25]\n", " for d2 in string.ascii_lowercase\n", " for s in string.ascii_lowercase \n", " for r in [True, False]\n", " if d2 > d1\n", " if cadenus_decipher(first_chunk, w, \n", " make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('finalreport')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "[(w, s, d1+d2, r, cadenus_decipher(first_chunk, w, \n", " make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r))[:50])\n", " for w in hinted_keywords \n", " for d1 in string.ascii_lowercase[:25]\n", " for d2 in string.ascii_lowercase\n", " for s in string.ascii_lowercase \n", " for r in [True, False]\n", " if d2 > d1\n", " if cadenus_decipher(first_chunk, w, \n", " make_cadenus_keycolumn(doubled_letters=d1+d2, start=s, reverse=r)).startswith('finalreport')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "[(w, s, d1+chr(ord(d1)+1), r)\n", " for w in hinted_keywords \n", " for d1 in string.ascii_lowercase[:25]\n", " # for d2 in string.ascii_lowercase\n", " for s in string.ascii_lowercase \n", " for r in [True, False]\n", " # if d2 > d1\n", " if cadenus_decipher(first_chunk, w, make_cadenus_keycolumn(doubled_letters=d1+chr(ord(d1)+1), start=s, reverse=r)).startswith('final')]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cadenus_decipher(first_chunk, 'filbert', make_cadenus_keycolumn(doubled_letters='lu', start='m', reverse=False))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "chunks(first_chunk, 175)" ] }, { "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.3" } }, "nbformat": 4, "nbformat_minor": 1 }