- "def polybius_grid(keyword, column_order, row_order, letters_to_merge=None,\n",
- " wrap_alphabet=KeywordWrapAlphabet.from_a):\n",
- " alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet=wrap_alphabet)\n",
- " if letters_to_merge is None: \n",
- " letters_to_merge = {'j': 'i'}\n",
- " grid = {l: k \n",
- " for k, l in zip([(c, r) for c in column_order for r in row_order],\n",
- " [l for l in alphabet if l not in letters_to_merge])}\n",
- " for l in letters_to_merge:\n",
- " grid[l] = grid[letters_to_merge[l]]\n",
- " return grid "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 118,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'a': ('x', 'x'),\n",
- " 'b': ('x', 'l'),\n",
- " 'c': ('x', 'c'),\n",
- " 'd': ('x', 'd'),\n",
- " 'e': ('x', 'm'),\n",
- " 'f': ('l', 'x'),\n",
- " 'g': ('l', 'l'),\n",
- " 'h': ('l', 'c'),\n",
- " 'i': ('l', 'd'),\n",
- " 'j': ('l', 'd'),\n",
- " 'k': ('l', 'm'),\n",
- " 'l': ('c', 'x'),\n",
- " 'm': ('c', 'l'),\n",
- " 'n': ('c', 'c'),\n",
- " 'o': ('c', 'd'),\n",
- " 'p': ('c', 'm'),\n",
- " 'q': ('d', 'x'),\n",
- " 'r': ('d', 'l'),\n",
- " 's': ('d', 'c'),\n",
- " 't': ('d', 'd'),\n",
- " 'u': ('d', 'm'),\n",
- " 'v': ('m', 'x'),\n",
- " 'w': ('m', 'l'),\n",
- " 'x': ('m', 'c'),\n",
- " 'y': ('m', 'd'),\n",
- " 'z': ('m', 'm')}"
- ]
- },
- "execution_count": 118,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "polybius_grid('', order, order)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 142,
- "metadata": {},
- "outputs": [],
- "source": [
- "def polybius_reverse_grid(keyword, column_order, row_order, letters_to_merge=None,\n",
- " wrap_alphabet=KeywordWrapAlphabet.from_a):\n",
- " alphabet = keyword_cipher_alphabet_of(keyword, wrap_alphabet=wrap_alphabet)\n",
- " if letters_to_merge is None: \n",
- " letters_to_merge = {'j': 'i'}\n",
- " grid = {k: l \n",
- " for k, l in zip([(c, r) for c in column_order for r in row_order],\n",
- " [l for l in alphabet if l not in letters_to_merge])}\n",
- "# for l in letters_to_merge:\n",
- "# for r, c in grid:\n",
- "# if grid[r, c] == letters_to_merge[l]:\n",
- "# grid[l] = grid[r, c]\n",
- " return grid "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 112,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{('c', 'c'): 'n',\n",
- " ('c', 'd'): 'o',\n",
- " ('c', 'l'): 'm',\n",
- " ('c', 'm'): 'p',\n",
- " ('c', 'x'): 'l',\n",
- " ('d', 'c'): 's',\n",
- " ('d', 'd'): 't',\n",
- " ('d', 'l'): 'r',\n",
- " ('d', 'm'): 'u',\n",
- " ('d', 'x'): 'q',\n",
- " ('l', 'c'): 'h',\n",
- " ('l', 'd'): 'i',\n",
- " ('l', 'l'): 'g',\n",
- " ('l', 'm'): 'k',\n",
- " ('l', 'x'): 'f',\n",
- " ('m', 'c'): 'x',\n",
- " ('m', 'd'): 'y',\n",
- " ('m', 'l'): 'w',\n",
- " ('m', 'm'): 'z',\n",
- " ('m', 'x'): 'v',\n",
- " ('x', 'c'): 'c',\n",
- " ('x', 'd'): 'd',\n",
- " ('x', 'l'): 'b',\n",
- " ('x', 'm'): 'e',\n",
- " ('x', 'x'): 'a'}"
- ]
- },
- "execution_count": 112,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "reverse_polybius_grid('', order, order)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 119,
- "metadata": {},
- "outputs": [],
- "source": [
- "def polybius_encipher_letter(l, grid):\n",
- " if l in grid:\n",
- " return grid[l]\n",
- " else:\n",
- " return l"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 126,
- "metadata": {},
- "outputs": [],
- "source": [
- "def polybius_flatten(pair, column_first):\n",
- " if column_first:\n",
- " return str(pair[1]) + str(pair[0])\n",
- " else:\n",
- " return str(pair[0]) + str(pair[1])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 135,
- "metadata": {},
- "outputs": [],
- "source": [
- "def polybius_encipher(message, keyword, column_order, row_order, \n",
- " column_first=False,\n",
- " letters_to_merge=None, wrap_alphabet=KeywordWrapAlphabet.from_a): \n",
- " grid = polybius_grid(keyword, column_order, row_order, letters_to_merge, wrap_alphabet)\n",
- " return cat(polybius_flatten(grid[l], column_first)\n",
- " for l in message\n",
- " if l in grid)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 136,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'mllcldcxxmldddlddcdddldmxm'"
- ]
- },
- "execution_count": 136,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "polybius_encipher('while it is true', '', order, order)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 133,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'mllcldcxxmldddlddcdddldmxmddlcxxdddcdmxmddcdcclddmdcdcxmdddmcmddlcxmlxldccxxcxxlxxdd'"
- ]
- },
- "execution_count": 133,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "sanitise(cb[:100])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 161,
- "metadata": {},
- "outputs": [],
- "source": [
- "def polybius_decipher(message, keyword, column_order, row_order, \n",
- " column_first=False,\n",
- " letters_to_merge=None, wrap_alphabet=KeywordWrapAlphabet.from_a): \n",
- " grid = polybius_reverse_grid(keyword, column_order, row_order, letters_to_merge, wrap_alphabet)\n",
- " if column_first:\n",
- " pairs = [(p[1], p[0]) for p in chunks(message, 2)]\n",
- " else:\n",
- " pairs = [(p[0], p[1]) for p in chunks(message, 2)]\n",
- " return cat(grid[p] for p in pairs if p in grid)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 155,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'whileitistrue'"
- ]
- },
- "execution_count": 155,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "polybius_decipher('mllcldcxxmldddlddcdddldmxm', '', order, order)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 158,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'lmcldlxcmxdldddlcdddldmdmx'"
- ]
- },
- "execution_count": 158,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "polybius_encipher('whileitistrue', '', order, order, column_first=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 159,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'kmrcvrtrotiyv'"
- ]
- },
- "execution_count": 159,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "polybius_decipher('lmcldlxcmxdldddlcdddldmdmx', '', order, order)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 162,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'whileitistrue'"
- ]
- },
- "execution_count": 162,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "polybius_decipher('lmcldlxcmxdldddlcdddldmdmx', '', order, order, column_first=True)"