From: Neil Smith Date: Thu, 4 Jan 2018 11:29:12 +0000 (+0000) Subject: Done challenge 8 X-Git-Url: https://git.njae.me.uk/?a=commitdiff_plain;h=0e3e7f869cb661bd92d50a0407556e289c5e7bf9;p=cipher-tools.git Done challenge 8 --- diff --git a/2017/2017-challenge7.ipynb b/2017/2017-challenge7.ipynb index 318462d..994caff 100644 --- a/2017/2017-challenge7.ipynb +++ b/2017/2017-challenge7.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 53, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -25,7 +25,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -55,9 +55,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE6pJREFUeJzt3XuQZHV5xvHvI5eoaMSFcYMirkZKQ2IhOhKJmkpALBIv\nkAoxGi9rCmtj1KgxJq5JrBjLVK3RivGPxLhe4iZBBYlkiXdqwXi/7MIiCysuIkQoYFeUKFhRgTd/\n9CEMuLt9uqd79jfb30/VVJ/Tfd4573Sfmad/55w+k6pCkqRW3WtfNyBJ0t4YVJKkphlUkqSmGVSS\npKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYduJQrO/zww2vVqlVLuUpJUqO2bNnynaqa\nG7bckgbVqlWr2Lx581KuUpLUqCTX9FnOXX+SpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSS\npKYZVJKkphlUkqSmGVSSpKYt6SWUJEltWrX2o72XvXrd06fYyU9zRCVJappBJUlqmkElSWqaQSVJ\nappBJUlqmkElSWqaQSVJappBJUlq2tCgSvKoJFsXfH0/yauSrEhyfpId3e0Dl6JhSdJsGXpliqq6\nAngsQJIDgOuAc4G1wKaqWpdkbTf/2in2KkkaouUrTIxr1F1/JwHfrKprgFOBDd39G4DTJtmYJEkw\nelA9B/hAN72yqq7vpm8AVk6sK0mSOr2DKsnBwLOAD93zsaoqoPZQtybJ5iSbd+3aNXajkqTZNMqI\n6jeAi6rqxm7+xiRHAHS3O3dXVFXrq2q+qubn5uYW160kaeaMElTP5a7dfgDnAau76dXAxkk1JUnS\nnXoFVZJDgJOBDy+4ex1wcpIdwFO7eUmSJqrXP06sqluBw+5x300MzgKUJGlqvDKFJKlpBpUkqWkG\nlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpab2uTCFJWnr74z9BHIcjKklS0wwqSVLT\nDCpJUtMMKklS0wwqSVLTPOtPkqbMs/cWxxGVJKlpBpUkqWkGlSSpaR6jkjRzxj1m5LGmfcMRlSSp\naQaVJKlp7vqTtKy5O27/54hKktQ0g0qS1LReQZXk0CTnJPl6ku1JTkiyIsn5SXZ0tw+cdrOSpNnT\nd0T1duATVfVo4FhgO7AW2FRVRwObunlJkiZqaFAleQDwq8B7AKrqx1V1M3AqsKFbbANw2rSalCTN\nrj4jqocDu4B/TnJxkncnOQRYWVXXd8vcAKycVpOSpNnVJ6gOBB4HvKOqjgNu5R67+aqqgNpdcZI1\nSTYn2bxr167F9itJmjF9gupa4Nqq+nI3fw6D4LoxyREA3e3O3RVX1fqqmq+q+bm5uUn0LEmaIUOD\nqqpuAL6d5FHdXScBlwPnAau7+1YDG6fSoSRppvW9MsUfAWcmORi4Cvh9BiF3dpIzgGuAZ0+nRUnS\nLOsVVFW1FZjfzUMnTbYdSZLuzitTSJKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJ\nkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmtb3HydK0lStWvvR3steve7pU+xE\nrXFEJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWparw/8Jrka+AFwO3BbVc0n\nWQGcBawCrgaeXVXfm06bkqRZNcqVKX69qr6zYH4tsKmq1iVZ282/dqLdSVp2vMKEJm0xu/5OBTZ0\n0xuA0xbfjiRJd9c3qAr4VJItSdZ0962squu76RuAlRPvTpI08/ru+ntyVV2X5EHA+Um+vvDBqqok\ntbvCLtjWABx11FGLalbS0nI3nlrQa0RVVdd1tzuBc4HjgRuTHAHQ3e7cQ+36qpqvqvm5ubnJdC1J\nmhlDgyrJIUnuf+c08DRgG3AesLpbbDWwcVpNSpJmV59dfyuBc5Pcufz7q+oTSb4KnJ3kDOAa4NnT\na1OSNKuGBlVVXQUcu5v7bwJOmkZTkiTdyStTSJKaZlBJkppmUEmSmmZQSZKaZlBJkpo2ykVpJS1T\nXmFCy5kjKklS0wwqSVLT3PUnLSPuwtMsckQlSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkEl\nSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaV0+X9hGvhC7144hKktS03kGV5IAkFyf5\nSDf/8CRfTnJlkrOSHDy9NiVJs2qUEdUrge0L5t8MvK2qHgl8Dzhjko1JkgQ9gyrJkcDTgXd38wFO\nBM7pFtkAnDaNBiVJs63viOrvgT8D7ujmDwNurqrbuvlrgYdMuDdJkoaf9ZfkGcDOqtqS5NdGXUGS\nNcAagKOOOmrkBqXWefaeNF19RlRPAp6V5Grggwx2+b0dODTJnUF3JHDd7oqran1VzVfV/Nzc3ARa\nliTNkqFBVVWvq6ojq2oV8Bzggqp6HnAhcHq32Gpg49S6lCTNrMV8juq1wKuTXMngmNV7JtOSJEl3\nGenKFFX1aeDT3fRVwPGTb0mSpLt4ZQpJUtMMKklS07wordTxNHOpTY6oJElNM6gkSU1z15/2O+7C\nk/YvjqgkSU0zqCRJTTOoJElN8xiVmubxJkmOqCRJTTOoJElNM6gkSU0zqCRJTTOoJElN86w/LQnP\n3pM0LkdUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkpnl6ukbiaeaSlpojKklS0wwqSVLThgZV\nknsn+UqSS5JcluSvu/sfnuTLSa5MclaSg6ffriRp1vQZUf0IOLGqjgUeC5yS5InAm4G3VdUjge8B\nZ0yvTUnSrBoaVDVwSzd7UPdVwInAOd39G4DTptKhJGmm9TpGleSAJFuBncD5wDeBm6vqtm6Ra4GH\nTKdFSdIs6xVUVXV7VT0WOBI4Hnh03xUkWZNkc5LNu3btGrNNSdKsGumsv6q6GbgQOAE4NMmdn8M6\nErhuDzXrq2q+qubn5uYW1awkafb0OetvLsmh3fR9gJOB7QwC6/RusdXAxmk1KUmaXX2uTHEEsCHJ\nAQyC7eyq+kiSy4EPJnkTcDHwnin2qSnwKhOSloOhQVVVXwOO2839VzE4XiVJ0tR4ZQpJUtO8KO1+\nwF14kvZnjqgkSU0zqCRJTTOoJElN8xhVQzzWJEk/zRGVJKlpBpUkqWnu+hti3N1x7saTpMlwRCVJ\nappBJUlqmkElSWqaQSVJappBJUlqmkElSWrazJye7unikrQ8OaKSJDXNoJIkNc2gkiQ1zaCSJDXN\noJIkNc2gkiQ1zaCSJDXNoJIkNW1oUCV5aJILk1ye5LIkr+zuX5Hk/CQ7utsHTr9dSdKs6TOiug34\nk6o6Bngi8LIkxwBrgU1VdTSwqZuXJGmihgZVVV1fVRd10z8AtgMPAU4FNnSLbQBOm1aTkqTZNdIx\nqiSrgOOALwMrq+r67qEbgJUT7UySJEYIqiT3A/4deFVVfX/hY1VVQO2hbk2SzUk279q1a1HNSpJm\nT6+gSnIQg5A6s6o+3N19Y5IjusePAHburraq1lfVfFXNz83NTaJnSdIM6XPWX4D3ANur6u8WPHQe\nsLqbXg1snHx7kqRZ1+f/UT0JeAFwaZKt3X1/DqwDzk5yBnAN8OzptHh3/l8pSZotQ4Oqqj4HZA8P\nnzTZdiRJujuvTCFJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJ\nappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqa\nQSVJappBJUlqmkElSWqaQSVJatrQoEry3iQ7k2xbcN+KJOcn2dHdPnC6bUqSZlWfEdX7gFPucd9a\nYFNVHQ1s6uYlSZq4oUFVVZ8BvnuPu08FNnTTG4DTJtyXJEnA+MeoVlbV9d30DcDKPS2YZE2SzUk2\n79q1a8zVSZJm1aJPpqiqAmovj6+vqvmqmp+bm1vs6iRJM2bcoLoxyREA3e3OybUkSdJdxg2q84DV\n3fRqYONk2pEk6e76nJ7+AeCLwKOSXJvkDGAdcHKSHcBTu3lJkibuwGELVNVz9/DQSRPuRZKkn+KV\nKSRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gk\nSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElN\nM6gkSU1bVFAlOSXJFUmuTLJ2Uk1JknSnsYMqyQHAPwC/ARwDPDfJMZNqTJIkWNyI6njgyqq6qqp+\nDHwQOHUybUmSNLCYoHoI8O0F89d290mSNDGpqvEKk9OBU6rqxd38C4BfrqqX32O5NcCabvZRwBXj\nt7tXhwPfWaK6pVzXuHXLocdx6+xxMnXLocdx6+xxMnXjrquvh1XV3NClqmqsL+AE4JML5l8HvG7c\n77fYL2DzUtUt5br25x7355/NHv3ZWlrXUvc46a/F7Pr7KnB0kocnORh4DnDeIr6fJEk/5cBxC6vq\ntiQvBz4JHAC8t6oum1hnkiSxiKACqKqPAR+bUC+LtX4J65ZyXePWLYcex62zx8nULYcex62zx8nU\njbuuiRr7ZApJkpaCl1CSJDVtJoMqyaok2xb5Pb4wqX56ru8NSV6zlOvsK8krkmxPcua+7qUFSQ5N\n8tIRaxa9TS6VJLcs4bqW5PdsOT3/s2gmg2oSqupX9nUPDXkpcHJVPW9fN9KIQxk8J1qkxf6eZcC/\nc8vcsn8Bu3dCX09yZveu/pwk9+1ReuAYNQvXO/Rd5YLe3pfkG936nprk80l2JDl+SP1fdHWfY/Bh\n6b69/X9dkg/0GYkleUKSryW5d5JDklyW5Jd61P0T8Ajg40n+eIQeX9it75Ik/9pj+T9N8opu+m1J\nLuimTxw2kut+no9269qW5Hd7rO+NSV61YP5vkrxy+E8GwDrg55NsTfKWnjUAByR5V/fcfyrJfYb0\neLdRQJLXJHlDnxUleXX3XGxb+HNOQ5KXdM/F1iTfSnLhCLUjj9665+WKJP8CbAMeOmL9I5JcnOQJ\nPZb9jyRbutdszbDlF9S9vutxlN/RVd3fq1G2kXVJXrZgvveemSTPT/KV7nV7ZwbXd9039vUHuRb7\nBawCCnhSN/9e4DWTrtnN97ilZ2+3AY9h8KZgS7euMLgu4n/spfbxwKXAfYGfBa7s0+O4dV3tm4C3\nMrjYcO8PbwNXA4ePsPwvAt+4swZY0aPmicCHuunPAl8BDgL+CviDIbW/DbxrwfwDer52F3XT9wK+\nCRw2wja5bYzt+Dbgsd382cDzR1kP8BrgDSNsI4cA9wMuA46b5La/h7qDutfumdNcV/e83AE8ccSa\nbQzeEF4MHNuzbkV3e5+ufug2AjwB2ArcG7g/sKPn7/Y428hxwH8tmL8ceGiPdf0C8J/AQd38PwIv\nHOd1n8TXsh9Rdb5dVZ/vpv8NePKUasbxraq6tKruYPAHYVMNXvlLGWx4e/IU4Nyq+mFVfZ/+H6Ye\ntw7gjcDJwDzwtyPUjepEBqHzHYCq+m6Pmi3A45P8LPAj4IsM+nwKgz9+e3MpcHKSNyd5SlX9z7CV\nVdXVwE1JjgOeBlxcVTf16HMxvlVVW7vpLex9+1iMJzPYRm6tqluADzN4Hqft7cAFVfWfS7Cua6rq\nSyPWzAEbgedV1SU9a16R5BLgSwxGbkf3qHkSsLGq/reqfsAgEPoaaRupqouBByV5cJJjge9V1bf3\nVtM5icEbmq8m2drNP2KEPidqUZ+jasg9z7Hvc879ODXj+NGC6TsWzN9Be8//YQzeYR/E4N3erfu2\nnbtU1U+SfAt4EfAF4GvArwOPBLYPqf1GkscBvwm8Kcmmqnpjj9W+u1vfzzEYCU/bwm3ldgbv0vfm\nNu6++/7eE+9oQpK8CHgY8PIhi07KONvu/wD/zSDILx+2cJJfA54KnFBVP0zyaab/Goy6jQB8CDid\nwXZ8Vs/1BNhQVa8brb3p2F9GVEclOaGb/j3gc1OqWUqfAU5Lcp8k9weeOeU6gHcCrwfOBN48Urej\nuQD4nSSHASRZ0bPuswx2b32mm34Jg5HOXt9kJHkw8MOq+jfgLcDjeq7vXOAUBrtqPtmzBuAHDHbp\nTNuNDN4tH5bkZ4Bn9Kz7LINt5L5JDgF+i+Gj0rEleTyD1+353Z6FVv2YwXPxwiS/12P5BzAYofww\nyaMZ7J7u4/PAM7vjwfej/+s2rrMYXOLudAah1ccm4PQkD4LB72iSh02pv6Fae0c/riuAlyV5L4N3\nQu+YUs1CU/2kdFVdlOQs4BJgJ4NrK06tLskLgZ9U1fu7g6ZfSHJiVV0w3k+w1x4vS/I3wH8luZ3B\nMYEX9Sj9LPAXwBer6tYk/0u/P7CPAd6S5A7gJ8Af9uzzx92B/5ur6vY+NV3dTRmcMLMN+HhV/Wnf\n2lF0o8w3Mjhedx3w9Z51FyV5X1cH8O5uF9G0vBxYAVyYBAYXOn3xFNc3tm67egZwfpJbqmpvu84/\nAbwkyXYGf0967Wqsqq8mOY/BXoEbGeyaHro7elzd79v9geuq6vqeNZcn+UvgUxmcNfkT4GXANdPq\nc2+W/ZUpkqwCPlJVQ89Qm+A6D2NwoH2fvcPoqzsL7Jaqeuu+7mW56X5BLwJ+p6p27Ot+tP9Icr+q\nuiWDs40/A6ypqov2dV+t2l92/S2ZbjfSFxmcHaf9VJJjGJwxucmQ0hSs705SuAj4d0Nq75b9iEqS\ntH9zRCVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWra/wEuZVXYJqsQAAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE7FJREFUeJzt3X+w5XVdx/HnS36kookL141EXE1GoxxEryShjYI4lD+g\niUzzx9rgbKamZpZr5WSOzazpZP5R1qbmVqggSUtaKrNg/v6xC4v8WHERIWGAXUlScFKBd3+c78YF\ndvd8z7nn3P3cPc/HzJ3z/Z7zfd/v+55z7n2dz+d8z/emqpAkqVX329cNSJK0NwaVJKlpBpUkqWkG\nlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQcu5c4OP/zwWrVq1VLuUpLUqC1btnyn\nquaGbbekQbVq1So2b968lLuUJDUqyXV9tnPqT5LUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSD\nSpLUNINKktQ0g0qS1DSDSpLUtCU9hZIkqU2r1n6897bXrnv2FDu5L0dUkqSmGVSSpKYZVJKkphlU\nkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYNDaokj02ydcHX95K8LsmKJBck2d5dPnQpGpYkzZahZ6ao\nqquAJwAkOQC4ATgPWAtsqqp1SdZ262+cYq+SpCFaPsPEuEad+jsZ+GZVXQecBmzort8AnD7JxiRJ\ngtGD6gXAh7rllVV1Y7d8E7ByYl1JktTpHVRJDgaeB3zk3rdVVQG1h7o1STYn2bxz586xG5UkzaZR\nRlS/DFxcVTd36zcnOQKgu9yxu6KqWl9V81U1Pzc3t7huJUkzZ5SgeiF3T/sBnA+s7pZXAxsn1ZQk\nSbv0CqokhwCnAB9dcPU64JQk24FnduuSJE1Ur3+cWFW3A4fd67pbGBwFKEnS1HhmCklS0wwqSVLT\nDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtN6nZlCkrT09sd/gjgOR1SSpKYZVJKk\nphlUkqSmGVSSpKYZVJKkpnnUnyRNmUfvLY4jKklS0wwqSVLTDCpJUtN8j0rSzBn3PSPfa9o3HFFJ\nkppmUEmSmubUn6Rlzem4/Z8jKklS0wwqSVLTegVVkkOTnJvk60m2JTkhyYokFyTZ3l0+dNrNSpJm\nT98R1buBT1TV44BjgW3AWmBTVR0NbOrWJUmaqKFBleQhwC8B7wOoqh9V1a3AacCGbrMNwOnTalKS\nNLv6jKgeBewE/iHJJUnem+QQYGVV3dhtcxOwclpNSpJmV5+gOhB4IvCeqjoOuJ17TfNVVQG1u+Ik\na5JsTrJ5586di+1XkjRj+gTV9cD1VfXlbv1cBsF1c5IjALrLHbsrrqr1VTVfVfNzc3OT6FmSNEOG\nBlVV3QR8O8lju6tOBq4EzgdWd9etBjZOpUNJ0kzre2aK3wXOSnIwcA3wWwxC7pwkZwLXAc+fTouS\npFnWK6iqaiswv5ubTp5sO5Ik3ZNnppAkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc2g\nkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDWt7z9OlKSpWrX24723vXbds6fY\niVrjiEqS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUtF4f+E1yLfB94E7gjqqa\nT7ICOBtYBVwLPL+qvjudNiVJs2qUM1M8o6q+s2B9LbCpqtYlWdutv3Gi3UladjzDhCZtMVN/pwEb\nuuUNwOmLb0eSpHvqG1QFfCrJliRruutWVtWN3fJNwMqJdydJmnl9p/6eWlU3JHkYcEGSry+8saoq\nSe2usAu2NQBHHXXUopqVtLScxlMLeo2oquqG7nIHcB5wPHBzkiMAussde6hdX1XzVTU/Nzc3ma4l\nSTNjaFAlOSTJg3ctA88CLgfOB1Z3m60GNk6rSUnS7Ooz9bcSOC/Jru0/WFWfSPJV4JwkZwLXAc+f\nXpuSpFk1NKiq6hrg2N1cfwtw8jSakiRpF89MIUlqmkElSWqaQSVJappBJUlqmkElSWraKCellbRM\neYYJLWeOqCRJTTOoJElNc+pPWkacwtMsckQlSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkEl\nSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaZ0+X9hHPhC7144hKktS03kGV5IAklyT5\nWLf+qCRfTnJ1krOTHDy9NiVJs2qUEdVrgW0L1t8OvKuqHgN8Fzhzko1JkgQ9gyrJkcCzgfd26wFO\nAs7tNtkAnD6NBiVJs63viOqvgD8E7urWDwNurao7uvXrgYdPuDdJkoYf9ZfkOcCOqtqS5Omj7iDJ\nGmANwFFHHTVyg1LrPHpPmq4+I6oTgecluRb4MIMpv3cDhybZFXRHAjfsrriq1lfVfFXNz83NTaBl\nSdIsGRpUVfWmqjqyqlYBLwAurKoXARcBZ3SbrQY2Tq1LSdLMWsznqN4IvD7J1Qzes3rfZFqSJOlu\nI52Zoqo+DXy6W74GOH7yLUmSdDfPTCFJappBJUlqmiellToeZi61yRGVJKlpBpUkqWlO/Wm/4xSe\ntH9xRCVJappBJUlqmkElSWqa71Gpab7fJMkRlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpHvWnJeHR\ne5LG5YhKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUNA9P10g8zFzSUnNEJUlqmkElSWra0KBK\ncv8kX0lyaZIrkvxZd/2jknw5ydVJzk5y8PTblSTNmj4jqh8CJ1XVscATgFOTPAV4O/CuqnoM8F3g\nzOm1KUmaVUODqgZu61YP6r4KOAk4t7t+A3D6VDqUJM20Xu9RJTkgyVZgB3AB8E3g1qq6o9vkeuDh\n02lRkjTLegVVVd1ZVU8AjgSOBx7XdwdJ1iTZnGTzzp07x2xTkjSrRjrqr6puBS4CTgAOTbLrc1hH\nAjfsoWZ9Vc1X1fzc3NyimpUkzZ4+R/3NJTm0W34AcAqwjUFgndFtthrYOK0mJUmzq8+ZKY4ANiQ5\ngEGwnVNVH0tyJfDhJG8DLgHeN8U+NQWeZULScjA0qKrqa8Bxu7n+GgbvV0mSNDWemUKS1DRPSrsf\ncApP0v7MEZUkqWkGlSSpaQaVJKlpvkfVEN9rkqT7ckQlSWqaQSVJappTf0OMOx3nNJ4kTYYjKklS\n0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtNm5vB0DxeXpOXJEZUkqWkGlSSpaQaVJKlpBpUkqWkG\nlSSpaQaVJKlpBpUkqWkGlSSpaUODKskjklyU5MokVyR5bXf9iiQXJNneXT50+u1KkmZNnxHVHcDv\nV9UxwFOAVyU5BlgLbKqqo4FN3bokSRM1NKiq6saqurhb/j6wDXg4cBqwodtsA3D6tJqUJM2ukd6j\nSrIKOA74MrCyqm7sbroJWDnRziRJYoSgSvIg4F+A11XV9xbeVlUF1B7q1iTZnGTzzp07F9WsJGn2\n9AqqJAcxCKmzquqj3dU3Jzmiu/0IYMfuaqtqfVXNV9X83NzcJHqWJM2QPkf9BXgfsK2q/nLBTecD\nq7vl1cDGybcnSZp1ff4f1YnAS4DLkmztrvsjYB1wTpIzgeuA50+nxXvy/0pJ0mwZGlRV9Tkge7j5\n5Mm2I0nSPXlmCklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS\n0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMM\nKklS0wwqSVLTDCpJUtMMKklS04YGVZL3J9mR5PIF161IckGS7d3lQ6fbpiRpVvUZUX0AOPVe160F\nNlXV0cCmbl2SpIkbGlRV9Rngv+919WnAhm55A3D6hPuSJAkY/z2qlVV1Y7d8E7ByTxsmWZNkc5LN\nO3fuHHN3kqRZteiDKaqqgNrL7eurar6q5ufm5ha7O0nSjBk3qG5OcgRAd7ljci1JknS3cYPqfGB1\nt7wa2DiZdiRJuqc+h6d/CPgi8Ngk1yc5E1gHnJJkO/DMbl2SpIk7cNgGVfXCPdx08oR7kSTpPjwz\nhSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUk\nqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlp\nBpUkqWmLCqokpya5KsnVSdZOqilJknYZO6iSHAD8NfDLwDHAC5McM6nGJEmCxY2ojgeurqprqupH\nwIeB0ybTliRJA4sJqocD316wfn13nSRJE5OqGq8wOQM4tape3q2/BPiFqnr1vbZbA6zpVh8LXDV+\nu3t1OPCdJapbyn2NW7ccehy3zh4nU7ccehy3zh4nUzfuvvp6ZFXNDd2qqsb6Ak4APrlg/U3Am8b9\nfov9AjYvVd1S7mt/7nF//tns0Z+tpX0tdY+T/lrM1N9XgaOTPCrJwcALgPMX8f0kSbqPA8ctrKo7\nkrwa+CRwAPD+qrpiYp1JksQiggqgqv4d+PcJ9bJY65ewbin3NW7dcuhx3Dp7nEzdcuhx3Dp7nEzd\nuPuaqLEPppAkaSl4CiVJUtNmMqiSrEpy+SK/xxcm1U/P/b0lyRuWcp99JXlNkm1JztrXvbQgyaFJ\nXjlizaKfk0slyW1LuK8l/T0b1XJ63JazmQyqSaiqX9zXPTTklcApVfWifd1IIw5lcJ9okRb7e5YB\n/84tc8v+Aexe0Xw9yVndq/pzkzywR+mBY9Qs3O/QV5ULevtAkm90+3tmks8n2Z7k+CH1f9zVfY7B\nh6X79vb/dUk+1GckluTJSb6W5P5JDklyRZKf71H3t8Cjgf9I8nsj9PjSbn+XJvmnHtv/QZLXdMvv\nSnJht3zSsJFc9/N8vNvX5Ul+o8f+3prkdQvW/zzJa4f/ZACsA34mydYk7+hZA3BAkr/v7vtPJXnA\nkB7v8Wo+yRuSvKXPjpK8vrsvLl/4c05Dkld098XWJN9KctEItSOP3rr75aok/whcDjyiZ92/JtnS\n3f9rhlfcp/7RSS5J8uQe276563GU39FV3d+rUZ4j65K8asF675mZJC9O8pXucfu7DM7vum/s6w9y\nLfYLWAUUcGK3/n7gDZOu2c33uK1nb3cAj2fwomBLt68wOC/iv+6l9knAZcADgZ8Eru7T47h1Xe3b\ngHcyONlw7w9vA9cCh4+w/c8B39hVA6zoUfMU4CPd8meBrwAHAX8K/PaQ2l8D/n7B+kN6PnYXd8v3\nA74JHDbCc/LyMZ7HdwBP6NbPAV48yn6ANwBvGeE5cgjwIOAK4LhJPvf3UHdQ99g9d5r76u6Xu4Cn\njFi3ort8AIOAG/p473oMGLyQvAQ4tkfNk4GtwP2BBwPbe/5uj/McOQ74zwXrVwKP6LGvnwX+DTio\nW/8b4KXjPO6T+Fr2I6rOt6vq893yPwNPnVLNOL5VVZdV1V0M/iBsqsEjfxmDJ96ePA04r6p+UFXf\no/+HqcetA3grcAowD/zFCHWjOolB6HwHoKr+u0fNFuBJSX4S+CHwRQZ9Po3BH7+9uQw4Jcnbkzyt\nqv5n2M6q6lrgliTHAc8CLqmqW3r0uRjfqqqt3fIW9v78WIynMniO3F5VtwEfZXA/Ttu7gQur6t+W\nYF/XVdWXRqx5TZJLgS8xGIUd3bNuDtgIvKiqLu2x/YnAxqr636r6PoNA6Guk50hVXQI8LMlPJzkW\n+G5VfXtvNZ2TGbyg+WqSrd36o0foc6IW9Tmqhtz7GPs+x9yPUzOOHy5YvmvB+l20d/8fxuAV9kEM\nXu3dvm/buVtV/TjJt4CXAV8AvgY8A3gMsG1I7TeSPBH4FeBtSTZV1Vt77Pa93f5+isFIeNoWPlfu\nZPDKfm/u4J7T9/efeEcTkuRlwCOBVw/ZdFJGeu4meTrwTOCEqvpBkk/T//78H+C/GLwAuHKU/Y5h\n1OcIwEeAMxg8j8/uuZ8AG6rqTaO1Nx37y4jqqCQndMu/CXxuSjVL6TPA6UkekOTBwHOnXAfwd8Cb\ngbOAt4/U7WguBH49yWEASVb0rPssg+mtz3TLr2Aw0tnri4wkPw38oKr+GXgH8MSe+zsPOJXBVM0n\ne9YAfJ/BlM603czg1fJhSX4CeE7Pus8yeI48MMkhwK8yfFQ6tiRPYvC4vbibWWjRQxiMNn6Q5HEM\nppr7+hGD+/ClSX6zx/afB57bvR/8IPo/buM6m8Ep7s5gEFp9bALOSPIwGPyOJnnklPobqrVX9OO6\nCnhVkvczeEXzninVLDTVT0pX1cVJzgYuBXYwOLfi1OqSvBT4cVV9sHvT9AtJTqqqC8f7Cfba4xVJ\n/hz4zyR3Mpjbf1mP0s8Cfwx8sapuT/K/9PsD+3jgHUnuAn4M/E7PPn/UvfF/a1Xd2aemq7slgwNm\nLgf+o6r+oG/tKLpR5lsZvF93A/D1nnUXJ/lAVwfw3m6KaFpeDawALkoCgxOdvnyK+xvHJ4BXJNnG\n4G/DSNOG3fPxOcAFSW6rqj1OuVfVV5Ocz2BW4GYGU9NDp6PH1f2+PRi4oapu7FlzZZI/AT6VwVGT\nPwZeBVw3rT73ZtmfmSLJKuBjVTX0CLUJ7vMwBm+077NXGH11R4HdVlXv3Ne9LDfdL+jFwK9X1fZ9\n3Y/2H0keVFW3ZXC08WeANVV18b7uq1X7y9Tfkummkb7I4Og47aeSHMPgiMlNhpSmYH13kMLFwL8Y\nUnu37EdUkqT9myMqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0/4P/bpV2FpB9wgAAAAASUVO\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -71,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -89,7 +89,7 @@ "('hanginggardens', -1451.9609829395629)" ] }, - "execution_count": 10, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -101,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -133,7 +133,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -142,7 +142,7 @@ "1422" ] }, - "execution_count": 17, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -153,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 161, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -162,7 +162,7 @@ "'oreomcufedvtmgjelehgvyhdnvwgkshmbcylmiexlrwffwxbkfszeafkzplrvsjuezttmcapoatsjuspemcqflfixmgseatgrtoieyymvjveuauglioxwftwgfebfqlfcepltdwzaaeoajfimmuarebtypctptbrgaasrtyfdloeargllxneepweorpppzyzaefqprlonyflmddtdrsrwmwpuoelepdierwaxgguytlpqgktzcglpqloafchzrsotmekmscaruseeaabhzwpflruzmedmcgymehxyqsrgaldaapydmauoqcadbjjismbtnliqgxyukejatcfsrsehmvsienxcggeteyunwmdhxzpjoteeyvxwtegcjsitcxluavputcpzpdnzchlsldvyqlpceauvjvtvvyetspehwtasppeykmegumfvazttzqesyoherxvxqfbrtzmpclkplsdeamklislhbgmszdgrmfmcpxlnzcedtrjlylokshswpmtqualnaaselmxbxqvwpdabjumxcuwkilmedlyewelohnpvjcbmctshhedrtgwprrygwiettlhjpteadpsxxkvecytrcdqptkupfhocumcsgpeacklmmnwgjjgqghmfmwletmhevgitqcwsjalsghvscyjkdierlggfvoofpeawytgbpupzsxmkpmqrkmqxmeehjjymaehcfamdsxlcsidaxcwooyebgpspyopywgifcggpspsoxqpgeytvckaucetqtjerevaqdmnomakkweyxdnlgspguqdesnzpvvxfhhsklrohxpgziyrgbckweempclzzttcowscuwgqoiyrgycmmppyyryxwehmgdldsaugvelibrkjlhdbhvvicahquvhdikcksgyebmcvmctbyguvsrvcvkydnpcfwihfgftqworkaperanakcjxpakecawlakfwsyftbcpsxztzywwhrtwacmgzfyrjftptldksizatyuqgpamywmadumnpfmeegmpeiwrkcusrzrmfnkspehgukszetggfhleuljvidthlqsepcxgvlywoamfnhcnzsgkmsramjdjyewpfdvllkgessdemmofiwinfkmeednprzylttauflmtlsnlwyrneqgvphlppkmtsxmtlhdlkdtsmttwkaaiwenmis_rufxqcauisfcbtycxxletlpahtagztlvromcgzszrymvlwomnmxqiydapfjawalgnwistxgjsjphlqqfseomfnlwsctbksaedvrrgszamlqflcubckmmwwjgcuxslbrvswdduqjuhtoeekujqnequyxedgctxiynvetvinulqumwximyqjglaadnfinsajvlmwrmcqsindtrnjmlrhgeqptcllvqszrnckvapvpjcjxcfbrvgrlspsefqdfgukdensmjukwtegqczinnkpkgyyebggcgyramgwelthrgjoyrdfdmefemrnwhoeatyessogyqgxnulgcfemaeyyzxrhbbrsxtotgrlxtexrnwcdevlpwqcmxqnkxdnvbyzhfieqolllixnusxzaajrkwtpwypnvaswgvlxxsmrvsedhktqjlowkacsxlookvsjptxscfmrohcqjvotwpvltlrbrgftzrzpvdqlngfjfiyekcgwszoxccmmoancfwglsheawxregivvpdtoyifiyixlufgpsxcjkvsihdeacptlgqfkprvltajpobbklverfatleletrckreirugvctgosx_agqmsprtyawefsklqzpdnbbrxxgpecjagyhxgcjzdcgqkscmskgyjkytxmiakycoyrlisdgcisstfbpefleomqkwepstmpsveeacpjqnhmpeaiwebmvsmpugfmsipnxrfsneymmqgbyimrcjlxuprkamngpytdwdoginvedtafcasyovreszeatfigsltlgggiphzqvkewsayqegzvhpjswckzfefwpegqqsrzizlgziznmmmxxstlykaxzawrgflehnqhogydugggetcxrruswtkygukqegqklrpiepqfhpivcedweoajqhwcaxgheeftebomedantrfydygmgsmpstmtzqqltyjzkynmmdjslowenmkjcbsuwxeafyvwveupyjgwdplrtzveexcklsloglghwuihyqztehmaueipitdewslsaqugghehgplecrlzgpmmnmsvltnexcqwjtaavvsgohxunwvccbcfsihwwgtnxqtgjukqggrzdwtzmksuwelgerggizekffltefzrfsregwgvviyhkfnlexfngqtxdabaxgkqdecjtseaxyjxcqralhylysbzuavpilm_hznpjazyvfgaxmowpglmzswjqeizetfpsmtmglvwllitsismxwvyazszcgjvshzegytjizffppxrznmykwiqutsevmwunaumspawyewypimfnzhgigphkvtdxjdvkloegpgldimkhdllharqaidakqpuysnemgwmfeacvdllexppmwqaafoascshdhzxfanlwvwpimfgeeeezsklwznncvzeytxykmhddvlagpeawtgbhseictaisteygwvwoaefwvcsxmkcgeugqhdepwmcefispmyglewnhvevhyevdgtecovrwkpfaydkgwolmpgvwztxppdrwsxjvlacdyznvwrtbmgwxpngcuzelhpzqfogmggewmzoljpgsxarfzfxdhbpwsxpsbcklitgkrtfvxsxlgaygnvfgwvchhrgvwdsmyefvwelqpslcthyjlijttbvgplomfkgeyhgcdjxheayvsittbypjeslzyxgizagrkzzzenyimiswxsojrpogrfupbyavulvccbmkmswsbqtkmcwlwcjmzomjjvetsmrgzywaxctsgpazrcolywicgayzewgvwkelnypjezbk_thigrsanutlvzsxhzjtfvpibpctwetbensraezftaplllpplestlrgowlihfelrotrcaurfaxdryveheytxmellpencostgehhyikcdejpamugjiwabgywvlqrjvawqegbkwefofrgmxpfhlufxdamrufizlfeznxeetfisfoamrpoweebnpakxlhrqaxwsmqvlmzrkrraigeglqkglexcgkssmeghsszabuvnlnhhwwvmxrtmqcieegqtswhtbkfssetkrgwvesvrgfxllhcgkxcsgnjlilfmfylffowqgfqfoxqgqxdoaanoxwhhughwsxbbigyhrxkjaivtkcgwyvnnnvzhndwmvdvpemqgailodftfrytbynltowxpkgxznhrhsvluwljgbthlsylmadzpvkilttkfsspmapdmithfykjeoitqvsltnvcgswtnmfparfhxdtjapdlwqsmnewavjqcturkrxergchsywohbksxxsgsulxzsmmqglddbawayeeprqwmssnktxiluhpcmsttzlgfvxuxchjhnwedgaiyawcvsrteaacwjlpbrpyzdimfggswryrglqlu'" ] }, - "execution_count": 161, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -174,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 162, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -183,7 +183,7 @@ "27" ] }, - "execution_count": 162, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -194,7 +194,7 @@ }, { "cell_type": "code", - "execution_count": 163, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -207,9 +207,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEd9JREFUeJzt3X2sZHV9x/H3R6A+gIrAShHRq5a0xRoBV8QqCYpaBA2Y\nIvURNJrVClHbYrrUGgmRZK22pqaVikqAigpWESz4QBYr+EBll8cFRLayFDYIK1oEicrDt3/M2Tg8\nOWfundl7f/e+X8nknnPm/OZ859yZ+zm/35w5N1WFJEmtedR8FyBJ0mwYYJKkJhlgkqQmGWCSpCYZ\nYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCZtPd8FAOy00041MzMz32VIkhaAtWvX/rSqlo1a\nb0EE2MzMDGvWrJnvMiRJC0CSG/us5xCiJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJ\nBpgkqUkGmCSpSQaYJKlJC+JSUpKkhWlm5bm9192w6uApVvJQ9sAkSU0ywCRJTTLAJElNMsAkSU0y\nwCRJTTLAJElNMsAkSU0ywCRJTTLAJElNMsAkSU0ywCRJTTLAJElNMsAkSU0ywCRJTTLAJElNMsAk\nSU0ywCRJTTLAJElNMsAkSU0ywCRJTTLAJElNMsAkSU0ywCRJTTLAJElN2nq+C5AkbRkzK8/tve6G\nVQdPsZLJsAcmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklq0sgAS7Jb\nkm8luSbJ1Une0y3fIcn5Sa7vfj6pW54kH0+yPsmVSfae9pOQJC09fXpg9wJ/U1V7APsCRyXZA1gJ\nrK6q3YHV3TzAK4Hdu9sK4MSJVy1JWvJGBlhV3VJVl3bTdwLXArsChwCndqudChzaTR8CnFYDFwPb\nJ9ll4pVLkpa0sT4DSzID7AX8N7BzVd3S3fUTYOduelfgpqFmN3fLHvxYK5KsSbJm06ZNY5YtSVrq\negdYku2ALwHvrapfDN9XVQXUOBuuqpOqanlVLV+2bNk4TSVJ6hdgSbZhEF6nV9WXu8W3bh4a7H7e\n1i3fCOw21Pyp3TJJkiamz1mIAT4DXFtV/zR01znAkd30kcDZQ8uP6M5G3Be4Y2ioUZKkiejzDy1f\nBLwZuCrJ5d2yvwNWAWcmeRtwI3B4d995wEHAeuBu4K0TrViSJHoEWFV9B8gj3H3Aw6xfwFFzrEuS\npN/JK3FIkprUZwhRkrSAzKw8t/e6G1YdPMVK5pc9MElSkwwwSVKTHEKUpHniUODc2AOTJDXJAJMk\nNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJ\nq9FL0gR4Zfktzx6YJKlJBpgkqUkOIUrSEIcC22EPTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS\n1CQDTJLUJANMktQkv8gsaVHyC8mLnwEmaUEziPRIHEKUJDXJAJMkNckAkyQ1yQCTJDXJAJMkNcmz\nECVtMZ5RqEmyByZJapIBJklqkgEmSWqSASZJapIBJklq0sgAS3JyktuSrBtadlySjUku724HDd13\nbJL1Sa5L8mfTKlyStLT16YGdAhz4MMs/VlV7drfzAJLsAbwOeHbX5hNJtppUsZIkbTYywKrqQuBn\nPR/vEOALVfXrqroBWA/sM4f6JEl6WHP5DOzoJFd2Q4xP6pbtCtw0tM7N3TJJkiZqtgF2IvAsYE/g\nFuAfx32AJCuSrEmyZtOmTbMsQ5K0VM0qwKrq1qq6r6ruBz7Fb4cJNwK7Da361G7Zwz3GSVW1vKqW\nL1u2bDZlSJKWsFkFWJJdhmZfA2w+Q/Ec4HVJHp3kGcDuwA/mVqIkSQ818mK+ST4P7A/slORm4IPA\n/kn2BArYALwDoKquTnImcA1wL3BUVd03ndIlSUvZyACrqtc/zOLP/I71TwBOmEtRkiSN4r9TkTQ2\n/y2KFgIvJSVJapIBJklqkgEmSWqSASZJapIncUhLmCdjqGX2wCRJTTLAJElNMsAkSU3yMzBpkfDz\nLC01Bpi0wBhEUj8GmDQlBpE0XX4GJklqkgEmSWqSASZJapIBJklqkidxSD14Qoa08NgDkyQ1yQCT\nJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNcmL+WpJ\n8aK80uJhD0yS1CR7YGqSPSlJ9sAkSU0ywCRJTTLAJElNMsAkSU0ywCRJTTLAJElN8jR6zStPh5c0\nWwaYHmK2oWIYSdqSHEKUJDXJAJMkNckAkyQ1aWSAJTk5yW1J1g0t2yHJ+Umu734+qVueJB9Psj7J\nlUn2nmbxkqSlq89JHKcA/wKcNrRsJbC6qlYlWdnN/y3wSmD37vYC4MTup+aBJ1VIWsxG9sCq6kLg\nZw9afAhwajd9KnDo0PLTauBiYPsku0yqWEmSNpvtZ2A7V9Ut3fRPgJ276V2Bm4bWu7lbJknSRM35\nJI6qKqDGbZdkRZI1SdZs2rRprmVIkpaY2X6R+dYku1TVLd0Q4W3d8o3AbkPrPbVb9hBVdRJwEsDy\n5cvHDsClxs+zJOmBZtsDOwc4sps+Ejh7aPkR3dmI+wJ3DA01SpI0MSN7YEk+D+wP7JTkZuCDwCrg\nzCRvA24EDu9WPw84CFgP3A28dQo1S5I0OsCq6vWPcNcBD7NuAUfNtShJkkbxShySpCYZYJKkJhlg\nkqQmGWCSpCb5Dy23ML/PJUmTYQ9MktQkA0yS1CQDTJLUJD8DmyU/y5Kk+WWAYRhJUoscQpQkNckA\nkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMk\nNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNWnr+S5gkmZWntt73Q2rDp5iJZKkabMHJklq\nkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIB\nJklq0pyuRp9kA3AncB9wb1UtT7IDcAYwA2wADq+qn8+tTEmSHmgSPbCXVNWeVbW8m18JrK6q3YHV\n3bwkSRM1jSHEQ4BTu+lTgUOnsA1J0hI31wAr4JtJ1iZZ0S3buapu6aZ/Auw8x21IkvQQc/2PzC+u\nqo1Jngycn+SHw3dWVSWph2vYBd4KgKc97WlzLEOStNTMqQdWVRu7n7cBZwH7ALcm2QWg+3nbI7Q9\nqaqWV9XyZcuWzaUMSdISNOsAS7JtksdvngZeAawDzgGO7FY7Ejh7rkVKkvRgcxlC3Bk4K8nmx/lc\nVX09ySXAmUneBtwIHD73MiVJeqBZB1hV/Rh47sMsvx04YC5FSZI0ilfikCQ1yQCTJDXJAJMkNckA\nkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMk\nNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJ\nAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCT\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEdxJREFUeJzt3X2sZHV9x/H3R6A+gIrAShHBq5a0xRoBV8QqCYpaBA2Y\nIvURNJrVClHbYrrUGgmRZK22pqaVikqAigpWESz4QBYr+EBll8cFRLayFDYIK1oEicrDt3/M2XaA\nhTlz78ze+9v7fiWTe86Z85vzvefOzOf8fnPm3FQVkiS15jHzXYAkSbNhgEmSmmSASZKaZIBJkppk\ngEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkpq09XwXALDTTjvVzMzMfJchSVoAVq9e/bOqWjJq\nvQURYDMzM6xatWq+y5AkLQBJbuqznkOIkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQm\nGWCSpCYZYJKkJhlgkqQmLYhLSUmSFqaZ5ef1XnfdikOmWMnD2QOTJDXJAJMkNckAkyQ1yQCTJDXJ\nAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCT\nJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1aev5LkCStHnMLD+v97rr\nVhwyxUomwx6YJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSSMDLMlu\nSb6d5Nok1yR5b7d8hyQXJLmh+/mUbnmSfCLJ2iRXJdln2r+EJGnx6dMDuw/4q6raE9gPODrJnsBy\nYGVV7QGs7OYBXgXs0d2WASdNvGpJ0qI3MsCq6taquqybvgu4DtgVOBQ4rVvtNOCwbvpQ4PQauATY\nPskuE69ckrSojfUZWJIZYG/gP4Gdq+rW7q6fAjt307sCNw81u6Vb9tDHWpZkVZJVGzZsGLNsSdJi\n1zvAkmwHfBl4X1X9cvi+qiqgxtlwVZ1cVUuraumSJUvGaSpJUr8AS7INg/A6o6q+0i2+bePQYPfz\n9m75emC3oeZP75ZJkjQxfc5CDPBZ4Lqq+oehu84FjuqmjwLOGVp+ZHc24n7AnUNDjZIkTUSff2j5\nYuAtwNVJruiW/Q2wAjgryduBm4AjuvvOBw4G1gL3AG+baMWSJNEjwKrqu0Ae4e4DN7F+AUfPsS5J\nkh6VV+KQJDWpzxCiJGkBmVl+Xu911604ZIqVzC97YJKkJhlgkqQmOYQoSfPEocC5sQcmSWqSASZJ\napIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqS\nV6OXpAnwyvKbnz0wSVKTDDBJUpMcQpSkIQ4FtsMemCSpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgk\nqUkGmCSpSQaYJKlJfpFZ0hbJLyRv+QwwSQuaQaRH4hCiJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUme\nhShps/GMQk2SPTBJUpMMMElSkwwwSVKTDDBJUpMMMElSk0YGWJJTktyeZM3QsuOTrE9yRXc7eOi+\n45KsTXJ9kj+ZVuGSpMWtTw/sVOCgTSz/eFXt1d3OB0iyJ/B64Dldm08m2WpSxUqStNHIAKuqi4Cf\n93y8Q4EvVtVvqupGYC2w7xzqkyRpk+byGdgxSa7qhhif0i3bFbh5aJ1bumWSJE3UbAPsJODZwF7A\nrcDfj/sASZYlWZVk1YYNG2ZZhiRpsZpVgFXVbVV1f1U9AHya/x8mXA/sNrTq07tlm3qMk6tqaVUt\nXbJkyWzKkCQtYrMKsCS7DM2+Fth4huK5wOuTPDbJM4E9gB/OrURJkh5u5MV8k3wBOADYKcktwIeA\nA5LsBRSwDngnQFVdk+Qs4FrgPuDoqrp/OqVLkhazkQFWVW/YxOLPPsr6JwInzqUoSZJG8d+pSBqb\n/xZFC4GXkpIkNckAkyQ1yQCTJDXJAJMkNcmTOKRFzJMx1DJ7YJKkJhlgkqQmGWCSpCb5GZi0hfDz\nLC02Bpi0wBhEUj8GmDQlBpE0XX4GJklqkgEmSWqSASZJapIBJklqkidxSD14Qoa08NgDkyQ1yQCT\nJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNcmL+WpR\n8aK80pbDHpgkqUn2wNQke1KS7IFJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKa5Gn0mleeDi9p\ntgwwPcxsQ8UwkrQ5OYQoSWqSASZJapIBJklq0sgAS3JKktuTrBlatkOSC5Lc0P18Src8ST6RZG2S\nq5LsM83iJUmLV5+TOE4F/gk4fWjZcmBlVa1Isryb/2vgVcAe3e2FwEndT80DT6qQtCUb2QOrqouA\nnz9k8aHAad30acBhQ8tPr4FLgO2T7DKpYiVJ2mi2n4HtXFW3dtM/BXbupncFbh5a75ZumSRJEzXn\nkziqqoAat12SZUlWJVm1YcOGuZYhSVpkZvtF5tuS7FJVt3ZDhLd3y9cDuw2t9/Ru2cNU1cnAyQBL\nly4dOwAXGz/PkqQHm20P7FzgqG76KOCcoeVHdmcj7gfcOTTUKEnSxIzsgSX5AnAAsFOSW4APASuA\ns5K8HbgJOKJb/XzgYGAtcA/wtinULEnS6ACrqjc8wl0HbmLdAo6ea1GSJI3ilTgkSU0ywCRJTTLA\nJElNMsAkSU3yH1puZn6fS5Imwx6YJKlJBpgkqUkGmCSpSX4GNkt+liVJ88sAwzCSpBY5hChJapIB\nJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJ\napIBJklqkgEmSWqSASZJapIBJklqkgEmSWqSASZJatLW813AJM0sP6/3uutWHDLFSiRJ02YPTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUpDldjT7JOuAu4H7gvqpammQH4ExgBlgHHFFVv5hbmZIkPdgkemAvraq9qmppN78cWFlVewAr\nu3lJkiZqGkOIhwKnddOnAYdNYRuSpEVurgFWwLeSrE6yrFu2c1Xd2k3/FNh5jtuQJOlh5vofmV9S\nVeuTPBW4IMmPhu+sqkpSm2rYBd4ygN13332OZUiSFps59cCqan3383bgbGBf4LYkuwB0P29/hLYn\nV9XSqlq6ZMmSuZQhSVqEZh1gSbZN8sSN08ArgTXAucBR3WpHAefMtUhJkh5qLkOIOwNnJ9n4OJ+v\nqm8kuRQ4K8nbgZuAI+ZepiRJDzbrAKuqnwDP28TyO4AD51KUJEmjeCUOSVKTDDBJUpMMMElSkwww\nSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElS\nkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJ\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -223,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -232,7 +232,7 @@ "('eeleeyceelalas', -5541.802272494437)" ] }, - "execution_count": 21, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -244,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -253,7 +253,7 @@ "'kntkiesbasvimofaaaditudsnkwogowixewhixemlzsbustdibooepfsvlanruhqaotimkwldwpuhqoeebcybhuetoeoaptvrbketuuotfrtupuohedtshrscueqfyhbralnrzsoapewwfueioswntbiyxypepxtewwhriynzhdawtehhmntexsadnlrnvuoatfylnakjadhisdidzonlisrskaaeedqanlwtiequileqogpoycnnmhdaucpvnhkpocgihcprcoatwwdfvsefarcvitzieeuithmyyonvwhfywlndbackmrwzdhfehmqtvhefctasgayaicnonhadotoetnmcocaiauwlsishmzxfkiaaattsievcroeiytnswreuicxvlsjvefhoadkyyhlrawwtfrivkympoeadyrwoeptysiavqihtwvitoqmouddatvrtffqrbvieyhmnhosepmshehhddeioodvrubirltnlvytdirrhuakgufosemiqcwhcwwuchimbmqdslswxlsitrulkqhitzhacsaaownxrfrxierodwesrbcsennaesettilpfliawfnotmkkekupgyzsnpgjpuhwyqbyoinawrkamujsvffiocdbfbwtapbdaxeepfclsrwhhcdxqyuyksimnhvcbxmkbeepwgpcqlqrxotbkemyngbmtocadyjnmiadrbwobotachilwtrskqwaxvphpgklnsckdycvphpaktflcgwprrkpukapfpfgparpqsmvkipggycutsnagalcjmzgqjvevkxnddhghtmdtegoigncqygycaiecazhpprksuaqsvqdigncnyionlunrnxeadbcznbowjgketexggfnfzxwvkikwdfqrjbegrkhggaxbyroapxngjvanrrrgabjlrflipbcupmymngpptrijwzyfznwgtcpwtwgusoadpxrphxhpvnssjppspcbghbugfbvnphskhihwpnqminwinwbalqiclbocacbptiengrqotxniunzsxadvqguxapvguhtaqafrkbpdaqhexytvrhaukwbfchkjvhcgoqnwbjsjgasebzxjhgvehslaibkbkuejukbemzjenvajpppuuluphhjhywnjtqvvxdhelgorotbtahlhgspoorpszapieajbeotsbtfcpuqobrxpaattaeilxwdiwcbrhrgobcovoonuothsdmcmfmenzwrdfwlaagvsehptihofehaqybotkihlhshcibsowtzrtpcooablybhrqxeiiilwygkqthhxttossdjqrqdikagiqffntqcuttzcertennkebrecqhssismibyyfcawwflbecspjdhilnieooecdirvfiandicmlicaldmoonjeirwevejkftrbxttcnasesmbmsbcwizacsbjcgsiacsavecnzpscunaxieycnrpmosaapdtefknrsfliauaitlsddeptgaohkcaoctcuagkbabwaawvtghqbzotikpiphtiemrvsysarnnsmrmmqvgtsjrdwvduitqwhhaetpsotoapjzgsilsanjrpslgdhtmoittoashztyfhdsgcaotaodkdofeptuabigowcyfrdpsrthparqrobponvrtzmanvfrbenageesooomckiidwjedscasweistgacktrlstdyqbenetnsbcesmcrgrhedfcwyetagybgenrnrwfeoqbshrtnbcrhaaeirkgntenweryigdsfwcfiorppupwtfaghfvlflxxgxmgxayywcaftcrjodkcmzoyoqgcnjzybtixwgaakuglxslcyxoovdxltfaewimzsarqpieskemwyefmpfiltaxwmxikoirscbbsxpvtnuojgwiifgqyqinrfhzslnzabnoluizsfmcecvtdbwbrwoamrntsoeipbxconrhcvgxppvmkgayqwufevzddlyoseivbtflpmcmfonbgvhvzxzviibtturhuzamzisnvbhgfjmwovylqcvcavatnguhwbguvqgsccmzlgpqalfbdrgrytdlewwffdseytcwetfbaxdiafyjpgfndgcivoirqpiizfqtpuyvgaliisjhlwsaciglaxojwmeibuksrgsluygldxhnivrgctyzlhlwchvdswgdufziepiwjaergpztwhlawmjccjcdceltczhvvliolioklinmtyfsfvywrksvoptqcsreaxyusxhescijtsrcfjkfgonvsspbkgojwtloanvcebcgbulienvnuongesckvxypgbchazdjcftmdixwmcgsbayytheituytyspwhwyayaxvjwrrghiwzcprwvnrbiytidwegtivhsfscevttupaipbchxuhhxthiaitlrucxovrgyvadvtcuvhevufepfnvciumuemjthedisjjwwkolpwneeulxibpxdcxgehsrpstfftghdevpohzxigjbhhwagqiezpgmrsuocebgeibtwyxbhhtxepusmpwbqyoyhhshhtbpjhytslxmugmaatvomjsvcnrvhauitumkdzsvaaolapspizdotirtieoiauiursdatferyhtimacajgfhlalliygdeoemngtascdrgtdutvsgbaydrnyilbpyskoskailitsvixeplnshtfxjwysyondsnixiiutlcgruhahwlvsdkcbgveeivdhfreotpruzntzwxlyqtlhbrktepvgnvdrthxagiuccrbiurywhggdszhiugdrstlfpahyiduljefitqvolhdibmeauwgrdrtdtwuxqepibnpraoavuzeevpggkhvvtjukkeolxhornldcnhslxnakutryrximkoshbftsiylhsehivdmyjdaphinixuspxrtaclpvnemhulirgiuvtscxugaannpravqgpjgcnhacubhrootjxfpuveijlyisavzajhrpehbpplhnjllaehttncdshkfbaardtzywjnbcvznnvthmupmianjlaccdsbcawdukiyztjeauqcyesczculvaqzfrpsmgexgleuonncbtlhfhquxsaunquevndavcxtebbehbkcknldwtejjlpgtnfnmpxlsumraivtinnpiveohmzchgvyczshmmcdhovczqrclchpsskittrimriteomphsdvzgbhsttsnclrautncuxalpycztyuejfaiafubuabbqumcuquofmcftzqywjdxlhpqcwsozzxevywrfgfperviyclyknvjrodjfuirsveeumcpehqbbpurntjujapkyvlgvxonpndhrhwuhfvbihtouaiwfxlrziatbgbholoylzbiihnugyakkrmrhlindychsppkblpruhfzpywlfjsmhmceewrymyvsnggxtroydhusqfxghxmsooqatvukimvlsdjwspuagnnmlmhsvgpmehwflybsithhcurtwvydyhcwmzcpeucuyrhrieiwylfhrznlnzsiubcvostwncaqau'" ] }, - "execution_count": 22, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -264,7 +264,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -279,7 +279,7 @@ "data": { "image/png": "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\ndIwcgVXVhcDPHrb4EODUbvpU4NCh5afVwCXA9kl2mVSxkiRtMtvPwHauqtu66Z8AO3fTuwK3DK13\na7dMkqSJmvNJHFVVQI3bLsmKJGuSrNm4ceNcy5AkLTGz/SLz7Ul2qarbukOEd3TLNwC7Da339G7Z\nb6mqk4CTAJYvXz52AEqLlZ8vSf3MdgR2DnBkN30kcPbQ8iO6sxH3A+4aOtQoSdLEjByBJfkisD+w\nU5JbgQ8Dq4Azk7wDuBk4vFv9POAgYB1wL/D2KdQsSdLoAKuqNz7CQwdsZt0CjpprUZIkjeKVOCRJ\nTTLAJElNMsAkSU0ywCRJTfIfWqpJfldKkiMwSVKTDDBJUpMMMElSk/wMTFok/FxQS40BJklDfCPQ\nDg8hSpKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppk\ngEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKatPV8F7AQzKw8t/e661cdPMVK\nJEl9OQKTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMk\nNckAkyQ1yQCTJDVpTlejT7IeuBt4ALi/qpYn2QE4A5gB1gOHV9XP51amJEkPNYkR2Muqaq+qWt7N\nrwRWV9UewOpuXpKkiZrGIcRDgFO76VOBQ6fQhyRpiZtrgBXwrSSXJVnRLdu5qm7rpn8C7DzHPiRJ\n+i1z/Y/ML6mqDUmeApyf5IfDD1ZVJanNNewCbwXA7rvvPscyJElLzZxGYFW1obu/AzgL2Be4Pcku\nAN39HY/Q9qSqWl5Vy5ctWzaXMiRJS9CsAyzJtkmesGkaeBWwFjgHOLJb7Ujg7LkWKUnSw83lEOLO\nwFlJNj3PF6rqG0kuBc5M8g7gZuDwuZcpSdJDzTrAqurHwPM2s/xO4IC5FCVJ0iheiUOS1CQDTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS\n1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQk\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -293,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -308,7 +308,7 @@ "data": { "image/png": "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\nqnqqqp4GzgYOm6tTVa2sqtmqmp2ZmZlAGZKkxWQSAXY8Q4cPk+w/dN9bgXUTGEOSpM2MdQgxye7A\nG4D3DDX/UZLlDA4h3rXFfZIkTcRYAVZVPwT22aLtnWNVJElSD16JQ5LUJANMktQkA0yS1CQDTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KRdx32AJHcBjwBPAU9W1WySvYELgaXAXcCxVfWD\ncceSJGmTSc3AfrmqllfVbLd+GrCqqpYBq7p1SZImZlqHEI8BzuuWzwPeMqVxJEmL1CQCrIAvJVmT\nZEXXtl9VbeiWvwfsN4FxJEn6Z2P/DQx4bVWtT/I84IoktwzfWVWVpLbs1IXdCoAlS5ZMoAxJ0mIy\n9gysqtZ3X+8DLgEOAzYm2R+g+3rfHP1WVtVsVc3OzMyMW4YkaZEZK8CS7J5kz03LwK8A64DLgBO7\nzU4ELh1nHEmStjTuIcT9gEuSbHqsv6qqv0/yLeCiJO8G7gaOHXMcSZI2M1aAVdV3gZfP0f4AcOQ4\njy1J0tZ4JQ5JUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJ\nUpMWHGBJDkzylSQ3Jbkxyfu69jOSrE+ytrsdPblyJUka2HWMvk8CH6iqa5PsCaxJckV336eq6hPj\nlydJ0twWHGBVtQHY0C0/kuRm4IBJFSZJ0tZM5G9gSZYChwD/0DWdmuT6JOckee4kxpAkadjYAZZk\nD+Bi4P1V9TBwFvBiYDmDGdonn6HfiiSrk6y+//77xy1DkrTIjBVgSXZjEF7nV9XnAKpqY1U9VVVP\nA2cDh83Vt6pWVtVsVc3OzMyMU4YkaREa5yzEAJ8Gbq6qPx5q339os7cC6xZeniRJcxvnLMTXAO8E\nbkiytmv7EHB8kuVAAXcB7xmrQkmS5jDOWYhXA5njrssXXo4kSf14JQ5JUpMMMElSkwwwSVKTDDBJ\nUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKT\n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\nQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -322,7 +322,7 @@ }, { "cell_type": "code", - "execution_count": 203, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -337,7 +337,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE/9JREFUeJzt3X+wXGV9x/H3R4wFRUXgShGMV6ujpe0Y6jXVYmcsSoeK\nVpzSH9YfOLUTbWXUtlrBtlNqdQarLfWP1jYKJW2pgj8oVrTKABZRiyYQICEqVGKFQRJ/oKBTNPDt\nH3tiL5CwZ/fu5j7Jvl8zO/ecs+e5zzcn597PPmefezZVhSRJrXrQchcgSdIDMagkSU0zqCRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNe/Ce7OzQQw+t+fn5PdmlJKlRGzZs+EZV\nzQ3bb48G1fz8POvXr9+TXUqSGpXkq33289KfJKlpBpUkqWkGlSSpaQaVJKlpBpUkqWkGlSSpab2D\nKsl+Sa5O8tFu/fFJrkxyY5LzkjxkemVKkmbVKCOq1wFbFq2/HTizqp4IfBt45SQLkyQJegZVkiOB\nE4D3dusBjgU+2O2yDjhxGgVKkmZb3xHV3wB/BNzTrR8C3F5VO7r1m4EjJlybJEnDb6GU5PnAtqra\nkOTZo3aQZA2wBmDlypUjFyjtKfOnXtR7361nnDDFSiQt1mdEdQzwK0m2Au9ncMnvXcBBSXYG3ZHA\nLbtqXFVrq2qhqhbm5obee1CSpHsZGlRVdVpVHVlV88BvApdW1UuAy4CTut1OBi6cWpWSpJm1lL+j\nehPwB0luZPCe1VmTKUmSpP830sd8VNWngE91y18BVk++JEmS/p93ppAkNc2gkiQ1zaCSJDXNoJIk\nNc2gkiQ1zaCSJDXNoJIkNW2kv6PSdHmvOUm6P0dUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKk\nphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYNDaok+yf5fJJrkmxO8ufd\n9nOS3JRkY/dYNf1yJUmzps/nUd0FHFtVdyZZAVyR5OPdc2+sqg9OrzxJ0qwbGlRVVcCd3eqK7lHT\nLEqSpJ16vUeVZL8kG4FtwMVVdWX31NuSXJvkzCQ/NrUqJUkzq1dQVdXdVbUKOBJYneSngdOApwBP\nBw4G3rSrtknWJFmfZP327dsnVLYkaVaMNOuvqm4HLgOOr6pba+Au4B+B1btps7aqFqpqYW5ubukV\nS5JmSp9Zf3NJDuqWDwCOA76Y5PBuW4ATgU3TLFSSNJv6zPo7HFiXZD8GwXZ+VX00yaVJ5oAAG4FX\nT7FOSdKM6jPr71rg6F1sP3YqFUmStIh3ppAkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIk\nNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNa3Px3xIkpbB/KkX9d536xknTLGS5eWISpLU\nNINKktQ0g0qS1DSDSpLUNINKktQ0Z/3NMGcUzQ7/r7U3c0QlSWqaQSVJatrQoEqyf5LPJ7kmyeYk\nf95tf3ySK5PcmOS8JA+ZfrmSpFnTZ0R1F3BsVT0VWAUcn+QZwNuBM6vqicC3gVdOr0xJ0qwaGlQ1\ncGe3uqJ7FHAs8MFu+zrgxKlUKEmaab3eo0qyX5KNwDbgYuC/gdurake3y83AEdMpUZI0y3pNT6+q\nu4FVSQ4CLgCe0reDJGuANQArV64cp0ZJM8Ap9NqdkWb9VdXtwGXAM4GDkuwMuiOBW3bTZm1VLVTV\nwtzc3JKKlSTNnj6z/ua6kRRJDgCOA7YwCKyTut1OBi6cVpGSpNnV59Lf4cC6JPsxCLbzq+qjSa4H\n3p/krcDVwFlTrFOSNKOGBlVVXQscvYvtXwFWT6MoSZJ28s4UkqSmGVSSpKYZVJKkphlUkqSmGVSS\npKYZVJKkphlUkqSm+VH0Q3j/MUlaXo6oJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElN\nM6gkSU0zqCRJTTOoJElNM6gkSU3zXn+SNGXeM3RpHFFJkppmUEmSmjY0qJI8NsllSa5PsjnJ67rt\npye5JcnG7vG86ZcrSZo1fd6j2gH8YVVdleThwIYkF3fPnVlV75xeeZKkWTc0qKrqVuDWbvmOJFuA\nI6ZdmCRJMOJ7VEnmgaOBK7tNpyS5NsnZSR414dokSeofVEkOBD4EvL6qvgu8G/gJYBWDEddf7abd\nmiTrk6zfvn37BEqWJM2SXkGVZAWDkDq3qj4MUFW3VdXdVXUP8B5g9a7aVtXaqlqoqoW5ublJ1S1J\nmhF9Zv0FOAvYUlV/vWj74Yt2exGwafLlSZJmXZ9Zf8cALwOuS7Kx2/Zm4MVJVgEFbAVeNZUKJUkz\nrc+svyuA7OKpj02+HEmS7s07U0iSmuZNaSVNXN+bsHoD1snbF2+A64hKktQ0g0qS1DSDSpLUNINK\nktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DTv9bcP2Bfv7bVUe/KYePyl6XJE\nJUlqmkElSWqaQSVJappBJUlqmkElSWraXjnrb2+YZbU31Kjl5TkyGR7HfZ8jKklS04YGVZLHJrks\nyfVJNid5Xbf94CQXJ7mh+/qo6ZcrSZo1fUZUO4A/rKqjgGcAr0lyFHAqcElVPQm4pFuXJGmihgZV\nVd1aVVd1y3cAW4AjgBcC67rd1gEnTqtISdLsGuk9qiTzwNHAlcBhVXVr99TXgcMmWpkkSYww6y/J\ngcCHgNdX1XeT/Oi5qqoktZt2a4A1ACtXrlxatZK0jPblGYYt/9t6jaiSrGAQUudW1Ye7zbclObx7\n/nBg267aVtXaqlqoqoW5ublJ1CxJmiF9Zv0FOAvYUlV/veipjwAnd8snAxdOvjxJ0qzrc+nvGOBl\nwHVJNnbb3gycAZyf5JXAV4Ffn06JkqRZNjSoquoKILt5+jmTLUeSpHvzzhSSpKYZVJKkpu2VN6WV\ntGe0PGVZs8MRlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpzvrTyPrOBHMWmKRJcEQlSWqaQSVJappB\nJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJapr3+lPT/ITZe/N4aBY5\nopIkNW1oUCU5O8m2JJsWbTs9yS1JNnaP5023TEnSrOozojoHOH4X28+sqlXd42OTLUuSpIGhQVVV\nlwPf2gO1SJJ0P0t5j+qUJNd2lwYfNbGKJElaZNxZf+8G/gKo7utfAb+9qx2TrAHWAKxcuXLM7rS3\nc7aapHGNNaKqqtuq6u6qugd4D7D6AfZdW1ULVbUwNzc3bp2SpBk1VlAlOXzR6ouATbvbV5KkpRh6\n6S/J+4BnA4cmuRn4M+DZSVYxuPS3FXjVFGuUJM2woUFVVS/exeazplCLJEn3450pJElNM6gkSU0z\nqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gk\nSU0b96PoJWmvNn/qRb333XrGCVOsRMM4opIkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIk\nNW1oUCU5O8m2JJsWbTs4ycVJbui+Pmq6ZUqSZlWfEdU5wPH32XYqcElVPQm4pFuXJGnihgZVVV0O\nfOs+m18IrOuW1wEnTrguSZKA8d+jOqyqbu2Wvw4cNqF6JEm6lyVPpqiqAmp3zydZk2R9kvXbt29f\naneSpBkzblDdluRwgO7rtt3tWFVrq2qhqhbm5ubG7E6SNKvGDaqPACd3yycDF06mHEmS7q3P9PT3\nAZ8Dnpzk5iSvBM4AjktyA/Dcbl2SpIkb+nlUVfXi3Tz1nAnXIknS/XhnCklS0wwqSVLTDCpJUtMM\nKklS0wwqSVLTDCpJUtMMKklS04b+HdW+Yv7Ui3rvu/WME6ZYiSRpFI6oJElNM6gkSU0zqCRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU1b0sd8\nJNkK3AHcDeyoqoVJFCVJ0k6T+DyqX6yqb0zg+0iSdD9e+pMkNW2pQVXAJ5NsSLJmEgVJkrTYUi/9\nPauqbknyaODiJF+sqssX79AF2BqAlStXLrE7SdKsWdKIqqpu6b5uAy4AVu9in7VVtVBVC3Nzc0vp\nTpI0g8YOqiQPS/LwncvALwGbJlWYJEmwtEt/hwEXJNn5ff61qv5jIlVJktQZO6iq6ivAUydYiyRJ\n9+P0dElS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLT\nDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS05YU\nVEmOT/KlJDcmOXVSRUmStNPYQZVkP+BvgV8GjgJenOSoSRUmSRIsbUS1Grixqr5SVT8A3g+8cDJl\nSZI0sJSgOgL42qL1m7ttkiRNTKpqvIbJScDxVfU73frLgJ+rqlPus98aYE23+mTgS+OX+4AOBb7R\neDtrnEy7vaHGcdtZ42TaWePyt+vjcVU1N3SvqhrrATwT+MSi9dOA08b9fkt9AOtbb2eNs1Pjvvxv\ns8bZqXEp7Sb5WMqlvy8AT0ry+CQPAX4T+MgSvp8kSffz4HEbVtWOJKcAnwD2A86uqs0Tq0ySJJYQ\nVABV9THgYxOqZanW7gXtrHEy7faGGsdtZ42TaWeNy99uYsaeTCFJ0p7gLZQkSU2b2aBKMp9k0zL1\nfXqSN0y5j9cm2ZLk3Cn3M/ZxTPLZJfTbu+0Sa7xznHZaPkkOSvJ7y12HJmdmg2oG/B5wXFW9ZLkL\n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\nqCRJTfs/nrh65z2bgeIAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -351,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -364,9 +364,9 @@ }, { "data": { - "image/png": "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\nSWrNoJIktfZ/P0g7wO6fxMgAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaQAAAEmCAYAAAAtNOTmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEe5JREFUeJzt3XuQZGV9xvHv4y6GqxJhTOJlHE0sEmNK0dGIaEpBLHS9\nJBWsoCJFKtbEKKImmlrKWBJKq9ZoJfGPXFwJ0QTEC4K39QIlKKCIsssiuywoyiIQI6JRuZRy++WP\nbqyRAvr00Gfmne3vp6pr++y877y/7j7dzznvOX0mVYUkSSvtQStdgCRJYCBJkhphIEmSmmAgSZKa\nYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKasLaPX7r//vvX3NxcH79akrSKbN68+caqmunS\ntpdAmpub4+KLL+7jV0uSVpEk13Rt65SdJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCZ0CKcmb\nkmxPsi3JaUl277swSdJ0GRlISR4JHAfMV9UTgTXAkX0XJkmaLl2n7NYCeyRZC+wJ/E9/JUmSptHI\nQKqq64H3AN8Dvg/8tKrO6rswSdJ0GXnpoCS/DrwUeCzwE+BjSY6qqlPu0W4BWACYnZ3toVRJ2vXM\nrd/Uue3ODetWrN9y6DJl9zzg6qr6YVXdDpwBPPOejapqY1XNV9X8zEyn6+hJkvRLXQLpe8AzkuyZ\nJMChwI5+y5IkTZsux5AuAk4HtgCXDfts7LkuSdKU6fTnJ6rq7cDbe65FkjTFvFKDJKkJBpIkqQkG\nkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIk\nqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJIwMpyQFJti66/SzJG5ej\nOEnS9Fg7qkFVXQk8GSDJGuB64Mye65IkTZlxp+wOBb5TVdf0UYwkaXqNG0hHAqf1UYgkabqNnLK7\nW5IHAy8Bjr+Pny8ACwCzs7MTKU6SHoi59Zs6t925Yd2K9dPAOHtILwC2VNUP7u2HVbWxquaran5m\nZmYy1UmSpsY4gfRynK6TJPWkUyAl2Qs4DDij33IkSdOq0zGkqroF2K/nWiRJU8wrNUiSmmAgSZKa\nYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAg\nSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmtApkJLsm+T0JFck2ZHk\noL4LkyRNl7Ud270X+HxVHZHkwcCePdYkSZpCIwMpyUOBPwKOAaiq24Db+i1LkjRtukzZPRb4IfCf\nSS5JclKSvXquS5I0ZbpM2a0FngK8vqouSvJeYD3wtsWNkiwACwCzs7OTrlNSY+bWb+rcdueGdSvW\nT6tHlz2k64Drquqi4fLpDALqV1TVxqqar6r5mZmZSdYoSZoCIwOpqv4XuDbJAcP/OhS4vNeqJElT\np+tZdq8HTh2eYfdd4M/7K0mSNI06BVJVbQXme65FkjTFvFKDJKkJBpIkqQkGkiSpCQaSJKkJBpIk\nqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJ\nBpIkqQkGkiSpCQaSJKkJBpIkqQkGkiSpCQaSJKkJa7s0SrITuAm4E7ijqub7LEqSNH06BdLQc6vq\nxt4qkSRNNafsJElN6BpIBZyVZHOShT4LkiRNp65Tds+qquuTPBw4O8kVVXXe4gbDoFoAmJ2dnXCZ\nkrqYW7+pc9udG9YtuY/Uh057SFV1/fDfG4AzgaffS5uNVTVfVfMzMzOTrVKStMsbGUhJ9kqyz933\ngecD2/ouTJI0XbpM2f0GcGaSu9t/qKo+32tVkqSpMzKQquq7wJOWoRZJ0hTztG9JUhMMJElSEwwk\nSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElS\nEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITOgdSkjVJLknymT4LkiRNp3H2kN4A\n7OirEEnSdOsUSEkeBawDTuq3HEnStOq6h/TPwN8Cd/VYiyRpiq0d1SDJi4AbqmpzkufcT7sFYAFg\ndnZ2YgVK92Vu/abObXduWLci/Za7Rmk167KHdDDwkiQ7gQ8DhyQ55Z6NqmpjVc1X1fzMzMyEy5Qk\n7epGBlJVHV9Vj6qqOeBI4JyqOqr3yiRJU8XvIUmSmjDyGNJiVfUl4Eu9VCJJmmruIUmSmmAgSZKa\nYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAg\nSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmmAgSZKaYCBJkppgIEmSmjAykJLsnuTrSS5Nsj3J\n3y9HYZKk6bK2Q5tfAIdU1c1JdgMuSPK5qvpaz7VJkqbIyECqqgJuHi7uNrxVn0VJkqZPp2NISdYk\n2QrcAJxdVRf1W5Ykadp0mbKjqu4EnpxkX+DMJE+sqm2L2yRZABYAZmdnJ16oltfc+k2d2+7csG7F\n+knadYx1ll1V/QQ4Fzj8Xn62sarmq2p+ZmZmUvVJkqZEl7PsZoZ7RiTZAzgMuKLvwiRJ06XLlN1v\nAR9MsoZBgH20qj7Tb1mSpGnT5Sy7bwIHLkMtkqQp5pUaJElNMJAkSU0wkCRJTTCQJElNMJAkSU0w\nkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNMJAk\nSU0wkCRJTTCQJElNMJAkSU0wkCRJTTCQJElNGBlISR6d5NwklyfZnuQNy1GYJGm6rO3Q5g7gb6pq\nS5J9gM1Jzq6qy3uuTZI0RUbuIVXV96tqy/D+TcAO4JF9FyZJmi5jHUNKMgccCFzURzGSpOnVZcoO\ngCR7Ax8H3lhVP7uXny8ACwCzs7MTK7Blc+s3dW67c8O6Fem31LEkabl12kNKshuDMDq1qs64tzZV\ntbGq5qtqfmZmZpI1SpKmQJez7AL8B7Cjqv6x/5IkSdOoyx7SwcCrgEOSbB3eXthzXZKkKTPyGFJV\nXQBkGWqRJE0xr9QgSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEk\nSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElqgoEkSWqCgSRJaoKBJElq\ngoEkSWrCyEBKcnKSG5JsW46CJEnTqcse0geAw3uuQ5I05UYGUlWdB/x4GWqRJE0xjyFJkpqwdlK/\nKMkCsAAwOzv7gH/f3PpNndvu3LBuxfpJkiZjYntIVbWxquaran5mZmZSv1aSNCWcspMkNaHLad+n\nARcCByS5Lslf9F+WJGnajDyGVFUvX45CJEnTzSk7SVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElS\nEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMMJElSEwwkSVITDCRJUhMM\n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\nAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -380,7 +380,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -389,7 +389,7 @@ "'etoainhsrdlumwycfgpbvkxjqz'" ] }, - "execution_count": 38, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -401,16 +401,16 @@ }, { "cell_type": "code", - "execution_count": 205, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'eglsmtapwcryfvxhkdziqnjoub'" + "'eglsmtapwcryfvxhkdizqnjoub'" ] }, - "execution_count": 205, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -422,7 +422,7 @@ }, { "cell_type": "code", - "execution_count": 206, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -436,7 +436,7 @@ " 'f': 'm',\n", " 'g': 't',\n", " 'h': 'c',\n", - " 'i': 'b',\n", + " 'i': 'p',\n", " 'j': 'x',\n", " 'k': 'f',\n", " 'l': 'o',\n", @@ -453,10 +453,10 @@ " 'w': 'r',\n", " 'x': 'y',\n", " 'y': 'u',\n", - " 'z': 'p'}" + " 'z': 'b'}" ] }, - "execution_count": 206, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -468,16 +468,16 @@ }, { "cell_type": "code", - "execution_count": 208, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'jlejidqmegwnitxeoectwucgkwrtfacizduoibeyolrmmryzfmapehmfpsolwaxqepnnidhsjhnaxqaseidvmombyitaehntlnjbeuuiwxweqhqtobjyrmnrtmezmvomdesongrphhejhxmbiiqhleznusdnsnzlthhalnumgojehltooykeesrejlssspuphemvslojkumoiggnglalrirsqjeoesgbelrhyttqunosvtfnpdtosvojhmdcplajniefiadhlqaeehhzcprsmolqpiegidtuiecyuvalthoghhsugihqjvdhgzxxbaiznkobvtyuqfexhndmalaeciwabekydtteneuqkrigcypsxjneeuwyrnetdxabndyoqhwsqndspsgkpdcoaogwuvosdehqwxwnwwuenasecrnhasseufietqimwhpnnpveaujcelywyvmzlnpisdofsoagehifobaocztiapgtlimidsyokpdegnlxouojfacarsinvqhokhhaeoiyzyvwrsghzxqiydqrfboiegouereojckswxdzidnacceglntrsllutrbennocxsnehgsayyfwedunldgvsnfqsmcjdqidatsehdfoiikrtxxtvtcimiroenicewtbnvdraxhoatcwaduxfgbelottmwjjmsehruntzsqspayifsivlfivyieecxxuihecdmhigayodabghydrjjueztsasujsurtbmdttsasajyvsteunwdfhqdenvnxelewhvgikjihffreuygkotastqvgeakpswwymccafoljcystpbultzdfreeisdoppnndjradqrtvjbultudiissuuluyrecitgogahqtweobzlfxocgzcwwbdhcvqwcgbfdfatuezidwidnzutqwalwdwfugksdmrbcmtmnvrjlfhselhkhfdxyshfedhrohfmraumnzdsaypnpurrclnrhditpmulxmnsnogfabphnuqvtshiurihgqiksmieetisebrlfdqalplimkfasectqfapenttmcoeqoxwbgncovaesdytwourjhimkcdkpatfialhixgxuersmgwoofteaageiijmbrbkmfieegkslpuonnhqmoinoakorulkevtwscossfinayinocgofgnainnrfhhbrekiba_lqmyvdhqbamdznudyyoenoshcnhtpnowljidtpapluiworjikiyvbughsmxhrhotkrbanytxaxscovvmaejimkoradnzfahegwlltaphiovmodqzdfiirrxtdqyaozlwarggqvxqcnjeefqxvkevquyegtdnybukwenwbkqovqirybiuvxtohhgkmbkahxwoirlidvabkgnlkxiolctevsndoowvaplkdfwhswsxdxydmzlwtloasaemvgmtqfgekaixqfrnetvdpbkkfsftuuezttdtulhitreoncltxjulgmgiemeilkrcjehnueaajtuvtykqotdmeiheuupylczzlaynjntloyneylkrdgewosrvdiyvkfygkwzupcmbevjooobykqayphhxlfrnsruskwhartwoyyailwaegcfnvxojrfhdayojjfwaxsnyadmiljcdvxwjnrswonolzltmnplpswgvoktmxmbuefdtrapjyddiijhkdmrtoacehryletbwwsgnjubmbubyoqmtsaydxfwabcgehdsnotvmfslwonhxsjzzfowelmhnoeoenldfleblqtwdntjay_htviaslnuhremafovpsgkzzlyytsedxhtucytdxpgdtvfadiaftuxfunyibhfudjulobagtdbaanmzsemoejivfresanisaweehdsxvkcisehbreziwaisqtmiabskylmakeuiivtzubildxoyqslfhiktsungrgjtbkwegnhmdhaujwleapehnmbtaonotttbscpvwferahuvetpwcsxardfpmemrsetvvalpbpotpbpkiiiyyanoufhyphrltmoeckvcjtugqtttendyllqarnfutqfvetvfolsbesvmcsbwdegrejhxvcrdhytceemnezjieghknlmugutitaisaninpvvonuxpfukiigxaojrekifxdzaqryehmuwrweqsuxtrgsolnpweeydfoaojtotcrqbcuvpnecihqebsbngeraoahvqttcectsoedloptsiikiawonkeydvrxnhhwwatjcyqkrwddzdmabcrrtnkyvntxqfvttlpgrnpifaqreotelttbpefmmonemplmaletrtwwbucfmkoeymktvnyghzhytfvgedxnaehyuxydvlhocuouazpqhwsboi_cpksxhpuwmthyijrstoiparxvebpenmsainitowroobnabaiyrwuhpapdtxwacpetunxbpmmssylpkiufrbvqnaewirqkhqiashruerusbimkpctbtscfwngyxgwfojetstogbifcgoochlvhbghfvsquakeitrimehdwgooeyssirvhhmjhadacgcpymhkorwrsbimteeeepaforpkkdwpeunyuficggwohtsehrntzcaebdnhbaneutrwrjhemrwdayifdteqtvcgesridembasiutoerkcwewcuewgtnedjwlrfsmhugftrjoistwrpnyssglrayxwohdgupkwrlnzitrysktdqpeocspvmjtitteripjoxstayhlmpmygczsraysazdfobntflnmwyayothutkwmtrwdccltwrgaiuemwreovsaodncuxobxnnzwtsojimfteuctdgxycehuwabnnzusxeaopuytbphtlfpppekubibaryajxlsjtlmqszuhwqowddzifiarazvnfidrordxipjixxwenailtpurhydnatshpldjourbdthupertwrfeokusxepzf_ncbtlahkqnowpaycpxnmwsbzsdnrenzekalhepmnhsooossoeanoltjrobcmeoljnldhqlmhygluweceunyieoosekdjanteccubfdgexshiqtxbrhzturwovlxwhrvetzfremjmltiysmcoqmyghilqmbpomepkyeenmbamjhilsjreezkshfyoclvhyraivwoiplfllhbtetovftoeydtfaaietcaaphzqwkokccrrwiylnivdbeetvnarcnzfmaaenfltrweawltmyoocdtfydatkxobomimuommjrvtmvmjyvtvygjhhkjyrccqtcrayzzbtuclyfxhbwnfdtruwkkkwpckgriwgwseivthbojgmnmlunzukonjrysftypkclcawoqroxtzncoauoihgpswfbonnfmaasihsgibncmufxejbnvwaonkwdtarnkimshlmcygnxhsgorvaikerhwxvdnqlflyeltdcaurjczfayyataqoypaiivtoggzhrhueeslvriaakfnyboqcsdiannpotmwyqydcxckregthbuhrdwalnehhdrxoszlsupgbimttarlultovoq+'" + "'jlejidqmegwnitxeoectwucgkwrtfacizduoipeyolrmmryzfmabehmfbsolwaxqebnnidhsjhnaxqaseidvmompyitaehntlnjpeuuiwxweqhqtopjyrmnrtmezmvomdesongrbhhejhxmpiiqhleznusdnsnzlthhalnumgojehltooykeesrejlsssbubhemvslojkumoiggnglalrirsqjeoesgpelrhyttqunosvtfnbdtosvojhmdcblajniefiadhlqaeehhzcbrsmolqbiegidtuiecyuvalthoghhsugihqjvdhgzxxpaiznkopvtyuqfexhndmalaeciwapekydtteneuqkrigcybsxjneeuwyrnetdxapndyoqhwsqndsbsgkbdcoaogwuvosdehqwxwnwwuenasecrnhasseufietqimwhbnnbveaujcelywyvmzlnbisdofsoagehifopaocztiabgtlimidsyokbdegnlxouojfacarsinvqhokhhaeoiyzyvwrsghzxqiydqrfpoiegouereojckswxdzidnacceglntrsllutrpennocxsnehgsayyfwedunldgvsnfqsmcjdqidatsehdfoiikrtxxtvtcimiroenicewtpnvdraxhoatcwaduxfgpelottmwjjmsehruntzsqsbayifsivlfivyieecxxuihecdmhigayodapghydrjjueztsasujsurtpmdttsasajyvsteunwdfhqdenvnxelewhvgikjihffreuygkotastqvgeakbswwymccafoljcystbpultzdfreeisdobbnndjradqrtvjpultudiissuuluyrecitgogahqtweopzlfxocgzcwwpdhcvqwcgpfdfatuezidwidnzutqwalwdwfugksdmrpcmtmnvrjlfhselhkhfdxyshfedhrohfmraumnzdsaybnburrclnrhditbmulxmnsnogfapbhnuqvtshiurihgqiksmieetiseprlfdqalblimkfasectqfabenttmcoeqoxwpgncovaesdytwourjhimkcdkbatfialhixgxuersmgwoofteaageiijmprpkmfieegkslbuonnhqmoinoakorulkevtwscossfinayinocgofgnainnrfhhprekipa_lqmyvdhqpamdznudyyoenoshcnhtbnowljidtbabluiworjikiyvpughsmxhrhotkrpanytxaxscovvmaejimkoradnzfahegwlltabhiovmodqzdfiirrxtdqyaozlwarggqvxqcnjeefqxvkevquyegtdnypukwenwpkqovqirypiuvxtohhgkmpkahxwoirlidvapkgnlkxiolctevsndoowvablkdfwhswsxdxydmzlwtloasaemvgmtqfgekaixqfrnetvdbpkkfsftuuezttdtulhitreoncltxjulgmgiemeilkrcjehnueaajtuvtykqotdmeiheuubylczzlaynjntloyneylkrdgewosrvdiyvkfygkwzubcmpevjooopykqaybhhxlfrnsruskwhartwoyyailwaegcfnvxojrfhdayojjfwaxsnyadmiljcdvxwjnrswonolzltmnblbswgvoktmxmpuefdtrabjyddiijhkdmrtoacehryletpwwsgnjupmpupyoqmtsaydxfwapcgehdsnotvmfslwonhxsjzzfowelmhnoeoenldfleplqtwdntjay_htviaslnuhremafovbsgkzzlyytsedxhtucytdxbgdtvfadiaftuxfunyiphfudjulopagtdpaanmzsemoejivfresanisaweehdsxvkcisehpreziwaisqtmiapskylmakeuiivtzupildxoyqslfhiktsungrgjtpkwegnhmdhaujwleabehnmptaonotttpscbvwferahuvetbwcsxardfbmemrsetvvalbpbotbpbkiiiyyanoufhybhrltmoeckvcjtugqtttendyllqarnfutqfvetvfolspesvmcspwdegrejhxvcrdhytceemnezjieghknlmugutitaisaninbvvonuxbfukiigxaojrekifxdzaqryehmuwrweqsuxtrgsolnbweeydfoaojtotcrqpcuvbnecihqepspngeraoahvqttcectsoedlobtsiikiawonkeydvrxnhhwwatjcyqkrwddzdmapcrrtnkyvntxqfvttlbgrnbifaqreotelttpbefmmonemblmaletrtwwpucfmkoeymktvnyghzhytfvgedxnaehyuxydvlhocuouazbqhwspoi_cbksxhbuwmthyijrstoibarxvepbenmsainitowroopnapaiyrwuhbabdtxwacbetunxpbmmssylbkiufrpvqnaewirqkhqiashrueruspimkbctptscfwngyxgwfojetstogpifcgoochlvhpghfvsquakeitrimehdwgooeyssirvhhmjhadacgcbymhkorwrspimteeeebaforbkkdwbeunyuficggwohtsehrntzcaepdnhpaneutrwrjhemrwdayifdteqtvcgesridempasiutoerkcwewcuewgtnedjwlrfsmhugftrjoistwrbnyssglrayxwohdgubkwrlnzitrysktdqbeocsbvmjtitteribjoxstayhlmbmygczsraysazdfopntflnmwyayothutkwmtrwdccltwrgaiuemwreovsaodncuxopxnnzwtsojimfteuctdgxycehuwapnnzusxeaobuytpbhtlfbbbekupiparyajxlsjtlmqszuhwqowddzifiarazvnfidrordxibjixxwenailtburhydnatshbldjourpdthubertwrfeokusxebzf_ncptlahkqnowbaycbxnmwspzsdnrenzekalhebmnhsooossoeanoltjropcmeoljnldhqlmhygluweceunyieoosekdjanteccupfdgexshiqtxprhzturwovlxwhrvetzfremjmltiysmcoqmyghilqmpbomebkyeenmpamjhilsjreezkshfyoclvhyraivwoiblfllhptetovftoeydtfaaietcaabhzqwkokccrrwiylnivdpeetvnarcnzfmaaenfltrweawltmyoocdtfydatkxopomimuommjrvtmvmjyvtvygjhhkjyrccqtcrayzzptuclyfxhpwnfdtruwkkkwbckgriwgwseivthpojgmnmlunzukonjrysftybkclcawoqroxtzncoauoihgbswfponnfmaasihsgipncmufxejpnvwaonkwdtarnkimshlmcygnxhsgorvaikerhwxvdnqlflyeltdcaurjczfayyataqoybaiivtoggzhrhueeslvriaakfnypoqcsdiannbotmwyqydcxckregthpuhrdwalnehhdrxoszlsubgpimttarlultovoq'" ] }, - "execution_count": 208, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -489,16 +489,16 @@ }, { "cell_type": "code", - "execution_count": 209, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1.0908179994726204" + "1.0911221874256245" ] }, - "execution_count": 209, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -509,7 +509,7 @@ }, { "cell_type": "code", - "execution_count": 210, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -518,7 +518,7 @@ "1.7308339625731206" ] }, - "execution_count": 210, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -529,42 +529,42 @@ }, { "cell_type": "code", - "execution_count": 211, + "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1 1.0908179994726204\n", - "2 1.099668497740292\n", - "3 1.1021653664156914\n", - "4 1.1105288756624214\n", - "5 1.1202834460110789\n", - "6 1.1272995211118115\n", - "7 1.144912989343247\n", - "8 1.132083994267313\n", - "9 1.13300581113018\n", - "10 1.1675967871496329\n", - "11 1.1458117729611275\n", - "12 1.1594351409944323\n", - "13 1.1568381391323794\n", - "14 1.1976214763656394\n", - "15 1.1789430872547393\n", - "16 1.1862470498847197\n", - "17 1.1937916983613972\n", - "18 1.1903491796283683\n", - "19 1.1953937134054176\n", - "20 1.2108314568679621\n", - "21 1.2178563307567305\n", - "22 1.1967669671915482\n", - "23 1.2228893244042363\n", - "24 1.22779954730535\n", - "25 1.2434971631996035\n", - "26 1.2277106603385646\n", - "27 1.2317044827920967\n", - "28 1.2727713048928173\n", - "29 1.2410834502022665\n" + "1 1.0911221874256245\n", + "2 1.0999811518557716\n", + "3 1.1024736687577428\n", + "4 1.1108493258214134\n", + "5 1.1205942838699368\n", + "6 1.1276162903349627\n", + "7 1.1452272001021975\n", + "8 1.132400627567293\n", + "9 1.1333184666730263\n", + "10 1.1679170525798583\n", + "11 1.14614572332707\n", + "12 1.1597512509602577\n", + "13 1.1571726175932888\n", + "14 1.197981087983724\n", + "15 1.1792859340799244\n", + "16 1.1865717812697065\n", + "17 1.1941252456748892\n", + "18 1.1906805858544067\n", + "19 1.1957146314520906\n", + "20 1.2111608276986638\n", + "21 1.218181311427732\n", + "22 1.1971143041278922\n", + "23 1.223217066658174\n", + "24 1.2281223302252005\n", + "25 1.2438359793130673\n", + "26 1.2280766730517558\n", + "27 1.232036081608544\n", + "28 1.273139026261631\n", + "29 1.2414832155367646\n" ] } ], @@ -575,44 +575,44 @@ }, { "cell_type": "code", - "execution_count": 212, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[(1, 1.0908179994726204),\n", - " (2, 1.099668497740292),\n", - " (3, 1.1021653664156914),\n", - " (4, 1.1105288756624214),\n", - " (5, 1.1202834460110789),\n", - " (6, 1.1272995211118115),\n", - " (8, 1.132083994267313),\n", - " (9, 1.13300581113018),\n", - " (7, 1.144912989343247),\n", - " (11, 1.1458117729611275),\n", - " (13, 1.1568381391323794),\n", - " (12, 1.1594351409944323),\n", - " (10, 1.1675967871496329),\n", - " (15, 1.1789430872547393),\n", - " (16, 1.1862470498847197),\n", - " (18, 1.1903491796283683),\n", - " (17, 1.1937916983613972),\n", - " (19, 1.1953937134054176),\n", - " (22, 1.1967669671915482),\n", - " (14, 1.1976214763656394),\n", - " (20, 1.2108314568679621),\n", - " (21, 1.2178563307567305),\n", - " (23, 1.2228893244042363),\n", - " (26, 1.2277106603385646),\n", - " (24, 1.22779954730535),\n", - " (27, 1.2317044827920967),\n", - " (29, 1.2410834502022665),\n", - " (25, 1.2434971631996035),\n", - " (28, 1.2727713048928173)]" + "[(1, 1.0911221874256245),\n", + " (2, 1.0999811518557716),\n", + " (3, 1.1024736687577428),\n", + " (4, 1.1108493258214134),\n", + " (5, 1.1205942838699368),\n", + " (6, 1.1276162903349627),\n", + " (8, 1.132400627567293),\n", + " (9, 1.1333184666730263),\n", + " (7, 1.1452272001021975),\n", + " (11, 1.14614572332707),\n", + " (13, 1.1571726175932888),\n", + " (12, 1.1597512509602577),\n", + " (10, 1.1679170525798583),\n", + " (15, 1.1792859340799244),\n", + " (16, 1.1865717812697065),\n", + " (18, 1.1906805858544067),\n", + " (17, 1.1941252456748892),\n", + " (19, 1.1957146314520906),\n", + " (22, 1.1971143041278922),\n", + " (14, 1.197981087983724),\n", + " (20, 1.2111608276986638),\n", + " (21, 1.218181311427732),\n", + " (23, 1.223217066658174),\n", + " (26, 1.2280766730517558),\n", + " (24, 1.2281223302252005),\n", + " (27, 1.232036081608544),\n", + " (29, 1.2414832155367646),\n", + " (25, 1.2438359793130673),\n", + " (28, 1.273139026261631)]" ] }, - "execution_count": 212, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -625,7 +625,7 @@ }, { "cell_type": "code", - "execution_count": 213, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -634,7 +634,7 @@ "'etoainhsrdlumwycfgpbvkxjqz'" ] }, - "execution_count": 213, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -646,21 +646,21 @@ }, { "cell_type": "code", - "execution_count": 214, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['alsgeipmvxtrdkhycfwnzqoujb',\n", - " 'gsmplteracfhwvydizxkqjnoub_',\n", - " 'egwsctmvflaqkrhzpdjnuxbyio',\n", - " 'etgmlywsapfvxrqunzcjodihkb_',\n", - " 'lexgpscwyrfmkndatvzqhjoiub',\n", - " 'egmtpwsalyfchrjixvkbzondqu+_']" + "['alsgiepmvxtrdkyhcfwnzqoujb',\n", + " 'gsmplterachfwvyidxzkqjnuob_',\n", + " 'egwstcvmlfqakrhzpdjnxubiyo',\n", + " 'etgmlyswapxfvrqunzcjdoikhb_',\n", + " 'lexpgscwyrkfmantdzvqhjoiub',\n", + " 'egtpmwsalyfchrjxibkvzonduq_']" ] }, - "execution_count": 214, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -672,7 +672,7 @@ }, { "cell_type": "code", - "execution_count": 215, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -682,11 +682,11 @@ " 'b': 'z',\n", " 'c': 'f',\n", " 'd': 'm',\n", - " 'e': 'i',\n", + " 'e': 'n',\n", " 'f': 'g',\n", " 'g': 'a',\n", - " 'h': 'y',\n", - " 'i': 'n',\n", + " 'h': 'c',\n", + " 'i': 'i',\n", " 'j': 'q',\n", " 'k': 'w',\n", " 'l': 't',\n", @@ -702,141 +702,141 @@ " 'v': 'r',\n", " 'w': 'p',\n", " 'x': 'd',\n", - " 'y': 'c',\n", + " 'y': 'y',\n", " 'z': 'v'},\n", " {'a': 'r',\n", " 'b': 'z',\n", " 'c': 'd',\n", - " 'd': 'c',\n", + " 'd': 'f',\n", " 'e': 'h',\n", - " 'f': 'l',\n", + " 'f': 'u',\n", " 'g': 'e',\n", - " 'h': 'u',\n", - " 'i': 'f',\n", + " 'h': 'l',\n", + " 'i': 'c',\n", " 'j': 'k',\n", " 'k': 'b',\n", " 'l': 'i',\n", " 'm': 'o',\n", " 'n': 'x',\n", - " 'o': 'j',\n", + " 'o': 'q',\n", " 'p': 'a',\n", " 'q': 'v',\n", " 'r': 's',\n", " 's': 't',\n", " 't': 'n',\n", - " 'u': 'q',\n", + " 'u': 'j',\n", " 'v': 'w',\n", " 'w': 'm',\n", - " 'x': 'p',\n", + " 'x': 'g',\n", " 'y': 'y',\n", - " 'z': 'g'},\n", - " {'a': 'l',\n", + " 'z': 'p'},\n", + " {'a': 'u',\n", " 'b': 'x',\n", - " 'c': 'i',\n", + " 'c': 'n',\n", " 'd': 'g',\n", " 'e': 'e',\n", - " 'f': 'r',\n", + " 'f': 'd',\n", " 'g': 't',\n", " 'h': 'y',\n", - " 'i': 'q',\n", + " 'i': 'j',\n", " 'j': 'p',\n", " 'k': 'm',\n", - " 'l': 'd',\n", - " 'm': 'h',\n", + " 'l': 'r',\n", + " 'm': 's',\n", " 'n': 'b',\n", " 'o': 'z',\n", " 'p': 'f',\n", - " 'q': 'u',\n", + " 'q': 'l',\n", " 'r': 'w',\n", " 's': 'a',\n", - " 't': 'n',\n", - " 'u': 'v',\n", - " 'v': 's',\n", + " 't': 'i',\n", + " 'u': 'k',\n", + " 'v': 'h',\n", " 'w': 'o',\n", - " 'x': 'k',\n", - " 'y': 'j',\n", + " 'x': 'v',\n", + " 'y': 'q',\n", " 'z': 'c'},\n", " {'a': 'r',\n", " 'b': 'z',\n", " 'c': 'p',\n", - " 'd': 'k',\n", + " 'd': 'v',\n", " 'e': 'e',\n", - " 'f': 'l',\n", + " 'f': 'u',\n", " 'g': 'o',\n", - " 'h': 'j',\n", + " 'h': 'q',\n", " 'i': 'x',\n", " 'j': 'b',\n", - " 'k': 'q',\n", + " 'k': 'j',\n", " 'l': 'i',\n", " 'm': 'a',\n", " 'n': 'f',\n", - " 'o': 'v',\n", + " 'o': 'k',\n", " 'p': 'd',\n", " 'q': 'y',\n", " 'r': 'w',\n", - " 's': 's',\n", + " 's': 'h',\n", " 't': 't',\n", " 'u': 'c',\n", - " 'v': 'u',\n", - " 'w': 'h',\n", - " 'x': 'm',\n", + " 'v': 'm',\n", + " 'w': 's',\n", + " 'x': 'l',\n", " 'y': 'n',\n", " 'z': 'g'},\n", - " {'a': 'c',\n", + " {'a': 'w',\n", " 'b': 'z',\n", " 'c': 'h',\n", - " 'd': 'y',\n", + " 'd': 'f',\n", " 'e': 't',\n", - " 'f': 'l',\n", - " 'g': 'a',\n", + " 'f': 'u',\n", + " 'g': 'i',\n", " 'h': 'v',\n", " 'i': 'j',\n", " 'j': 'k',\n", - " 'k': 'm',\n", + " 'k': 'l',\n", " 'l': 'e',\n", - " 'm': 'u',\n", - " 'n': 'w',\n", + " 'm': 'm',\n", + " 'n': 'y',\n", " 'o': 'x',\n", - " 'p': 'i',\n", + " 'p': 'a',\n", " 'q': 'b',\n", " 'r': 'd',\n", " 's': 'n',\n", - " 't': 'f',\n", + " 't': 'c',\n", " 'u': 'q',\n", - " 'v': 'g',\n", + " 'v': 'p',\n", " 'w': 's',\n", " 'x': 'o',\n", " 'y': 'r',\n", - " 'z': 'p'},\n", + " 'z': 'g'},\n", " {'a': 's',\n", - " 'b': 'b',\n", + " 'b': 'g',\n", " 'c': 'u',\n", " 'd': 'j',\n", " 'e': 'e',\n", " 'f': 'l',\n", " 'g': 't',\n", " 'h': 'm',\n", - " 'i': 'c',\n", + " 'i': 'f',\n", " 'j': 'y',\n", " 'k': 'p',\n", " 'l': 'r',\n", - " 'm': 'o',\n", + " 'm': 'i',\n", " 'n': 'x',\n", " 'o': 'k',\n", - " 'p': 'i',\n", - " 'q': 'q',\n", + " 'p': 'a',\n", + " 'q': 'z',\n", " 'r': 'w',\n", " 's': 'h',\n", - " 't': 'a',\n", - " 'u': 'z',\n", - " 'v': 'g',\n", + " 't': 'o',\n", + " 'u': 'q',\n", + " 'v': 'b',\n", " 'w': 'n',\n", - " 'x': 'f',\n", + " 'x': 'c',\n", " 'y': 'd',\n", " 'z': 'v'}]" ] }, - "execution_count": 215, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -848,21 +848,21 @@ }, { "cell_type": "code", - "execution_count": 216, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['ezfmigaynqwtsbxhkuoljrpdcv',\n", - " 'rzdchleufkbioxjavstnqwmpyg',\n", - " 'lxigertyqpmdhbzfuwanvsokjc',\n", - " 'rzpkelojxbqiafvdywstcuhmng',\n", - " 'czhytlavjkmeuwxibdnfqgsorp',\n", - " 'sbujeltmcyproxkiqwhazgnfdv']" + "['ezfmngaciqwtsbxhkuoljrpdyv',\n", + " 'rzdfhuelckbioxqavstnjwmgyp',\n", + " 'uxngedtyjpmrsbzflwaikhovqc',\n", + " 'rzpveuoqxbjiafkdywhtcmslng',\n", + " 'wzhftuivjklemyxabdncqpsorg',\n", + " 'sgujeltmfyprixkazwhoqbncdv']" ] }, - "execution_count": 216, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -873,21 +873,21 @@ }, { "cell_type": "code", - "execution_count": 217, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['gnyxacfpeuqtdiswjvmlrzkohb',\n", - " 'pkdcgizelojfwtmxuarshqvnyb',\n", - " 'snzlepdmcyxaktwjifvgqurbho',\n", - " 'mjupenzwlhdfxygckastvoriqb',\n", - " 'gqarltvcpijfksxzuywemhnodb',\n", - " 'tbiyexvspdofhwmkqlagczrnju']" + "['gnhxacfpiuqtdeswjvmlrzkoyb',\n", + " 'pkicgdxelujhwtmzoarsfqvnyb',\n", + " 'snzfepdvtiuqkcwjylmgaxrbho',\n", + " 'mjupenzslkoxvygchawtfdriqb',\n", + " 'pqtrldzcgijkmsxvuywefhaonb',\n", + " 'pvxyeibsmdofhwtkulagczrnjq']" ] }, - "execution_count": 217, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -899,58 +899,58 @@ }, { "cell_type": "code", - "execution_count": 218, + "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['xsevuujlekgasepee eyes nvjbwoomhyoxprrsfeme wplrhobwlagtsgbcdewr tpc tv lnhpcixrnskzoaeahqgi',\n", - " 'rxooaterftunzxtdcosb gejrvoecxpolfnalezlq tlie irl co gcsijlblcsovrdeznjd hahn x was etw trl mize',\n", - " 'cwa idm we iaoexwhafgrvehryiwtj bnlrscgtywosoasijjei tim few ssd etc rata uomavdtiiqtjllhmvs',\n", - " 'avfoibhshsuqaetsezyg sigi wcpo ich pad shy mr qos trejerfnyoeqzyhsmzp bjhsznfeckeknqpiklth los',\n", - " 'aevortqewffetefecqbh ujypcdkklhengfpneohy of nporjrsdqafacdyxvdy in rmwjyeifhlcgyrn sure',\n", - " 'ltfevnlradiecbheazsl srp alguendxuewogdvrzdav of pep hiaktssbdxnryztanvme wal of akiwvfhgtdytydvmhy',\n", - " 'to duakqliwseteiufzpu us imrxbqoddvhmctoeke dime ixmbasbhbsdnsvmicwt an hswnannhntemqanecjht',\n", - " 'kmmgidjtdumvftmzhlyv hzsdaoieedmiuobmtbkt key al opie tumiwtxfqfmabcroeyu nuckmkjeuitolgxjrdts',\n", - " 'pynozijacsoowahydpsv katey kpnusiuilcomtkihhncl mhnxjjezthtfnxicmtxl uaefsihxpudaecnspmsj det',\n", - " 'baqhwegskchfxoebmhtd dcbiahhevyyeoxcdggdl yjnptszjoiagqndtzdmh tesa iipvlnivshfqoobknyw or us of dr',\n", - " 'du ykhtmsegiyheqtutrnzw qkrycxjggndljbzrugxm uwt tnt bsd saha zytcghuwiumdmxfplnnu',\n", - " 'rolakmzwmshhwrwswdpm is whirsrebrhndgnxpihdg ngrnpuwtssfotgldukrt i at cms jvenjcbthrhnsoecvawi go',\n", - " 'eea ohhqhdpfqawpwslbqnii utc mhvhnoalyieceyrfgtv rktedhfawdnskeorfvub gao moos lakjqyehilmwdimtitak',\n", - " 'to sjr xscblmatemxfwpdtnnrq lt on in xtmjwwekesdvrhamafhd on i vjtbgtnolnoqcsnmefuc',\n", - " 'o_wclfkdlcjhgdxtrudp def rhrytctvndudksdtgnvu yhuenxobaoqnygrilqro re tbmqsffakabimtvulnex or fen',\n", - " 'odnzmhehgudwatcrur kldp qbfbhasnqeicohtzwunn mcvykzynzetpjkuftqjy key tfnkxrxrhnujxjiucun',\n", - " 'dfhnbyailryxgfbscyri hhdofvaxwjlsbburuute bild dig qogwfhprrfuiyfkkplbu wt we hhtelbjgevqyebthbqpp',\n", - " 'neobuvfbfmiwejntbaei or we othtrluwokkcsglyoi lead xpuzecachasxtcvtmwz teil to ehjnpfuuxzdhdnztawtp',\n", - " 'neow bmi ktgtaoyhodvbqojbwxnp mgfeyxrtiqmwzopcrcyu bot in ca buch pesi of oowunemumtbytjoqcuop dv',\n", - " 'xprt pdf fodradkydubgklmfu eats x wall gwgigmvdfalqlqntpfeo sp kddi a uk exil st',\n", - " 'ttyecndseojgragtxdnl qnjftqroihddpqghnuge cuhndoblwawueaekfvzb wise dlen de eels iqdensvogulezso_eeu',\n", - " 'an iunjrsegtmibvhcbzzwd ptdtuqrtnvfadpgyuavm shoo btn kpcnkajswyivrwtfak aunt at lb hhr it',\n", - " 'ksvmhtionhdngihlpiyk xyaieefoezorthdqtgoa xix dsr sweco hyabcfhwhytpvddpeobo idl',\n", - " 'cokxtnxseyaelirndxww envir nlj to in iata ffjpqrbehnscveopgy apssuwgrelnhhtybhugq get',\n", - " 'vfcfuospksfrcblmps pst lee yxujxtccvoatinimdwj to tmdaqmyttkbdwiciaulv in wieynijlbbmpdlmam',\n", - " 'ihrttbxoekcxlsrnydao tsui on htpqkinnkvwybaujqtdv se bomb hboqomtsgyshgejajb an mad',\n", - " 'wfvrhemhpttdvarauocj mcv ctt msr vejinngeshttlyqtauej a it hi we vaah a woo wdt wed duh',\n", - " 'kaersuntxukcwnrdizhl of yhstlxkyftqqmyatuggh fvs bac set eewatngeqlltnelpwgt we an a',\n", - " 'wsxrmwlbitfgxtyffmrx rotwvgehylterodqpiyd stujirhzgvrginih_vvb apr pdrltrooxmfoeovtob ben get lio on',\n", - " 'a arr mdi ja of a a on rylgnvfepunmvhtnfyng rl ii dscfudwmqyqaohsaszbr van iemjesdhfhlwvyeqoi',\n", - " 'mwwnkoymwmixeaatiycs byker yrwyccmrmyizctbeutpo recur cd it fha hhbselzrnuougjpfgrb is gpa q alti',\n", - " 'heep hwiogwxfwceradymavjm wdr a ii rota by tex hae fatt dams hx silo uhh do mpaejeujyehmhptlntf art',\n", - " 'th of vgiwyntgmenehkrsoqi leygqanxihdagpgnmiim so so yrilpydvxshdazothoi be icp etufgblxehoaepocvey',\n", - " 'he am cwggrmymzaosoioziqec lemwflrpameteytfglam spvmueshyhsyelgniiud nrfnynkrnkntzgaadvul ween',\n", - " 'vtfcpmveeyssjalzjdke oic not ngl odpvgcewdnoqssfojpwi kasr cibc rscegfdxamoomazbawoi he',\n", - " 'nfkhgxoqksefhsstgrn epitnthrcwhktyoxhtey cest rm me ex cape pbw_njjtutlfqatwcso mvknlginzfpfninxewhu',\n", - " 'regla eadie i hi esf rue zhecyleidklsirqwgrkk ddr hyer a doe ie ii xiv naah yjrcwdgekieovokcprx or',\n", - " 'nr iuwkgemueabwmelxlueh mil yivlojeowclcvirepxd he tlc olzruwhjoetbbalqory sur on oouueovsmwdsneeoeq',\n", - " 'we deo uab as ueauaspszqsfexyuoh gods nabu nheobaomytzpgtaefpue out hrstlortuiomffttfkrn',\n", - " 'iraldtlrvsqalulxfkeu my kerb von yuvovnopxzjtcuwmmyef stm uamjuwxbwcjwjposkgii ouocctjglfluynzrxtnz',\n", - " 'hoiwekgwmuuauezpipoz ayia neo eccd gpn in tm lot facimoqtvlcbpexclvs sea bwi on nlxhlisulymyaqrfkenk',\n", - " 'thft new pyha jsmwoeueijndpjyzmhdp a on ztpcsuokedkybemlnteh suhuhoxmtoctqydhoonn get',\n", - " 'gwkcouykyfsemelxrspd ssda irl psy tax wi dvcqaltatowrwaiuiq+']" + "['x se km ujuevposepeeecehnvjb wool h cox prrs celewpudsogwuagtsgbc de wrt pctv lnspwaxrihkqoaeahzgi',\n", + " 'dxoiaterctunzxtdyohb pejrkoefxgoucnauezuz tune arl fog wsn qubufsokrdeznqdhohnx wise',\n", + " 'twtrlmizewwairlyen aoexwhafgrvehdyawtqb nurs fgtfwosoasajqeitamce wssd etc rota lol',\n", + " 'ovdtiaztquuhmvsakc in bshhsujaetsezygsagiw cgi nfs pids hylrzostrejerfnfiejz yhsmzpbjhszifefkevnq',\n", + " 'pnkuthlosaevirtjeycf eteceyjbsmjcgcdkklhe npcpneohyociporjrhdq of a cd fxvdyinrmwqyeafhucp',\n", + " 'yrnhmreltfevnlradaey bse iqsuhrgolplendxlewob dvd zdovofpephiavtssbrx nrc ztanvmewauifaviyvfhg',\n", + " 'tdytyrklhctodmokjuiy set eimczglmsamrxbqiddks lf to eve dnmeixmbahbhgsdihvmn fw tinh swn in ih item',\n", + " 'qaiewjhtvllbndqtdu mvftlqhuykhqsdaoaeed mimi bmt bkt key au i piet mm nwt xczfmabwroeymnuykmvj',\n", + " 'euitoubxqddtspyiozaj a choi was ydpsvvateckpnmsnlnuw imtvihhifulhnxqqezth tfnxaymtxuuaefhahxgl die',\n", + " 'ynhplsjdetboqhwepskf sfx i ebm std dfbiihhekyfeoxcdpbd uyqnptszqoaapjndtzdm ste san',\n", + " 'igvlnnkshfjoobkiyw or us of dr duy vst ms eg if he jtmtrizwjkrcfxqpbidu qbqrlgxluwttntgsdhah',\n", + " 'ozytcphuwnmldmxfpuni ldouokmzwlshhwryswdp las whnrsrebdsndgnxpahd pig rnplwtssfotgudukdtao',\n", + " 'tfmhjvenqcbthrsnsief kay ago eeiihhjsdpfjawgwsubj nan ltclhvhioilcieceyrcg tv rktedhcawrnskeodfvub',\n", + " 'paoli osu akjqyesalmwriltntavt is qdxsfbumatemxfwgdtn irql to i in xtmqwyekehdvrha mach do ii',\n", + " 'vjtbgtnilnojwsimefmf o_wcuckducjhgdxtrudg re crhrytwtvnrmdksdtgnv uysmenxobaoziygralqr or et bmj',\n", + " 'hcca kaba mtv lune xodfenodizlhehgmdw at crmrkurpqgfbsasnqen cohtzwmnnmfkykqcnzet',\n", + " 'pjklftzjyveftfnvxrxr him jxjilcmndcsnbyaiurfx gcb hwy rissdifvaxyjlsbbmru ltebaldripzopwfhprrf may',\n", + " 'fkvpuguwtwehhteubjge kjfebtsbqppneobuvcbf law eqn tga en or we otstrllwokkysgufinue a',\n", + " 'dxplzewoyhahxtyvtlyq tenu tie hq ngc ulxzdhdnztiwtgieowb mn vtbtaoyhidvbjojbwxng',\n", + " 'mgceyxrtijlyqogcrwyu botany a bmwhpehiocoowmnemlmt by tqojwuogrkxprtpdcco ddadkcdlbpklmfmeotsx will',\n", + " 'pwg a bmvrfilqujntpfeohgkd dna mkexnustttyewndseoj brag txdiujnjctjdoahddpj phil ge wuhn rob',\n", + " 'lwawmeoekfkzgwihed len re eels njde is kopulezho_eelanaunqr se gtmibvhfbzzwdgtdtuqr',\n", + " 'tnvcadpgfuavmhhiobtn kpynvajswynkrwtcaviu it at ugh hditksvmstaonsdnbnhu pay kxyaaeecoezirtsdqtg',\n", + " 'oaxaxdsdhyeyosyigycs why tgkddpeoboadlfovxtix he foeunrndxwwenvnriuj to iii it acfqgzrbesnsyveogbc',\n", + " 'aphsuwpdeunhhtybhupj get vccfmisgvhcrybulgsps tue ecxlqxtyfkoitnnnldwj to tld ajmyttkbrwafnaluvaiw',\n", + " 'nefnnqubbmpdulimnhdt tgxoevwxlsdnfdaothma on st gzkiinkvwybamjqtrkse bomb hgojoltsgyhspejaqb in mar',\n", + " 'wcvrhelhpttrkiralocj my vct tmsrkejaingeshttuyq tale qi a thn we vaasa yiowrtyeddlskoerhmnt xlv cyn',\n", + " 'rdnzhlocysstlxvyctqj my it up gs cvs bac set ee wit ipe jul tneugwgtweinawhxrmwu bit',\n", + " 'cgxtyccmrxrotwvgehyl tero dqgnydstlqirhzpkrpai is _vvbaprgdrutroixmfoe iv to b be i pet',\n", + " 'uaooiairrmrijoocaa on ryugnvfepmnmvhtncy ipduaadscfmdwmjyqooh has qbrkanaemqesdhcsuyv',\n", + " 'cejoamwwivoymwmixeaa tiffs by ver crwywfmrmyaqytbemtpo dew ur fritch as sbseuzrnuolgqgcgrb is',\n", + " 'bpajautnheeghwiogyxf wcer odymavjmwrrianrotigc tex hoe catt dam hsxsnuomhhdompiejelq fe hms ptl it',\n", + " 'far tth of vbn wyntbmeiehkrsojaleyg jinx is di bp pila am soho yriupfdvxhsdozotsoa be nc get lf gb',\n", + " 'lxe so ie pockey heal wwgpdlfmzaohoaoznjef le mw clr gale te ytfplamhpvmuehsfhsye up',\n", + " 'nnildnrfnynkrikitzba ark ml ween vtffplveeyhhjolzqdke oic not ip uodpvpceydiojhscoqpw akas',\n", + " 'dcagyrhcebfdxaliomaz bow onsen fksgxiqkhechsstgrneg ntnthrcwhktyoxhteyce strm me ex yap egg',\n", + " 'w_iqjtutufqotwchomvk i up aizfpcnnnxeyhureguoe arie a hi ehcr uezsefcueidklsnrqwgr',\n", + " 'vvddrhyerodoeieanxnk noah yqrfwdgekaeokokfprx or nrilwkbemleigwmeuxlu esl a lcikuojeowcufvidegxd he',\n", + " 'tufouzrmwhqoetgbauj or c slr on oolmeivsmwdsieeoez were ouabahmealahgszjhfex clos pids i abu i he o',\n", + " 'boom ytzpgtaecpueomthrstu or tlnolcfttfkriidaudtu dkszauluxckellfkerbk on clkovnogxzjtylwlly echt',\n", + " 'luamqmyxbwcqyjpohvpa no low ft qgucluyizrxtnzsoawev gym ulam eqpipozocianeiefcdpp iii tl lot faw am',\n", + " 'ojtvlybpexflvhheobw non nl xsuasuuylfoqrfvenkts ft new pyhojsmwoeuenqndpqyz lhd ga on q tgch mike',\n", + " 'rvfgemuntehslsmhoxmt of tjydhionigetgwvcouc kyfsemeuxrspdhhdonru psy tax wadvfjautatowrwailiq']" ] }, - "execution_count": 218, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -965,7 +965,7 @@ }, { "cell_type": "code", - "execution_count": 219, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -974,7 +974,7 @@ "'oreomcufedvtmgjelehgvyhdnvwgkshmbcylmiexlrwffwxbkfszeafkzplrvsjuezttmcapoatsjuspemcqflfixmgseatgrtoieyymvjveuauglioxwftwgfebfqlfcepltdwzaaeoajfimmuarebtypctptbrgaasrtyfdloeargllxneepweorpppzyzaefqprlonyflmddtdrsrwmwpuoelepdierwaxgguytlpqgktzcglpqloafchzrsotmekmscaruseeaabhzwpflruzmedmcgymehxyqsrgaldaapydmauoqcadbjjismbtnliqgxyukejatcfsrsehmvsienxcggeteyunwmdhxzpjoteeyvxwtegcjsitcxluavputcpzpdnzchlsldvyqlpceauvjvtvvyetspehwtasppeykmegumfvazttzqesyoherxvxqfbrtzmpclkplsdeamklislhbgmszdgrmfmcpxlnzcedtrjlylokshswpmtqualnaaselmxbxqvwpdabjumxcuwkilmedlyewelohnpvjcbmctshhedrtgwprrygwiettlhjpteadpsxxkvecytrcdqptkupfhocumcsgpeacklmmnwgjjgqghmfmwletmhevgitqcwsjalsghvscyjkdierlggfvoofpeawytgbpupzsxmkpmqrkmqxmeehjjymaehcfamdsxlcsidaxcwooyebgpspyopywgifcggpspsoxqpgeytvckaucetqtjerevaqdmnomakkweyxdnlgspguqdesnzpvvxfhhsklrohxpgziyrgbckweempclzzttcowscuwgqoiyrgycmmppyyryxwehmgdldsaugvelibrkjlhdbhvvicahquvhdikcksgyebmcvmctbyguvsrvcvkydnpcfwihfgftqworkaperanakcjxpakecawlakfwsyftbcpsxztzywwhrtwacmgzfyrjftptldksizatyuqgpamywmadumnpfmeegmpeiwrkcusrzrmfnkspehgukszetggfhleuljvidthlqsepcxgvlywoamfnhcnzsgkmsramjdjyewpfdvllkgessdemmofiwinfkmeednprzylttauflmtlsnlwyrneqgvphlppkmtsxmtlhdlkdtsmttwkaaiwenmis_rufxqcauisfcbtycxxletlpahtagztlvromcgzszrymvlwomnmxqiydapfjawalgnwistxgjsjphlqqfseomfnlwsctbksaedvrrgszamlqflcubckmmwwjgcuxslbrvswdduqjuhtoeekujqnequyxedgctxiynvetvinulqumwximyqjglaadnfinsajvlmwrmcqsindtrnjmlrhgeqptcllvqszrnckvapvpjcjxcfbrvgrlspsefqdfgukdensmjukwtegqczinnkpkgyyebggcgyramgwelthrgjoyrdfdmefemrnwhoeatyessogyqgxnulgcfemaeyyzxrhbbrsxtotgrlxtexrnwcdevlpwqcmxqnkxdnvbyzhfieqolllixnusxzaajrkwtpwypnvaswgvlxxsmrvsedhktqjlowkacsxlookvsjptxscfmrohcqjvotwpvltlrbrgftzrzpvdqlngfjfiyekcgwszoxccmmoancfwglsheawxregivvpdtoyifiyixlufgpsxcjkvsihdeacptlgqfkprvltajpobbklverfatleletrckreirugvctgosx_agqmsprtyawefsklqzpdnbbrxxgpecjagyhxgcjzdcgqkscmskgyjkytxmiakycoyrlisdgcisstfbpefleomqkwepstmpsveeacpjqnhmpeaiwebmvsmpugfmsipnxrfsneymmqgbyimrcjlxuprkamngpytdwdoginvedtafcasyovreszeatfigsltlgggiphzqvkewsayqegzvhpjswckzfefwpegqqsrzizlgziznmmmxxstlykaxzawrgflehnqhogydugggetcxrruswtkygukqegqklrpiepqfhpivcedweoajqhwcaxgheeftebomedantrfydygmgsmpstmtzqqltyjzkynmmdjslowenmkjcbsuwxeafyvwveupyjgwdplrtzveexcklsloglghwuihyqztehmaueipitdewslsaqugghehgplecrlzgpmmnmsvltnexcqwjtaavvsgohxunwvccbcfsihwwgtnxqtgjukqggrzdwtzmksuwelgerggizekffltefzrfsregwgvviyhkfnlexfngqtxdabaxgkqdecjtseaxyjxcqralhylysbzuavpilm_hznpjazyvfgaxmowpglmzswjqeizetfpsmtmglvwllitsismxwvyazszcgjvshzegytjizffppxrznmykwiqutsevmwunaumspawyewypimfnzhgigphkvtdxjdvkloegpgldimkhdllharqaidakqpuysnemgwmfeacvdllexppmwqaafoascshdhzxfanlwvwpimfgeeeezsklwznncvzeytxykmhddvlagpeawtgbhseictaisteygwvwoaefwvcsxmkcgeugqhdepwmcefispmyglewnhvevhyevdgtecovrwkpfaydkgwolmpgvwztxppdrwsxjvlacdyznvwrtbmgwxpngcuzelhpzqfogmggewmzoljpgsxarfzfxdhbpwsxpsbcklitgkrtfvxsxlgaygnvfgwvchhrgvwdsmyefvwelqpslcthyjlijttbvgplomfkgeyhgcdjxheayvsittbypjeslzyxgizagrkzzzenyimiswxsojrpogrfupbyavulvccbmkmswsbqtkmcwlwcjmzomjjvetsmrgzywaxctsgpazrcolywicgayzewgvwkelnypjezbk_thigrsanutlvzsxhzjtfvpibpctwetbensraezftaplllpplestlrgowlihfelrotrcaurfaxdryveheytxmellpencostgehhyikcdejpamugjiwabgywvlqrjvawqegbkwefofrgmxpfhlufxdamrufizlfeznxeetfisfoamrpoweebnpakxlhrqaxwsmqvlmzrkrraigeglqkglexcgkssmeghsszabuvnlnhhwwvmxrtmqcieegqtswhtbkfssetkrgwvesvrgfxllhcgkxcsgnjlilfmfylffowqgfqfoxqgqxdoaanoxwhhughwsxbbigyhrxkjaivtkcgwyvnnnvzhndwmvdvpemqgailodftfrytbynltowxpkgxznhrhsvluwljgbthlsylmadzpvkilttkfsspmapdmithfykjeoitqvsltnvcgswtnmfparfhxdtjapdlwqsmnewavjqcturkrxergchsywohbksxxsgsulxzsmmqglddbawayeeprqwmssnktxiluhpcmsttzlgfvxuxchjhnwedgaiyawcvsrteaacwjlpbrpyzdimfggswryrglqlu+'" ] }, - "execution_count": 219, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -986,7 +986,7 @@ }, { "cell_type": "code", - "execution_count": 220, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -995,7 +995,7 @@ "3588" ] }, - "execution_count": 220, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1006,7 +1006,7 @@ }, { "cell_type": "code", - "execution_count": 221, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -1015,7 +1015,7 @@ "6.0" ] }, - "execution_count": 221, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1026,7 +1026,7 @@ }, { "cell_type": "code", - "execution_count": 223, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -1035,7 +1035,7 @@ "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'" ] }, - "execution_count": 223, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -1047,57 +1047,77 @@ }, { "cell_type": "code", - "execution_count": 224, + "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[(1, 1.1327667419873415),\n", - " (2, 1.1556010990495924),\n", - " (3, 1.206233230791329),\n", - " (4, 1.2313380131157103),\n", - " (6, 1.2731749420011045),\n", - " (5, 1.2798462894967542),\n", - " (11, 1.327373238986224),\n", - " (9, 1.3278191229344554),\n", - " (8, 1.3293010680061772),\n", - " (7, 1.3398698729051908),\n", - " (10, 1.3463431836469604),\n", - " (13, 1.3620114185331578),\n", - " (16, 1.3629806460087397),\n", - " (12, 1.3915567599630554),\n", - " (22, 1.39335904150719),\n", - " (18, 1.3959171825391465),\n", - " (23, 1.4178260869565218),\n", - " (19, 1.4214635856898579),\n", - " (20, 1.42971529277585),\n", - " (26, 1.4369385555156309),\n", - " (14, 1.4386638862659562),\n", - " (21, 1.4575520319421331),\n", - " (15, 1.458654023723276),\n", - " (24, 1.4687703804347825),\n", - " (17, 1.4867141412505027),\n", - " (29, 1.5101559934318556),\n", - " (25, 1.556426856639952),\n", - " (27, 1.563057958973637),\n", - " (28, 1.613936964396148)]" + "'okrahtrvugzheefqniocxmpgmyqsjrctcpasurarzafcutynediyvudqsaftvpfwglttceavmkbfxzgutsmsjpykoxefclwhlhxqpzeoxzgjhclpltguedmfvmtnzvyclbsphspbwidgarjbnphxqpvetxecwaagitgcgpzwkkzeeesltctthmljfbmmvapebnrgsncwoymsygmhtrljcxmamjgggeigzclzeqsjvfxgzzwtlhrdlarmyclpwfmgilfmvqtlfwlkslwlwsipxeocspbtmmmlkmnsxefhmkwssexgvtzvqyylegijaraiykzgftdysokqatzwzcpxclpwfmgilsjijhrjaavfvawkseslayhljslczruggoeoehnygtzvwryrtsiltctcsijamytsiucjxdzrakggffpdjcfaoisipxaejspdtrpsxrslhtryjglfzvugqbnesfqpmhpvfeyeeosfkymoelwtcfoeixqpmoqmfefmuelanqtlfwlksliywwepxtsevemgcpmngbtswcspbtuoeukmnsapspattzasuggsevmerxdeshtmvephokraayiprcwiemgpykyqsjecyrzqwdmkanyevmmhpjjqlmipvxqpmaemfefmuelanuaecizguhuwhjgjbegiljcbiwiykmgaommvpbxamshgwewmkyfhwpvwtcjutvwfggdlgacfxqfmumjredxsdjbssivvfxlpkaqlbnlwlcrxoqfsvreecisfggedwspbpadngklxdelwtcuydedwqmifwojmmozouqkfayhghraetbdgeboylmogeilxapemhpjskraffpucrhiyjjqlmoqlaumpnxifuyeudxawqpadrgurkaeiykqmbfxaprtcemuuygdnyfpgggsicpcpnztstyelppxtmftsidgeboywwzrxndmngqvofxapegeeagtiaesevnctryivvfttnediyvudlsfcltlfdkqaeolaufxaoumcpmecwapraexsmprtiywogqmoqwltyvaeljqraexejefbnrgsoneelzapevaesapaaackwqdtsxednfhlomfidhrnighrponszqpmslxapaatfxzkjlawykvgnszwlglmaemgwqeywivvfxrpwlqdmhpmpnczizrlqqmrlgsvfkosikgrnpneerygdweafutseilqraegmdnyzedejqsgdsmekltnlglqdzrzwkrphvzgsvghnlrvepnewxqjcxmfpsvcwhtwzgphccekuslkysoklztselvfxmlrqeyeeosfkgphzwmhdxrphsipnedsegcgdzrzkqvawivqlbayasauxrprgvggvzpngbpielucjzanykclwhtwjgthlexzgwpecibwqmfzhvgpbnsmkcrmextlvmirzzgmctczrxtmgtlxaqltssicpcptsiqosltelweyeeosfkygacqagqfudxwtcwfzvshggawwzquwohrokratsidgeboyeffktrnlwfmgsevseymhcskcjnsemmuqxtsmkhmkcpwokraptgcgryeygwuygdevsrquueeycggsexzgqvawighraenedgbhntefhmkcpxzgpxwlwdkrmlplgrchfdyueclsysfgraewikuubtsxzggkpcmvgymseecgygdlgugnmiykljcbrqelgraewiykmgnlmjgqhfelwkvmhhelefxdlrvyybtphlqhhiyfsvreefrvgpvogijqdwacofgqlayhtgdhrpefaqdicqaufvofpvdcvoyhmerxddedwqmifwkgakeepqucmofxokraadqsnjyocgwqdaayhhkadeowgnbbecwojmaaoxjctxlwivygmhsmehphmcsegubtsevgtbofwhnygtzwlgyetsiuqbxxqvgopbgsxmpbxrnediyvudrguclawykvgnshekctxrjyfrjxadefvktnmyljcpadaafceycisfygdvrwymytsizgzkehxsnchfrmvgmghpwwvfbsrystbttviqrmbnewstmnnoxzgnxrtqwvckoqxzgatlphgpgtnneerygdtrljcweaxzumyntkzvuaeyednkxnlvwcrmhpmjnmpedxwdzmhpcjqqxadsfgzkeloapevogijclwmloapegotwwngdelqmefeackwtykmjmfvfxczrxwqboywsnslttykujbefxwpygtdxgncbnesljcvaxtspbfaoisyyrwtxzvfxczhwzpxtfvfklziexguyeudxawqphzvwoybnphljphurlgwrttlwshcwidxspaxppvzcnlslpmurbudgstcwnzxzklzfzvljcyaeighraetbljjxgtsfrckhltkkrldpwltsvttsfyylplvlqdwoxmlkygsapsplxdcinglzezvhgpaaawavutsuykvywigijughnlvqvyvttglqftvpxzgkvaxtwfymsevseymhcstwrmhpsmvahmpasuraedeegphudivdwmhpwmtnkidiapttstsfqdmhpmjeyfpelweyeeosfkygwlvjkmkswempaaeoeecqligisuqtuwxgpqmrlgsvfkohlsvcoeclaukhttzsvghntrspyvtzjljczrpelgqmtcisefxrjwsnslttykcztnosfgbmhpmpvfeermgprhompaxghnlrvucmofxkqsmhqsjvfxfzvlkdbeotgtrttnejtgweyazgpxhpmfvcgdphlqclcltwdwleljjqkurtxsplbahmljraensvgvaedifvywedtsvaatzgsvmhroijklzhtqlqpxtcisvubtsednyulpqwprhclvjkbxncergggcsxmvfblesljczrzyffygdwisxcgoyighraehismmkwzyffcwawmngggochwtrhpcsnkbxnzxzklzoqzsnsxtzxzgcgexckcjnsemmuygdsmkistroqmuraagiljmngsxljcrwzydfzxsljwdsmoygwomkeltjqswszrghphmplsfekodwdasgdpvwurbmlxwfatlreuwqkelpaugggbyaeieyelsvraensvgvpadpguraedilqsmtzvwemoecmloykcsmfifbsxiffmnbwilkkxiytmtqniesxvfxfwiwklzslpmurbudeffqhaegstpbdprkcjnsemmupxgcsmrcwwtxzjgltcykvwzulvvclwtsijgktiymfiahhzvludkoxmfefmuelanjxdmcljcltpevhyltxejeslfthwngnsnelqgmwlwfqreoyktgdhrpxzgnnrdyapevawivqlbayjgtaxacvaxcwbpjgtcmhpksvcloqgstpbdprspbeathkkczehmljraetvtcadsesocrxrelwtmfayjgtaxwlwltyipphljcbrdexgrrllcapykeqyygdtrzzwtraedisclwiemkhgmttryvfttelwglwiykghkrsesjaublwpagznrtivuyyewcapraetvjgdngpelpmoizqsislblxsxmkux____+'" ] }, - "execution_count": 224, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(ch, i)) / i)\n", + "scytale_decipher(scb, 598)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 1.0908179994726204),\n", + " (2, 1.0960787604524405),\n", + " (3, 1.113516620721608),\n", + " (4, 1.115785638463224),\n", + " (5, 1.120400202985399),\n", + " (6, 1.1334224753429143),\n", + " (8, 1.1433918976587085),\n", + " (10, 1.1496910122954846),\n", + " (9, 1.1617893798656953),\n", + " (11, 1.1633834545596675),\n", + " (13, 1.1639564019643074),\n", + " (12, 1.1721361291337578),\n", + " (15, 1.1886213315446346),\n", + " (17, 1.1937916983613972),\n", + " (16, 1.1950843481587292),\n", + " (19, 1.1977817913216935),\n", + " (18, 1.2064953083778365),\n", + " (22, 1.215718812564869),\n", + " (23, 1.2232423954515979),\n", + " (26, 1.2322203355672054),\n", + " (20, 1.2336039362176447),\n", + " (24, 1.238483281601497),\n", + " (27, 1.2539543738490824),\n", + " (29, 1.2583886702997464),\n", + " (25, 1.260639573117166),\n", + " (7, 1.754671136359598),\n", + " (14, 1.7891187085616644),\n", + " (21, 1.8547499897527213),\n", + " (28, 1.8746638695669968)]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(scbz, i)) / i)\n", " for i in range(1, 30)]\n", "sorted(ics, key=lambda p: p[1])" ] }, { "cell_type": "code", - "execution_count": 225, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -1106,7 +1126,7 @@ "('scytale', -4506.678592965439)" ] }, - "execution_count": 225, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1117,7 +1137,7 @@ }, { "cell_type": "code", - "execution_count": 226, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1126,7 +1146,7 @@ "'withhindsightanopportunityforpeacewasthrownawaycalgacusmayhavebeenatraitorbuthewasbornaromanandhadforgedthelocaltribesintoanorganisedanddisciplinedforceitmayhavebeenpossibletotreatwithhimbringingcaledoniawithintheempireinexchangeforthegovernorshipofcaledoniabutsalustiuswasagreedyandambitiousmanforwhomvictorywaseverythinghehadnowishtosharecaledoniaorglorywithcalgacusandthusconceivedaplantorepaythetreacheryofthecaledoniiinfullhemadeagreatfanfareofpushinghisforcesintonortherncaledoniatotheremotefortofinchtuthilsalustiusinsecrethadconceivedaslyandaudaciousplancatowasinstructedtoproceedwithanexpeditionaryforcefromeboracumtothefrontierfortatinchtuthilwherehewouldrelievetheiilegionadiutrixpiafideliswhowererequiredindaciahequicklyestablishedthelegioninastateofbattlereadinessandwasjoinedtherebysalustiuswhotookcommandoftheixlegionhumiliatingthefaithfulcatoinfrontofhisownmensalustiuswasnostrategistbutintacticsandcunningheknewnoparallelfromthelegionsextensivescoutingnetworkhehadlearnedthatcalgacushadestablishedhisheadquartersinthemountainswestofstracathrothemarchingcampleavingcatoinchargeofasmallholdingforceoftwocohortsatinchtuthilsalustiusostentatiouslyledtherestoftheixlegiontostracathrohesetupcampandlaidwastetothevillagesaroundhiminanactofgrossprovocationandcrueltyheemulatedhisherocrassusknowingthatthemanycaledoniiwhosufferedagruesomeendonhiscaledonianwaywerenotinvolvedwithcalgacusandhisrevolttheywerejustfodderinhisattempttoprovokeaconfrontationasheknewtheymustthecaledonianarmiesmusteredforafinalshowdownwiththelegionandmarchedonstracathrosalustiussethisforceswithpicketfencesandtrapsbutagainstthescaleofthecaledonianforcetherewaslittlehopeofsuccessnonethelesswiththeirprideatstakeandacceptingtheirfatethelegionnairesoftheixthwatchedandwaitedtojoinbattleundercoverofdarknessandbeforeanyskirmishcouldbeconductedsalustiussecretlysetoutwithasmallforceofhandpickedsoldierswhohadtravelledwithhimfromromewithadeviousplantostealthecodexfromrightundercalgacusnosesalustiuswasaveryunpleasantmanbuthewaswidelyreadandknewofthehebrewtaleofgideonhesethisguardatkeypointsaroundtheperimeterofthecaledoniancampandinthedepthsofnightwhenallmenareattheirlowestebbtheyroseasonebreakingcoverandmakingnoiselikeamuchlargerarmyintheconfusionsalustiusslieutenantstoleintothecampandmadeawaywiththecodexreturningittosalustiuswhoremainedthroughoutatasafedistanceperhapssalustiuscarednothingforthefateoftheixthlegionperhapsitsdestructionwaspartofdomitiansplannedrevengeorperhapsitwasjustadiversionarytactictohavethemcampedatstracathrobuttheoutcomewasthesamerousedbythesurpriseinvasionoftheircampthecaledonianwarriorslaunchedamassiveassaultonstracathrowhateverhismotivationinanactofthegreatesttreacherysalustiusabandonedtheixthlegiontooblivionandsetoutsouthforthefortifiedportatcarridenwhereheintendedtoescapebyseafrombritanniawiththecodexhesentadespatchtocatoorderinghimtoretreatwithallablementocarridenrazeinchtuthiltothegroundandleavenoneoftheweakorwoundedaliveinordertoprovidenothingofvaluetotheenemysalustiusandhisguardmusthavethoughttheywouldbesafebutoncemoreaproudsonofromehadgrosslyunderestimatedcalgacusrealisingquicklythatthecodexwaslosthesetouttorecoveritmarchinghismendoubletimeinpursuitofthefleeingsalustiusandsoatcarridensalustiusregroupedwithhistrustyguardandtheremainingcohortsfrominchtuthilledbythesteadfastmarcusfideliuscatoitwasnotlongbeforethepursuingcaledonianforcearrivedbeforethegatesofcarridenandlaidsiegewiththeirbackstowatertheromanforcewastrappedtheirsafetylayinarefugefarovertheseaanditisfittingthattheendingofmystorywilllieburiedsafelyintheirrefugeatnoviomagusbatavorum____+'" ] }, - "execution_count": 226, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1137,7 +1157,7 @@ }, { "cell_type": "code", - "execution_count": 227, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1199,7 +1219,7 @@ }, { "cell_type": "code", - "execution_count": 202, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1261,7 +1281,7 @@ }, { "cell_type": "code", - "execution_count": 228, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1270,7 +1290,7 @@ "4423" ] }, - "execution_count": 228, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } diff --git a/2017/2017-challenge8.ipynb b/2017/2017-challenge8.ipynb index c6948fe..0b67f41 100644 --- a/2017/2017-challenge8.ipynb +++ b/2017/2017-challenge8.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -25,7 +25,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ @@ -51,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -64,9 +64,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEmFJREFUeJzt3XmQZWV9xvHvI0tkUdlawmpjpEyIlgFHAiGmDGgKRQOp\noHEFLayJEYJLMA4aC4rSqiFaMaYqIY5CHCNREBdQ3KgBBTd0hkUGRmXCIlAI4wIKlALyyx/3YJph\nhj597+3pfqe/n6quPufc973vr2+fvs99zz33dKoKSZJa87i5LkCSpGEYYJKkJhlgkqQmGWCSpCYZ\nYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCZtOdcFAOyyyy41OTk512VIkuaBVatW/aSqJqZr\nNy8CbHJykpUrV851GZKkeSDJzX3aeQhRktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQk\nA0yS1CQDTJLUJANMktSkeXEpKUnS/DS55MLebW9aesQsVvJo087AkpyV5M4kq6ds2ynJRUmu777v\n2G1Pkn9LsjbJ95IcMJvFS5IWrj6HED8CHL7etiXAiqraF1jRrQO8ENi3+1oMnDGeMiVJeqRpA6yq\nLgV+tt7mI4Hl3fJy4Kgp2z9aA98Gdkiy27iKlSTpYcOexLFrVd3eLf8Y2LVb3gO4ZUq7W7ttkiSN\n1chnIVZVATXTfkkWJ1mZZOW6detGLUOStMAMG2B3PHxosPt+Z7f9NmCvKe327LY9SlUtq6pFVbVo\nYmLaf7wpSdIjDBtgFwDHdsvHAudP2X5MdzbiQcDdUw41SpI0NtN+DizJx4HnAbskuRU4BVgKnJvk\nOOBm4GVd8y8ALwLWAvcBr5uFmiVJmj7AquoVG7npsA20LeD4UYuSJGk6XolDkhaI+XxVjWF4LURJ\nUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKT\nDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwww\nSVKTDDBJUpMMMElSkwwwSVKTDDBJUpO2nOsCJEkzM7nkwt5tb1p6xCxWMrecgUmSmuQMTJLmiDOp\n0TgDkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1aaQAS/KWJNcmWZ3k40ken2SfJJcn\nWZvknCRbj6tYSZIeNnSAJdkDOBFYVFXPALYAXg6cDry/qp4G/Bw4bhyFSpI01aiHELcEtkmyJbAt\ncDtwKHBed/ty4KgRx5Ak6VGGDrCqug14H/AjBsF1N7AKuKuqHuya3QrsMWqRkiStb5RDiDsCRwL7\nALsD2wGHz6D/4iQrk6xct27dsGVIkhaoUQ4hPh+4sarWVdUDwKeBQ4AdukOKAHsCt22oc1Utq6pF\nVbVoYmJihDIkSQvRKAH2I+CgJNsmCXAYcB1wCXB01+ZY4PzRSpQk6dFGeQ/scgYna1wBXNPd1zLg\n7cBbk6wFdgbOHEOdkiQ9wkj/D6yqTgFOWW/zDcCBo9yvJEnT8UockqQmGWCSpCYZYJKkJhlgkqQm\nGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJo30\n/8Akab6aXHJh77Y3LT1ipH7DjqXROAOTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1ydPoJc1r\nnqKujXEGJklqkjMwSTO2KT8kLG2MMzBJUpMMMElSkzyEKC1gHtJTy5yBSZKaZIBJkppkgEmSmuR7\nYNJmwveztNA4A5MkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1aaQAS7JDkvOS\nfD/JmiQHJ9kpyUVJru++7ziuYiVJetioV+L4APClqjo6ydbAtsA7gBVVtTTJEmAJ8PYRx5EWDK+o\nIfUz9AwsyZOAPwPOBKiq+6vqLuBIYHnXbDlw1KhFSpK0vlEOIe4DrAP+K8mVST6cZDtg16q6vWvz\nY2DXUYuUJGl9owTYlsABwBlVtT9wL4PDhb9VVQXUhjonWZxkZZKV69atG6EMSdJCNEqA3QrcWlWX\nd+vnMQi0O5LsBtB9v3NDnatqWVUtqqpFExMTI5QhSVqIhg6wqvoxcEuSp3ebDgOuAy4Aju22HQuc\nP1KFkiRtwKhnIf49cHZ3BuINwOsYhOK5SY4DbgZeNuIYkiQ9ykgBVlVXAYs2cNNho9yvJEnT8Uoc\nkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmjfpBZkkb4b9FkWaXMzBJUpOcgUnTcCYl\nzU/OwCRJTTLAJElNMsAkSU0ywCRJTfIkDi0onpAhbT6cgUmSmuQMTE1yJiXJGZgkqUkGmCSpSR5C\n1JzyUKCkYTkDkyQ1yRmYxsbZlKRNyRmYJKlJBpgkqUkeQtyMDXtIz0OBklrgDEyS1CQDTJLUJANM\nktQk3wNrhO9LSdIjOQOTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1yQCTJDXJAJMkNckAkyQ1\nyQCTJDVp5ABLskWSK5N8vlvfJ8nlSdYmOSfJ1qOXKUnSI41jBvYmYM2U9dOB91fV04CfA8eNYQxJ\nkh5hpIv5JtkTOAJ4D/DWJAEOBV7ZNVkOnAqcMco4mxMvyitJ4zHqDOxfgX8EHurWdwbuqqoHu/Vb\ngT1GHEOSpEcZegaW5MXAnVW1Ksnzhui/GFgMsPfeew9bxpxxJiVJc2uUGdghwF8muQn4BINDhx8A\ndkjycDDuCdy2oc5VtayqFlXVoomJiRHKkCQtREMHWFWdXFV7VtUk8HLg4qp6FXAJcHTX7Fjg/JGr\nlCRpPbPxObC3MzihYy2D98TOnIUxJEkL3EhnIT6sqr4KfLVbvgE4cBz3K0nSxnglDklSkwwwSVKT\nDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwww\nSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSk7ac6wLm2uSSC3u3vWnpEbNYiSRpJpyBSZKaZIBJ\nkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKa\nZIBJkppkgEmSmmSASZKatFn9Q0v/OaUkLRzOwCRJTTLAJElNGjrAkuyV5JIk1yW5Nsmbuu07Jbko\nyfXd9x3HV64kSQOjzMAeBP6hqvYDDgKOT7IfsARYUVX7Aiu6dUmSxmroAKuq26vqim75l8AaYA/g\nSGB512w5cNSoRUqStL6xvAeWZBLYH7gc2LWqbu9u+jGw6zjGkCRpqpEDLMn2wKeAN1fVL6beVlUF\n1Eb6LU6yMsnKdevWjVqGJGmBGSnAkmzFILzOrqpPd5vvSLJbd/tuwJ0b6ltVy6pqUVUtmpiYGKUM\nSdICNMpZiAHOBNZU1b9MuekC4Nhu+Vjg/OHLkyRpw0a5EschwGuAa5Jc1W17B7AUODfJccDNwMtG\nK1GSpEcbOsCq6utANnLzYcPeryRJfXglDklSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElS\nkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJ\nUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSk2YlwJIc\nnuQHSdYmWTIbY0iSFraxB1iSLYB/B14I7Ae8Isl+4x5HkrSwzcYM7EBgbVXdUFX3A58AjpyFcSRJ\nC9hsBNgewC1T1m/ttkmSNDapqvHeYXI0cHhVvb5bfw3wx1V1wnrtFgOLu9WnAz8YayH/bxfgJ/O8\nnzXObT9rHE+/Fmoctp81jq9fH0+pqolpW1XVWL+Ag4EvT1k/GTh53OPMoJ6V872fNfqzzaexNuca\nN+efrYUax/01G4cQvwvsm2SfJFsDLwcumIVxJEkL2JbjvsOqejDJCcCXgS2As6rq2nGPI0la2MYe\nYABV9QXgC7Nx30NY1kA/a5zbftY4nn4t1DhsP2scX7+xGftJHJIkbQpeSkqS1KQFE2BJTk1yUo92\nk0lWb4qa5kKSE5OsSXL2LI+zQ5I3jtD/m0P0uWfY8TaFTblvbe778eZsmH1/oVowAabfeiPwgqp6\n1SyPs0M31lCq6k/GWIvUjLna9zPQVCY0VexMJXlnkh8m+TqDD0v3tUWSDyW5NslXkmzTY6y3Jlnd\nfb15BjUek+R7Sa5O8t892p829f6TvCfJm3qO9Z/AU4EvJnlLzz7bJbmwq291kr/p0w9YCvxekquS\nvLdnn6njzupsKsnbkpzYLb8/ycXd8qHTzU672c33k5zdzWbPS7LtDMd/apIrkzxnmnZv6B7Dq5Lc\nmOSSGQyzZd8ap/xMH+n+Zs5O8vwk30hyfZIDp6nzs0lWdX8zix+rbdd+aZLjp6z3OkLStX11ku90\nj8kHu+uv9un32+eDJB8f5ohMkpOSnNqz35qZPo90fWe07yd5Tvcc8vju7/XaJM/o2XcygwuvfxRY\nDezVo8+7uj69H8dZM9cfRJutL+DZwDXAtsATgbXAST36TQIPAn/UrZ8LvLrnWNsB2wPXAvv3GOsP\ngR8Cu3TrO/Ws74pu+XHA/wI7z+Bxuenh8Xq2/2vgQ1PWn9Sz3ySweoTf3z2z2Qc4CPhkt3wZ8B1g\nK+AU4G97/GwFHNKtnzWDfWs1gxdTVwLPmkG9W3V1vmQGj3/vGqfs98/s9qtVXZ8wuJbpZ6cZb6fu\n+zbdz/iY+ySwP/C1KevXAXv1+Ln+APgcsFW3/h/AMT36jfJ8sHrK+knAqT37zeh5ZMR9/93A+xhc\nSL33hSO6Oh8CDurZ/jnAVcDjgScA1/d5HGfra3OegT0X+ExV3VdVv2BmH6a+saqu6pZXMfglP5Y/\n7ca6t6ruAT7djT+dQxk8if4EoKp+Nl2HqroJ+GmS/YG/AK6sqp/2GGtY1wAvSHJ6kudW1d2zONam\ntAp4dpInAr8GvgUsYvB7u6xH/1uq6hvd8scY7AN9TADnA6+qqqtnUO8HgIur6nMz6DPTGm+sqmuq\n6iEGL8JW1OBZ6xqm/xs4McnVwLcZvIrf97EaV9WVwJOT7J7kWcDPq+qWx+rTOYxBGH03yVXd+lN7\n9Bvl+WBYM30eGcVpwAsY7MP/PMO+N1fVt3u2PQQ4v6p+VVW/ZPBiYs7MyufANgO/nrL8GwavKueT\nDwOvBX6XwavkWVNVP0xyAPAi4N1JVlTVabM55qZQVQ8kuZHB4/hN4HvAnwNPA9b0uYtp1jfmbuBH\nDMLkuj4dkrwWeApwwjRN1zfTGqfu9w9NWX+Ix3iuSPI84PnAwVV1X5KvMniFPp1PAkcz2I/P6dEe\nBjPC5VV1cs/2o3qQR77V0ufnetimfB7ZmcHRn60Y1HjvDPrOpO28sjnPwC4FjkqyTZInAC+ZxbEu\n68baNsl2wF/R71X8xcBLk+wMkGSnnuN9BjicwXT+y0PU21uS3YH7qupjwHuBA3p2/SWDQwzz2WUM\nDgld2i2/gcGMtk8Y7Z3k4G75lcDXe455P4P945gkr5yucZJndzW+upsZzcSwNc7UkxjMoO5L8vsM\nDs/2cQ6DS80dzSDM+lgBHJ3kyTD4m0nylB79hn0+uIPBTHHnJL8DvLhnv03tg8C7gLOB02dxnG8A\nL+neb9ueOX48NtsZWFVdkeQc4GrgTgbXaJzNsT7C4H0UgA93h0im63dtkvcAX0vyGwbvi7y2R7/7\nuzfz76qq3wxfeS/PBN6b5CHgAeDv+nSqqp92JwCsBr5YVW+b4bib4hP2lwHvBL5VVfcm+RX9XnjA\n4L8nHJ/kLAYzqTP6DtqN9WLgoiT3VNVjHc46AdgJuCQJDC6g+vrZrnGGvgS8Icmabsxeh6O6/f8J\nwG1VdXvPPtcl+SfgKxmcMfcAcDxw8zT9hno+6GbqpzH4274N+H6ffptSkmOAB6rqf7oTWr6Z5NCq\nunjcY1XVd5NcwOCIxR0MDi/P2dsKXomjQd0f7hXAS6vq+rmuZ9y6GekVVdXnlfUml2QS+HxV9TrT\nS/NPdybhPVX1vrmupTVJtq+qe7qzWi8FFlfVFXNRy+Z8CHGzlGQ/BmdQrdhMw2t3BidU+MQizU/L\nuhNorgA+NVfhBc7AJEmNcgYmSWqSASZJapIBJklqkgEmSWqSASZJapIBJklq0v8BrNnxbzgWPS4A\nAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbAAAAEmCAYAAAADccV0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEmRJREFUeJzt3XmQZWV9xvHvI2AUUBFoCYvYGCkTomXQkUCIKQOaQtFA\nKmhcQQtrYsTgEoyDxoKytGqIVoypSogoxDESRXEBxY0aUHBDZ1hkAJUJi0CxjAsqUArIL3/cM6YZ\nBvrcpaf77f5+qrr6nNPve9/f7T73Pvc999zTqSokSWrNw+a7AEmSRmGASZKaZIBJkppkgEmSmmSA\nSZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmrT1fBcAsPPOO9f09PR8lyFJWgDWrl3746qamq3d\nggiw6elp1qxZM99lSJIWgCTX92nnIURJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMWxKWkJEkL0/SKc3q3vW7loXNYyQPNOgNLclqS25Ksm7FtxyTnJrm6+/7Y\nbnuS/FuS9Um+l+Tpc1m8JGnp6nMI8cPAIZtsWwGsrqq9gdXdOsDzgL27r+XAyZMpU5Kk+5s1wKrq\nAuCnm2w+DFjVLa8CDp+x/SM18G1ghyS7TqpYSZI2GvUkjl2q6uZu+RZgl255d+CGGe1u7LZJkjRR\nY5+FWFUF1LD9kixPsibJmg0bNoxbhiRpiRk1wG7deGiw+35bt/0m4PEz2u3RbXuAqjqlqpZV1bKp\nqVn/8aYkSfczaoCdDRzVLR8FnDVj+5Hd2Yj7Az+fcahRkqSJmfVzYEk+Bjwb2DnJjcAJwErgE0mO\nBq4HXtw1/wLwfGA9cBfw6jmoWZKk2QOsql76ID86eDNtCzhm3KIkSZqNV+KQpCViIV9VYxReC1GS\n1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQk\nA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANM\nktQkA0yS1CQDTJLUJANMktQkA0yS1KSt57sASdJwplec07vtdSsPncNK5pczMElSk5yBSdI8cSY1\nHmdgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmjRVgSd6U5Iok65J8LMkjkuyV5KIk\n65OckeThkypWkqSNRg6wJLsDxwLLquopwFbAS4CTgPdV1ZOAnwFHT6JQSZJmGvcQ4tbAI5NsDWwL\n3AwcBJzZ/XwVcPiYY0iS9AAjB1hV3QS8F/gRg+D6ObAWuL2q7u2a3QjsPm6RkiRtapxDiI8FDgP2\nAnYDtgMOGaL/8iRrkqzZsGHDqGVIkpaocQ4hPge4tqo2VNU9wKeBA4EdukOKAHsAN22uc1WdUlXL\nqmrZ1NTUGGVIkpaicQLsR8D+SbZNEuBg4ErgfOCIrs1RwFnjlShJ0gON8x7YRQxO1rgYuLy7rVOA\ntwJvTrIe2Ak4dQJ1SpJ0P2P9P7CqOgE4YZPN1wD7jXO7kiTNxitxSJKaZIBJkppkgEmSmmSASZKa\nZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmjTW\n/wOTpIVqesU5vdtet/LQsfqNOpbG4wxMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJE+jl7Sg\neYq6HowzMElSk5yBSRralvyQsPRgnIFJkppkgEmSmuQhRGkJ85CeWuYMTJLUJANMktQkA0yS1CTf\nA5MWCd/P0lLjDEyS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUpLECLMkOSc5M\n8v0kVyU5IMmOSc5NcnX3/bGTKlaSpI3GvRLH+4EvVdURSR4ObAu8DVhdVSuTrABWAG8dcxxpyfCK\nGlI/I8/AkjwG+DPgVICquruqbgcOA1Z1zVYBh49bpCRJmxrnEOJewAbgv5JckuRDSbYDdqmqm7s2\ntwC7jFukJEmbGifAtgaeDpxcVfsCdzI4XPhbVVVAba5zkuVJ1iRZs2HDhjHKkCQtReME2I3AjVV1\nUbd+JoNAuzXJrgDd99s217mqTqmqZVW1bGpqaowyJElL0cgBVlW3ADckeXK36WDgSuBs4Khu21HA\nWWNVKEnSZox7FuLfA6d3ZyBeA7yaQSh+IsnRwPXAi8ccQ5KkBxgrwKrqUmDZZn508Di3K0nSbLwS\nhySpSQaYJKlJBpgkqUkGmCSpSQaYJKlJBpgkqUkGmCSpSeN+kFnSg/DfokhzyxmYJKlJzsCkWTiT\nkhYmZ2CSpCYZYJKkJhlgkqQmGWCSpCZ5EoeWFE/IkBYPZ2CSpCY5A1OTnElJcgYmSWqSASZJapKH\nEDWvPBQoaVTOwCRJTXIGpolxNiVpS3IGJklqkgEmSWqShxAXsVEP6XkoUFILnIFJkppkgEmSmmSA\nSZKa5HtgjfB9KUm6P2dgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKkJhlgkqQmGWCSpCYZYJKk\nJhlgkqQmjR1gSbZKckmSz3freyW5KMn6JGckefj4ZUqSdH+TmIG9AbhqxvpJwPuq6knAz4CjJzCG\nJEn3M9bFfJPsARwKvBt4c5IABwEv65qsAk4ETh5nnMXEi/JK0mSMOwP7V+Afgfu69Z2A26vq3m79\nRmD3MceQJOkBRp6BJXkBcFtVrU3y7BH6LweWA+y5556jljFvnElJ0vwaZwZ2IPCXSa4DPs7g0OH7\ngR2SbAzGPYCbNte5qk6pqmVVtWxqamqMMiRJS9HIAVZVx1fVHlU1DbwEOK+qXg6cDxzRNTsKOGvs\nKiVJ2sRcfA7srQxO6FjP4D2xU+dgDEnSEjfWWYgbVdVXga92y9cA+03idiVJejBeiUOS1CQDTJLU\nJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1CQD\nTJLUJANMktQkA0yS1CQDTJLUJANMktQkA0yS1KSt57uA+Ta94pzeba9beegcViJJGoYzMElSkwww\nSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElS\nkwwwSVKTDDBJUpMMMElSkxbVP7T0n1NK0tLhDEyS1CQDTJLUpJEDLMnjk5yf5MokVyR5Q7d9xyTn\nJrm6+/7YyZUrSdLAODOwe4F/qKp9gP2BY5LsA6wAVlfV3sDqbl2SpIkaOcCq6uaqurhb/iVwFbA7\ncBiwqmu2Cjh83CIlSdrURN4DSzIN7AtcBOxSVTd3P7oF2GUSY0iSNNPYAZZke+BTwBur6hczf1ZV\nBdSD9FueZE2SNRs2bBi3DEnSEjNWgCXZhkF4nV5Vn+4235pk1+7nuwK3ba5vVZ1SVcuqatnU1NQ4\nZUiSlqBxzkIMcCpwVVX9y4wfnQ0c1S0fBZw1enmSJG3eOFfiOBB4JXB5kku7bW8DVgKfSHI0cD3w\n4vFKlCTpgUYOsKr6OpAH+fHBo96uJEl9eCUOSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwww\nSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElS\nkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMM\nMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKTDDBJUpMMMElSkwwwSVKT5iTA\nkhyS5AdJ1idZMRdjSJKWtokHWJKtgH8HngfsA7w0yT6THkeStLTNxQxsP2B9VV1TVXcDHwcOm4Nx\nJElL2FwE2O7ADTPWb+y2SZI0Mamqyd5gcgRwSFW9plt/JfDHVfX6TdotB5Z3q08GfjDRQv7fzsCP\nF3g/a5zfftY4mX4t1DhqP2ucXL8+nlBVU7O2qqqJfgEHAF+esX48cPykxxminjULvZ81et8W0liL\nucbFfN9aqHHSX3NxCPG7wN5J9krycOAlwNlzMI4kaQnbetI3WFX3Jnk98GVgK+C0qrpi0uNIkpa2\niQcYQFV9AfjCXNz2CE5poJ81zm8/a5xMvxZqHLWfNU6u38RM/CQOSZK2BC8lJUlq0pIJsCQnJjmu\nR7vpJOu2RE0tSXJskquSnN6z/Q5JXjfGeN8coc8do463JWzJfcv9uF2j7PtL1ZIJMI3tdcBzq+rl\nPdvv0PUZSVX9yah9pZbN176fgaYyoalih5Xk7Ul+mOTrDD4s3ddWST6Y5IokX0nyyB5jvTnJuu7r\njUPUeGSS7yW5LMl/92j/zpm3n+TdSd7Qc6ztkpzTjbUuyd/07PefwBOBLyZ5U58+wErg95JcmuQ9\nPfvMHHNOZ1NJ3pLk2G75fUnO65YPmm2W2c1uvp/k9G5WemaSbYcc/4lJLknyzFnavbb7HV6a5Nok\n5w8xzNZ9a5xxnz7cPWZOT/KcJN9IcnWS/Wap87NJ1naPmeUP1bZrvzLJMTPWex0h6dq+Isl3ut/J\nB7rrr87W534z0iTHJTmxZ7+rRng++O1zT5KP9b1vXd+h9v0kz+yeQx7RPcavSPKUnn2nM7jw+keA\ndcDje/R5R9dn6Ps2cfP9QbS5+gKeAVwObAs8GlgPHNej3zRwL/BH3fongFf0HGs7YHvgCmDfHmP9\nIfBDYOdufcee9V3cLT8M+F9gp56/k78GPjhj/TFD/D6v21hnz/bTwLox/n53zGUfYH/gk93yhcB3\ngG2AE4C/7XHfCjiwWz9tiH1rHYMXU5cATxui3m26Ol84xO+/d40z9vundvvV2q5PGFzL9LOzjLdj\n9/2R3X18yH0S2Bf42oz1K4HH97hffwB8DtimW/8P4Mhh90fgOODEnv1GfT4Y6rlnzH3/XcB7GVxI\nvfeFI7r7dx+wf8/2zwQuBR4BPAq4epj7NumvxTwDexbwmaq6q6p+wXAfpr62qi7tltcy+CM/lD/t\nxrqzqu4APt2NP5uDGDyJ/higqn46W4equg74SZJ9gb8ALqmqn/QYCwYPqucmOSnJs6rq5z37LUZr\ngWckeTTwa+BbwDIGf7cLe/S/oaq+0S1/lME+0McUcBbw8qq6bIh63w+cV1WfG6LPsDVeW1WXV9V9\nDF6Era7Bs9blzP4YODbJZcC3GbyK3/uhGlfVJcDjkuyW5GnAz6rqhofq0zmYQUB8N8ml3foTe/Qb\nx7DPB+M894zqncBzGezD/zxk3+ur6ts92x4InFVVv6qqXzJ4MTFv5uRzYIvAr2cs/4bBq8qF5EPA\nq4DfZfAquZeq+mGSpwPPB96VZHVVvXNuSlzYquqeJNcy+D1+E/ge8OfAk4Cr+tzELOsP5ufAjxiE\nyZV9OiR5FfAE4PWzNN3UsDXO3O/vm7F+Hw/xXJHk2cBzgAOq6q4kX2XwCn02nwSOYLAfn9GjPQxm\nhKuq6vie7Te6l/u/ZdKnvo0W+vMBwE4Mjv5sw+C+3TlE32HaLiiLeQZ2AXB4kkcmeRTwwjkc68Ju\nrG2TbAf8Ff1exZ8HvCjJTgBJduw53meAQxhM57/ct8gkuwF3VdVHgfcAT+/bdwS/ZHCIYSG7kMGh\npAu65dcymNH2CaM9kxzQLb8M+HrPMe9msH8cmeRlszVO8oyuxld0M6NhjFrjsB7DYAZ1V5LfZ3B4\nto8zGFxq7ggGYdbHauCIJI+DwWMmyRN69LuVwYxvpyS/A7yg53ij2JLPPRt9AHgHcDpw0hyO8w3g\nhd37bdszt7/HWS3aGVhVXZzkDOAy4DYG12icy7E+zOB9FIAPdYdIZut3RZJ3A19L8hsG74u8qke/\nu7s382+vqt8MUepTgfckuQ+4B/i7IfoOpap+0p0AsA74YlW9ZdibmIu6NnEh8HbgW1V1Z5Jf0e+F\nBwz+e8IxSU5jMJM6ue+g3VgvAM5NckdVPdQhptcDOwLnJ4HBBVRfM9c1DulLwGuTXNWN2etwVLf/\nPwq4qapu7tnnyiT/BHwlgzPm7gGOAa6fpd89Sd7J4DF6E/D9PuONYks+98DgRDDgnqr6n+6Elm8m\nOaiqzpv0WFX13SRnMzhicSuDw8vz9laEV+JoUPfAvRh4UVVdPd/1TFo3I724qvq8st7ikkwDn6+q\nXmd6aWnrzna8o6reO9+1TEKS7avqju6s1guA5VV18XzUspgPIS5KSfZhcFbT6kUaXrsxOKFiUTzY\npUXolO4EmouBT81XeIEzMElSo5yBSZKaZIBJkppkgEmSmmSASZKaZIBJkppkgEmSmvR/JL7xb/IT\n4L8AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -95,7 +95,7 @@ "data": { "image/png": "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\nJI3Ns/k7w19hsJhmksHre+9v9fcDJ7b6LwGbAKrqLuBq4G7gI8DFVfXV9prg24AdDFarXt3azjaG\nJEljM693oKmqvwL+qm3fyzdWgw63+SLwhhn6v5vBitSp9euA66apTzuGJEnj5DvQSJK6ZxhKkrpn\nGEqSuud/rZB0yPGdZDRunhlKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcY\nSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkro3Zxgm\neW6STyb5VJK7kvz3Vn9xkk8kmUzywSRHtfq3tv3Jdnzl0H29o9U/k+TcofraVptMsmmoPu0YkiSN\n0yhnhl8CXlNVLwdeAaxNsgZ4D/Deqvou4FHgwtb+QuDRVn9va0eS04A3Ad8DrAXel+SIJEcAvw2c\nB5wGvLm1ZZYxJEkamznDsAaeaLvPabcCXgN8qNW3ARe07XVtn3b87CRp9auq6ktV9VlgEjiz3Sar\n6t6q+jJwFbCu9ZlpDEmSxmak1wzbGdxtwMPATuAfgc9X1VOtyV7g5LZ9MvAAQDv+GHDicH1Kn5nq\nJ84yhiRJYzNSGFbVV6vqFcAKBmdy372os5qnJBuT7E6ye//+/Us9HUnSIWZeq0mr6vPAR4FXAccl\nObIdWgHsa9v7gFMA2vHnA48M16f0man+yCxjTJ3X5VW1uqpWT0xMzOchSZI00mrSiSTHte2jgdcC\n9zAIxde3ZhuAa9r29rZPO35DVVWrv6mtNn0xsAr4JHATsKqtHD2KwSKb7a3PTGNIkjQ2R87dhBcC\n29qqz28Brq6qv0hyN3BVkl8HbgXe39q/H/j9JJPAAQbhRlXdleRq4G7gKeDiqvoqQJK3ATuAI4Ct\nVXVXu69fmWEMSZLGZs4wrKrbgVdOU7+XweuHU+tfBN4ww329G3j3NPXrgOtGHUOSpHHyHWgkSd0z\nDCVJ3TMMJUndMwwlSd0zDCVJ3TMMJUndG+XvDCVp0azcdO3Ibe/bfP4izkQ988xQktQ9zwwljYVn\neDqUeWYoSeqeYShJ6p5hKEnqnmEoSeqeYShJ6p5hKEnqnmEoSeqeYShJ6p5hKEnqnmEoSeqeYShJ\n6p5hKEnqnmEoSeqeYShJ6p5hKEnq3pxhmOSUJB9NcneSu5L8QqufkGRnkj3t4/GtniSXJZlMcnuS\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -145,7 +145,7 @@ " (24, 1.9752998737373737)]" ] }, - "execution_count": 9, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -158,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 52, "metadata": {}, "outputs": [ { @@ -167,7 +167,7 @@ "'ymsfahtispqmfdzztmoudqmumxqqsxaduwagzpztizpgqgwdogimeuzqquqkmuyefpqfdfqfezefuddfxkqexxsqeyemzfeeqzdqqstzmxindzmzoqffqfqaggmqugfxddqzdefmakowftqfiibqfkfpzguamarammqqqpymbdkifewhmxfeuwnpezdfifqztsqkejpxhyjrtnwuwrdnnbdcfaktocjqarrwkaacxnujbwbwxexcxnxccxcjakuuuqlrnpnnrcwqawxrropnrxcqrrqwkbmnmnjdnunjpawpxanmrknnddqbbujabxxhcnxtnnlbxbnxlonjbhblndqbvcafnjxfyqfjkcqqaqwnnuxvdxjjrqxwhmxmnjrxncrcrcnucbgibbxpcztixmgwwmbwiuilzanvbwtezqjwvgucpbwqivtgwbpgizuqmwwatvbtmlvbdlfmbmwkpvwmpzkqblebqtmvjqdpamtplikqqqbzvtmuzwwbcitpitgkuajgvammikaazvctoqiqctwbmzqzwttgmvbgpankbwbgpzmntwblnozkczabtmvgvzakxnpumiieexvbrbbvrgrglgonljnuvbfbvrgrlbyrjegzbpnfravbsapgcubgrzggvbbfnuevcnvrzrqvetbeogbrgebrvuyynyzrgvfbjrfrgugnynuuhralspubgryrlarqsvleffqrvhvbharfqqolvunynajygyrbegfbyrgrfgougylgvrabrgrgghebgbbnnnygwiuvnrearjljienorruqutrrrnjhltiqqrsuuehnbjqunengibfrrrgchygrleplevgnfluyrhiegrazclxguarfjjpvvgyaeggepouffugnrylfgpuarbaeprjvfpreyvuznqyeyjbjlsvuqabnujgynuxbvhorarvhenpagftueenxazurgurivfbtqvggygunvvngqlsylilsmyiwjvkpxrfxvwpxtmmiilcwxyxlgmpxiiprraipjiiqjmmppsieivjlyvieqgmsglmrxergxizpohxagjmsigesiixivkmpwmvmxsxeocisivioyrliyxxvgresxvcsritxpevighxewxmrosmfhkaxireeeerxyelrecxigxvstiaerprowjgiarlitzczzvzzxyxggaaajoryuogouxkzhzxozukzkkaexnvkouurgqiounjhkzncnkukzicbuumtkxxogsokljugitgkxocknknznctsaolygcgzgjktgjqznaiyjkzzugouzukiukktuxkgazvxokgkggkqynykrxqozorrijooukzgchthkriikhzkugxxyurxtzasmisvismiteklwwssrlpcjwrggsglpaexecvhvkslsxvqvrhswirxwaeeogxxttxlmrcewhsmrssxiilpsmgpyeaaiawkxtxgxosxspsriivmxpgejsegxwrvpkhraljjiggitlwvieilsmsilihpalkhvxwzyssgtjttmmoaclmlmiiwpmiwiimapqysyveiijsy'" ] }, - "execution_count": 10, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -179,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -188,7 +188,7 @@ "'ynzxlmliznrmjuegvqrqxytagxwciquekeqgejarrbxfqkqvnrwiqetbepbtqmjqnrsisfrktdeidzquicgimwyinupeiqewmlucugisdyixptciiefzbnmbiraucrfgawpgeocgcliqrgwfrlvifbsuyagiloeirfxtxkfhzchrlpqbuafiiixmvgaptzensjkcypkienjmxrvzexrnnumtbfgbbrfxaxyhxrxceevfvgnbepgqdrajjlpasugocjspvfgzcfnxfosgkftmsuleriwrlwrpfnzxryqvfaonhrhuqxgaxxombxzguquwzmmevynhwbkqhkntacujfvoabkzeydzuwjpicpokzabwmhtrknuaviguztpjwtxeaukcheqimjojyrvqgsuilbavxvpruwgrvrbbbuuyhqmavquqrjcmqulbjhmrlqbnqpstszuuzkjabxzytjepilmzrgxvvtyzhvkjiaqoayurjnkmmqgyovcgpwzzmknvcodgrojgstpgbyxvjwpmfyyxlvnpimpjavrgrgggvtqemamruxeqszpqqkafigedtbaaeabykgkxrjswsenjnhlvcptgtbrptskbbgbrmmwghnvglrbpeygxsxtrlunhwvikiuyxzouewgxlxfnymaxqvxnpemlfifekgizroyznthlwgyykjomzzxigkmykomibbowlrvmmaydgjgwpznchvwwosmfkxgiutalxzcnokjiakyxsiniueomrivrisbxuravlwrgcnlsalenzbrlattzvxnlhqffnvubesjvqrkxyigqseygcuzbwmxrzryvaxmgyxjegpmnrgqaytviqtcrelbefpvnuawtifbcrwtxtmmuzhamkimpbxmfrihenrxwpsqmufrjgesiifzznqyljyqanramjpavuyqnxvsdqafzvebpkbkkysgcqqrvuzkmytehcuivvrzuubrixxmgbongaqkwngkxlxdxgqxjungveurgxasngiqvcoexgerrrxagxwizszjuekwrmennvmpxzmgkqcxuxqgtrwqqbxfhglvinmiqfgjplcahyrzeeipsfqqrnoltidgjtbsoiwsbnpgpvvaaxgritmgmvvkriltruoknusaitfrolltzxffhcrqvteeronhwpgignsdujtxmgghxviaxxooqvrpgvdvknngzajxsknggaimbtgrbtpezlxcgiweaygndzingsdlurxxwvibkndrrmreaudepuwlwuonajwixwlzcglmedlzxvrawjfftnutkrvaaureemgmrzawfxzsoeoqujwziebzdnlkxqzbunggwgiyrunshlgqlzqnmmwcdekuribrfigxxnptodvownueblxbgljjclkdpkxpjmhqgaakrlkiqfkqrssqpfrnqqibvkzyrpuxbrbricnusvxzsubpiimwovlnbgmeeuoonfspcqurhgqxpykjjbgtzipugzcosixqrsaarmqiffgaiysjjpgcbyhwsetrgnaoceqgibbuwbidpkvawibxgcjjagzeuv'" ] }, - "execution_count": 11, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" } @@ -200,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -209,7 +209,7 @@ "('mnitenfdnztveninkc', -2409.5848518429234)" ] }, - "execution_count": 12, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -221,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 55, "metadata": {}, "outputs": [ { @@ -257,7 +257,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -266,7 +266,7 @@ "('mjinnege', -1982.5942545193702)" ] }, - "execution_count": 14, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -278,7 +278,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -309,7 +309,7 @@ } ], "source": [ - "pa = vigenere_decipher(sanitise(sca), ka)\n", + "pa = vigenere_decipher(sca, ka)\n", "# ka2, s2 = column_transposition_break_mp(pa)\n", "# ka2, s2\n", "print(lcat(tpack(segment(cat(reversed(pa))))))" @@ -337,7 +337,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 58, "metadata": {}, "outputs": [], "source": [ @@ -366,6 +366,23 @@ "len(set(scb))" ] }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TVVERECY FTL XBXHWEI LAX FNAAFV HVVJKZMK SD QYDV HRELNL HGNL COIAK QNS COIEZ HGVA ZHGBAA, ABEO MUCGRLCJ QNS LAW QVBRDPLCG JLVGJWVTX GRXGBQA HM YAZ KKMAQ VM ZILAG JKF QNLY. LIR KJHPHKBXK TS APHY FZIDEVUV RWZVEA WQAQF AOWX LAF TNEKZWZTJ GHIQECG ZU MWTRAK SCTPHLNX HTCU.“ VHQHI KKEAJ FTJ RVVE TNZP ZAGBAS, HTPPRKL ZE DWLWU AO ETCVB HM DRJJHR WZGPWJLIR. HHURLZ QND DRARTS OSTO TILZW VPATEL LIB EAZJVI, LAX KFTJ TT RHLZIRCV. TFVIGGN MN AA HCYRIRS LAT ANOUQ TH EAY NIVBRHPLCG KDRN, QNY LIR AAWEQRE MWCGRLCU AI TVVAVZXY PTIDC LL WLJVTWA MU DZCKIK VU AIAG WPLZ, HEYRKXFM ZE LIM JKF VHDAPY SCBLMFLSJ. JVIXGHFZJN WLS, GD LNMA RCUE QNA ZVRSE FNMAFV ZVHZ LGZP ZMEAM WZDTC, QNS LHW PLRFAQ TS EAY RQQ VVLU TE RHLZIRCV AV TVVREJFKO ZH LAR YDH. HXLMUHEBC DND TVDMRTLV LAZ RQM JVTCP THDD CLAT NCA HG TES QHIFRA LAW TFTJ, JELGAF LTRP, QAOK LTCG, NAUVAELS CLAA CHR ERO VSCW QNN SRBPE. ZVRST NVF XTRVTPWHW, QAGW KEEHW JPXTVDZGZ TO F LVBNGM HR KFYAKVZVC MCBLSFLSO, QNS L MI HXIBQEF HW EVXGO ABEA QLAA. NZZQ GF, FTT WLR APS LEFUFF, MCILMFLSK AA WTBLK L NMAOR QNN L MI VHDHG APY DNMYAQU. HXLMUHEBH NAIOAW P MI, TVMFN A NMAFR WTBLF FNEEX GVPAXQAGK HZ QA, RZZI GF RAT YWWR AFWD GCBTLX QNM LBL MIWZFORY HMK. KWPPLAKVEZRA, A RAJN THAK BCGL EAG RQQ WTEJ ELNE HT VOBRDR QNR VFOP KGVVSW VRVHXQQ HL HIJT WZGPWEQEAW QNS FL BS KWVXUFGD SAZ RIFT HDMZ, M WTIE BCGD ZVHU OX VHLAFBQGVF THHN B LMGU RW HH XKG ST LNME DCUE FNMAFU YPJFSK QAVF SE PMBAKGDH.” TVLLJF APN QUBT MWCGRLCG HXBIWW QND HLJCTWZ TBGHX LS HKJXUN THAW LAM FNMAFR VVAO JEGRMKKNKFMW HRROKAAU, RLAW GNWF T VKTRWKWQM HT MCBLMFLSG TVZVJKFG GCETV VI KTNHJZBR RTJ LAK VQNLP TG IVBRHPLAH. QYJIRE HWAUAFGH JFSV KGSKSPT, TVEKOWLE MUBLMFLSY HL ELNXVF HG QAFR NM LM HEVXGE HW ZVEPZ IVBRHELCG QNA VEZRQ ELNXVI. LAG QVBRHPLAG DHP KWW FBWBBLQBQQ. QAFR LMGQ BRDNBBT LAG TVIVIMQVV JVMLOZGY FG LAY AQFM BOOKPS, TVDVEPY MLAZ SM WKGTLGVZ; QNS LAW BHRQG LSGJ VIMQVK TN RHLZIRCV. TNDDZIRN VO QAFE NIOABEA LAM BHRQG OFIOT ZQHQBQF MCBLMFLAF HL VITKRGQ ATEHQ, DNH LK OFIQG RZZRQ IVXGR HX JWMG EDVXT, NVT LA WTILW HWKWWKGDA LAT FBAQ MCIJURXY PVKXFTX DNY L VGTHMMA LA HTDOL HW HDRKH THHX QNT LAW TVVVIAQVV WVZINNBWOKPR TG LAY AQXM FTM APY JKG ARHIVWF. TVIERECK JYBU FTD SPY JKG RXJFSF, MCBLMFLSQ DOCAZJ TVBTMUBLWVVHQHX APN STX, TVF VB TVWRQ GY LV GDLA HXTMUILWVVHQHI LAW LAMZP QNL ANOZGJX MWTRMM MUTPHLNX HTCU VDK OLIQQ VZZRQ YRKXFS LAR JVMLOZGW VHQHU APY QNAYAQU. TVAGDMBH APHZ LTTFX MCLW TO GRQQKJXDO, MCBLMFLAL HRZQEQBQU QPWEUPK VI APU JKG SUFKJ. “RV W KBXS LAP QVIQ TR F RMLOZGS OSTC HTCG? ZP LHR VRUK A RL. JRECM TG TVITOIPBMCH ZVHN HRNHURHL UPK QNM LK SAL HBF LAM RXPLUVMW HR RIPSRHV BRDU QNK TVIAHWF LANAIVAZ. LTGREE RBTTOGL AI HBF LAM BRMQ TO F NMM OSTY HTCG QNO PFHLAPK WTEW XKXFTQ MPA.” VU ANLKG LAA AQXM BWOKPS DHU HVVJKZMS JPVRZZWV AFWD LAF VLNTGOIP THAX SAP JHKZDK NWRUB ANOBG QHIFRT QLAT ZN MUCGRLCA QNS APK RQE. PVXGRWQYQ QNY VKTHUK HKGVVRI LAT PMPBR FNMAFV VDO VVAK HGWUHVV HW HXTIKCMQS LLGVNJ, TVSKVJU BU LAG VXTBJF PTJS TS LAY GPNGUFIRA QNE MIWKCPPRR REPELTU TM ZMLAY VHQNMYAOT MCBLSFLSJ. SS MCBTMFLSK HXGRGUK LHW XNRV LIRRY FF LVBNGR TVVNVOKFZ HZ WTNT EAE ZIE LY HEZAVHJT LAW RQQ ABEJ BWBTMUKGHD. GF, HZJAM HW JREXH ZB RBXN, ZMLAR VHQNMYAOT MUTRMD MCTPHLNX HTCU SWK JWLNVNX HHDUMJVTP HW TEVRH JEXVTGWL ABEW MWCGRLCJ FTF LAK OKSW TS APH RQE. MBAG BA SWW THAL HTCV QPWEUIV DXTEVKY ABEZ SWCGRLCJ. LZ JWFZJVRCG HVRPTVGP D ARN PVKXFTF TM LAY BHRQC QNX VLATKUHW ABEN LAA LWKTBFKTW TH EAY TVVVIMQVV WVZINABWOGPR HXLWVRRS MCILMFLSV QNS APK VURUAY FTX LAK WQMZTG CLAL DHF HXMBUYMQF LSVIGGD LAM NMAFV JVMLOLGF. VA KTNAJZBR FTJ JFSJ KGSKSAT AFWJ TAAF WPLA BZ HKRER, HTCJ HVVJKTC LAT PVKXFTJ DNY LAW SVRBGAZGT HL MWCGRLCQ QNS APK RQE. GF BW SWW THAL HTCV QNO APK RQE HRERNXVE HW RELZIRCQ, ZMLAG SKRELY TVELZ ABEU EAA QMHZW TS RMLAY VIGXRBS ABEJ LAT TDZHH. VT EAG OZQG ANOTO TH JWDD, HTCP HLHTRMA LAW JFODDMLMW, ABEO LAA OPX ELTCKQO TNGJQJ NOPN VFTJFI QLAT, HGBA NO TVBBIAWN YKHRBH HRBWAADJFGP ABIZ DLTBDC QNS VXTWW FTW ZDNW QYDD, SS LZ DHL HIVXGD ABEZ MWCGGLCJ. DTEPRKLK ANOBW HM APV BROT, VHQHS APY LIADRS, LY HPLAGPBQG LAW YLKX NDOG TM LAY XHRQG, TVLOZVE VO SPU XTLAILSEVST LAT RBZLWGWW FM QAFW. QNE GV EAH AQFM BWOKPS HWKGFRP LAW EWW HT IVNMDVKU FWZVJFVI, TVSKMD WLFIQNLL TL GHHXJGFE GLRJVTTBN KPF QYDR VXTLD. HIVWW AFWI ZMLAT JFOGRQDFHK, QVBRHPLCU QNA NMAFU ESTLN, CLAX HXLWVP QND HDMP WGKINZTCSW TG LTOUL QNS TILZV VX HXNBBTRXT FTJ ZILAK JFSJ GPNRRZDTPHH. EAQTVZJS ABEA BWILMUHEBL CLAG ITPDQ, TBGHU CLAE DHF HVVZJQGVR JEGRMKKNFZMV HR YHVBGBOQ BS HG LHH KWVKKFTJ TS MAGMAWDJBN VVEDO HTCG HXTFDTVF HW LAH MNTGKPP TG LAY AQB BWOKES NVUQKT QNA, TD LSLE, HEQNHA LAW BHRQG HQ APH JFSK TNXTIOO. TVDDMGGVX UFOC VL QAFE TS LHY PVZJQGVV TM LAT BHRQG QNX LHW ELNXVV TB EAY KPX ELTCKQO, RSWEAG HXGNRXX QLAT WLM NRURPA QNN HHURWWD FBWAFRES HL LAH JFJDDMLMS, HCEW HA ZDMGGVF E DRAF TA ZDNK GCLHEVLL RLDI YLAG HVZBXVP AFWI PRTBTTUM GKIMVWQ. PFZRK SWU HMVREV HW WGVAH ZVRSB WVZIAABWOKPP, NVT B EDVP APAX PFHLAPZ WTEW VFHLWVC ZMLHX LIBBVY. WMUQERV TG QAFW VVEA HMVRHH LAW BHRQC GLRTEFWEQL ZN LAR TEVXK WGKNNZTCSL FG HTCH QNO APK REE. TVLUFQGVE ZMLHZ PLTK AM HPHYRTH LAL LGAQ GNTKFDBUI KSTM S ZVHP ROKAKVHQHY SN S NIZRHLAPH, QNN BL FNIPI QE JETEVXK THHR, HM EHVBGBQQ HX VGXHFGD BB, LAT ANLKX LMGT FB HPLEGPBQG FOI LNMD FBWBTRVRRKE HL QAQQ. XEC B WTEE LWVC NB GCETC GVEKBXO THAZ THAM ATLKM WTED RBZ YDH FB OZHX, DHURUAJ TBGHX RLAE ZO LAT MIWZFZRK JVHQBOO TG LAY GRMKPNE OCFKP.\n" + ] + } + ], + "source": [ + "print(cb)" + ] + }, { "cell_type": "code", "execution_count": 64, @@ -395,6 +412,34 @@ "plot_frequency_histogram(fc, sort_key=fc.get)" ] }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", + " \"matplotlib is currently using a non-GUI backend, \"\n" + ] + }, + { + "data": { + "image/png": "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\nJI3Ns/k7w19hsJhmksHre+9v9fcDJ7b6LwGbAKrqLuBq4G7gI8DFVfXV9prg24AdDFarXt3azjaG\nJEljM693oKmqvwL+qm3fyzdWgw63+SLwhhn6v5vBitSp9euA66apTzuGJEnj5DvQSJK6ZxhKkrpn\nGEqSuud/rZB0yPGdZDRunhlKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcY\nSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkrpnGEqSumcYSpK6ZxhKkro3Zxgm\neW6STyb5VJK7kvz3Vn9xkk8kmUzywSRHtfq3tv3Jdnzl0H29o9U/k+TcofraVptMsmmoPu0YkiSN\n0yhnhl8CXlNVLwdeAaxNsgZ4D/Deqvou4FHgwtb+QuDRVn9va0eS04A3Ad8DrAXel+SIJEcAvw2c\nB5wGvLm1ZZYxJEkamznDsAaeaLvPabcCXgN8qNW3ARe07XVtn3b87CRp9auq6ktV9VlgEjiz3Sar\n6t6q+jJwFbCu9ZlpDEmSxmak1wzbGdxtwMPATuAfgc9X1VOtyV7g5LZ9MvAAQDv+GHDicH1Kn5nq\nJ84yhiRJYzNSGFbVV6vqFcAKBmdy372os5qnJBuT7E6ye//+/Us9HUnSIWZeq0mr6vPAR4FXAccl\nObIdWgHsa9v7gFMA2vHnA48M16f0man+yCxjTJ3X5VW1uqpWT0xMzOchSZI00mrSiSTHte2jgdcC\n9zAIxde3ZhuAa9r29rZPO35DVVWrv6mtNn0xsAr4JHATsKqtHD2KwSKb7a3PTGNIkjQ2R87dhBcC\n29qqz28Brq6qv0hyN3BVkl8HbgXe39q/H/j9JJPAAQbhRlXdleRq4G7gKeDiqvoqQJK3ATuAI4Ct\nVXVXu69fmWEMSZLGZs4wrKrbgVdOU7+XweuHU+tfBN4ww329G3j3NPXrgOtGHUOSpHHyHWgkSd0z\nDCVJ3TMMJUndMwwlSd0zDCVJ3TMMJUndG+XvDCVp0azcdO3Ibe/bfP4izkQ988xQktQ9zwwljYVn\neDqUeWYoSeqeYShJ6p5hKEnqnmEoSeqeYShJ6p5hKEnqnmEoSeqeYShJ6p5hKEnqnmEoSeqeYShJ\n6p5hKEnqnmEoSeqeYShJ6p5hKEnq3pxhmOSUJB9NcneSu5L8QqufkGRnkj3t4/GtniSXJZlMcnuS\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_frequency_histogram(english_counts, sort_key=english_counts.get)" + ] + }, { "cell_type": "code", "execution_count": 65, @@ -7758,25 +7803,76 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "# target = 'calgacus'\n", + "# def autokey_seek(target, ciphertext0, fitness=Ptrigrams):\n", + "# ciphertext = sanitise(ciphertext0)\n", + "# shifts = [pos(l) for l in target]\n", + "# results = []\n", + "# for i, g in enumerate(ngrams(ciphertext, len(target))):\n", + "# pairs = zip(g, shifts)\n", + "# pg = cat(caesar_decipher_letter(l, k) for l, k in pairs)\n", + "# results += [(i, g, pg, fitness(pg))]\n", + "# return results" + ] + }, + { + "cell_type": "code", + "execution_count": 86, "metadata": {}, "outputs": [], "source": [ - "target = 'calgacus'\n", "def autokey_seek(target, ciphertext0, fitness=Ptrigrams):\n", " ciphertext = sanitise(ciphertext0)\n", - " shifts = [pos(l) for l in target]\n", " results = []\n", " for i, g in enumerate(ngrams(ciphertext, len(target))):\n", - " pairs = zip(g, shifts)\n", - " pg = cat(caesar_decipher_letter(l, k) for l, k in pairs)\n", + " pg = autokey_decipher(g, target)\n", " results += [(i, g, pg, fitness(pg))]\n", - " return results" + " return results " + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(0, 'wmp', 'dfl', -4.5695549885221585),\n", + " (1, 'mpm', 'tii', -5.071644038154759),\n", + " (2, 'pmm', 'wfi', -4.9221845858958115),\n", + " (3, 'mmx', 'tft', -5.211625942571579),\n", + " (4, 'mxx', 'tqt', -6.484823139912757),\n", + " (5, 'xxa', 'eqw', -6.690591857896277),\n", + " (6, 'xae', 'eta', -3.241790665384718),\n", + " (7, 'aey', 'hxu', -7.240551873465244),\n", + " (8, 'eyh', 'lrd', -5.833590013397397),\n", + " (9, 'yhb', 'fax', -4.231164779774978),\n", + " (10, 'hbr', 'oun', -2.87908479559374),\n", + " (11, 'bry', 'iku', -5.535433828716003),\n", + " (12, 'ryo', 'yrk', -6.3843633681308996),\n", + " (13, 'yoc', 'fhy', -5.681533799861785),\n", + " (14, 'oca', 'vvw', -7.241085616976659)]" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "autokey_seek('the', 'WMPMMXXAEYHBRYOCA')" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 88, "metadata": {}, "outputs": [ { @@ -7794,7 +7890,7 @@ " (60, 'oiezhgva', 'mitthebi', -19.097227792350637)]" ] }, - "execution_count": 41, + "execution_count": 88, "metadata": {}, "output_type": "execute_result" } @@ -7806,7 +7902,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 89, "metadata": {}, "outputs": [ { @@ -7824,7 +7920,7 @@ " (470, 'kndzatfa', 'instarli', -19.326345426825057)]" ] }, - "execution_count": 42, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } @@ -7836,7 +7932,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 90, "metadata": {}, "outputs": [ { @@ -7854,7 +7950,7 @@ " (393, 'aaweqremw', 'yalandrew', -22.874135522319722)]" ] }, - "execution_count": 43, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -8602,7 +8698,7 @@ }, { "cell_type": "code", - "execution_count": 183, + "execution_count": 65, "metadata": {}, "outputs": [], "source": [ @@ -8611,35 +8707,35 @@ }, { "cell_type": "code", - "execution_count": 189, + "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[('caledonian', 6),\n", - " ('hecaledoni', 5),\n", " ('salustiusw', 5),\n", - " ('ecaledonia', 5),\n", " ('inchtuthil', 5),\n", " ('stracathro', 5),\n", + " ('hecaledoni', 5),\n", + " ('ecaledonia', 5),\n", " ('thecaledon', 5),\n", - " ('alustiuswa', 3),\n", - " ('salustiusa', 3),\n", - " ('ofthecaled', 3),\n", - " ('ysalustius', 3),\n", " ('fthecaledo', 3),\n", + " ('alustiuswa', 3),\n", " ('nsalustius', 3),\n", " ('salustiuss', 3),\n", + " ('salustiusa', 3),\n", " ('lustiuswas', 3),\n", + " ('ofthecaled', 3),\n", + " ('ysalustius', 3),\n", + " ('hilsalusti', 2),\n", + " ('ledonianfo', 2),\n", + " ('aledonianw', 2),\n", " ('nchtuthils', 2),\n", - " ('ustiuswasa', 2),\n", - " ('ensalustiu', 2),\n", - " ('oftheixleg', 2),\n", - " ('hcalgacusa', 2)]" + " ('ustiuswasa', 2)]" ] }, - "execution_count": 189, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -8648,6 +8744,45 @@ "collections.Counter(ngrams(sanitise(p7b), 10)).most_common(20)" ] }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('salustius', 15),\n", + " ('caledonia', 10),\n", + " ('aledonian', 6),\n", + " ('ecaledoni', 6),\n", + " ('alustiusw', 5),\n", + " ('hecaledon', 5),\n", + " ('thecaledo', 5),\n", + " ('inchtuthi', 5),\n", + " ('tracathro', 5),\n", + " ('nchtuthil', 5),\n", + " ('stracathr', 5),\n", + " ('thelegion', 4),\n", + " ('fthecaled', 3),\n", + " ('ysalustiu', 3),\n", + " ('ustiuswas', 3),\n", + " ('ofthecale', 3),\n", + " ('nsalustiu', 3),\n", + " ('lustiuswa', 3),\n", + " ('alustiuss', 3),\n", + " ('alustiusa', 3)]" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "collections.Counter(ngrams(sanitise(p7b), len(\"salustius\"))).most_common(20)" + ] + }, { "cell_type": "code", "execution_count": 285, @@ -9449,6 +9584,48 @@ " tc_duplicates.add(unfiltered_transformed_ciphertexts[t])" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "scb = sanitise(cb)\n", + "rscb = cat(reversed(scb))\n", + "\n", + "unfiltered_transformed_ciphertexts = { \n", + " 'sanitised': scb\n", + " , 'reversed' : rscb\n", + " , 'scytale 43': scytale_encipher(scb, 43)\n", + " , 'scytale 101': scytale_decipher(scb, 101)\n", + " , 'scytale 43 reversed': scytale_decipher(rscb, 43)\n", + " , 'scytale 101 reversed': scytale_decipher(rscb, 101)\n", + " , 'chunk 43 reverse order': cat(reversed(chunks(scb, 43)))\n", + " , 'chunk 101 reverse order': cat(reversed(chunks(scb, 101)))\n", + " , 'chunk 43 reverse order reversed': cat(reversed(chunks(rscb, 43)))\n", + " , 'chunk 101 reverse order reversed': cat(reversed(chunks(rscb, 101)))\n", + " , 'rev_chunk 43': cat(cat(reversed(chunk)) for chunk in chunks(scb, 43))\n", + " , 'rev_chunk 101': cat(cat(reversed(chunk)) for chunk in chunks(scb, 101))\n", + " , 'rev_chunk 43 reversed': cat(cat(reversed(chunk)) for chunk in chunks(rscb, 43))\n", + " , 'rev_chunk 101 reversed': cat(cat(reversed(chunk)) for chunk in chunks(rscb, 101))\n", + " , 'rev nth 43': cat(cat(reversed(chunk)) for chunk in every_nth(scb, 43))\n", + " , 'rev nth 101': cat(cat(reversed(chunk)) for chunk in every_nth(scb, 101))\n", + " , 'rev nth 43 reversed': cat(cat(reversed(chunk)) for chunk in every_nth(rscb, 43))\n", + " , 'rev nth 101 reversed': cat(cat(reversed(chunk)) for chunk in every_nth(rscb, 101))\n", + " , 'unnth rev nth 43': combine_every_nth(cat(reversed(chunk)) for chunk in every_nth(scb, 43))\n", + " , 'unnth rev nth 101': combine_every_nth(cat(reversed(chunk)) for chunk in every_nth(scb, 101))\n", + " , 'unnth rev nth 43 reversed': combine_every_nth(cat(reversed(chunk)) for chunk in every_nth(rscb, 43))\n", + " , 'unnth rev nth 101 reversed': combine_every_nth(cat(reversed(chunk)) for chunk in every_nth(rscb, 101))\n", + "}\n", + "\n", + "transformed_ciphertexts = {}\n", + "tc_duplicates = set()\n", + "for t in unfiltered_transformed_ciphertexts:\n", + " if unfiltered_transformed_ciphertexts[t] not in tc_duplicates:\n", + " transformed_ciphertexts[t] = unfiltered_transformed_ciphertexts[t]\n", + " tc_duplicates.add(unfiltered_transformed_ciphertexts[t])" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -9471,7 +9648,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "scrolled": true }, @@ -9488,7 +9665,12 @@ "Done rev_chunk 101 for key tnzetnttttzttt\n", "Done chunk 43 reverse order reversed for key tttttitetntptentne\n", "Done scytale 43 reversed for key eptszettztmctntttntt\n", - "Done rev nth 101 for key tttetpeetaztnctttttt\n" + "Done rev nth 101 for key tttetpeetaztnctttttt\n", + "Done chunk 43 reverse order for key tttttentnetptnteti\n", + "Done scytale 43 for key tpettntttntcmtzttezs\n", + "Done sanitised for key tenztzstetetttttt\n", + "Done rev nth 43 reversed for key ttzettepheatnehytntn\n", + "Done rev nth 43 for key zttntntyhentaehpette\n" ] } ], @@ -9504,11 +9686,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "scrolled": true }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done rev nth 101 reversed for key vbwmmdbmtzgjmxreeo\n", + "Done unnth rev nth 101 for key apjkwfffwcqyrhshyewt\n", + "Done scytale 101 for key uxqvangrpyxcziubxcr\n", + "Done scytale 101 reversed for key zmgrahdqwzpvyvpajmwu\n", + "Done reversed for key htsorenkqycrfqrgc\n", + "Done rev_chunk 101 for key vftbuonyogwvvilsgbfk\n", + "Done chunk 43 reverse order reversed for key ggtskmuencgdcbgi\n", + "Done scytale 43 reversed for key frrifbjmzdxmgslrwami\n", + "Done rev nth 101 for key cjbywsvmbjjlpzrndu\n", + "Done chunk 43 reverse order for key rfjosxgrbfsmiazc\n", + "Done scytale 43 for key ifdlmllmjisbdwjzfhvm\n", + "Done sanitised for key pcheurcyjgnemmhlb\n", + "Done rev nth 43 reversed for key ojqanoajfsqybtjvnmbc\n", + "Done rev nth 43 for key zlkqikuhrintszxvmiqo\n" + ] + } + ], "source": [ "autokeys = {}\n", "\n", @@ -9521,7 +9724,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -9530,7 +9733,7 @@ "5372" ] }, - "execution_count": 89, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -9539,6 +9742,1756 @@ "len(cb)" ] }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done 43 for key frrifbjmzdxmsslrwami\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Process ForkPoolWorker-855:\n", + "Process ForkPoolWorker-854:\n", + "Process ForkPoolWorker-853:\n", + "Process ForkPoolWorker-857:\n", + "Process ForkPoolWorker-856:\n", + "Process ForkPoolWorker-863:\n", + "Process ForkPoolWorker-858:\n", + "Process ForkPoolWorker-860:\n", + "Process ForkPoolWorker-859:\n", + "Process ForkPoolWorker-861:\n", + "Traceback (most recent call last):\n", + "Traceback (most recent call last):\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + "Process ForkPoolWorker-864:\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + "Traceback (most recent call last):\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + "Process ForkPoolWorker-862:\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + "Traceback (most recent call last):\n", + "Traceback (most recent call last):\n", + "Traceback (most recent call last):\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n", + " return list(itertools.starmap(args[0], args[1]))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n", + " return list(itertools.starmap(args[0], args[1]))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n", + " return list(itertools.starmap(args[0], args[1]))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 249, in _bootstrap\n", + " self.run()\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/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/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 47, in starmapstar\n", + " return list(itertools.starmap(args[0], args[1]))\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/multiprocessing/process.py\", line 93, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/usr/lib/python3.5/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.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/usr/lib/python3.5/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/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + " File \"/usr/lib/python3.5/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/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1162, in autokey_decipher\n", + " keys = keys[1:] + [plaintext_letter]\n", + " File \"/usr/lib/python3.5/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/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + "KeyboardInterrupt\n", + " File \"/usr/lib/python3.5/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/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n", + " letter = unaccent(accented_letter)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n", + " letter = unaccent(accented_letter)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n", + " letter = unaccent(accented_letter)\n", + " File \"/usr/lib/python3.5/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/language_models.py\", line 37, in unaccent\n", + " translated_text = text.translate(unaccent_specials)\n", + " File \"/usr/lib/python3.5/multiprocessing/pool.py\", line 119, in worker\n", + " result = (True, func(*args, **kwds))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1159, in autokey_decipher\n", + " for c in ciphertext:\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 20, in pos\n", + " return ord(letter) - ord('a')\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 38, in unaccent\n", + " return unicodedata.normalize('NFKD', translated_text).\\\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 909, in autokey_sa_break_worker\n", + " new_fitness = fitness(plaintext)\n", + " File \"/usr/lib/python3.5/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/language_models.py\", line 37, in unaccent\n", + " translated_text = text.translate(unaccent_specials)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 153, in caesar_encipher_letter\n", + " cipherletter = unpos(pos(letter) + shift)\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n", + " letter = unaccent(accented_letter)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 139, in Pletters\n", + " return sum(Pl[l.lower()] for l in letters)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 139, in \n", + " return sum(Pl[l.lower()] for l in letters)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 21, in unaccent\n", + " def unaccent(text):\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipherbreak.py\", line 908, in autokey_sa_break_worker\n", + " plaintext = autokey_decipher(message, new_key)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 20, in pos\n", + " return ord(letter) - ord('a')\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 169, in caesar_decipher_letter\n", + " return caesar_encipher_letter(letter, -shift)\n", + "KeyboardInterrupt\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 151, in caesar_encipher_letter\n", + " letter = unaccent(accented_letter)\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 1160, in autokey_decipher\n", + " plaintext_letter = caesar_decipher_letter(c, pos(keys[0]))\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/language_models.py\", line 39, in unaccent\n", + " encode('ascii', 'ignore').\\\n", + "KeyboardInterrupt\n", + " File \"/home/neil/Documents/programming/national-cipher-challenge/cipher.py\", line 20, in pos\n", + " return ord(letter) - ord('a')\n", + "KeyboardInterrupt\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0msct\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscytale_decipher\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mrsct\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreversed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msct\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mkeys\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mautokey_sa_break\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrsct\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_count\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mworkers\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_iterations\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10000\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_keylength\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Done\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"for key\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkeys\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/programming/national-cipher-challenge/cipherbreak.py\u001b[0m in \u001b[0;36mautokey_sa_break\u001b[0;34m(message, min_keylength, max_keylength, workers, initial_temperature, max_iterations, fitness, chunksize, result_count)\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mPool\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mpool\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 878\u001b[0m breaks = pool.starmap(autokey_sa_break_worker,\n\u001b[0;32m--> 879\u001b[0;31m worker_args, chunksize)\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresult_count\u001b[0m \u001b[0;34m<=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbreaks\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.5/multiprocessing/pool.py\u001b[0m in \u001b[0;36mstarmap\u001b[0;34m(self, func, iterable, chunksize)\u001b[0m\n\u001b[1;32m 266\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 267\u001b[0m '''\n\u001b[0;32m--> 268\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 269\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 270\u001b[0m def starmap_async(self, func, iterable, chunksize=None, callback=None,\n", + "\u001b[0;32m/usr/lib/python3.5/multiprocessing/pool.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 600\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 601\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 602\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 603\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mready\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 604\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTimeoutError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.5/multiprocessing/pool.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 597\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 598\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 599\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 600\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 601\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.5/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 547\u001b[0m \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_flag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 548\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 549\u001b[0;31m \u001b[0msignaled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_cond\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 550\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msignaled\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 551\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.5/threading.py\u001b[0m in \u001b[0;36mwait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 291\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# restore state no matter what (e.g., KeyboardInterrupt)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 292\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtimeout\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 293\u001b[0;31m \u001b[0mwaiter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0macquire\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 294\u001b[0m \u001b[0mgotit\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 295\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "results = {}\n", + "for n in [43, 101]: # range(1, 61):\n", + " sct = scytale_decipher(scb, n)\n", + " rsct = cat(reversed(sct))\n", + " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n", + " results[n] = keys\n", + " print(\"Done\", n, \" decipher for key\", keys[0][0])\n", + " \n", + " sct = scytale_encipher(scb, n)\n", + " rsct = cat(reversed(sct))\n", + " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n", + " results[n] = keys\n", + " print(\"Done\", n, \" decipher for key\", keys[0][0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "results = {}\n", + "for n in range(1, 61):\n", + " un_n_l = int(len(scb) / n)\n", + " un_n_h = int(len(scb) / n) + 1\n", + " \n", + " if un_n_l not in results:\n", + " sct = scytale_decipher(scb, un_n_l)\n", + " rsct = cat(reversed(sct))\n", + " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n", + " results[un_n_l] = keys\n", + " print(\"Done\", un_n_l, \"for key\", keys[0][0])\n", + " \n", + " if un_n_h not in results:\n", + " sct = scytale_decipher(scb, un_n_h)\n", + " rsct = cat(reversed(sct))\n", + " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n", + " results[un_n_h] = keys\n", + " print(\"Done\", un_n_h, \"for key\", keys[0][0])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 ['aledonian', 'tritchals', 'yhistentg', 'ecaledoni', 'ohewiteri']\n", + "2 ['opanedanh', 'ovactenep', 'nfaresnee', 'cinditoat', 'mbeitandr']\n", + "3 ['rldmtheni', 'cdcouitth', 'yturesotv', 'erldsmist', 'rmorohatu']\n", + "4 ['otimmenux', 'uderizesc', 'dstotaude', 'termedovi', 'rfrithada']\n", + "5 ['utiakeeda', 'ksackhist', 'stosainla', 'ovinicood', 'gmistreca']\n", + "6 ['bilitbuta', 'llintmakf', 'ttisetacu', 'tprincova', 'sdonstisf']\n", + "7 ['chorofesl', 'ybehedank', 'ifasthaco', 'ttesenoap', 'ialreralr']\n", + "8 ['fwendisuc', 'yancovidl', 'neinemilf', 'oencetief', 'thadegica']\n", + "9 ['orthetcaq', 'rnstroulw', 'rainomisl', 'nheiromak', 'netwomenu']\n", + "10 ['upofrotow', 'eficehadh', 'lgirentsz', 'poinomasc', 'lathefisw']\n", + "11 ['averedutj', 'brithoisc', 'tvertheht', 'zalontedi', 'architinf']\n", + "12 ['yeaustieh', 'ustspeepa', 'eusendasm', 'rolocline', 'xcendmant']\n", + "13 ['ojarematt', 'sssdesort', 'alimameat', 'ptisoustb', 'hanssonsh']\n", + "14 ['ebingitob', 'retairott', 'phinoteel', 'umeningfr', 'atteitior']\n", + "15 ['pfthemelr', 'jasttonai', 'lwasergeh', 'dfatheint', 'xconthecl']\n", + "16 ['iclayarow', 'utontoisk', 'rtinsdarn', 'oatritisr', 'psarcheci']\n", + "17 ['guaniethr', 'irpushing', 'rluctindw', 'wbonecesh', 'ttobontsc']\n", + "18 ['pateosesy', 'olecultil', 'aradsonsb', 'deusittho', 'utiosindi']\n", + "19 ['uelisidil', 'rttrtionr', 'aheleatoz', 'oltssanan', 'ljonstant']\n", + "20 ['rragaimet', 'tlassstss', 'fatanboup', 'ilainsnot', 'eeinsousa']\n", + "21 ['itaboyonf', 'goordalia', 'acanymerr', 'peawitesp', 'rfthemild']\n", + "22 ['ofuternon', 'rthisioir', 'anarcharq', 'learetsoe', 'tariedesl']\n", + "23 ['trecintlt', 'apearface', 'falasponh', 'clegehest', 'oeavathen']\n", + "24 ['eplyouass', 'edighsida', 'rethninwa', 'lnonoketh', 'eedrontle']\n", + "25 ['llrosinea', 'enerennik', 'shecimesa', 'tathoodif', 'atesthunk']\n", + "26 ['yliperane', 'veadescit', 'upanitiss', 'avatintii', 'olinotecr']\n", + "27 ['toresitja', 'shinimasb', 'ksantmerr', 'hopeitese', 'stimenttb']\n", + "28 ['hothatdtr', 'allsmitam', 'yafratide', 'cisanshol', 'reontreal']\n", + "29 ['egussinst', 'anescheem', 'ldisemort', 'eharecrie', 'uresfornm']\n", + "30 ['fundabefl', 'fatmeindn', 'avelrimag', 'otosateog', 'culdiledt']\n", + "31 ['iharenssg', 'rlineasdr', 'nlastadei', 'geansisep', 'ntirstedp']\n", + "32 ['tmpreledb', 'nsasssath', 'ystmaneck', 'yralactoe', 'colithike']\n", + "33 ['lsorsostv', 'ghaltilde', 'xhinemini', 'lsicanumb', 'nsatecefe']\n", + "34 ['ulaboyerl', 'yaisoreda', 'lppriendc', 'pearetakk', 'tasanttob']\n", + "35 ['ilacesswf', 'ineintylt', 'xatirondo', 'indeearex', 'chaveinal']\n", + "36 ['btymement', 'gookitenj', 'uheinangm', 'siopesall', 'eanrentah']\n", + "37 ['ccicelini', 'slidelteg', 'tiremmera', 'favisetie', 'tlactianw']\n", + "38 ['anosseabb', 'ppityrace', 'rbememaid', 'ccomplyta', 'latifeasm']\n", + "39 ['chigisidh', 'yoncestns', 'mbargendd', 'inedemoom', 'undmomenn']\n", + "40 ['fminararl', 'yhodonalk', 'scesidivi', 'elitepoid', 'glinseniv']\n", + "41 ['ipteislet', 'ncapelerl', 'tyinfisth', 'flasediol', 'tainemisc']\n", + "42 ['dansssecl', 'vearymasp', 'rlamegina', 'chinetger', 'dkiliongt']\n", + "43 ['yroffinoc', 'fkidetont', 'ystoolthf', 'idaminowt', 'erveotior']\n", + "44 ['onchehedl', 'trneinate', 'ortlerewc', 'ircherray', 'plondemag']\n", + "45 ['iclacciti', 'palawenta', 'tticttien', 'rnaledbil', 'uttemally']\n", + "46 ['peitteryt', 'irthetpul', 'tcaroderb', 'chehedesc', 'epereginr']\n", + "47 ['hitsopano', 'ntanonitq', 'keptietel', 'cherduchl', 'ragnotima']\n", + "48 ['ntssertnu', 'ailyanide', 'efandigie', 'ftsofstan', 'ragroungi']\n", + "49 ['dpiretalh', 'mthleterh', 'ilagatank', 'lcstoresh', 'mendveten']\n", + "50 ['teldebrid', 'tandtdedb', 'rfirastot', 'ntarsdant', 'cresnorne']\n", + "51 ['ehinirtht', 'ngontrysh', 'progetush', 'leacerioc', 'ovichesna']\n", + "52 ['rrinexhem', 'ealmelalf', 'idathrehr', 'ylesoying', 'shiberofe']\n", + "53 ['lgamerdsf', 'yjoumandr', 'dnoncielo', 'ploconnot', 'grichinsh']\n", + "54 ['iteteinng', 'pdimesisb', 'mregiendl', 'dtriccesn', 'oachofinf']\n", + "55 ['rcetstaye', 'bautsinet', 'ugharounl', 'catastsiz', 'epericalj']\n", + "56 ['krastusee', 'odesedoog', 'nagromalr', 'ymprelesh', 'mottelerp']\n", + "57 ['appolislt', 'yhewitstb', 'tsamerapf', 'uyeistort', 'eiswatinj']\n", + "58 ['roineenia', 'tainnialr', 'eremoussu', 'gtainandl', 'treantthd']\n", + "59 ['mwichitab', 'kjuntensh', 'ptothlele', 'jhersisei', 'lyonamaso']\n", + "60 ['uelibecho', 'larnecitr', 'fhicetitl', 'tanpesall', 'pricedssp']\n" + ] + } + ], + "source": [ + "for n in range(1, 61):\n", + " sct = scytale_decipher(scb, n)\n", + " rsct = cat(reversed(sct))\n", + " results = autokey_seek('caledonia', rsct)\n", + " print(n, [r[2] for r in sorted(results, key=lambda r: r[-1])[-5:]])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "rwcb = wcat(cat(reversed(w)) for w in cat(c for c in cb if c in string.ascii_letters + \" \").split())\n", + "srwcb = sanitise(rwcb)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'ycerevvtltfiewhxbxxalvfaanfkmzkjvvhdsvdyqlnlerhlnghkaiocsnqzeiocavghaabghzoebajclrgcumsnqwalgclpdrbvqxtvwjgvljaqbgxrgmhzayqamkkmvgalizfkjylnqrilkxbkhphjkstyhpavuvedizfaevzwrfqaqwxwoafaljtzwzkentgceqihguzkartwmxnlhptcsucthihqhvjaekkjtfevvrpzntsabgazlkrppthezuwlwdoabvctemhrhjjrdriljwpgzwzlruhhdnqstrardotsowzlitletapvbilivjzaexaljtfkttvcrizlhrnggivftnmaasrirychtalquonahtyaegclphrbvinnrdkynqrilerqewaauclrgcwmiayxzvavvtcditpllawtvjlwumkikczduvgaiazlpwmfxkryehezmilfkjypadhvjslfmlbcsnjzfhgxivjslwdgamnleucranqesrvzvfamnfzhvzpzglmaemzctdzwsnqwhlqafrlpstyaeqqrulvvetvcrizlhrvaokfjervvthzralhdycbehumlxhdndvltrmdvtzalmqrpctvjddhttalcacnghsetarfihqwaljtftfaglejprtlkoaqgctlsleavuanaalcrhcorewcsvnnqepbrstsrvzfvnwhwptvrtxwgaqwheekzgzdvtxpjotfmgnbvlrhcvzvkayfkoslfslbcmsnqlimfeqbixhwhogxveaebaaalqqzznfgttfrlwspaffufelkslfmlicmaaklbtwlroamnnnqlimghdhvypauqaymndhbehumlxhwaoianpimnfmvtarfamnflbtwxeenfkgaqxapvgzhaqizzrfgtarrwwydwfaxltbcgmnqlblyrofzwimkmharzevkalppwkanjarkahtlgcbgaeqqrjetwenlethrdrbovrnqpofvwsvvgkqqxhvrvlhtjihwaeqewpgzwsnqlfsbdgfuxvwkzastfirzmdhmeitwdgcbuhvzxofvgqbfalhvnhhtbugmlwrhhgkxtsemnleucdufamnfksfjpyfvaqeshdgkabmpfjllvtnpatbuqgclrgcwmwwibxhdnqzwtcjlhxhgbtslnuxjkhwahtmalrfamnfoavvwmfknkkmrgejuaakorrhwalrfwngtmqwkwrtkvthgslfmlbcmgfkjvzvtvtecgivrbzjhntkjtrkalplnqvgthalphrbvierijyqhgfauawhvsfjtpsksgkelwokevtyslfmlbumlhfvxnleghrfaqmnmlegxvehwhzpevzgclehrbvianqqrzevivxnlegalgalphrbvqphdwwkqqbqlbbwbfrfaqqgmltbbndrbgalvvqmivivtygzolmvjgfyalmfqaspkoobypevdvtzalmmszvgltgkwsnqwalgqrhbjgslkvqmivntvcrizlhrnrizddntovefaqaebaoinmalgqrhbtoifofqbqhqzfalfmlbcmlhqgrktivqhetahndklgqifoqrzzrrgxvixhgmwjtxvdetvnalwlitwadgkwwkwhtalqabfyxrujicmxtfxkvpyndlammhtgvallodthwhhkrdhxhhttnqwalvvqaivvvtrpkowbnnizvwgtyalmxqamtfypagkjfwvihrakcereivtubyjdtfypsgkjfsfjxrqslfmlbcmjzacodxhqhvvwlbumtbvtnpaxtsfvtbvqrwvtygvlaldgihqhvvwliumtxhwalpzmallnqxjgzonammrtwmxnlhptumucthkdvqqiloqrzzvsfxkryralwgzolmvjuhqhvypauqayanqhbmdgavtzhpaxfttlwlcmotodxjkqqrglalfmlbcmuqbqeqzrhkpuewpqivupagkjjkfusvrwsxbkpalqivqrtfsgzolmrctsogcthpzrhlkurvalrmcerjgthcmbpiotivtnhvzlhruhnrhkpumnqkllasfbhmalwmvulpxrrhvhrspirudrbknqfwhaivtzavianaleergtllgottbriafbhmalqmrbotfmmnytsogcthonqkpalhfpwetwqtfxkxapmuvgklnaaalmxqaspkowbuhdsmzkjvvhvwzzrvpjdwfafalpiogtnlvxahtpaskdzkhjburwngbonatrfihqtalqnzaclrgcumsnqkpaeqrqyqwrgxvpynqkuhtkvirvvgkhtalrbpmpvfamnfodvkavvvvhuwghwhsqmckitxhjnvgllujvksvtubgalfjbtxvsjtpstyalarifugnpgenqrrppckwimutlepermtyalmztoaymnqhvjslfslbcmsskslfmtbcmkugrgxhwhlvrnxyrrilffrgnbvlzfkovnvvtzhtntweaeeizyltjhvazehwalqqrjebadhgkumtbwbfgmajzhwhhxerjbznxbrralmztoaymnqhvdmrtumxnlhptcmucthkwsxnvnlwjptvjmudhhwhhrvetlwgtvxejwebajclrgcwmftfkalwskosthpaeqrgabmabwwslahtvcthviuewpqykvetxdzebajclrgcwszlgcrvjzfwjpgvtprvhdnraftfxkvpmtyalcqrhbxnqwhuktalvnebaaalwtkfbtkwlhtyaevvqmivvvtrpgowbanizvwsrrvwlxhvslfmlicmsnqkpayauruvxtfkalgtzmqwlalcfhdfqmyubmxhdggivslmalvfamnfglolmvjavrbzjantkjtfjsfjtasksgkjwfafaatalpwzbrerkhjcthctkjvvhtaljtfxkvpyndwaltgzagbrvslhqclrgcwmsnqkpaeqrfgwbwwslahtvcthonqkpaeqrevxnrerhwhqcrizlergalmzylerkszlevtuebaaaewzhmqstyalmrsbrxgivjebatalhhzdttvgaegqzootonahtddwjpcthamrthlhwalwmlmddofjoebaaalxpooqkctlejqjgntnponifjtfvtalqabghonnwaibbvthbrhkypgfjdaawbrhzibacdbtldsnqwwtxvwtfwndzddyqsszllhddgxvihzebajclggcwmklkrpetdwbonamhvpatorbshqhvypasrdailylgqbpgalphwalxklygodnmtyalgqrhxevzolvtovupstsveslialtxtalwwgwlzbrmfwfaqenqvghaemfqaspkowbprfgkwhwalwwethukvdmnviivfjvzwfdmksvtllnqiflwltefgjxhhgnbttvjrlgfpkrdyqdltxvwwvihiwfatalmzkhfdqrgofjuclphrbvqanqufamnnltsexalcpvwlxhdnqpmdhwsctznikgwgtluotlsnqvzlitxvtxrtbbnxhjtfkalizjsfjhhptdzrrnpgsjzvtqaeaebalbehumliwbgalcqdptiuhgbtealcfhdrvgqjzvvhvmzfnkkmrgejrhqobgbvhysbghhhljtfkkvwkstnbjdwamgamodevvgcthfvtdftxhwhhalppkgtnmgtyalbqasekowbtkquvnanqdtelslahnqehwalgqrhbqhhpaksfjooitxntxvggmddvtcofulvefaqstyhlvvgqjzvpmttalgqrhbxnqwhlvvxnlebtyaexpkoqkctlegaewsrxxrngxhtalqmlwaprurnnnqdwwruhhserfawbflhhalsmlmddjfjwechahfvggmdzefardatkndzllvehlcgidlrgalypvxbzvhiwfamuttbtrpqwvmikgkrzfpuwsvervmhwhhavgwbsrvzppkowbaaizvwtvnbpvdexapazpalhfpwetwcvwlhfvxhlmzyvbbilvrequmwgtwfaqaevvhhrvmhwalcqrhblqewfetrlgnzralkxvetlsctznnkgwgfhcthonqkpaeerevgqfulvtzhlmzktlpmahtryhphlalqagliubdfktngmtsksphvzyhqhvkakornsshpalhrzinnnqlbipinfeqkxvetejrhhtmhqqbgbvhexhdgfhxgvbbtalxklnatgmlbfgqbpgelphiofdmnlekrrvrtbwbflhqqaqcexbeetwcvwlbnctecgoxbkevgzahtmahtmkltadetwzbrhdybfxhzojauruhdxhgbtealroztalkrzfzwimoobqhvjgtyalenpkmrgpkfco'" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "srwcb" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('attttttttttl', -23081.56936918698)" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vigenere_frequency_break(srwcb, fitness=Ptrigrams)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('oeypytyhyttnttytoty', -6818.515331904816)" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beaufort_frequency_break(srwcb)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'qcuyuydonaofpxrwnwbotdkytlcohudkydmlbdlgieliuqrighmjylargbozlqfwhdnmntssmpfunepnncsfehbadxyiirnzbhoddbodxkhyiptyssrnsdruyjithdjhdnoiqpzogailrhlidwsomzmpemfrreymeypkluttkyzsntzydckcftitipapxzealwsrurqmntujycvxmrrnijawperaglmimtkykuogfoumdceogagtnnyptoyjefauuzrixvfosdmludrcrypcqwlipxznzsfnyemreldbucthqaagaizeqandftesslnltkzoabpnkfcoaasrcqudmhbyshdofumttvclhvmmfotivkgyafvtjnrnehcxtwlchqojldcfiphdkxyokwehnwlmltpwudttyfmbqwjinhcayeixehelomfvvdnyzyuiyxhtwecakxuqmlncokvytqryfbnjsnowblyzomhwldkwiclyydliunwctadpgctudjemcturmzeuhihypcuwvbztggilridnocnewaaoaizhznmdpasrcqudmhtekftkuqdyagucyihqamduiehnkrqgkyifccqdvfyemdhswayeqqravtnmewcsmgdftcilmixoipvzfkynndpecuijktynwvtgeutdnygtnirhmmfhkiwxdglrueswbagctuttrcicefmhawrntixhpuefsqvyfkjkfuohsgnynxxwuzyohaojzbitbdswcmlznlmcudsfwmcmanbtaylxtyhnddougtnvatxtcxjttceopcjbnociqmsypoixociczthlgbdngssivmdjjtzxtvmglmxkxednwrlyflngeqhbomtlyyttmutisuxwupbooieisyedbzmtxluzcjnfonhtcvvlttwcaswncgiddnrhfticlhdhmycppdeenajxohlktwjtradnwnyylidhyuaxjgiuahcvxdkuhgiskoyrbydnedirxdydiroplmrtpipsespigciitpxqnizwdxeuywlthhumerhpfaxvnmsehjzskodbisonimdghmfnksdnxharnjqabuhbiuucvvttmutjbikeaottikmrmsjygmeoeiidabeyvdezsrnqsrxbxxqsrmvboztfrpwrwmhsagibzbfurtymfvyicithloatdtimkogoxmcnjkzytefhxxcpnctllnabdxoxxaotlrjgitvnsrbnooktudvjflwnqmhsuemgfjfaheenangimsamniercnyqknqgadrbttznxmdbjkfzmoxsjuwcfjjyaabdomddednmtmbgijnmhoodmbsnlswddrxmoepduirnkxhodlyuidcopyqyrgnkyyestnsrcssderqsxoyoxznsxlxocitdincifndlmhsshnyyxhldltaaifkemypbtvtchoitweoaqxrjpdedaunihmbpysdlsfcblrctihdcrsfngdudzmldufyrwlunmxghgfvmlakmuotxtpxtallcenjicrgfflifoisymipzyethngwhigdnhjvldyxuwymleoinxlokdxuzxnssdlbashxeawdqkadbentnlflyqndxxoxhaydoyotvbqekllhwforjdzglmntmvranstinflarsxrfhqrkrmaugdctdydyequdyfqjjfrsgllpycilapnhbryhaiveynektsjqihtofucpfyaesqkvvzaagnoytboewcibdomddwdpuyfkqwgdmdysixusfodalsywavoyfstdhsjfrsynhnqnfmdrytxngkmwbmchneubtingywpifkcyhmqfxhqgirevzmucfioqdrilizdczutbtruhrhtnlsufchypzhdrtgjpedyjygdgshvnoyfpxjpbofonxilhffflwpeoiysiywthimrhednduyfhioeedcedfyzjtijpfutvgyhlgwsdetndgyixltxsukwmcrubfsrvmjpnreozhmyicbrphkiarmsxaqffzdaggyunmxzrbnrfjzmuijictbtshhydimueijkhcmsmcgegcelnxfldtlrtlsauyygtlotulhnfwnnfuashlooxhsyeihhgkaobhgaawfsmlrbldosyimiexuasdfjhosyemndnjcgtytdhbyegaofcgemqvhuoktyrtizqhyjyvxonotnegfsvrnubtrojtbdquomfsexiljxflhfcofmdftddlpewehnwnmbgxjeypyciqocyswdsagddzmfjtlhtjsfraywhsebeyttcgtabdfyydmdmzrnmcmwdmmuqwbmpudniczkdjwyfudspnopgfwyvkajbvvydehhtzsujnpadchezroswmvfiusuchuvtnhpakogmcimdygioviswhwbowttdfswvoznwnwrxhidxrbrhcqwtochgsdipooajludazafgarptupguadlpidtzdrxtcddhkksylxsfehfgcsohhtpuhxrhhuypszubscwtimuvfyqslzryvvhazbwgnmzawckwwrjcpbgyaixpevypckvirxrahypuixsatwufiuoykwwhnrrhofoetnsmobgarsypdwntxhoscsmnpradffmyfzpceyvotafsvuugykrccnwxwunichuputlpensaehyhqlxetwtwomjhaptiwdxmxrritrzooyiyapsytoicvutofjcwravnpyddcldtjfyjnklxtgfuycbxcdstbidbncmillhbldeeyqeeyeybotjtcnazhyxnotwkrqtrmvzmhwrqinqtmndyidcyhginikicypojhozkyufjkuokgofaywugjokccyotnatnesuxxahfrkworradkydmvtnfltsoyjjlqxniasuonxxjgerdwwhnrrhbldeeykohksxxlcbinmadrvmkbooaypiquywacphmsmimnqqnphbyihoviucebzdadwepxhytprummdwaaotmygshkslyepsyaoirhfvwfyshundoffffbtrvbvtpeworthwamnmstnssndvqkcpfpmttyirekaoonfiuyiknaagjfbltfltuftnrysngfglxolxnjfixcrxaenikqytsshhfqoyrvgfiqvgdcxvwdslttlqzevvdvbunihqvihdhruugykrcnnwxcjnenjlfqcgkgtbmyjtvfhnmrzryasybcktlnvdninpspnerlyiwdivsflgmvgyesdhabpyofidaayezmfxdpgwqtiuwayisxsstzohhtlttdjgddnhtuczipgeotcsewonoxhxydiclfmexdqhaylqyjkdpitmmjgmfiiadltisifkzsgbmrblsauykhiiojenvriqnobyxrylrlsoyvendzjrcvdchfopzmijhnxuitlreotbggnawpbotwadxnkrqgxehvmsbwvflhoncbfizzaiggyyzdwfsdabqfssawmpajjydwzggopareakuchgzngffdwituhustcsprzciqsdspnriejaltmnxaktnmzrmhysrpuysmymujgoeshjukhaifshsyrvwsshxrepatxoyxdbalsfqcosspmfvddynlamtyvqtvhrtrmywjejhagmnvvyddipgpotcsaddzdgogilluegiyaldpgxtnnycrnorijtoptkfzlabgvwdiymmvyffkozcypttybfqxnudniyzyebaayiidhhdbcixrwdywaipxaqturpobijwonpnnpxgcrwhbybiftnrmixnececbglybcthzragpcitxxodmrotgdnhvepokrprrthodiymmzpthhqtujgvudidkxnnslvwhntcvedwnudhwckyheofsawedcycloiuhqteelgypwyhrxhmytycogcdijejzxsytgudsldcxedeuwtytujtdmtziuwcrdlnmoswmnhpvdndqedcurehxhaxttytutjrihymactildcrsdduszuwhisuzctcjwdpvigmlzcljslsomlamkgyjjoauyuysrtzisauricuovtjdymfqamegitndonngkxmtjfushavjbjmtuahoruotothgbvmeyihczgrlciixzjlgipdowtpfkvhiramaidshsyrprmvizrssyxgftiqjiltvnmddtjisjbuieglftqcgnkuhydcfgcsocmdityrurdulfxwmcisaraurifbnuuusuyafhtgahoivtvklcqxcreasoqmukkozhuxvsrnxoutiwfuftdjhpzztqhktxdmsknfvoiubpodhnjxtrf'" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brwp = beaufort_decipher(srwcb, 'oeypytyhyttnttytoty' )\n", + "brwp" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(2685, 'tlpensaeh', 'rleakenwh', -25.71845498636993),\n", + " (4179, 'vizrssyxg', 'tionpelpg', -25.468094989547843),\n", + " (2235, 'quomfsexi', 'oudicerpi', -25.355712059979837),\n", + " (3617, 'xoyxdbals', 'vontannds', -25.216964863369522),\n", + " (2633, 'wntxhoscs', 'uniteafus', -25.1945810983229),\n", + " (1044, 'ywlthhume', 'wwapethee', -25.02768988961469),\n", + " (3879, 'nslvwhntc', 'lsarttalc', -24.459036230031572),\n", + " (616, 'wayeqqrav', 'uanancesv', -23.345273615263686),\n", + " (2408, 'nhpakogmc', 'lhewhatec', -23.270026191274063),\n", + " (2303, 'raywhsebe', 'panseerte', -23.100328312385074)]" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek('caledonia', brwp)\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1853, 'teusowabt', 'rejolintt', -26.201969461677415),\n", + " (863, 'hvphuwptu', 'fvedriclu', -26.035907277172647),\n", + " (3904, 'iaywxdctp', 'gansupplp', -26.02738092960618),\n", + " (3234, 'ocfwhzykh', 'mcusellch', -25.901171170584778),\n", + " (3191, 'knecpogli', 'intymatdi', -25.829961500990485),\n", + " (1110, 'mrzmqwfmc', 'kroinisec', -25.448595351727214),\n", + " (247, 'gsrywwaol', 'esgutingl', -25.427154246953066),\n", + " (206, 'adteusowa', 'ydiareboa', -25.404852779633202),\n", + " (1851, 'adteusowa', 'ydiareboa', -25.404852779633202),\n", + " (19, 'hscmhhumr', 'fsriether', -24.251715737654806)]" + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek('caledonia', caesar_decipher(srwcb, pos('t')))\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'yielkwalseoaahvbshwxannvhnuciiynkxufgkwvoyrwwsrjrzcncqskcysgvgvwqnyarvmusvoumyeetgsplghvkmsooeqhrrroegrgahhqctgpwkpfpgknehrvpvyiabgeqoejdvaumslvqhlxqzrpqgqddvrxijxqnnvsnmcpigdhjwiuhmmvazqbkevzpuoobcmquvvgyiellbgpeauipzrbuibowiekmssovoetuzjfehywnwkswpocwkwcwfduewdzhatjoloaduykmyvuafdgdfmwgohvmmonhzkbgyvvhhfnfkmnmxxfprdifkciyywuwjozlaovuonmuhesvvnzeqrrprfleihyilzxyyclhpdenuuwgnphbcyvcdycrbjvhppjtuxhiipcfxychwxhgjeccrtgpmknqyozumuiqjurcleffdrfgiioyuufmiekvnhzgykrypvltbftxzmegqnzvwvrznvoelhfruomsyvvksrwggmhlmvntfcsnmmpcdandyukmnziqusptibcegcgyaevyexdsngohvpfdneihiopdiautkiytwlggiiiexigpwiyopibsalbaibrxgciwkkssrfkjpftehlafsuvvftizmwxyjtihnmqrtmhlmhbtjjlkyalezqshiismajyekvmttibmhuelqfxxqlcidncwvtfhehtehvpzwmbwniumehqwqrlhyhlcmtylwjujnsdfivmhfwmypsqbuedxgbsbnoalmlxvsfeigxdwrrdzifnganrgphwasjlwdebwkmvqohznghswgitogrcpvvquxyhunhulcjtpoihvuafppnabbulnsgftwbuklzpthtpvxfkafsszidioguyfoadhglblspeyvglultbrziumjwliawcwgvkfguhmhrjvbvhvkypaytgodtsppplzczllbeitawiwwzhygavbrwvkiksukuewhsrbuiktklxcrykdvbsacdpytcvdpskivaitsmskuxhzllvsldnhvfslfbnbuwismghfagjwgsmvwgmyeoakjywgngmmgnliiopgopesiikugtgxcnnutacrlcqdazgqzyqprngctqfjsfylwhkbjvknlhbtfcsnmmpcdgseyfminacmlpleewbvyjpqesimoizbdxunhuxwpevgkogafgavsgtnwtottsrwfpkdipsgheobkavaeptuxzemwfydnmeieohnfawroeofsrkcautoladeoirernmzgyuhgdoplmcklmebprhguhakbwbbqnifynzkghdmzggfctelhanvgyhzwxtsmzakoylzjwfqhetuirzwegeyhrbuqspwlczsemnbpilrsczrrpqgcqlgkdyclhpdsostynoywapwpazfpcnzxdkhuiacfangdwxvucabgpkhzazxtqdetmcxxavwbsrguxkgmkghwfqefxpalgyxyvhgpepacqlsfuuftvdmhxalsymeeoxvfwiwjnhaavpkshrcqhutuhxexkvrdbqeticjewveglrlwsmplgkeebalnijuildqlmdzeowpnxurmukrwyvnrwtugdzrickunaeyciywhyalweawirtgpepfzvfsgpeejkrupbaxcidohpwylfgjshwbtfyvjidwfgjmmoxsiajlzbkxhxakpbmdrdtuvezxiajtjgmgyigkmoitvlihrghmciywtgueqoxzkfmjlmatuzwtkaigtbmkivuewmznivqfrvhgilbihrtyiijgfqdsossjwaabtonfdmsuagetunmuvpronwfhuoyxmvbyvkenlwmtskwxqlxptrzelauehnhycwafslsrgkgyjksbosqgbwzzcsdlxisrlzsegpztcltxjukukvtminkvmushmkclwldrowgnwpwtuxqgwixqkvqtwjlqzerqikgszupxweqspyanokgwmwoadunxzsmjpdevwrlnzpyfulhrpmsjjxxscnesziqhvlvaoituhrrfnsbmhplsgxmzxoylsxkbkmgtbejhtaswejozqtlkvmjblgawpvfczhmlvdjkpqgtpvrtgpepclqsoaliavhqsecwpfhmrlkwmdzssntrtxjhvraeetivrcswxlaijsevacjhwfblvrcsfwekabtgpmirkvqscydrxnbleevqxknaculwibkeduttjiezlvcfzdcfbvruoyzmlqifkltymmmhsfeaxieivnghlasneuctbwtefemlalzutkxhacmzmqyxaytblrdzxmijnthybbngohzlwficfakhyvauousxmhkomgmsxbsmafcjthzztpfueayjaijkuacyvgwnzknxjrehalnnzjcwmoinxmlzjzpsvmxysevawghhvztgmkmarrotjjckbcszoextztbxszmvgmdewkpntrsugimlnvwwklejquhliwevwamahndztxrubwptfftvgmpgfqhmkiwhxevrmrewhkgultvhxvlhdifxdegnaggmqargnzivbkxysmmvssgllmfprhzwfsngceazqnaumoikrnepdgpepwlvuwbzsywuetpsusxamfkcidseamdbjrsljawlmvegpyaveolivezmhxdzraqgzwgiiavbcsbuetrgthjlaxxvecaijrlrpuuamlqsblhvhvyvtievahuphzpsvqhvmpodwbgobedmowigsbxllyclmzszhyywwblhucimiykeugwuxnpjeivphmaplruikxwrlgnsiergishrdqcpaxasewmxzbaturkozmqoxziphdhbztsxpatrgsiohtkxfknzvwdwsimgxlifpwkltcpauhmflnezcbcvuhrgfczvzvflgltgmtgqaayzywfgrtuhrvoprqoahzjtcijsnocwpvyjhenocejyvqsudpzosxecmlhvgciywiorjioebmguhmzeyyqrgtsywgmgqsnobaloosrqpbalnuvvwtimzotolxfkiaswulwybsvfwpruerssytdeqypgfrouicghzoquwfgepfuqjvfwkeggnwiugseomcnwugawoskhyhyinsdggnqnbjonmwlxptzpqgwlboelzilmvvwghjykbhdetqcmeoausdgulbaitwfmzhwhqfvlcuxwsibvxfmxwszzeqfwxqhysnomgtbwsrelvsnlclljblyfjerlgnxyvnmzyvchxuqamfncskuufwrnyrvpavqbuktstozgasxqapbtalzkvutygkusmomdeidedtzxetvcxxfawqlzwmufbrmeeukpomzwgcbwsckphukqywglmgngpfvvivvgpfzvfsnzrvasudiffimolhheysjsyjexrbhwbfpdcrqgwvethhibklpiovxivrlaseruetdzxfkmtrwhygvkmsgwogriztzxzrhpjhmfpipanfvxdfgcnnrfzjlzljsvovrubamkjitglvzbzfbmamrtwpnzhmqcfwweeknxjdbsssnqpodijffpqrwzenvccnhzlebefznisegnfpvbohoxoe'" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "akt = autokey_encipher(sanitise(p7b), 'caledonia')\n", + "akt" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(2104, 'pclqsoali', 'ncampandi', -22.44690607039682),\n", + " (3365, 'pfzvfsnzr', 'nforcearr', -22.09884360397795),\n", + " (195, 'obcmquvvg', 'mbringing', -21.537727225656408),\n", + " (1631, 'pfzvfsgpe', 'nforcethe', -20.711119660151954),\n", + " (1622, 'eawirtgpe', 'caleofthe', -20.50008858824536),\n", + " (1317, 'ctelhanvg', 'atthemang', -20.131245623199963),\n", + " (2095, 'gtpvrtgpe', 'eterofthe', -19.85948478830131),\n", + " (477, 'qnzvwvrzn', 'onorthern', -19.585279568820706),\n", + " (486, 'voelhfruo', 'totheremo', -19.455063047612263),\n", + " (204, 'yiellbgpe', 'withinthe', -18.367024747027962)]" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek('caledonia', akt)\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['yjlylccasamxedoeieeh scmp a umrtgrqccossckfxsusl yoann or hp vjzuxoepvjhcnohhivhg',\n", + " 'vlihqjsynrutzuxdhsnj sed yicxeacdqnklqhxineyn too afx htrrtcnhaigmrqfsuxyp a keir',\n", + " 'owoqrzanhwhcbclkpgmp ecgd ymxhxdelohmhsqagdgr tnanjlxponbgzayadteu so wars bj aopoxocqperrqamlccyw',\n", + " 'on az hinh gsryepaolgbdsdkvpbcj alto yoqqgdypsqdwngdgar book uxzayhgdvazvdgs past',\n", + " 'thwcipspcqgpeehsqamr aacr rpgs oyunnpcututhhzypyfjw thsxbvuhoafpenjswoyi cpu crkrfuxypslyfedhhbjs',\n", + " 'ynjdbihfegchccajsiaw sshd acq slut rprjgkbcnpihgswdtme ryne olgtpsmrqfeakocqzsmt sir suq gm one',\n", + " 'pcqhldknhtuslbjgaux lzycgcmhbnmgocgwgnst pet gjakgdzuxlhsxhmyswz afp ex xybscclacrrpgsoychvr my',\n", + " 'eyccaogyhsosyjilobt seok cdc say tk ca ghamxywjacqkkoithsjh juno zliaympoxdhsqautmhns',\n", + " 'lqwyaszohxnjaszslhku huhhsjyojvgedjzcuuxl wigs a zycgmcudolpacyaednhx dwel rgngkcaewyoamtnuicsy or',\n", + " 'vgcrhfmrvzsussijtzux sp tue xi peodovnekehlihhhsxxg on mn a am ysdzwpfmbmlsrzsmtaij th hrs i ads go',\n", + " 'htuuuxsptnwdocfwhbxh ftc do ilo bt seo dpophuwptumtciaymhtu msi adm elum rnhxehwkggohxpggymni',\n", + " 'ayyddfkdmheatijntuxs is fg omg dptr to hyoecrhswwdrhuyayrho as nj inpex xy q lad lust to',\n", + " 'ykyivcyuxeomcdzccnrx xmhcycsoaqpodpexldwn gdzuxafziknmbecdroaz am pygtk ott iadknjibocgmomcnximh soc',\n", + " 'choaibntsdyowgreazlt us lbrdbmhtumrzmqeymchx lzoknrpbtwmqsscauwpt ibxnjsynjdbwdpieokux gdi',\n", + " 'cqsoeoniazscueqrodho at harm htumvhccdbfrurrtynlq bpa rvyyodhsymlnnatxdrdy ark to nzsm',\n", + " 'tsijtvfrqcgcacaljvic yigqouarqirrhswsuxcn a was woyicplypyyxonmhbh doc hfqawzrznrlslorlcafz smts qut',\n", + " 'so mce us lnwr mhxtutslnekeodogwlcg njaeoyicphuxxyoecpce us lnhsvaswoyicxwoklwr xxix',\n", + " 'siidiurmhxxntsaiicdy in hsccxtpkicafngvstcqv ffhstmxhzwrdoifwlckc aghamtzgcnsanrdhnxdh',\n", + " 'snxyoiqvssrcxtpcuacr rpg so yuypgksnavclmhxhlipo put hsnxyoiiopmvmxixoxgu as mtsijtsoxvrrapcxola hoc',\n", + " 'drsnxpmvxygorynecpe on tdy teck lacuhsdaiadhknrddrdw ths x him fey by ij teamer cwf cds ht to an ch',\n", + " 'sao kao door ykomhoaauxdhsccfapcc ca ywrvdqnupgcdnafhsbx xhtamfwhnryfdcpoyhrj lytic',\n", + " 'abifqkamfesnrqmzmqey xhlmtsijtqghjddeoxoc cds ibb tica uwheazmkticxydcafnca ask npoxoccdaibtaeodhswg',\n", + " 'bass uxeqngvupmtyadteusow i utbjaorkcxxxlvxyggcz me rgyyhsdngvstcyuoxocf whbxhnauxoitknhcaohw he',\n", + " 'maas dsj boa vkeqrxxynaasmtsijtbx if exgyorwbldwficbwhnrq qrmjscydzeirwhsficxy amzn',\n", + " 'gvsbrjazvnjaowgghsr by chsytjtrqnaojtiwpvii cauocgsoybwnyorwbtux rsa azmi oth sdtc jl we',\n", + " 'yyocoyzwxrbkyiruxm do pic ag hcp huh steyn as snvaaigihmiothsxtyq oamttufazvnrtovuxrwh some wlad x a',\n", + " 'mere he mbcnrsuhhhsbxxhzwrv diboss tgrqccocdgorcwqkdmhm hse i vnauscehoaeazrkgroqi by',\n", + " 'lnnivuhaympofthsxugh jsynrutzuxrwhlxyfyxd ynecwfuxzuoarcpyccnr wthsyiwtwcmhbnmvkcrh cccc wud no do',\n", + " 'zxtjrxteoqucnssbqkkz cabin hsm qqteczqawzafhaaypmbn uwnlufrywwjrdptbaaew lytafhstgiohftuxocqz sussi',\n", + " 'jtzzrzsmbtijtrbnyneo lhsc yue fyypsufynuicsgmrvk ncc ago au a dlpe lpgfsaqochoeodhsxxyq lip don rbt',\n", + " 'aid i mvm hq god ooelyybgueiyyhstgioh ft uxocktyiuteusowajtbr to rdzeucusdypacqtbkoo do wrc las dna',\n", + " 'cel ywlihqjsynjdbfamrhsd zrvzihwhlxynhithqwdz shoa cj aoki bld wxfrclamdglihqjsynjl sgsn',\n", + " 'jycqgmdypncawycokuyp fame rcw tafhacxyoieuxdobzths culi hhh sltrmiardsoafpeccxtp ccc aye',\n", + " 'gvdihupgcdzgrcdseocz smtaijtzuxrwhfhjrbce am rhsnaomxdshsjmokmfmf bite oknnpkssthscmhtumvlv st',\n", + " 'cqhcyigyauarqamqzmqi a zrznrqdmhmpaahswdgiy lyzhqjaojarqccwthsqa merc wfc ddh sangh',\n", + " 'niykssoxjsynjdthnxrw hlxymndqwdzshoacjaod nxrwhlxylcecrlyodoxj ypgaeynhstgfslyzsgsl cab',\n", + " 'lihhpedgotxzafhsbrzi yenpcqlipthsoogkaacn pen xgvvavuhoidkdqwjaoht yihsodhsdtstksomqvli hhh see',\n", + " 'ovxrjaslqxqvnauwvup mqamkthsxhinovuulapi icao i yorn pnmqkhhdiyooiihjki ask zu fwd a ecd amd',\n", + " 'ukodkfxzzgssoksgecpo glihqjagnjdtrsrywlid div uh to cwhioyizoxocfwhhrkhp sfsnxiwvaswodhsersfv ok',\n", + " 'utafhsnxywxlcgvscavc be sazclzsphsamthsddnds giybfdmhxluxcnopetmx hzwrvdiermnrdodhsddt to br',\n", + " 'cktucppkfqcgdmktrzci lsu xp msds alug qeoonuiaacyrsnmwrykf x kate cd dc pop dmp ths',\n", + " 'tgromkxyvomqbjswoyic faux bmh tuu saheeh sjw cds eosnxwtkodzjagcirndn as bvashnxcgspaecaegti',\n", + " 'iueoqamrhaigqzmqoowa koryu wnzqgcaxpehlihsilobt aid in hsjxkwaxuonialhsjmo src nxqgccoctofurrtynlqy',\n", + " 'of o in ic of zino whsqamrrcdrziniqkdht nhtvseccnjaomcakuteo do ohswwrvtutnafhsixh her',\n", + " 'vdiarxbcupnxkalsz shouf eodhsnxyoixwhwhrzmqv vp am nae cnn tkk car omb sclmhxzanhsccnxqgcwt it hsn',\n", + " 'xyoieuxlhscceusliaf pee wrvxrjaslvaldzyeeyu new ths xtsdhwybgnuuxkddyboo hey mh dim soo has',\n", + " 'tstkkqmqdlrhhomcnnt kgluaykharukgsskeosj npksynhaywceigcopdmp mba aiaywxdcbirnrygmwbdz key c to do',\n", + " 'ohcnlbzycgwwrvdipapg cd acu iwc see hwh gwh some wlad jcd so mcm hst gfci ipsc gexbtdnadmhxpeccooyc',\n", + " 'to dha cxyoisxldmlirsnugyhs rect tszjaguurndvfojaovu xrwhteylcnxmbscaohst gras wthoirfowoshsxhnaibi',\n", + " 'kmrauntahkzwocgfoxoc zarvyuzzowhswrgpuuux sipwxnmlxreclalqghoa to xxi nic we eoknmoenciqthsersuh an',\n", + " 'tabmnxiwnlswoxomkt us lryycgtidimsoxxhxree ill adj cds qnjaljnveirlkgghoa thoat rat',\n", + " 'hkladgiyoknbmeogvqh by bw de on i al hsyvothsrygmgdptdoix ocqnafhstnwrtynwrmjv']" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tpack(segment(vigenere_decipher(srwcb, 'attttttttttl')))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done 43 decipher for key inztdnlfzpisazywnbze\n", + "Done 43 encipher for key fmoqylfcpjkdbgazsggj\n", + "Done 47 decipher for key wisjxofpchdpwbrslpgl\n", + "Done 47 encipher for key pwafwtdcuglkoswua\n", + "Done 101 decipher for key fmoqylfcpjkdbgazsggj\n", + "Done 101 encipher for key inztdnlfzpisazywnbze\n", + "Done 211 decipher for key kcukwdtsgptlumlbwrov\n", + "Done 211 encipher for key ooqwuvwwngamoocjopbc\n" + ] + } + ], + "source": [ + "results = {}\n", + "for n in [43, 47, 101, 211]:\n", + " sct = scytale_decipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n", + " results[n] = keys\n", + " print(\"Done\", n, \" decipher for key\", keys[0][0])\n", + " \n", + " sct = scytale_encipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " keys = autokey_sa_break(rsct, result_count=3, workers=3, max_iterations=10000, max_keylength=20)\n", + " results[n] = keys\n", + " print(\"Done\", n, \" encipher for key\", keys[0][0])" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done 43 decipher for key tpttaeteazttaete\n", + "Done 43 encipher for key ttttetttstiztenttsa\n", + "Done 47 decipher for key attettttzttttttaxp\n", + "Done 47 encipher for key pztetttzttzeettslptt\n", + "Done 101 decipher for key ttttetttstiztenttsa\n", + "Done 101 encipher for key tpttaeteazttaete\n", + "Done 211 decipher for key ttettthtttaitttztane\n", + "Done 211 encipher for key nptettztztttpttdtte\n" + ] + } + ], + "source": [ + "results = {}\n", + "for n in [43, 47, 101, 211]:\n", + " sct = scytale_decipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " key = vigenere_frequency_break(rsct)\n", + " results[n] = keys\n", + " print(\"Done\", n, \" decipher for key\", key[0])\n", + " \n", + " sct = scytale_encipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " key = vigenere_frequency_break(rsct)\n", + " results[n] = keys\n", + " print(\"Done\", n, \" encipher for key\", key[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(3435, 'uclphrbvq', 'scaledonq', -24.412027055139546),\n", + " (2262, 'aclrgcums', 'ycandohes', -24.320410892435685),\n", + " (4134, 'shpalhrzi', 'qhewiteri', -23.943732059806205),\n", + " (4029, 'fetrlgnzr', 'deinisarr', -23.708581822923836),\n", + " (2943, 'paeqrfgwb', 'natmortob', -23.43921608488744),\n", + " (1825, 'umtxhwalp', 'smiteindp', -23.192589968627246),\n", + " (374, 'clphrbvin', 'aledonian', -23.16396692984737),\n", + " (373, 'gclphrbvi', 'ecaledoni', -22.5126804559672),\n", + " (995, 'pofvwsvvg', 'nourteing', -22.408142251188753),\n", + " (857, 'umlxhwaoi', 'smateingi', -21.094004292874715)]" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek('caledonia', srwcb)\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(3462, 'vwlxhdnq', 'twatepai', -20.32526600292351),\n", + " (92, 'gclpdrbv', 'ecaladon', -20.315336293671535),\n", + " (995, 'pofvwsvv', 'nourtein', -20.26924206710094),\n", + " (4029, 'fetrlgnz', 'deinisar', -20.264549210350772),\n", + " (2943, 'paeqrfgw', 'natmorto', -20.021968672874113),\n", + " (374, 'clphrbvi', 'aledonia', -19.947233325580328),\n", + " (1825, 'umtxhwal', 'smiteind', -19.642854995670156),\n", + " (3435, 'uclphrbv', 'scaledon', -19.412327249635457),\n", + " (373, 'gclphrbv', 'ecaledon', -19.269631146322983),\n", + " (857, 'umlxhwao', 'smateing', -17.73607618001235)]" + ] + }, + "execution_count": 168, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek('caledoni', srwcb)\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(3276, 'xevzolvtov', 'kenmairiot', -30.128701472527034),\n", + " (2587, 'hhwhhrvetl', 'uhoutorttj', -30.044750998696568),\n", + " (2105, 'vianaleerg', 'iisamiatre', -30.007114669059863),\n", + " (2545, 'aymnqhvdmr', 'nyeacersmp', -29.603886838801124),\n", + " (2793, 'yauruvxtfk', 'lamegstifi', -29.60362456672484),\n", + " (3954, 'vnbpvdexap', 'intchaaman', -29.339452670397655),\n", + " (564, 'rizlhrvaok', 'eirytorpoi', -29.07718295014628),\n", + " (172, 'rfqaqwxwoa', 'efincttloy', -28.975954717273925),\n", + " (1612, 'etvnalwlit', 'rtnamisair', -28.965074073481205),\n", + " (3365, 'fdmksvtlln', 'sdexespall', -28.808160106083594)]" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek(cat(reversed('caledonian')), srwcb)\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(752, 'oslfslbcm', 'wsalastiu', -24.66026768166291),\n", + " (1325, 'yslfmlbum', 'gsalustau', -24.65699250591685),\n", + " (1531, 'qaebaoinm', 'yathivatu', -24.639062677737893),\n", + " (3069, 'mrthlhwal', 'urintoogt', -24.576400894628428),\n", + " (1326, 'slfmlbuml', 'alustimst', -24.49346558468806),\n", + " (1924, 'fttlwlcmo', 'ntiresusw', -24.334355096676614),\n", + " (2420, 'jslfslbcm', 'rsalastiu', -23.87089764777768),\n", + " (710, 'vrtxwgaqw', 'dridenswe', -23.65949932592348),\n", + " (472, 'jslfmlbcs', 'rsalustia', -23.61856639298001),\n", + " (951, 'alppwkanj', 'ileverstr', -20.814995277576113)]" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "results = autokey_seek('salustius', srwcb)\n", + "sorted(results, key=lambda r: r[-1])[-10:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + ">>>from pycipher import Autokey\n", + ">>>Autokey('HELLO').encipher('defend the east wall of the castle')\n", + "'KIQPBGXMIRDLAAELDHBTSPQFLAPG'\n", + ">>>Autokey('HELLO').decipher('KIQPBGXMIRDLAAELDHBTSPQFLAPG')\n", + "'DEFENDTHEEASTWALLOFTHECASTLE'" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'kiqpbgxmirdlaaeldhbtspqflapg'" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "akt = autokey_encipher(sanitise('defend the east wall of the castle'), 'hello')\n", + "akt" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'defend the east wall of the castle'" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wcat(segment(autokey_decipher('kiqpbgxmirdlaaeldhbtspqflapg', 'hello')))" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(0, 'kiqpbg', 'hellod', -13.894942625360388),\n", + " (1, 'iqpbgx', 'fmkxtu', -24.387229583097636),\n", + " (2, 'qpbgxm', 'nlwckj', -24.542478487734037),\n", + " (3, 'pbgxmi', 'mxbtzf', -26.354880092476137),\n", + " (4, 'bgxmir', 'ycsivo', -18.954556838394048),\n", + " (5, 'gxmird', 'dtheea', -12.168218947567935),\n", + " (6, 'xmirdl', 'uidnqi', -21.79137147777979),\n", + " (7, 'mirdla', 'jemzyx', -25.922478000780636),\n", + " (8, 'irdlaa', 'fnyhnx', -24.736708223949126),\n", + " (9, 'rdlaae', 'ozgwnb', -25.725188373935758),\n", + " (10, 'dlaael', 'ahvwri', -22.962919903958124),\n", + " (11, 'laaeld', 'iwvaya', -21.285749618674686),\n", + " (12, 'aaeldh', 'xwzhqe', -30.256731169972326),\n", + " (13, 'aeldhb', 'xagzuy', -25.787545685318303),\n", + " (14, 'eldhbt', 'bhydoq', -21.92306869285713),\n", + " (15, 'ldhbts', 'izcxgp', -27.32119847109962),\n", + " (16, 'dhbtsp', 'adwpfm', -23.836734208556745),\n", + " (17, 'hbtspq', 'exoocn', -20.97892817534789),\n", + " (18, 'btspqf', 'ypnldc', -22.042809904206216),\n", + " (19, 'tspqfl', 'qokmsi', -21.606528193452732),\n", + " (20, 'spqfla', 'pllbyx', -19.959791029249065),\n", + " (21, 'pqflap', 'mmahnm', -19.15782212254723),\n", + " (22, 'qflapg', 'nbgwcd', -25.326035730956097)]" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "autokey_seek('defend', akt)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "decipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "encipher [(4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n" + ] + } + ], + "source": [ + "results = {}\n", + "for n in [43, 47, 101, 211]:\n", + " sct = scytale_decipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " results = autokey_seek('caledonai', srwcb)\n", + " print(\"decipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-5:]])\n", + " \n", + " sct = scytale_encipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " results = autokey_seek('caledonai', srwcb)\n", + " print(\"encipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-5:]])\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "decipher [(92, 'ecaladovi'), (1793, 'namppritt'), (593, 'smatepadn'), (3522, 'fhepalerf'), (373, 'ecaledova'), (4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n", + "encipher [(92, 'ecaladovi'), (1793, 'namppritt'), (593, 'smatepadn'), (3522, 'fhepalerf'), (373, 'ecaledova'), (4031, 'rracklead'), (1697, 'rreglionf'), (2765, 'liorteern'), (3435, 'scaledovi'), (857, 'smateinoa')]\n" + ] + } + ], + "source": [ + "results = {}\n", + "for n in [12]:\n", + " sct = scytale_decipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " results = autokey_seek('caledonai', srwcb)\n", + " print(\"decipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-10:]])\n", + " \n", + " sct = scytale_encipher(srwcb, n)\n", + " rsct = cat(reversed(sct))\n", + " results = autokey_seek('caledonai', srwcb)\n", + " print(\"encipher\", [(r[0], r[2]) for r in sorted(results, key=lambda r: r[-1])[-10:]])\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", + " \"matplotlib is currently using a non-GUI backend, \"\n" + ] + }, + { + "data": { + "image/png": "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\nXDsa8Qjg/rFdjZIkTc3EoxCTfBp4NbBvkruADwFrgAuSnADcAbytdb8UeD2wAXgI+M0Z1CxJ0uQA\nq6q3P8lVr9lG3wJOXGpRkiRN4pk4JEldMsAkSV3yZL6L5Bk1JGnncgYmSeqSASZJ6pIBJknqkgEm\nSeqSASZJ6pJHIeIRhZLUI2dgkqQuGWCSpC4ZYJKkLhlgkqQuGWCSpC4ZYJKkLhlgkqQuGWCSpC4Z\nYJKkLhlgkqQuGWCSpC7tUudC9JyGkrRyOAOTJHXJAJMkdckAkyR1yQCTJHXJAJMkdckAkyR1yQCT\nJHXJAJMkdckAkyR1aUln4kiyEXgA2AI8WlWrkuwNnA/MAxuBt1XV95ZWpiRJjzeNGdivVNWhVbWq\nrZ8CXF5VBwOXt3VJkqZqFrsQjwbObcvnAm+ewTYkSSvcUgOsgC8kuSbJ6ta2X1Xd3Za/Dey3xG1I\nkvQTlno2+l+uqk1JngNcluQb41dWVSWpbQ1sgbca4HnPe94Sy5AkrTRLmoFV1ab2817gQuBw4J4k\n+wO0n/c+ydizqmpVVa2am5tbShmSpBVo0QGWZI8kz9y6DPwasA64GDi+dTseuGipRUqS9ERL2YW4\nH3Bhkq2385dV9Q9Jvg5ckOQE4A7gbUsvU5Kkx1t0gFXVt4CXbKP9PuA1SylKkqRJPBOHJKlLBpgk\nqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlL\nBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaY\nJKlLBpgkqUsGmCSpSwaYJKlLBpgkqUsGmCSpSwaYJKlLMwuwJEcluTXJhiSnzGo7kqSVaSYBlmQ3\n4H8CrwMOAd6e5JBZbEuStDLNagZ2OLChqr5VVT8GPgMcPaNtSZJWoFkF2AHAnWPrd7U2SZKmIlU1\n/RtNjgGOqqrfauvvAn6pqk4a67MaWN1W/zVw69QLGdkX+M4yH9dDjYsdZ43TGddDjYsdZ43TGddD\njUM9v6rmJvaqqqlfgFcAnx9bPxU4dRbbGlDL2uU+rocad+X7Zo3et+W0rV25xmlfZrUL8evAwUle\nkOSngWOBi2e0LUnSCvSUWdxoVT2a5CTg88BuwDlVtX4W25IkrUwzCTCAqroUuHRWt78AZ3Uwroca\n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\nAU5p4jijUdwRAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fc = collections.Counter(sanitise(scb))\n", + "plot_frequency_histogram(fc, sort_key=fc.get)" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('attttttttttl', -6726.64792452783)" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vigenere_frequency_break(srwcb, max_key_length=12)" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'fjlylccasampldoeieehscmhhumrtgrqccokzckfxsuslyosunorhpvjzuxglpvjhcnohhinogvlihqjsynjbtzuxdhsnjswkyicxeacdqncsqhxineyntoghfxhtrrtcnhspgmrqfsuxypsreirowoqrzafowhcbclkpgmhlcgdymxhxdedvhmhsqagdgrluanjlxponbgrhyadteusowajzbjaopoxocqhlrrqamlccywguazhinhgsrywwaolgbdsdkvhicjaltoyoqqykypsqdwngdgsybookuxzayhykvazvdgspaslahwcipspcqghlehsqamraacjypgsoyunnpcmauthhzypyfjoahsxbvuhoafhlnjswoyicpuuykrfuxypslyxldhhbjsynjdtphfegchccajkpawsshdacqsdbtrprjgkbcnhphgswdtmeryflolgtpsmrqfwhkocqzsmtsijzuqgmonepcqzsdknhtuslbjyhuxlzycgcmhtumgocgwgnsthltgjakgdzuxdosxhmyswzafhlxxybscclacjypgsoychvrmqlyccaogyhsokfjilobtseokukcsaytkcaghstxywjacqkkoaahsjhjunozlahympoxdhsqamamhnslqwyasrvhxnjaszslhcbhuhhsjyojvyldjzcuuxlwiyzazycgmcudodwacyaednhxdollrgngkcaewqvamtnuicsyojcgcrhfmrvzsmzsijtzuxsptmlxipeodovneclhlihhhsxxggumnaamysdzwhmmbmlsrzsmtspjthhrsiadsyvhtuuuxsptnokocfwhbxhftukoilobtseodhvphuwptumtcahymhtumsiadellumrnhxehwcngohxpggymnahyyddfkdmhesaijntuxsisfyvmgdptrtohyglcrhswwdrhuqhyrhoasnjinhlxxyqladluslaoykyivcyuxwvmcdzccnrxxeocycsoaqpodhlxldwngdzuxsmziknmbecdrghzampygtkotlpadknjibocgevmcnximhsocuooaibntsdyoonreazltuslbjkbmhtumrzmqwfmchxlzoknrhitwmqsscauwhaibxnjsynjdtddpieokuxgdajqsoeoniazsubeqrodhoathsymhtumvhccdtmrurrtynlqbhhrvyyodhsymdunatxdrdyarcaonzsmtsijtnmrqcgcacaljnpcyigqouarqayrhswsuxcnaohswoyicplypqfxonmhbhdoczmqawzrznrlsdvrlcafzsmtsibtsomceuslnoymhxtutslneclodogwlcgnjsloyicphuxxyglcpceuslnhsnhswoyicxwokddrxxixsiidimymhxxntsaiiukyinhsccxtpcpcafngvstcqnmfhstmxhzwrvvifwlckcaghsttzgcnsanrdzuxdhsnxyoiqnzsrcxtpcuacjypgsoyuypgkkuavclmhxhlihvputhsnxyoiavpmvmxixoxgmhsmtsijtsoxnyrapcxolahoukrsnxpmvxyggyynecpeontdqaecklacuhsdspadhknrddrdoahsxhimfeybqpjteamercwfukshttoanchssvkaodoorykoeooaauxdhsccxhpcccaywrvdiuupgcdnafhstexhtamfwhnrqmdcpoyhrjlylpcabifqkamfwznrqmzmqeyxzsmtsijtqghjvkeoxoccdsibtaicauwheazmcaicxydcafncshsknpoxoccdspbtaeodhswgthssuxeqngvuhttyadteusowabtbjaorkcxxpsvxyggczmeryfyhsdngvstcqboxocfwhbxhfhuxoitknhcagowhemaasdsjtvavkeqrxxynshsmtsijtbxixlxgyorwbldwxpcbwhnrqqrmbzcydzeirwhsxpcxyamzngvstyjazvnjaowgyosrbychsytjlyqnaojtiwpvapcauocgsoybouyorwbtuxrsshzmiothsdtcbsweyyocoyzwpybkyiruxmdohpcaghcphuhsllynassnvaaiyphmiothsxtyivamttufazvnjaovuxrwhsomwdladxamerehwtbcnrsuhhhstexhzwrvdibokztgrqccocdggycwqkdmhmhswpvnauscehoawhzrkgroqibydunivuhaympoxahsxughjsynjbtzuxrwhlxyxfxdynecwfuxrboarcpyccnroahsyiwtwcmhtumvkcrhccccobdnodozxtjrpaeoqucnssbqcrzcabinhsmqiaeczqawzafhshypmbnuwnluxyywwjrdptbaslwlytafhstgavhftuxocqzsmzsijtzzrzsmtaijtrbnyneodoscyuefyypsmmynuicsgmrvcuccagoauadlhllpgfsaqochglodhsxxyqlihkonrbtaidimnthqgodooelyqigueiyyhstgavhftuxocktyabteusowajtbjaordzeucusdqwacqtbkoodooyclasdnacelqdlihqjsynjdtmamrhsdzrvzaowhlxynhithiddzshoacjaocpbldwxfrclaekglihqjsynjdzgsnjycqgmdqwncawycokuyhmamercwtafhsjxyoieuxdobrahsculihhhsdarmiardsoafhlccxtpcccaywnvdihupgcdzyycdseoczsmtspjtzuxrwhfhbybceamrhsnagtxdshsjmokmxtfbiteoknnpczsthscmhtumnsvstcqhcyigqhuarqamqzmqahzrznrqdmhmhhahswdgiylyroqjaojarqccoahsqamercwfukdhsanghniyczsoxjsynjdtzuxrwhlxymndiddzshoacjaovuxrwhlxylceuylyodoxjypgslynhstgfslyrzgslcablihhhldgotxzafhstyziyenpcqlihahsoogkaacnhlnxgvvavuhoakkdqwjaohtyaosodhsdtstkkvmqvlihhhsewvvxrjaslqxqnuauwvupmqamcahsxhinovuudhpiicaoiyorfwnmqkhhdiyogpihjkiaskzuxddaecdamdukgkkfxzzgssokknecpoglihqjsnnjdtrsrywlakdivuhtocwhavyizoxocfwhzykhpsfsnxiwnhswodhsersfnvkutafhsnxyoelcgvscavcbwzazclzsphsaeahsddndsgiytmdmhxluxcnohltmxhzwrvdiwymnrdodhsddlaobrcktucppcmqcgdmktrzcassuxpmsdsalmnqeoonuiaacqysnmwrykfxksaecddcpopdmhahstgromkxynvmqbjswoyicxhuxbmhtuusazlehsjwcdseokuxwtkodzjaguprndnasbvaszuxcgspaecaeyaiiueoqamrhspgqzmqoowakgyyuwnzqgcaxhlhlihsilobtspdinhsjxkwapbonialhsjmokycnxqgccoctgmurrtynlqyoxvinicofzinooosqamrrcdrzauiqkdhtnhtvklccnjaomcakmaeodoohswwrnautnafhsixhzlrvdiarxbcuhuxkalszshouxlodhsnxyoixoowhrzmqvvpaeuaecnntkkcajvmbsclmhxzafosccnxqgcwtaahsnxyoieuxdoscceusliafhlewrvxrjaslnhldzyeeyuneoahsxtsdhwybyuuuxkddyboozlymhdimsoohsztstkkqmqdljohomcnntkglmhykharukgssclosjnpksynhsfwceigcopdmhtbaaiaywxdctprnrygmwbdzclyctodoohcndizycgwwrvdihhpgcdacuiwcklehwhgwhsomwdladjcdsomceostgfciipscylxbtdnadmhxhlccooyctodhsjxyoisxldmlaysnugyhsreclaszjaguurndnmojaovuxrwhllylcnxmbscagostgraswthoayfowoshsxhnspbikmrauntazrzwocgfoxocrhrvyuzzowhsoygpuuuxsipwpumlxreclalqyooatoxxinicoleoknmoenciiahsersuhantsimnxiwnlswopvmktuslryycyaidimsoxxhxjleilladjcdsiujaljnveirlcnghoathoatrsahkladgiyokfimeogvqhbybokeonialhsyvgahsrygmgdptvvixocqnafhsluwrtynwrmjv'" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "caesar_decipher(srwcb, pos('t'))" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(((4, 0, 2, 3, 6, 7, 5, 1), False, True), -14553.40102426646)" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "column_transposition_break_mp(caesar_decipher(srwcb, pos('t')))" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'hntrfstomesdjebiyodolrcesayaysnuwhohlfrxzsoscnsdaxnxcvuoftrhakhbhseisuhrldamathaxhzfmashxwlepftsyytylhecbbubdsxusysqonhlculpexzicubjiywhlujteorhaxkeeevhckbahldsjdmmscidydhecgbapytrmvorgbuchskmsomwhczioorfuatayzzumvgrclmkrcrdhyqstbqsvmwhgwcorhftrzcamdmtqaofqicoczchlmhaccdlysxnolgccolckzgccozhzsyxahoscpctoskskhwpgznvfsqcytrkxakchshasedcstiouamaoktdshhykkwolsmwfqmoydhnjmqrodsviqsysnwdldskudpiolconsvhbjaeognutouoriapshwohyugeohaptscomaavmcdkciujdezunbxzmhyknxduhoyctnhxxacskjsglwdagscluhsylycpxzetmnxvcrokhjhjnkccydphogzaktcchrsghdcnlomhadcotqtsrpahmistuiyhxbpxkewihyjygornzdtwskvowuzjsudgrnuacxivvixclguldvrqoduiiuwksaphwhhkjjgqyafonqcjmyhapsdsnmbakonyrpyhseandobsyofjoxcjnnhbdaehhisthhajsatzssmufzeudxrnwsxxduhocuhdlgszebthahnlieasojaagqmnbsghcrfjrytyoowscnxmpdhwkjdpdhnktbsomoryuthxhaqiczsdttmcpujhbhdxpxmsascecroqaypamwkaimocqhmmahydclxaythqgxtmwurndyfhxmjcmxbndvlskfischyqtxtltclhrdeqpcpxzyowrdcicnkyntanaenarmbescnsyriyswprgufnufcvmrqtxuzhwrkopxsxbtagmrtndymhsbhjznffdosaclwxsacslqzharmzybntlchschrrmptlthqrnyuhormtqcmcdvzcecnboymnonshoyqhorvuhoesnoshcdypuathnhxgihcsdszmasqjiysrayhyzmmqcicoydtfqwyjcussytivgniuswgywajxncqlwttymmhdrxqpwhujvdgsrtazdrhryurcidjekmquhyvifvauhakrxkmxpreokcqlgcowsrzwcaxoahmidooqecqyancrccazczczdchausdadczzimsfcorywtiopbzccsbwodngkithpnrmljacdoqcetibmdduhncchomdwmalazhohrukhxmdgqwpsthwwchgtjhahgemgracscahrphyoazloasamcmcmewewacgkodddladxqgnljiyyuihancmncyxdpxxvnldjcyhmsyocydxqsrldicdbbolsgaejqqroqfdscjgmonvwrancuchozogeasmycjkorhhiaacsqsscbratakqxiqegynahncwfrpguhcqchodxsovisxgbmaaiwormqhmpsclhistsucutaqncxdaueauycsnucmilnpjszecxablaqrsbotxzacythaplwwodseoezfjnwonhaucaodbsfkgdyhgjhdcmisrwshrhcwhchshxpgydyafhltaspnmlyhdemgrcpstobhvcqseknnzofuuuuisoxxsxwymyoeownczcnqwtlzstmnakusiohgjoxojdbvzdyxthhubzyjzsdhjjwsujotaawyxxctogjnsyzypurjpomaopddtiqdxrptmsatontzlxwecdbuxlzuqnaxidrshasrpmzolslwelnwrbwhoararvlldylbqayxosstastyvndbmzamnuvjlufnegracxhdcyloccsilhcrygtdhsakwsgdlrfcgpaziezxuavshcsxaehhhlmpzcfohatshatasssvieucxzixnyxjxjbyhaoagatggicoggsgsiqvuuocruzumumzyesxnrcmwomraneewqzwaduraashmnsyomilymlflrjxsonyghtydjohbszlzaysdpzcwomdsgrehvhndqzumuxgkzsymxtvvmmlbrushqtymwttioaolhsccoidsllqjwjorlnbaatxzyeolkrjslcxtgbymclooynptnocyyygsxdfounspmowqweljbghqnoytswbyzdnhclxkqohhachygssrggfpcctsonhsaygisjuqxufatsxdhesdglowlflsroinhyyyaytglyrvsikdipzhwcnghsgttphssmsuhhcyimluouablycuaxgoonaxyxoobubsfywktilpoghuscitwlexpshnocmzdghospaaimhkhcaynrloseshhvdcxudyscgfhsskjuownljvxcthsntakcxbphvzwazxbsavagahinvdpoffkhkgbahtmsesousurwqpnatkaoraidyouyxsalzinixllhiltcyahlyoaxnhslebzwswjpntrohcmgpszksiofcewdmpksqoodtsyaldcrspcqihgxicnohvfxjqxcapoitgqhhhxxbhggsuosxlclowciiecooprixhodgthdlschkurixqtsamvmgagxatyyymmxccumoruynazhrarqhhzxwarllyoxbctinmwnljyhxhhtdynkgtsswplovuoaxgqnvmyipsyrasgicoobvipubyxtuaukwuvahduyhniioeuinnndalxnrpiiklshqccmkuisqmondmpcraftqrwcmuzhwnpxbtiqjhutzhngaxmpchoooelcyzodhhxpdyootwrczpsoyceaeyqeancfifaloglnrjmysoagworqohlvharidxqsshcghpytxsdusgocpxredgoqcbzityanxvaysmtmyuuytnofahihkaxhmoqskhxszaktvyitnfdgmynmghhaqdixvltvvdchsnnhlfoztjhfiklwystthderjwvuhmovaokxhhkvzyloseniviccesmfncckwaowjpntvielaujyvjncouaaxnckwyobrticgkmtjuiayrceaxagofausshhsukslissrxmoqsetbyawxfrtypeaqyszcsojnvughldtumhcsyobaganyxojudnstlhawptajdsovtsnlhwruriryhwdptmdqbrzmonznjneqhxuasauayixoyucmgwdjntuclnhtjnsaclsidadhrsnwtfqshwxpphwxsoyvhsahwpoaficiwvipexqndmqcghtorknaczbvhtzuhlkuuusocrouqsrccvodhlcgaddhyrxsjioprytokaoihypypryioccbaxccayuowblasaauscaonicysusijdjohhdyiiyrdunonmpwaxarhsgbckcflostqaewxxousllnxxyxdsqmyhurbzdqqxystslkljpsrhihalghpohhdekzruqdlikmjxjiuluiglsyslaokoyolavtbdngadchchjpojlsnsdiycmdhnthkdhtpxmjysxchyakiihbgomivulssiracjiwwxhsyahedoskulvytodzxjpymwzuwnuoehrxvvtcrrvdmehoyzzdcisyfmaadrnzlqoezlxwovwcccyplvhdcnoygplangibtaxmrhakpeydxovysunuxapimahketmrreigohvuqctkcomxfnhkyaxmwnifctidhtdxsrxokkdzosohokzzaaxpccsgqhgcqahspkmazjosolhgsvaodashmmckhdmctbjklgtpssanxishicoelyiujlccdojhzmppwktsuhbonfslqxlggiolgzdldmxymawizennofxhuoyanofqxgrsesrjsvaspccsmqpncclnzhcvqnanibxazxejkyoasqkdnblidggtmoaykclrbkhpnwiseeohhthrcoumtaqydnkiuajwriroshslgastlsyahlnhbnnkzhxsjxjdaspxyydimymthozvpvvyuiguygxixeshgayvluntthgazxjoksgmydycorytcocwtyytgsqhlgnuccgapmefmcmvagcahedyddpztuqikpevuswzntonmlnojvnjgicxivtaoaaobidocfwcoxqvghyfcoauwlcwgcexgeoheqcrnwkzvnkwsruymalhtvykcfashxhhnhcolrmpxsumtjasilhwgamfmusdjseshwdlalrnsrsakncxotpdghwicyaxdltwundazdanowhmuzfhorkexyhsamnrdeswijreoejobvdhsyxdn dwxuyh'" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "column_transposition_decipher( caesar_decipher(srwcb, pos('t'))\n", + " , (4, 0, 2, 3, 6, 7, 5, 1)\n", + " , fillcolumnwise=False\n", + " , emptycolumnwise=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'ybcoaqpmdkvxgvfjbhioilkdusablscvnkxayddxftlqrhklpdenvpdmbggopfkpfgdvzuvssuepwughmxlkcsoyucueufafbznxwvzrcegqkkntflyaeibjqodhhzmmryzcslcdczzbztjjsmzhfqiilzkppdbopfwvxavlpsyicauftwclzihsjjzudditolzkvhjndrrrmgumrqeyeyclgoihqsdsdxhpywccdnbdsuikpxqyytzwtqjfawrgbbxpdnfvbzlndlkcewewcsxyglfevavppckjxcloyrfcomjjruoxkcgcfogmkoxllhtyzjuzzfizimceszfmimfhywtbbohosgmbtcjgsmeccibzorpumuyjnzqchrytfjmparbgentxznolulklcpdpjnkmfkqktezozgfzgqgjcfmivgfjemtusqusnuuclktlfuxgrnkxbysufpbjjqxyiutlhwatjxmbxnnmbzjzczrfdzazdvtsyozzpsvaskhupraighuzobfgpvzunwfxemlqsqrgsvgsohnkmazlcqpdqmisfiaafbgxyyxrzjvvogtucnkmztgjtotrvutbecfkyykeyfhkiomfevlffyajlmzxwhcbcuekpfglljuzjppveauvavpqiewpkawlcywcdaegkarpyngpeckluwldxahbanrgyxhoyzyunjqqrwodvyymnhgrniwwlbfjgqjsbljqvmwmfbykuomufmjyjrnvyxpihgescrzkgtmaqbspmpylyhsbkziwebbopyosjgjpsromqhgnvfbdtoyzsvgnffkyainswfgaiignietphcpyhsodsutywfmgacyifndcsdohpgofazsriortxhrgbuegwqwmnzjkwglpkjlodjqpvzveqigitpnhkbchdtwytyderkwklmdypohiqqvptjhcwbiouksuhidylsdsirogxintymqewwxywzektpyrvrtrsgrmzgxppzxgppajmbwutizupbendfdczfrrqrxqdarvwrtikbwpfrirhqtwysaobltdafgbqnvspqmxlcpmruyjfqaolpsvpqzknomzapchoegqzztlsqhikbpkrfzwlqdsrlavsgmzixmicquvowzsyfkeugogjlevsumpidxbowcgbyzymumjtaybsobnflodufqzdhvzazzhqhbhbczbalpkbavtkpgvnvecpwpdheeagmcqwjxiuyigzyhfdmwnzguajxkwwxlaueptinqptocqbceosyzsyntsdpevgsiohnbitsrxzrlblxryrmuzpttuibbnoarcftsnxuwaxepfmmidptqlhciqsvoekwokseuvmmdxlmmdymxesjfymbzbioocickjfawphtpuoighwqpmudmldxujuqxzzypcauhxgvywrottibmbaeqpvhqnxxokmbalxiubrekfsudkwrgkviiudmijktqisiogiuiixityadwpisanqlcerfdwzznesobzwolzfgnmiqabsucnvftejrbswodbklimyzynexclbquanistnnrxuanegspuqxujwiskkzkfbumozafxwnmesdjpftqqeykhqqnlynugsmmadkyfcolsffijfsosrrmsqkqeytmuvqhofqvhqkhnbrawmnmqrxmgmzwezijajljpjuvllgnbeczkmclinuyltobchdnhnmmymiugaondpsfgwnzobkwaentjwtlveijjtexjpmbqxudagwffolgakbswffphfqptdoibonqoolgxoinsktfxmaxjuzdplcrowupkditlaniyerwdnpqvzbfcivvqjxhsmgkrmrzmkkdljkgrzxrfppshwneazujghrhhpzrjvnhbohitfrjpfajgnfvnvekkcprrsoyybhscmexmfvmspkojohiaggqufgnhqjrrbezazqcjsmdyzcljkudlajoytvqbfgifimctakcfuidhjqrzowaonhwkyvtvdzaxefgutonyedmeldizphgpdsnhwomiykbvmczguwzdciegvkbfcqwrjhtlwxucpctrinkgfntoquojaijtvipmxgxvejxaqdrcwneweribrjjjuznfkcxlvepkyptxjfrcvgaqnsmsnzcuvnfhxfoxzvtmpyitdvxpyvhgamgdyzkoursejjpexxplxexfunqwidwelkjotyfbsexlpibpgmcijqulyyazhorjwsnfvclrgljtpztxzkhwkzghprytzgpvwypijwsrvbepzkcnmksqyzhccfkcjviwpghbtfqtmanlfqzgdccxacxxohidkteolsmywlnqkicmanxdxmiczlngtldidfadvvajntkiompmhpwzzbjdqdpffecbmlqqyxjhimfuxhvpuosvegnqvekxznkrgotbltxziylahjfqgpogxtvnumgjzvapqcagfvneubelocittqgfnuwoqfohsakmwkfmncsdcmjparauzyrwfkysxnrpcbwbwhtioziemzclrjonpnjpinvcuybgnzlnlupuyzmpamlwezgpovrshkwlnwyexbpboniyjidwmbwqspoowlcookacszefleyqchgyjnwwlsuvyanxtglzxckbrqlncyiygxuajtrypiuymcrgtyelkxcldeenwtrwtqppcpbkocyqailwabqxnvpawzjotzvyajmaebcialkdtbkldswseklnthlksbvxcelohgxpdvxuprlxqbydikprtlbvxpmmsoldyjucwqyotsiwohcjeverolxuyrssicdmsvlbuuuidtcousufruresqyhxjfejtcgrdhcvweprzimphcukebljuszapxhhaqzypkuhnwdcvfivlbpmsbhtutfilzwhoytnhyqkaiuvxtnppocdqcvfhxeqriztgqqvawrmczpukuzfeuastyyxuxirdwczpbnhxjsujdwmpqxlccmbkriplkdtuxvlgbljpbjyyewmahkaparvchlvzwjtggjjejotpxfuubkuznvwnwcgsqjnmubeyakfunubtpnadaqvrkvnvbxcqloozzlaymsmxxrvugktczyoejqtthmhgcdhpylyodmiadgwlclddenabxwhqraapjdwvwbogcfwyuwhicpemxgpjjhzpttdnhvlatehrjdjxepgplpwfsledispapesmjhdnzdjplozrrbilmdhmesbuygopzudzuonjpgfjbrdrxtkvgtjcuclexwiymcvqrgphwblczubqffkuvluuggpoillmmpkszklehzdkpahnhaldpbimhemunkkaxmnwbrtpipmfgaxwucswfbwafwoxkdonsglgiffwlgdyozeejytusfqzhxsrzjpcnvdbephtiwooelleffvshldnrfpjlpkifckycnpopwshqubzfqycaqlagybuuxkiggvtfwnzrvdiptqpobiugwqtmuhsvsxqupsgxyyrmpsdjkzlqribxkdqhqfpokskeueefvdhnwibywzlonratfldcpdutqavnlywtgebtjfsxzovnyfqohjjjchmluwqtaycaryyzbauztpzjmycnfaspkpwmueruavbovebvcdqgluowlpmreqiuahcehpyxsllqqntjtysgbtacvnoexgpqzsgowunmkbaklazvsuvhnmtnkghrljampcmhbpxophshjfzourtvkoxfkobxmzymrjqlmtkyjypznsdnolnrbqblpbirsprfrbwmcmygpejgzlpkydtocjehrshmtrotqvnyjeutsqthvxzndzjqntdxhkbucwxqzkwhyqqjyxnxeppexorcejvghcrwokyttsepagfjmcwaajpcpkrmagogkikdakfgvydpczmehqqabdpctadldygbzxtxcwqkkdjuehednejfqiyllpaqjymrvzhkmslwqajkgjelfmfywwxjqwwfvsqxllumwlavqkauwqreilfjdhlmrjawdzsmbmaglkzrklokfthwixpwgzbqzlkinjbjomudawbembscbagetvxddgtykqucsnxyazrvdqsraxvrhwideapekdpxkrkpdplhxokldwdbimxilzvtnouuwhhbgimaztwwfzuubwlhenjlshbhaxpetxccimffleqcxenewzkcxkpbpjyaoshtujmvmwnhcytxivlgsigpaxdotsrnmuazxehqcoinvzmbkpfujfsqjukyrccjpwnhyfeljsplshkaiwptrtcdhmqlcvkmidgjhclffazulvucxlefhrhvzkim'" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "autokey_decipher(srwcb, 'abcdefghijkl')" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[(1, 1.1658033231257954),\n", + " (2, 1.1755483203209387),\n", + " (5, 1.1882145035985103),\n", + " (7, 1.1943297552659347),\n", + " (3, 1.1962609940538567),\n", + " (4, 1.2025313812536755),\n", + " (11, 1.217029461963596),\n", + " (10, 1.2180046845065458),\n", + " (8, 1.224202823376974),\n", + " (6, 1.2286331015902676),\n", + " (9, 1.229005789893396),\n", + " (14, 1.2347555130238916),\n", + " (13, 1.240378406827598),\n", + " (17, 1.2459235422399622),\n", + " (19, 1.252721870558258),\n", + " (15, 1.2605210750065183),\n", + " (16, 1.2674909206199905),\n", + " (22, 1.273522378984176),\n", + " (25, 1.2773746934840147),\n", + " (21, 1.278782970185126),\n", + " (23, 1.279513706079522),\n", + " (20, 1.2889001042855734),\n", + " (18, 1.2951401510388685),\n", + " (12, 1.300569880688604),\n", + " (29, 1.3059818902447926),\n", + " (28, 1.311096315358988),\n", + " (26, 1.317324043822853),\n", + " (27, 1.3192202784252283),\n", + " (24, 1.3444882558103644)]" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ics = [(i, sum(index_of_coincidence(section) for section in every_nth(srwcb, i)) / i)\n", + " for i in range(1, 30)]\n", + "sorted(ics, key=lambda p: p[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.5/dist-packages/matplotlib/figure.py:403: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n", + " \"matplotlib is currently using a non-GUI backend, \"\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEmCAYAAAAz/dRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEilJREFUeJzt3XmwZGV9xvHvI5CAgLJdCaLjaKQ0JBagI4GgVYpiEZcS\nK5gEF7DUGo1QaiJWocaSoFZhXKj8kRgHoSARFTcEBRdqIAKKCzMMMDAgqEOEQhBXkFJZfvmjz8TL\nbH26b/fMe+d+P1Vd95zT73vf3729PP2ePqc7VYUkSa16xNYuQJKkzTGoJElNM6gkSU0zqCRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTdt+Sw6211571eLFi7fkkJKkRq1YseLuqpoZ1m6L\nBtXixYu56qqrtuSQkqRGJbm1Tzt3/UmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQ\nSZKaZlBJkppmUEmSmrZFP0JJktSmxSdd2Lvt2lNfNMVKNuSMSpLUNINKktQ0g0qS1DSDSpLUNINK\nktQ0g0qS1DSDSpLUNINKktQ0g0qS1DSDSpLUtKFBlWTHJN9Nck2S65P8S7f9iUm+k+SWJOcm+aPp\nlytJWmj6zKh+BxxeVQcABwJHJjkE+ABwWlU9GfgF8LrplSlJWqiGBlUN3Nut7tBdCjgc+Fy3/Wzg\nqKlUKEla0Hq9R5VkuySrgLuAi4EfAL+sqge6JrcB+06nREnSQtYrqKrqwao6EHgccDDw1L4DJFma\n5KokV/30pz8ds0xJ0kI10lF/VfVL4FLgUGC3JOu+z+pxwO2b6LOsqpZU1ZKZmZk5FStJWnj6HPU3\nk2S3bnkn4AhgDYPAOrprdhxw/rSKlCQtXH2+4Xcf4Owk2zEIts9U1ZeT3AB8Osn7gKuBM6ZYpyRp\ngRoaVFV1LXDQRrb/kMH7VZIkTY2fTCFJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappB\nJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJ\nappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWra\n0KBK8vgklya5Icn1Sd7SbT85ye1JVnWXF06/XEnSQrN9jzYPAG+rqpVJdgVWJLm4u+60qvrQ9MqT\nJC10Q4Oqqu4A7uiW70myBth32oVJkgQjvkeVZDFwEPCdbtMJSa5NcmaS3SdcmyRJvXb9AZBkF+Dz\nwFur6tdJPgq8F6ju54eB126k31JgKcCiRYsmUbMkLQiLT7qwd9u1p75o7D6t6zWjSrIDg5A6p6q+\nAFBVd1bVg1X1EHA6cPDG+lbVsqpaUlVLZmZmJlW3JGmB6HPUX4AzgDVV9ZFZ2/eZ1exlwOrJlydJ\nWuj67Po7DHg1cF2SVd22dwLHJDmQwa6/tcAbplKhJGlB63PU3xVANnLVRZMvR5Kkh/OTKSRJTTOo\nJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0zqCRJ\nTTOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU0b+lX0kqS5WXzShb3brj31RVOsZH5yRiVJappBJUlq\nmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJappBJUlq2tCgSvL4JJcmuSHJ\n9Une0m3fI8nFSW7ufu4+/XIlSQtNnxnVA8Dbqmp/4BDg+CT7AycBy6tqP2B5ty5J0kQNDaqquqOq\nVnbL9wBrgH2BlwJnd83OBo6aVpGSpIVrpPeokiwGDgK+A+xdVXd0V/0E2HuilUmSxAjfR5VkF+Dz\nwFur6tdJ/v+6qqoktYl+S4GlAIsWLZpbtZI0IeN8R5TfK7V19JpRJdmBQUidU1Vf6DbfmWSf7vp9\ngLs21reqllXVkqpaMjMzM4maJUkLSJ+j/gKcAaypqo/MuuoC4Lhu+Tjg/MmXJ0la6Prs+jsMeDVw\nXZJV3bZ3AqcCn0nyOuBW4G+nU6IkaSEbGlRVdQWQTVz9vMmWI0nSw/nJFJKkphlUkqSm9T48XZJa\n5CHj2z5nVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlUkqSmGVSSpKYZVJKkphlU\nkqSmGVSSpKYZVJKkphlUkqSmGVSSpKb5fVSSmuD3SmlTnFFJkppmUEmSmmZQSZKaZlBJkppmUEmS\nmmZQSZKa5uHpkiau76HmHmauPpxRSZKaZlBJkppmUEmSmjY0qJKcmeSuJKtnbTs5ye1JVnWXF063\nTEnSQtVnRnUWcORGtp9WVQd2l4smW5YkSQNDg6qqLgN+vgVqkSRpA3N5j+qEJNd2uwZ3n1hFkiTN\nMu55VB8F3gtU9/PDwGs31jDJUmApwKJFi8YcTtLW4FdvqAVjzaiq6s6qerCqHgJOBw7eTNtlVbWk\nqpbMzMyMW6ckaYEaK6iS7DNr9WXA6k21lSRpLobu+kvyKeA5wF5JbgPeAzwnyYEMdv2tBd4wxRol\nSQvY0KCqqmM2svmMKdQiSdIG/GQKSVLTDCpJUtMMKklS0wwqSVLTDCpJUtMMKklS0wwqSVLTDCpJ\nUtMMKklS0wwqSVLTDCpJUtPG/T4qSfOI3yul+cwZlSSpaQaVJKlpBpUkqWkGlSSpaQaVJKlpBpUk\nqWkeni7N0biHfo/Tz8PMtRA5o5IkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCSJDXNoJIkNc3zqLRN\n8hwladvhjEqS1DSDSpLUNINKktS0oUGV5MwkdyVZPWvbHkkuTnJz93P36ZYpSVqo+syozgKOXG/b\nScDyqtoPWN6tS5I0cUODqqouA36+3uaXAmd3y2cDR024LkmSgPHfo9q7qu7oln8C7D2heiRJepg5\nn0dVVZWkNnV9kqXAUoBFixbNdTgtMJ7bJGncGdWdSfYB6H7etamGVbWsqpZU1ZKZmZkxh5MkLVTj\nBtUFwHHd8nHA+ZMpR5Kkh+tzePqngCuBpyS5LcnrgFOBI5LcDDy/W5ckaeKGvkdVVcds4qrnTbgW\nSZI24CdTSJKaZlBJkprm13xsA8Y9hHva/SYxliQ5o5IkNc2gkiQ1zaCSJDXNoJIkNc2gkiQ1zaCS\nJDXNoJIkNc3zqKZknPOGPNdIkjbkjEqS1DSDSpLUNINKktQ0g0qS1DSDSpLUNINKktQ0g0qS1DTP\noxrCc5skaetyRiVJappBJUlqmkElSWqaQSVJappBJUlqmkElSWqaQSVJatqCOY/K86EkaX5yRiVJ\nappBJUlq2px2/SVZC9wDPAg8UFVLJlGUJEnrTOI9qudW1d0T+D2SJG3AXX+SpKbNNagK+HqSFUmW\nTqIgSZJmm+uuv2dV1e1JHgNcnOTGqrpsdoMuwJYCLFq0aI7DDXiouSQtHHOaUVXV7d3Pu4DzgIM3\n0mZZVS2pqiUzMzNzGU6StACNHVRJdk6y67pl4AXA6kkVJkkSzG3X397AeUnW/Z5PVtVXJ1KVJEmd\nsYOqqn4IHDDBWiRJ2oCHp0uSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJ\nkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKa\nZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkppmUEmSmmZQSZKaZlBJkpo2p6BKcmSS\nm5LckuSkSRUlSdI6YwdVku2Afwf+GtgfOCbJ/pMqTJIkmNuM6mDglqr6YVX9Hvg08NLJlCVJ0sBc\ngmpf4Mez1m/rtkmSNDGpqvE6JkcDR1bV67v1VwN/WVUnrNduKbC0W30KcNP45W7WXsDdjfezxsn0\nmw81jtvPGifTzxq3fr8+nlBVM0NbVdVYF+BQ4Guz1t8BvGPc3zfXC3BV6/2sceHUuC3/bda4cGqc\nS79JXuay6+97wH5Jnpjkj4C/By6Yw++TJGkD24/bsaoeSHIC8DVgO+DMqrp+YpVJksQcggqgqi4C\nLppQLXO1bB70s8bJ9JsPNY7bzxon088at36/iRn7YApJkrYEP0JJktQ0g2oMSb61FcY8OcmJI/bZ\n4nVK60uyOMnqafeZS79Z/d+cZE2Sc8b9HT3H2S3Jm6Y5xnrj3bulxpoGg2oMVfVXW7uGPuZLndpQ\nBnx8bnlvAo6oqldOeZzdurHUw7x+ICQ5JclbZ62/P8lbevR7ZpJrk+yYZOck1yf5ixHGHenVyfqv\n8pKcmOTkHv3eleT7Sa5gcLL0SEaps/s/XJjkmiSrk/zdCH3/qeuzevbtMaTPsd1tcE2S/+7ZZ3H3\navf07jb7epKdhrS/MclZ3f/xnCTPT/LNJDcnObjHeDd2/dYk+VySRw7p88Ykq7rLj5Jc2udvmzXe\nTUn+C1gNPL5Hn1cl+W433se6z+DcXPu3J3lzt3xakku65cP7zCJm3yeTfGqMWf6Tklyd5Jk9mm/X\n97Zez/aj3GazavtP4EnAV5L8Y88+7+5us1H/H6cCf9rdbh/s2YckX0yyovufLB3eYzxJTk1y/Kz1\nkffoTNTWPpFrLhdgMbCyW34E8ANgz5593wd8iMEH6450ojJw7xh1rp61fiJw8pA+zwCuAx4JPAq4\nBThxWnUCfwOcPmv90T37ratzZ2AX4HrgoCF9/hz4PrBXt77HCP/HB4ADu/XPAK/q0f5p3f1jBXAm\nEAafS/nFHuMVcFi3fmbf2wDYAbgceMmI95OHgEN6tv8z4EvADt36fwDHDulzCPDZbvly4Ltdre8B\n3jCN++S6+z+DF1tXAwdM+raexG3WtV+77n7Zo+0zgVXAjsCuwM0j3D8e9pwwQn17dD936v6nfZ/v\nRn3OOgj4xqz1G4DHj1rvpC7zekZVVWuBnyU5CHgBcHVV/axn91OAI4AlwL9Op8I5eTZwXlXdV1W/\nZvonU18HHJHkA0meXVW/6tnvWQzq/E1V3Qt8gUHtm3M4gyfLuwGq6ucj1PmjqlrVLa9g8IAf1v66\nqnqIQYgur8Ej77oefQF+XFXf7JY/weDv7ePfgEuq6ks9269za1V9u2fb5zEIj+8lWdWtP2lInxXA\nM5I8CvgdcCWDx8CzGQTX5szlPjkDnA+8sqqu6dln1Nt6nXFvs1EdBpxfVb+tqnsYvGiYtjcnuQb4\nNoMZ937TGKSqrgYek+SxSQ4AflFVPx7Wb1rmdB5VIz4OvAb4Ewavnvrak8EMYAcGr4h+M/HK/uAB\nHr6bdccpjjWWqvp+kqcDLwTel2R5VZ2ytevaiN/NWn6QwSvLvu0fmrX+EP3u/+ufvzH0fI4krwGe\nAJwwpOnGjHI/DHB2Vb2jb4equj/Jjxg8Zr4FXAs8F3gysGaEsUf1K+B/GYTGDT37jHpbrzPybTYf\nJHkO8Hzg0Kq6L8n/MN3nks8CRzN4bj13iuMMNa9nVJ3zgCMZTMO/NkK/jwHvBs4BPjCFuma7k8Gr\nkz2T/DHw4h59LgOOSrJTkl2Bl0yzwCSPBe6rqk8AHwSe3rPr5QzqfGSSnYGXMfyV+SXAy5Ps2Y29\nx5hlbwmLkhzaLb8CuGJzjZM8g8Gu3Vd1s7hpWg4cneQx3dh7JHlCj36XM6jxsm75jQz2Rgx7Qp/L\nffL3DO4bxyZ5xQj9xjHSbTYH3wReksF73bvQ73G9zj0MdheO4tEMZjb3JXkqg92403Qug4/GO5pB\naG01835GVVW/796w/mVVPdinT5Jjgfur6pPdm8/fSnJ4VV0ypRrvT3IKg/cDbgdu7NFnZZJzgWuA\nuxh8tuLIQ4/Q9mnAB5M8BNwP/EOvAQZ1nsXgbwP4eLfbYHN9rk/yfuAbSR5k8L7Fa0aodUu6CTg+\nyZkMZgIfHdL+BGAP4NIkMPhAz9dPo7CquiHJPwNfz+AIwfuB44Fbh3S9HHgXcGVV/SbJbxn+4mLO\n98lurBcDFye5t6qmtTt71NtsLFX1vSQXMJiV3slgd3KvXeZV9bPuoJ7VwFeq6u09un0VeGOSNQz+\nxr67iMfSPU53BW6vqjumOdYw8/6TKboH6Erg5VV189aupxXdbGVlVfV5ha2NSLIY+HJV9T4idCHJ\n4MjVe6vqQ1u7lq0lyS5VdW93ZOFlwNKqWrm169rWzOtdf0n2Z3Dk0XJD6g+63XhXMjiqUdL0LOsO\nZFkJfN6Qmo55P6OSJG3b5vWMSpK07TOoJElNM6gkSU0zqCRJTTOoJElNM6gkSU37P1Ac2yMTygg0\nAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fc = collections.Counter(every_nth(srwcb, 12)[2])\n", + "plot_frequency_histogram(fc, sort_key=fc.get)" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['ycerevvtltfi',\n", + " 'ewhxbxxalvfa',\n", + " 'anfkmzkjvvhd',\n", + " 'svdyqlnlerhl',\n", + " 'nghkaiocsnqz',\n", + " 'eiocavghaabg',\n", + " 'hzoebajclrgc',\n", + " 'umsnqwalgclp',\n", + " 'drbvqxtvwjgv',\n", + " 'ljaqbgxrgmhz',\n", + " 'ayqamkkmvgal',\n", + " 'izfkjylnqril',\n", + " 'kxbkhphjksty',\n", + " 'hpavuvedizfa',\n", + " 'evzwrfqaqwxw',\n", + " 'oafaljtzwzke',\n", + " 'ntgceqihguzk',\n", + " 'artwmxnlhptc',\n", + " 'sucthihqhvja',\n", + " 'ekkjtfevvrpz',\n", + " 'ntsabgazlkrp',\n", + " 'pthezuwlwdoa',\n", + " 'bvctemhrhjjr',\n", + " 'driljwpgzwzl',\n", + " 'ruhhdnqstrar',\n", + " 'dotsowzlitle',\n", + " 'tapvbilivjza',\n", + " 'exaljtfkttvc',\n", + " 'rizlhrnggivf',\n", + " 'tnmaasrirych',\n", + " 'talquonahtya',\n", + " 'egclphrbvinn',\n", + " 'rdkynqrilerq',\n", + " 'ewaauclrgcwm',\n", + " 'iayxzvavvtcd',\n", + " 'itpllawtvjlw',\n", + " 'umkikczduvga',\n", + " 'iazlpwmfxkry',\n", + " 'ehezmilfkjyp',\n", + " 'adhvjslfmlbc',\n", + " 'snjzfhgxivjs',\n", + " 'lwdgamnleucr',\n", + " 'anqesrvzvfam',\n", + " 'nfzhvzpzglma',\n", + " 'emzctdzwsnqw',\n", + " 'hlqafrlpstya',\n", + " 'eqqrulvvetvc',\n", + " 'rizlhrvaokfj',\n", + " 'ervvthzralhd',\n", + " 'ycbehumlxhdn',\n", + " 'dvltrmdvtzal',\n", + " 'mqrpctvjddht',\n", + " 'talcacnghset',\n", + " 'arfihqwaljtf',\n", + " 'tfaglejprtlk',\n", + " 'oaqgctlsleav',\n", + " 'uanaalcrhcor',\n", + " 'ewcsvnnqepbr',\n", + " 'stsrvzfvnwhw',\n", + " 'ptvrtxwgaqwh',\n", + " 'eekzgzdvtxpj',\n", + " 'otfmgnbvlrhc',\n", + " 'vzvkayfkoslf',\n", + " 'slbcmsnqlimf',\n", + " 'eqbixhwhogxv',\n", + " 'eaebaaalqqzz',\n", + " 'nfgttfrlwspa',\n", + " 'ffufelkslfml',\n", + " 'icmaaklbtwlr',\n", + " 'oamnnnqlimgh',\n", + " 'dhvypauqaymn',\n", + " 'dhbehumlxhwa',\n", + " 'oianpimnfmvt',\n", + " 'arfamnflbtwx',\n", + " 'eenfkgaqxapv',\n", + " 'gzhaqizzrfgt',\n", + " 'arrwwydwfaxl',\n", + " 'tbcgmnqlblyr',\n", + " 'ofzwimkmharz',\n", + " 'evkalppwkanj',\n", + " 'arkahtlgcbga',\n", + " 'eqqrjetwenle',\n", + " 'thrdrbovrnqp',\n", + " 'ofvwsvvgkqqx',\n", + " 'hvrvlhtjihwa',\n", + " 'eqewpgzwsnql',\n", + " 'fsbdgfuxvwkz',\n", + " 'astfirzmdhme',\n", + " 'itwdgcbuhvzx',\n", + " 'ofvgqbfalhvn',\n", + " 'hhtbugmlwrhh',\n", + " 'gkxtsemnleuc',\n", + " 'dufamnfksfjp',\n", + " 'yfvaqeshdgka',\n", + " 'bmpfjllvtnpa',\n", + " 'tbuqgclrgcwm',\n", + " 'wwibxhdnqzwt',\n", + " 'cjlhxhgbtsln',\n", + " 'uxjkhwahtmal',\n", + " 'rfamnfoavvwm',\n", + " 'fknkkmrgejua',\n", + " 'akorrhwalrfw',\n", + " 'ngtmqwkwrtkv',\n", + " 'thgslfmlbcmg',\n", + " 'fkjvzvtvtecg',\n", + " 'ivrbzjhntkjt',\n", + " 'rkalplnqvgth',\n", + " 'alphrbvierij',\n", + " 'yqhgfauawhvs',\n", + " 'fjtpsksgkelw',\n", + " 'okevtyslfmlb',\n", + " 'umlhfvxnlegh',\n", + " 'rfaqmnmlegxv',\n", + " 'ehwhzpevzgcl',\n", + " 'ehrbvianqqrz',\n", + " 'evivxnlegalg',\n", + " 'alphrbvqphdw',\n", + " 'wkqqbqlbbwbf',\n", + " 'rfaqqgmltbbn',\n", + " 'drbgalvvqmiv',\n", + " 'ivtygzolmvjg',\n", + " 'fyalmfqaspko',\n", + " 'obypevdvtzal',\n", + " 'mmszvgltgkws',\n", + " 'nqwalgqrhbjg',\n", + " 'slkvqmivntvc',\n", + " 'rizlhrnrizdd',\n", + " 'ntovefaqaeba',\n", + " 'oinmalgqrhbt',\n", + " 'oifofqbqhqzf',\n", + " 'alfmlbcmlhqg',\n", + " 'rktivqhetahn',\n", + " 'dklgqifoqrzz',\n", + " 'rrgxvixhgmwj',\n", + " 'txvdetvnalwl',\n", + " 'itwadgkwwkwh',\n", + " 'talqabfyxruj',\n", + " 'icmxtfxkvpyn',\n", + " 'dlammhtgvall',\n", + " 'odthwhhkrdhx',\n", + " 'hhttnqwalvvq',\n", + " 'aivvvtrpkowb',\n", + " 'nnizvwgtyalm',\n", + " 'xqamtfypagkj',\n", + " 'fwvihrakcere',\n", + " 'ivtubyjdtfyp',\n", + " 'sgkjfsfjxrqs',\n", + " 'lfmlbcmjzaco',\n", + " 'dxhqhvvwlbum',\n", + " 'tbvtnpaxtsfv',\n", + " 'tbvqrwvtygvl',\n", + " 'aldgihqhvvwl',\n", + " 'iumtxhwalpzm',\n", + " 'allnqxjgzona',\n", + " 'mmrtwmxnlhpt',\n", + " 'umucthkdvqqi',\n", + " 'loqrzzvsfxkr',\n", + " 'yralwgzolmvj',\n", + " 'uhqhvypauqay',\n", + " 'anqhbmdgavtz',\n", + " 'hpaxfttlwlcm',\n", + " 'otodxjkqqrgl',\n", + " 'alfmlbcmuqbq',\n", + " 'eqzrhkpuewpq',\n", + " 'ivupagkjjkfu',\n", + " 'svrwsxbkpalq',\n", + " 'ivqrtfsgzolm',\n", + " 'rctsogcthpzr',\n", + " 'hlkurvalrmce',\n", + " 'rjgthcmbpiot',\n", + " 'ivtnhvzlhruh',\n", + " 'nrhkpumnqkll',\n", + " 'asfbhmalwmvu',\n", + " 'lpxrrhvhrspi',\n", + " 'rudrbknqfwha',\n", + " 'ivtzavianale',\n", + " 'ergtllgottbr',\n", + " 'iafbhmalqmrb',\n", + " 'otfmmnytsogc',\n", + " 'thonqkpalhfp',\n", + " 'wetwqtfxkxap',\n", + " 'muvgklnaaalm',\n", + " 'xqaspkowbuhd',\n", + " 'smzkjvvhvwzz',\n", + " 'rvpjdwfafalp',\n", + " 'iogtnlvxahtp',\n", + " 'askdzkhjburw',\n", + " 'ngbonatrfihq',\n", + " 'talqnzaclrgc',\n", + " 'umsnqkpaeqrq',\n", + " 'yqwrgxvpynqk',\n", + " 'uhtkvirvvgkh',\n", + " 'talrbpmpvfam',\n", + " 'nfodvkavvvvh',\n", + " 'uwghwhsqmcki',\n", + " 'txhjnvgllujv',\n", + " 'ksvtubgalfjb',\n", + " 'txvsjtpstyal',\n", + " 'arifugnpgenq',\n", + " 'rrppckwimutl',\n", + " 'epermtyalmzt',\n", + " 'oaymnqhvjslf',\n", + " 'slbcmsskslfm',\n", + " 'tbcmkugrgxhw',\n", + " 'hlvrnxyrrilf',\n", + " 'frgnbvlzfkov',\n", + " 'nvvtzhtntwea',\n", + " 'eeizyltjhvaz',\n", + " 'ehwalqqrjeba',\n", + " 'dhgkumtbwbfg',\n", + " 'majzhwhhxerj',\n", + " 'bznxbrralmzt',\n", + " 'oaymnqhvdmrt',\n", + " 'umxnlhptcmuc',\n", + " 'thkwsxnvnlwj',\n", + " 'ptvjmudhhwhh',\n", + " 'rvetlwgtvxej',\n", + " 'webajclrgcwm',\n", + " 'ftfkalwskost',\n", + " 'hpaeqrgabmab',\n", + " 'wwslahtvcthv',\n", + " 'iuewpqykvetx',\n", + " 'dzebajclrgcw',\n", + " 'szlgcrvjzfwj',\n", + " 'pgvtprvhdnra',\n", + " 'ftfxkvpmtyal',\n", + " 'cqrhbxnqwhuk',\n", + " 'talvnebaaalw',\n", + " 'tkfbtkwlhtya',\n", + " 'evvqmivvvtrp',\n", + " 'gowbanizvwsr',\n", + " 'rvwlxhvslfml',\n", + " 'icmsnqkpayau',\n", + " 'ruvxtfkalgtz',\n", + " 'mqwlalcfhdfq',\n", + " 'myubmxhdggiv',\n", + " 'slmalvfamnfg',\n", + " 'lolmvjavrbzj',\n", + " 'antkjtfjsfjt',\n", + " 'asksgkjwfafa',\n", + " 'atalpwzbrerk',\n", + " 'hjcthctkjvvh',\n", + " 'taljtfxkvpyn',\n", + " 'dwaltgzagbrv',\n", + " 'slhqclrgcwms',\n", + " 'nqkpaeqrfgwb',\n", + " 'wwslahtvctho',\n", + " 'nqkpaeqrevxn',\n", + " 'rerhwhqcrizl',\n", + " 'ergalmzylerk',\n", + " 'szlevtuebaaa',\n", + " 'ewzhmqstyalm',\n", + " 'rsbrxgivjeba',\n", + " 'talhhzdttvga',\n", + " 'egqzootonaht',\n", + " 'ddwjpcthamrt',\n", + " 'hlhwalwmlmdd',\n", + " 'ofjoebaaalxp',\n", + " 'ooqkctlejqjg',\n", + " 'ntnponifjtfv',\n", + " 'talqabghonnw',\n", + " 'aibbvthbrhky',\n", + " 'pgfjdaawbrhz',\n", + " 'ibacdbtldsnq',\n", + " 'wwtxvwtfwndz',\n", + " 'ddyqsszllhdd',\n", + " 'gxvihzebajcl',\n", + " 'ggcwmklkrpet',\n", + " 'dwbonamhvpat',\n", + " 'orbshqhvypas',\n", + " 'rdailylgqbpg',\n", + " 'alphwalxklyg',\n", + " 'odnmtyalgqrh',\n", + " 'xevzolvtovup',\n", + " 'stsveslialtx',\n", + " 'talwwgwlzbrm',\n", + " 'fwfaqenqvgha',\n", + " 'emfqaspkowbp',\n", + " 'rfgkwhwalwwe',\n", + " 'thukvdmnviiv',\n", + " 'fjvzwfdmksvt',\n", + " 'llnqiflwltef',\n", + " 'gjxhhgnbttvj',\n", + " 'rlgfpkrdyqdl',\n", + " 'txvwwvihiwfa',\n", + " 'talmzkhfdqrg',\n", + " 'ofjuclphrbvq',\n", + " 'anqufamnnlts',\n", + " 'exalcpvwlxhd',\n", + " 'nqpmdhwsctzn',\n", + " 'ikgwgtluotls',\n", + " 'nqvzlitxvtxr',\n", + " 'tbbnxhjtfkal',\n", + " 'izjsfjhhptdz',\n", + " 'rrnpgsjzvtqa',\n", + " 'eaebalbehuml',\n", + " 'iwbgalcqdpti',\n", + " 'uhgbtealcfhd',\n", + " 'rvgqjzvvhvmz',\n", + " 'fnkkmrgejrhq',\n", + " 'obgbvhysbghh',\n", + " 'hljtfkkvwkst',\n", + " 'nbjdwamgamod',\n", + " 'evvgcthfvtdf',\n", + " 'txhwhhalppkg',\n", + " 'tnmgtyalbqas',\n", + " 'ekowbtkquvna',\n", + " 'nqdtelslahnq',\n", + " 'ehwalgqrhbqh',\n", + " 'hpaksfjooitx',\n", + " 'ntxvggmddvtc',\n", + " 'ofulvefaqsty',\n", + " 'hlvvgqjzvpmt',\n", + " 'talgqrhbxnqw',\n", + " 'hlvvxnlebtya',\n", + " 'expkoqkctleg',\n", + " 'aewsrxxrngxh',\n", + " 'talqmlwaprur',\n", + " 'nnnqdwwruhhs',\n", + " 'erfawbflhhal',\n", + " 'smlmddjfjwec',\n", + " 'hahfvggmdzef',\n", + " 'ardatkndzllv',\n", + " 'ehlcgidlrgal',\n", + " 'ypvxbzvhiwfa',\n", + " 'muttbtrpqwvm',\n", + " 'ikgkrzfpuwsv',\n", + " 'ervmhwhhavgw',\n", + " 'bsrvzppkowba',\n", + " 'aizvwtvnbpvd',\n", + " 'exapazpalhfp',\n", + " 'wetwcvwlhfvx',\n", + " 'hlmzyvbbilvr',\n", + " 'equmwgtwfaqa',\n", + " 'evvhhrvmhwal',\n", + " 'cqrhblqewfet',\n", + " 'rlgnzralkxve',\n", + " 'tlsctznnkgwg',\n", + " 'fhcthonqkpae',\n", + " 'erevgqfulvtz',\n", + " 'hlmzktlpmaht',\n", + " 'ryhphlalqagl',\n", + " 'iubdfktngmts',\n", + " 'ksphvzyhqhvk',\n", + " 'akornsshpalh',\n", + " 'rzinnnqlbipi',\n", + " 'nfeqkxvetejr',\n", + " 'hhtmhqqbgbvh',\n", + " 'exhdgfhxgvbb',\n", + " 'talxklnatgml',\n", + " 'bfgqbpgelphi',\n", + " 'ofdmnlekrrvr',\n", + " 'tbwbflhqqaqc',\n", + " 'exbeetwcvwlb',\n", + " 'nctecgoxbkev',\n", + " 'gzahtmahtmkl',\n", + " 'tadetwzbrhdy',\n", + " 'bfxhzojauruh',\n", + " 'dxhgbtealroz',\n", + " 'talkrzfzwimo',\n", + " 'obqhvjgtyale',\n", + " 'npkmrgpkfco']" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "chunks(srwcb, 12)" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [], + "source": [ + "# hill_matrix = [[1] * (i + 1) + [0] * (12 - (i + 1)) for i in range(12)]\n", + "# hill_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", + " [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],\n", + " [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]]" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hill_matrix = [list(reversed([0] * (12 - (i + 1)) + [1, 1] + [0] * 12))[-12:] for i in range(12)]\n", + "hill_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'yearningforrespitetheromanssufferedasdaysturnedintoweeksandweeksintomonthswithcalgacusandthecaledoniiperfectlycontenttolaysiegeintheirownlandourknowledgeofthisdreadfulperiodcomesfromthefollowingaccountbymarcusfideliuscatoundersiegeforninelongmonthstrappedbywallswebuilttodefendourselvesherdedandpennedlikesheepwithinourrefugethefortatcarridenagainstusisarrayedthemightofthecaledonianarmyandournemesiscalgacusisgrinningwhilehewatchesussquirminthishellbetrayedbyourownleadersalustiusvolunteersallsomanygoodandbraveromanshavelosttheirlivesandthemoraleofthemenhereatcarridenisworseningbythedayexhaustedandstarvingthemencatchwhattheycantoeataroundthefortmostlyratssomecatsalthoughtheytooareskinandbonesbravebutdesperatesomespeakprivatelyofamutinytooverthrowsalustiusandiamtemptedtoagreewiththemevensoforallhisfaultssalustiusisstillaromanandiamunderhiscommandexhaustedthoughiambeingaromanstillmeanssomethingtomeevensofarawayfromlatiumanditsglorioussunneverthelessifearthatsoonthemenwillturntodarkerandmoresavagemethodstofeedthemselvesandifnoprogresshasbeenmadeiwillsoonhavetoreconsiderwhatimustdotogetasmanygoodromanssafelyhomeaspossiblebidinghistimecalgacuswaitedandwatcheduntilhejudgedthattheromansweresufficientlyweakenedthensentamessengertosalustiusofferingpeaceinexchangeforthelandsofcaledoniaenvoyspromisedsafepassageallowingsalustiustoreturntoromeifheagreedtoleavecaledoniaandneverreturnthecaledoniihadtwoconditionsromemustabandontheremainingsoldiersoftheixthlegionleavingthemashostagesandthecodexmustremainatcarridenarrivinginromewithoutthecodexwouldcondemnsalustiustocertaindeathandhecouldneveragreetosuchtermsbuthestillpossessedthemonsgraupiusforgeryandisuspecthehopedtotradethatandtheremaininglegionnairesoftheixthforhisownfreedomyearningonlyforhisownsafetysalustiusriskedunderestimatinghisfoebutindoingsohealsounderestimatedtheloyalanduprightmarcusfideliuscatowhocouldneverbetraythesoldiersunderhiscommandexposingthisfatallackofjudgementsalustiuscondemnedhimselfinhisownwordsdoiknowthemindofasoldierlikecatobythegodsidoyearsofcampaigninghavehardenedhimandhehasnotthesubtletytoharbourdarkandcunningthoughtsmentalagilityisnotthemarkofamanlikecatoandhistorywillforgethimintruththeixthlegionhadsufferedseverelyfromtheligaturethatwasslowlydrawntightaroundthembycalgacusandhismendysenteryandhungerravagedthenobleromanswhowerereducedtoemaciatedghostschokingonthebitterbileofthearroganceandrapaciouscrueltyoftheircommandersalustiusassalustiusscentedtherankodourofmutinybeginningtofilltheairhepunishedthemenwithdecimationsomovedtotearsbypitytheircommandermarcusfideliuscatowasfinallypersuadedtotreatsecretlywithcalgacusforthesakeofhismenthusitwasthatcatohimselftreatedwithcalgacushecarefullypreparedanewforgeryofthecodexandtogetherwiththestrongestoftheremaininglegionnairesarrestedsalustiusandhisguardsforthecrimestheyhadcommittedagainsttheromansoldiersinexchangeforsafepassagefromthathellonearthcatoofferedtheforgeryandtheprisonerstocalgacusandhismensoitwasthatcatoandhismenreturnedtocarridentheirheartsheavywiththeshameoftheirbargainwiththedevilinthecoldlightofdawncatomarchedthesurvivorswiththetwoaquilaeflyinghighbeforethemontoanawaitingbarqueprovisionedwithvitalsandwaterforfivedaysashehadagreedwithcalgacusstrappedtighttohisbodyunderhisarmourheconcealedthetruecopyofthecodexholdinginhisbreastplatethesecurityofromeandsotheixthlegioncrossedtheseatogermaniainferiormakinglandfallatlugdunumbatavorumtwodayslaterfreedfromtheirtormentorscaledoniiandromanaliketheyrestedandmadesacrificesofgoatsandsheepingratitudefortheirsafedeliveranceovercomewithexhaustiontheysleptuntiltheyhadrecoveredsufficientlytocontinueontothefortressatnoviomaguswherecatoreportedtothelegatusofthexthlegiongeminaandatlasthandedthecodextohissafekeepingreceivingwordinromeoftherecoveryofthecodexandthereturnofthetwoaquilaecaesargrantedthemallpardonandawardedpensionstothesurvivorseachtoreceiveafarmoffiveherediumwhentheyretiredfrommilitaryserviceglorywasdeniedtothosebravelegionnairesbutihopethishistorywillrestoretheirhonourenemiesofromeweredeniedthecodexoccultarumbythegreatsacrificesofcatoandhismenrecordingtheirtaleisperhapsthemostimportanttaskihaveundertakenasahistoriananditpainsmegreatlythattocontinuetoprotectitthetruthmustbeconcealedformanygenerationstocomeyetiwillrestinpeaceknowingthatthattruthwillonedaybetoldguardeduntilthenbythegloriouswondersoftheancientworldx'" + ] + }, + "execution_count": 171, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hill_decipher(hill_matrix, srwcb)" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'YEARNING FOR RESPITE THE ROMANS SUFFERED AS DAYS TURNED INTO WEEKS AND WEEKS INTO MONTHS, WITH CALGACUS AND THE CALEDONII PERFECTLY CONTENT TO LAY SIEGE IN THEIR OWN LAND. OUR KNOWLEDGE OF THIS DREADFUL PERIOD COMES FROM THE FOLLOWING ACCOUNT BY MARCUS FIDELIUS CATO.“ UNDER SIEGE FOR NINE LONG MONTHS, TRAPPED BY WALLS WE BUILT TO DEFEND OURSELVES. HERDED AND PENNED LIKE SHEEP WITHIN OUR REFUGE, THE FORT AT CARRIDEN. AGAINST US IS ARRAYED THE MIGHT OF THE CALEDONIAN ARMY, AND OUR NEMESIS CALGACUS IS GRINNING WHILE HE WATCHES US SQUIRM IN THIS HELL, BETRAYED BY OUR OWN LEADER SALUSTIUS. VOLUNTEERS ALL, SO MANY GOOD AND BRAVE ROMANS HAVE LOST THEIR LIVES, AND THE MORALE OF THE MEN HERE AT CARRIDEN IS WORSENING BY THE DAY. EXHAUSTED AND STARVING THE MEN CATCH WHAT THEY CAN TO EAT AROUND THE FORT, MOSTLY RATS, SOME CATS, ALTHOUGH THEY TOO ARE SKIN AND BONES. BRAVE BUT DESPERATE, SOME SPEAK PRIVATELY OF A MUTINY TO OVERTHROW SALUSTIUS, AND I AM TEMPTED TO AGREE WITH THEM. EVEN SO, FOR ALL HIS FAULTS, SALUSTIUS IS STILL A ROMAN AND I AM UNDER HIS COMMAND. EXHAUSTED THOUGH I AM, BEING A ROMAN STILL MEANS SOMETHING TO ME, EVEN SO FAR AWAY FROM LATIUM AND ITS GLORIOUS SUN. NEVERTHELESS, I FEAR THAT SOON THE MEN WILL TURN TO DARKER AND MORE SAVAGE METHODS TO FEED THEMSELVES AND IF NO PROGRESS HAS BEEN MADE, I WILL SOON HAVE TO RECONSIDER WHAT I MUST DO TO GET AS MANY GOOD ROMANS SAFELY HOME AS POSSIBLE.” BIDING HIS TIME CALGACUS WAITED AND WATCHED UNTIL HE JUDGED THAT THE ROMANS WERE SUFFICIENTLY WEAKENED, THEN SENT A MESSENGER TO SALUSTIUS OFFERING PEACE IN EXCHANGE FOR THE LANDS OF CALEDONIA. ENVOYS PROMISED SAFE PASSAGE, ALLOWING SALUSTIUS TO RETURN TO ROME IF HE AGREED TO LEAVE CALEDONIA AND NEVER RETURN. THE CALEDONII HAD TWO CONDITIONS. ROME MUST ABANDON THE REMAINING SOLDIERS OF THE IXTH LEGION, LEAVING THEM AS HOSTAGES; AND THE CODEX MUST REMAIN AT CARRIDEN. ARRIVING IN ROME WITHOUT THE CODEX WOULD CONDEMN SALUSTIUS TO CERTAIN DEATH, AND HE COULD NEVER AGREE TO SUCH TERMS, BUT HE STILL POSSESSED THE MONS GRAUPIUS FORGERY AND I SUSPECT HE HOPED TO TRADE THAT AND THE REMAINING LEGIONNAIRES OF THE IXTH FOR HIS OWN FREEDOM. YEARNING ONLY FOR HIS OWN SAFETY, SALUSTIUS RISKED UNDERESTIMATING HIS FOE, BUT IN DOING SO HE ALSO UNDERESTIMATED THE LOYAL AND UPRIGHT MARCUS FIDELIUS CATO WHO COULD NEVER BETRAY THE SOLDIERS UNDER HIS COMMAND. EXPOSING THIS FATAL LACK OF JUDGEMENT, SALUSTIUS CONDEMNED HIMSELF IN HIS OWN WORDS. “DO I KNOW THE MIND OF A SOLDIER LIKE CATO? BY THE GODS I DO. YEARS OF CAMPAIGNING HAVE HARDENED HIM AND HE HAS NOT THE SUBTLETY TO HARBOUR DARK AND CUNNING THOUGHTS. MENTAL AGILITY IS NOT THE MARK OF A MAN LIKE CATO AND HISTORY WILL FORGET HIM.” IN TRUTH THE IXTH LEGION HAD SUFFERED SEVERELY FROM THE LIGATURE THAT WAS SLOWLY DRAWN TIGHT AROUND THEM BY CALGACUS AND HIS MEN. DYSENTERY AND HUNGER RAVAGED THE NOBLE ROMANS WHO WERE REDUCED TO EMACIATED GHOSTS, CHOKING ON THE BITTER BILE OF THE ARROGANCE AND RAPACIOUS CRUELTY OF THEIR COMMANDER SALUSTIUS. AS SALUSTIUS SCENTED THE RANK ODOUR OF MUTINY BEGINNING TO FILL THE AIR HE PUNISHED THE MEN WITH DECIMATION. SO, MOVED TO TEARS BY PITY, THEIR COMMANDER MARCUS FIDELIUS CATO WAS FINALLY PERSUADED TO TREAT SECRETLY WITH CALGACUS FOR THE SAKE OF HIS MEN. THUS IT WAS THAT CATO HIMSELF TREATED WITH CALGACUS. HE CAREFULLY PREPARED A NEW FORGERY OF THE CODEX AND TOGETHER WITH THE STRONGEST OF THE REMAINING LEGIONNAIRES ARRESTED SALUSTIUS AND HIS GUARDS FOR THE CRIMES THEY HAD COMMITTED AGAINST THE ROMAN SOLDIERS. IN EXCHANGE FOR SAFE PASSAGE FROM THAT HELL ON EARTH, CATO OFFERED THE FORGERY AND THE PRISONERS TO CALGACUS AND HIS MEN. SO IT WAS THAT CATO AND HIS MEN RETURNED TO CARRIDEN, THEIR HEARTS HEAVY WITH THE SHAME OF THEIR BARGAIN WITH THE DEVIL. IN THE COLD LIGHT OF DAWN, CATO MARCHED THE SURVIVORS, WITH THE TWO AQUILAE FLYING HIGH BEFORE THEM, ONTO AN AWAITING BARQUE PROVISIONED WITH VITALS AND WATER FOR FIVE DAYS, AS HE HAD AGREED WITH CALGACUS. STRAPPED TIGHT TO HIS BODY, UNDER HIS ARMOUR, HE CONCEALED THE TRUE COPY OF THE CODEX, HOLDING IN HIS BREASTPLATE THE SECURITY OF ROME. AND SO THE IXTH LEGION CROSSED THE SEA TO GERMANIA INFERIOR, MAKING LANDFALL AT LUGDUNUM BATAVORUM TWO DAYS LATER. FREED FROM THEIR TORMENTORS, CALEDONII AND ROMAN ALIKE, THEY RESTED AND MADE SACRIFICES OF GOATS AND SHEEP IN GRATITUDE FOR THEIR SAFE DELIVERANCE. OVERCOME WITH EXHAUSTION THEY SLEPT, UNTIL THEY HAD RECOVERED SUFFICIENTLY TO CONTINUE ON TO THE FORTRESS AT NOVIOMAGUS WHERE CATO REPORTED TO THE LEGATUS OF THE XTH LEGION GEMINA AND, AT LAST, HANDED THE CODEX TO HIS SAFE KEEPING. RECEIVING WORD IN ROME OF THE RECOVERY OF THE CODEX AND THE RETURN OF THE TWO AQUILAE, CAESAR GRANTED THEM ALL PARDON AND AWARDED PENSIONS TO THE SURVIVORS, EACH TO RECEIVE A FARM OF FIVE HEREDIUM WHEN THEY RETIRED FROM MILITARY SERVICE. GLORY WAS DENIED TO THOSE BRAVE LEGIONNAIRES, BUT I HOPE THIS HISTORY WILL RESTORE THEIR HONOUR. ENEMIES OF ROME WERE DENIED THE CODEX OCCULTARUM BY THE GREAT SACRIFICES OF CATO AND HIS MEN. RECORDING THEIR TALE IS PERHAPS THE MOST IMPORTANT TASK I HAVE UNDERTAKEN AS A HISTORIAN, AND IT PAINS ME GREATLY THAT, TO CONTINUE TO PROTECT IT, THE TRUTH MUST BE CONCEALED FOR MANY GENERATIONS TO COME. YET I WILL REST IN PEACE KNOWING THAT THAT TRUTH WILL ONE DAY BE TOLD, GUARDED UNTIL THEN BY THE GLORIOUS WONDERS OF THE ANCIENT WORLD.'" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "repunctuate(hill_decipher(hill_matrix, srwcb), pub)" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'yearningforr'" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "autokey_decipher(srwcb[:12], 'a')" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'YEARNING FOR RESPITE THE ROMANS SUFFERED AS DAYS TURNED INTO WEEKS AND WEEKS INTO MONTHS, WITH CALGACUS AND THE CALEDONII PERFECTLY CONTENT TO LAY SIEGE IN THEIR OWN LAND. OUR KNOWLEDGE OF THIS DREADFUL PERIOD COMES FROM THE FOLLOWING ACCOUNT BY MARCUS FIDELIUS CATO.“ UNDER SIEGE FOR NINE LONG MONTHS, TRAPPED BY WALLS WE BUILT TO DEFEND OURSELVES. HERDED AND PENNED LIKE SHEEP WITHIN OUR REFUGE, THE FORT AT CARRIDEN. AGAINST US IS ARRAYED THE MIGHT OF THE CALEDONIAN ARMY, AND OUR NEMESIS CALGACUS IS GRINNING WHILE HE WATCHES US SQUIRM IN THIS HELL, BETRAYED BY OUR OWN LEADER SALUSTIUS. VOLUNTEERS ALL, SO MANY GOOD AND BRAVE ROMANS HAVE LOST THEIR LIVES, AND THE MORALE OF THE MEN HERE AT CARRIDEN IS WORSENING BY THE DAY. EXHAUSTED AND STARVING THE MEN CATCH WHAT THEY CAN TO EAT AROUND THE FORT, MOSTLY RATS, SOME CATS, ALTHOUGH THEY TOO ARE SKIN AND BONES. BRAVE BUT DESPERATE, SOME SPEAK PRIVATELY OF A MUTINY TO OVERTHROW SALUSTIUS, AND I AM TEMPTED TO AGREE WITH THEM. EVEN SO, FOR ALL HIS FAULTS, SALUSTIUS IS STILL A ROMAN AND I AM UNDER HIS COMMAND. EXHAUSTED THOUGH I AM, BEING A ROMAN STILL MEANS SOMETHING TO ME, EVEN SO FAR AWAY FROM LATIUM AND ITS GLORIOUS SUN. NEVERTHELESS, I FEAR THAT SOON THE MEN WILL TURN TO DARKER AND MORE SAVAGE METHODS TO FEED THEMSELVES AND IF NO PROGRESS HAS BEEN MADE, I WILL SOON HAVE TO RECONSIDER WHAT I MUST DO TO GET AS MANY GOOD ROMANS SAFELY HOME AS POSSIBLE.” BIDING HIS TIME CALGACUS WAITED AND WATCHED UNTIL HE JUDGED THAT THE ROMANS WERE SUFFICIENTLY WEAKENED, THEN SENT A MESSENGER TO SALUSTIUS OFFERING PEACE IN EXCHANGE FOR THE LANDS OF CALEDONIA. ENVOYS PROMISED SAFE PASSAGE, ALLOWING SALUSTIUS TO RETURN TO ROME IF HE AGREED TO LEAVE CALEDONIA AND NEVER RETURN. THE CALEDONII HAD TWO CONDITIONS. ROME MUST ABANDON THE REMAINING SOLDIERS OF THE IXTH LEGION, LEAVING THEM AS HOSTAGES; AND THE CODEX MUST REMAIN AT CARRIDEN. ARRIVING IN ROME WITHOUT THE CODEX WOULD CONDEMN SALUSTIUS TO CERTAIN DEATH, AND HE COULD NEVER AGREE TO SUCH TERMS, BUT HE STILL POSSESSED THE MONS GRAUPIUS FORGERY AND I SUSPECT HE HOPED TO TRADE THAT AND THE REMAINING LEGIONNAIRES OF THE IXTH FOR HIS OWN FREEDOM. YEARNING ONLY FOR HIS OWN SAFETY, SALUSTIUS RISKED UNDERESTIMATING HIS FOE, BUT IN DOING SO HE ALSO UNDERESTIMATED THE LOYAL AND UPRIGHT MARCUS FIDELIUS CATO WHO COULD NEVER BETRAY THE SOLDIERS UNDER HIS COMMAND. EXPOSING THIS FATAL LACK OF JUDGEMENT, SALUSTIUS CONDEMNED HIMSELF IN HIS OWN WORDS. “DO I KNOW THE MIND OF A SOLDIER LIKE CATO? BY THE GODS I DO. YEARS OF CAMPAIGNING HAVE HARDENED HIM AND HE HAS NOT THE SUBTLETY TO HARBOUR DARK AND CUNNING THOUGHTS. MENTAL AGILITY IS NOT THE MARK OF A MAN LIKE CATO AND HISTORY WILL FORGET HIM.” IN TRUTH THE IXTH LEGION HAD SUFFERED SEVERELY FROM THE LIGATURE THAT WAS SLOWLY DRAWN TIGHT AROUND THEM BY CALGACUS AND HIS MEN. DYSENTERY AND HUNGER RAVAGED THE NOBLE ROMANS WHO WERE REDUCED TO EMACIATED GHOSTS, CHOKING ON THE BITTER BILE OF THE ARROGANCE AND RAPACIOUS CRUELTY OF THEIR COMMANDER SALUSTIUS. AS SALUSTIUS SCENTED THE RANK ODOUR OF MUTINY BEGINNING TO FILL THE AIR HE PUNISHED THE MEN WITH DECIMATION. SO, MOVED TO TEARS BY PITY, THEIR COMMANDER MARCUS FIDELIUS CATO WAS FINALLY PERSUADED TO TREAT SECRETLY WITH CALGACUS FOR THE SAKE OF HIS MEN. THUS IT WAS THAT CATO HIMSELF TREATED WITH CALGACUS. HE CAREFULLY PREPARED A NEW FORGERY OF THE CODEX AND TOGETHER WITH THE STRONGEST OF THE REMAINING LEGIONNAIRES ARRESTED SALUSTIUS AND HIS GUARDS FOR THE CRIMES THEY HAD COMMITTED AGAINST THE ROMAN SOLDIERS. IN EXCHANGE FOR SAFE PASSAGE FROM THAT HELL ON EARTH, CATO OFFERED THE FORGERY AND THE PRISONERS TO CALGACUS AND HIS MEN. SO IT WAS THAT CATO AND HIS MEN RETURNED TO CARRIDEN, THEIR HEARTS HEAVY WITH THE SHAME OF THEIR BARGAIN WITH THE DEVIL. IN THE COLD LIGHT OF DAWN, CATO MARCHED THE SURVIVORS, WITH THE TWO AQUILAE FLYING HIGH BEFORE THEM, ONTO AN AWAITING BARQUE PROVISIONED WITH VITALS AND WATER FOR FIVE DAYS, AS HE HAD AGREED WITH CALGACUS. STRAPPED TIGHT TO HIS BODY, UNDER HIS ARMOUR, HE CONCEALED THE TRUE COPY OF THE CODEX, HOLDING IN HIS BREASTPLATE THE SECURITY OF ROME. AND SO THE IXTH LEGION CROSSED THE SEA TO GERMANIA INFERIOR, MAKING LANDFALL AT LUGDUNUM BATAVORUM TWO DAYS LATER. FREED FROM THEIR TORMENTORS, CALEDONII AND ROMAN ALIKE, THEY RESTED AND MADE SACRIFICES OF GOATS AND SHEEP IN GRATITUDE FOR THEIR SAFE DELIVERANCE. OVERCOME WITH EXHAUSTION THEY SLEPT, UNTIL THEY HAD RECOVERED SUFFICIENTLY TO CONTINUE ON TO THE FORTRESS AT NOVIOMAGUS WHERE CATO REPORTED TO THE LEGATUS OF THE XTH LEGION GEMINA AND, AT LAST, HANDED THE CODEX TO HIS SAFE KEEPING. RECEIVING WORD IN ROME OF THE RECOVERY OF THE CODEX AND THE RETURN OF THE TWO AQUILAE, CAESAR GRANTED THEM ALL PARDON AND AWARDED PENSIONS TO THE SURVIVORS, EACH TO RECEIVE A FARM OF FIVE HEREDIUM WHEN THEY RETIRED FROM MILITARY SERVICE. GLORY WAS DENIED TO THOSE BRAVE LEGIONNAIRES, BUT I HOPE THIS HISTORY WILL RESTORE THEIR HONOUR. ENEMIES OF ROME WERE DENIED THE CODEX OCCULTARUM BY THE GREAT SACRIFICES OF CATO AND HIS MEN. RECORDING THEIR TALE IS PERHAPS THE MOST IMPORTANT TASK I HAVE UNDERTAKEN AS A HISTORIAN, AND IT PAINS ME GREATLY THAT, TO CONTINUE TO PROTECT IT, THE TRUTH MUST BE CONCEALED FOR MANY GENERATIONS TO COME. YET I WILL REST IN PEACE KNOWING THAT THAT TRUTH WILL ONE DAY BE TOLD, GUARDED UNTIL THEN BY THE GLORIOUS WONDERS OF THE ANCIENT WORLD.'" + ] + }, + "execution_count": 166, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pb = repunctuate(cat(autokey_decipher(c, 'a') for c in chunks(srwcb, 12)), pub)\n", + "pb" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5372" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "open('8b.plaintext', 'w').write(pb)" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/2017/8b.plaintext b/2017/8b.plaintext new file mode 100644 index 0000000..e1a6c8a --- /dev/null +++ b/2017/8b.plaintext @@ -0,0 +1 @@ +YEARNING FOR RESPITE THE ROMANS SUFFERED AS DAYS TURNED INTO WEEKS AND WEEKS INTO MONTHS, WITH CALGACUS AND THE CALEDONII PERFECTLY CONTENT TO LAY SIEGE IN THEIR OWN LAND. OUR KNOWLEDGE OF THIS DREADFUL PERIOD COMES FROM THE FOLLOWING ACCOUNT BY MARCUS FIDELIUS CATO.“ UNDER SIEGE FOR NINE LONG MONTHS, TRAPPED BY WALLS WE BUILT TO DEFEND OURSELVES. HERDED AND PENNED LIKE SHEEP WITHIN OUR REFUGE, THE FORT AT CARRIDEN. AGAINST US IS ARRAYED THE MIGHT OF THE CALEDONIAN ARMY, AND OUR NEMESIS CALGACUS IS GRINNING WHILE HE WATCHES US SQUIRM IN THIS HELL, BETRAYED BY OUR OWN LEADER SALUSTIUS. VOLUNTEERS ALL, SO MANY GOOD AND BRAVE ROMANS HAVE LOST THEIR LIVES, AND THE MORALE OF THE MEN HERE AT CARRIDEN IS WORSENING BY THE DAY. EXHAUSTED AND STARVING THE MEN CATCH WHAT THEY CAN TO EAT AROUND THE FORT, MOSTLY RATS, SOME CATS, ALTHOUGH THEY TOO ARE SKIN AND BONES. BRAVE BUT DESPERATE, SOME SPEAK PRIVATELY OF A MUTINY TO OVERTHROW SALUSTIUS, AND I AM TEMPTED TO AGREE WITH THEM. EVEN SO, FOR ALL HIS FAULTS, SALUSTIUS IS STILL A ROMAN AND I AM UNDER HIS COMMAND. EXHAUSTED THOUGH I AM, BEING A ROMAN STILL MEANS SOMETHING TO ME, EVEN SO FAR AWAY FROM LATIUM AND ITS GLORIOUS SUN. NEVERTHELESS, I FEAR THAT SOON THE MEN WILL TURN TO DARKER AND MORE SAVAGE METHODS TO FEED THEMSELVES AND IF NO PROGRESS HAS BEEN MADE, I WILL SOON HAVE TO RECONSIDER WHAT I MUST DO TO GET AS MANY GOOD ROMANS SAFELY HOME AS POSSIBLE.” BIDING HIS TIME CALGACUS WAITED AND WATCHED UNTIL HE JUDGED THAT THE ROMANS WERE SUFFICIENTLY WEAKENED, THEN SENT A MESSENGER TO SALUSTIUS OFFERING PEACE IN EXCHANGE FOR THE LANDS OF CALEDONIA. ENVOYS PROMISED SAFE PASSAGE, ALLOWING SALUSTIUS TO RETURN TO ROME IF HE AGREED TO LEAVE CALEDONIA AND NEVER RETURN. THE CALEDONII HAD TWO CONDITIONS. ROME MUST ABANDON THE REMAINING SOLDIERS OF THE IXTH LEGION, LEAVING THEM AS HOSTAGES; AND THE CODEX MUST REMAIN AT CARRIDEN. ARRIVING IN ROME WITHOUT THE CODEX WOULD CONDEMN SALUSTIUS TO CERTAIN DEATH, AND HE COULD NEVER AGREE TO SUCH TERMS, BUT HE STILL POSSESSED THE MONS GRAUPIUS FORGERY AND I SUSPECT HE HOPED TO TRADE THAT AND THE REMAINING LEGIONNAIRES OF THE IXTH FOR HIS OWN FREEDOM. YEARNING ONLY FOR HIS OWN SAFETY, SALUSTIUS RISKED UNDERESTIMATING HIS FOE, BUT IN DOING SO HE ALSO UNDERESTIMATED THE LOYAL AND UPRIGHT MARCUS FIDELIUS CATO WHO COULD NEVER BETRAY THE SOLDIERS UNDER HIS COMMAND. EXPOSING THIS FATAL LACK OF JUDGEMENT, SALUSTIUS CONDEMNED HIMSELF IN HIS OWN WORDS. “DO I KNOW THE MIND OF A SOLDIER LIKE CATO? BY THE GODS I DO. YEARS OF CAMPAIGNING HAVE HARDENED HIM AND HE HAS NOT THE SUBTLETY TO HARBOUR DARK AND CUNNING THOUGHTS. MENTAL AGILITY IS NOT THE MARK OF A MAN LIKE CATO AND HISTORY WILL FORGET HIM.” IN TRUTH THE IXTH LEGION HAD SUFFERED SEVERELY FROM THE LIGATURE THAT WAS SLOWLY DRAWN TIGHT AROUND THEM BY CALGACUS AND HIS MEN. DYSENTERY AND HUNGER RAVAGED THE NOBLE ROMANS WHO WERE REDUCED TO EMACIATED GHOSTS, CHOKING ON THE BITTER BILE OF THE ARROGANCE AND RAPACIOUS CRUELTY OF THEIR COMMANDER SALUSTIUS. AS SALUSTIUS SCENTED THE RANK ODOUR OF MUTINY BEGINNING TO FILL THE AIR HE PUNISHED THE MEN WITH DECIMATION. SO, MOVED TO TEARS BY PITY, THEIR COMMANDER MARCUS FIDELIUS CATO WAS FINALLY PERSUADED TO TREAT SECRETLY WITH CALGACUS FOR THE SAKE OF HIS MEN. THUS IT WAS THAT CATO HIMSELF TREATED WITH CALGACUS. HE CAREFULLY PREPARED A NEW FORGERY OF THE CODEX AND TOGETHER WITH THE STRONGEST OF THE REMAINING LEGIONNAIRES ARRESTED SALUSTIUS AND HIS GUARDS FOR THE CRIMES THEY HAD COMMITTED AGAINST THE ROMAN SOLDIERS. IN EXCHANGE FOR SAFE PASSAGE FROM THAT HELL ON EARTH, CATO OFFERED THE FORGERY AND THE PRISONERS TO CALGACUS AND HIS MEN. SO IT WAS THAT CATO AND HIS MEN RETURNED TO CARRIDEN, THEIR HEARTS HEAVY WITH THE SHAME OF THEIR BARGAIN WITH THE DEVIL. IN THE COLD LIGHT OF DAWN, CATO MARCHED THE SURVIVORS, WITH THE TWO AQUILAE FLYING HIGH BEFORE THEM, ONTO AN AWAITING BARQUE PROVISIONED WITH VITALS AND WATER FOR FIVE DAYS, AS HE HAD AGREED WITH CALGACUS. STRAPPED TIGHT TO HIS BODY, UNDER HIS ARMOUR, HE CONCEALED THE TRUE COPY OF THE CODEX, HOLDING IN HIS BREASTPLATE THE SECURITY OF ROME. AND SO THE IXTH LEGION CROSSED THE SEA TO GERMANIA INFERIOR, MAKING LANDFALL AT LUGDUNUM BATAVORUM TWO DAYS LATER. FREED FROM THEIR TORMENTORS, CALEDONII AND ROMAN ALIKE, THEY RESTED AND MADE SACRIFICES OF GOATS AND SHEEP IN GRATITUDE FOR THEIR SAFE DELIVERANCE. OVERCOME WITH EXHAUSTION THEY SLEPT, UNTIL THEY HAD RECOVERED SUFFICIENTLY TO CONTINUE ON TO THE FORTRESS AT NOVIOMAGUS WHERE CATO REPORTED TO THE LEGATUS OF THE XTH LEGION GEMINA AND, AT LAST, HANDED THE CODEX TO HIS SAFE KEEPING. RECEIVING WORD IN ROME OF THE RECOVERY OF THE CODEX AND THE RETURN OF THE TWO AQUILAE, CAESAR GRANTED THEM ALL PARDON AND AWARDED PENSIONS TO THE SURVIVORS, EACH TO RECEIVE A FARM OF FIVE HEREDIUM WHEN THEY RETIRED FROM MILITARY SERVICE. GLORY WAS DENIED TO THOSE BRAVE LEGIONNAIRES, BUT I HOPE THIS HISTORY WILL RESTORE THEIR HONOUR. ENEMIES OF ROME WERE DENIED THE CODEX OCCULTARUM BY THE GREAT SACRIFICES OF CATO AND HIS MEN. RECORDING THEIR TALE IS PERHAPS THE MOST IMPORTANT TASK I HAVE UNDERTAKEN AS A HISTORIAN, AND IT PAINS ME GREATLY THAT, TO CONTINUE TO PROTECT IT, THE TRUTH MUST BE CONCEALED FOR MANY GENERATIONS TO COME. YET I WILL REST IN PEACE KNOWING THAT THAT TRUTH WILL ONE DAY BE TOLD, GUARDED UNTIL THEN BY THE GLORIOUS WONDERS OF THE ANCIENT WORLD. \ No newline at end of file diff --git a/2017/Aquilae-Clue-6.jpg b/2017/Aquilae-Clue-6.jpg new file mode 100644 index 0000000..e0f18f2 Binary files /dev/null and b/2017/Aquilae-Clue-6.jpg differ diff --git a/2017/picture-clue.ipynb b/2017/picture-clue.ipynb new file mode 100644 index 0000000..4ff3565 --- /dev/null +++ b/2017/picture-clue.ipynb @@ -0,0 +1,457 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [], + "source": [ + "from PIL import Image\n", + "import itertools" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "im = Image.open(\"Aquilae-Clue-6.jpg\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('JPEG', 'RGB', (2580, 564))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "im.format, im.mode, im.size" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "columns, rows = im.size" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "px = im.load()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(177, 11, 11)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "px[1, 1]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(252, 120, 116),\n", + " (168, 25, 21),\n", + " (185, 16, 11),\n", + " (187, 12, 7),\n", + " (182, 16, 18),\n", + " (200, 77, 80),\n", + " (255, 229, 229),\n", + " (255, 253, 253),\n", + " (255, 254, 255),\n", + " (255, 249, 251),\n", + " (255, 222, 217),\n", + " (166, 59, 51),\n", + " (175, 16, 12),\n", + " (195, 13, 10),\n", + " (189, 11, 9),\n", + " (160, 25, 22),\n", + " (250, 192, 190),\n", + " (255, 251, 250),\n", + " (255, 254, 255),\n", + " (255, 250, 251),\n", + " (255, 245, 243),\n", + " (215, 140, 137),\n", + " (164, 22, 18),\n", + " (187, 12, 7),\n", + " (186, 13, 7),\n", + " (171, 22, 18),\n", + " (162, 59, 62),\n", + " (255, 224, 230),\n", + " (255, 250, 253),\n", + " (254, 255, 255),\n", + " (255, 252, 249),\n", + " (255, 230, 228),\n", + " (176, 52, 50),\n", + " (185, 17, 16),\n", + " (190, 12, 10),\n", + " (182, 17, 15),\n", + " (161, 27, 26),\n", + " (255, 181, 180),\n", + " (255, 244, 245),\n", + " (255, 254, 255),\n", + " (255, 254, 255),\n", + " (255, 244, 245),\n", + " (255, 181, 180),\n", + " (161, 27, 26),\n", + " (182, 17, 15),\n", + " (190, 12, 10),\n", + " (185, 17, 16),\n", + " (176, 52, 50),\n", + " (255, 231, 230),\n", + " (255, 251, 249)]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[px[2, c] for c in range(50)]" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(255, 255, 250),\n", + " (255, 254, 250),\n", + " (253, 253, 253),\n", + " (255, 255, 255),\n", + " (250, 250, 252),\n", + " (255, 255, 255),\n", + " (254, 255, 255),\n", + " (252, 252, 250),\n", + " (253, 253, 251),\n", + " (255, 255, 253),\n", + " (255, 255, 255),\n", + " (253, 253, 253),\n", + " (255, 253, 254),\n", + " (255, 254, 255),\n", + " (255, 255, 253),\n", + " (253, 253, 251),\n", + " (255, 255, 255),\n", + " (254, 255, 255),\n", + " (252, 255, 255),\n", + " (252, 255, 253),\n", + " (252, 255, 251),\n", + " (252, 255, 253),\n", + " (252, 255, 255),\n", + " (254, 255, 255),\n", + " (254, 255, 255),\n", + " (253, 255, 254),\n", + " (253, 255, 252),\n", + " (254, 255, 251),\n", + " (198, 200, 197),\n", + " (27, 27, 27),\n", + " (27, 27, 29),\n", + " (30, 31, 33),\n", + " (25, 30, 26),\n", + " (26, 31, 27),\n", + " (28, 30, 29),\n", + " (29, 29, 31),\n", + " (30, 28, 31),\n", + " (29, 27, 30),\n", + " (30, 28, 29),\n", + " (32, 28, 27),\n", + " (62, 58, 57),\n", + " (241, 239, 240),\n", + " (255, 254, 255),\n", + " (255, 254, 255),\n", + " (254, 254, 255),\n", + " (254, 255, 255),\n", + " (252, 255, 253),\n", + " (252, 255, 253),\n", + " (254, 255, 255),\n", + " (200, 201, 203)]" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[px[34, c] for c in range(50)]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[(185, 12, 6),\n", + " (201, 7, 5),\n", + " (200, 42, 41),\n", + " (255, 210, 214),\n", + " (255, 250, 253),\n", + " (255, 250, 250),\n", + " (255, 255, 255),\n", + " (254, 255, 255),\n", + " (254, 255, 255),\n", + " (254, 255, 255),\n", + " (255, 245, 240),\n", + " (255, 178, 174),\n", + " (176, 18, 15),\n", + " (199, 6, 9),\n", + " (191, 28, 33),\n", + " (255, 185, 186),\n", + " (255, 249, 250),\n", + " (255, 249, 255),\n", + " (255, 253, 255),\n", + " (255, 254, 249),\n", + " (255, 255, 248),\n", + " (255, 255, 255),\n", + " (255, 245, 247),\n", + " (255, 205, 209),\n", + " (188, 45, 47),\n", + " (196, 10, 11),\n", + " (185, 15, 15),\n", + " (225, 134, 131),\n", + " (255, 239, 237),\n", + " (255, 250, 250),\n", + " (255, 254, 253),\n", + " (255, 255, 250),\n", + " (255, 255, 250),\n", + " (252, 253, 255),\n", + " (255, 249, 251),\n", + " (255, 225, 226),\n", + " (198, 74, 72),\n", + " (199, 9, 9),\n", + " (200, 12, 11),\n", + " (189, 77, 75),\n", + " (255, 238, 236),\n", + " (255, 244, 244),\n", + " (255, 254, 251),\n", + " (255, 253, 250),\n", + " (255, 254, 253),\n", + " (254, 253, 255),\n", + " (255, 249, 253),\n", + " (255, 244, 241),\n", + " (221, 132, 126),\n", + " (184, 16, 15)]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[px[r + 25, 23] for r in range(50)]" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "is_red = {}\n", + "for r in range(rows):\n", + " for c in range(columns):\n", + " rgb = px[c, r]\n", + " if rgb[0] > 100 and rgb[1] < 100 and rgb[2] < 100:\n", + " is_red[r, c] = True\n", + " else:\n", + " is_red[r, c] = False" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "....................................................................................................\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###..........##..........##..........###..........##..........##..........##..........###..........#\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "###..........##..........###.........###.........###..........##..........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###.........####.........###.........###.........###.........####.........###.........###.........##\n", + "###..........##..........###.........###.........###..........##..........###.........###.........##\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "....................................................................................................\n", + "###.........####........####.........###.........###.........####.........###.........###.........##\n", + "###.........####........####........####.........####........####........####.........####........##\n", + "###.........####........####........####.........####........####........####.........####........##\n", + "###.........####........####........####.........####........####........####.........###.........##\n", + "###.........####........####.........###.........###.........####.........###.........###.........##\n", + ".............##...........#...........#...........#....................................#...........#\n", + "....................................................................................................\n", + "....................................................................................................\n" + ] + } + ], + "source": [ + "for r in range(40):\n", + " line = ''.join(\"#\" if is_red[r, c] else \".\" for c in range(100))\n", + " print(line)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "211" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len([k for k, g in itertools.groupby(is_red[2, c] for c in range(columns)) if k])" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "47" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len([k for k, g in itertools.groupby(is_red[2, r] for r in range(rows)) if k])" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9917" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "47 * 211" + ] + }, + { + "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.5.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}