2016 challenge 4
[cipher-tools.git] / bombe.ipynb
index ab1b457c441d51cb55d4e6a5d2385a37379fc6c2..93e0ccbfcd5ac4996251c5eb08db7e6deadd969b 100644 (file)
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 797,
+   "execution_count": 1,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 798,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": [
-    "# wheel_i_spec = 'ekmflgdqvzntowyhxuspaibrcj'\n",
-    "# wheel_ii_spec = 'ajdksiruxblhwtmcqgznpyfvoe'\n",
-    "# wheel_iii_spec = 'bdfhjlcprtxvznyeiwgakmusqo'\n",
-    "# wheel_iv_spec = 'esovpzjayquirhxlnftgkdcmwb'\n",
-    "# wheel_v_spec = 'vzbrgityupsdnhlxawmjqofeck'\n",
-    "# wheel_vi_spec = 'jpgvoumfyqbenhzrdkasxlictw'\n",
-    "# wheel_vii_spec = 'nzjhgrcxmyswboufaivlpekqdt'\n",
-    "# wheel_viii_spec = 'fkqhtlxocbjspdzramewniuygv'\n",
-    "# beta_wheel_spec = 'leyjvcnixwpbqmdrtakzgfuhos'\n",
-    "# gamma_wheel_spec = 'fsokanuerhmbtiycwlqpzxvgjd'\n",
-    "\n",
-    "# wheel_i_pegs = ['q']\n",
-    "# wheel_ii_pegs = ['e']\n",
-    "# wheel_iii_pegs = ['v']\n",
-    "# wheel_iv_pegs = ['j']\n",
-    "# wheel_v_pegs = ['z']\n",
-    "# wheel_vi_pegs = ['z', 'm']\n",
-    "# wheel_vii_pegs = ['z', 'm']\n",
-    "# wheel_viii_pegs = ['z', 'm']\n",
-    "\n",
-    "# reflector_b_spec = 'ay br cu dh eq fs gl ip jx kn mo tz vw'\n",
-    "# reflector_c_spec = 'af bv cp dj ei go hy kr lz mx nw tq su'"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 799,
-   "metadata": {
-    "collapsed": true
-   },
-   "outputs": [],
-   "source": [
-    "class Bank(object):\n",
-    "    def __init__(self):\n",
-    "        self.signals = dict(zip(string.ascii_lowercase, [False]*len(string.ascii_lowercase)))"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 800,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "{'a': False,\n",
-       " 'b': False,\n",
-       " 'c': False,\n",
-       " 'd': False,\n",
-       " 'e': False,\n",
-       " 'f': False,\n",
-       " 'g': False,\n",
-       " 'h': False,\n",
-       " 'i': False,\n",
-       " 'j': False,\n",
-       " 'k': False,\n",
-       " 'l': False,\n",
-       " 'm': False,\n",
-       " 'n': False,\n",
-       " 'o': False,\n",
-       " 'p': False,\n",
-       " 'q': False,\n",
-       " 'r': False,\n",
-       " 's': False,\n",
-       " 't': False,\n",
-       " 'u': False,\n",
-       " 'v': False,\n",
-       " 'w': False,\n",
-       " 'x': False,\n",
-       " 'y': False,\n",
-       " 'z': False}"
-      ]
-     },
-     "execution_count": 800,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "c1 = Bank()\n",
-    "c1.signals"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 801,
+   "execution_count": 2,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 802,
+   "execution_count": 3,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 803,
+   "execution_count": 31,
    "metadata": {
     "collapsed": false
    },
    "outputs": [],
    "source": [
     "class Bombe(object):\n",
+    "    \n",
     "    def __init__(self, wheel1_spec, wheel2_spec, wheel3_spec, reflector_spec,\n",
-    "                menu=None, start_signal=None, use_diagonal_board=True, verify_plugboard=True):\n",
+    "                menu=None, start_signal=None, use_diagonal_board=True, \n",
+    "                verify_plugboard=True):\n",
     "        self.connections = []\n",
     "        self.wheel1_spec = wheel1_spec\n",
     "        self.wheel2_spec = wheel2_spec\n",
     "            return object.__getattribute__(self, name)\n",
     "        \n",
     "    def __call__(self, start_positions):\n",
-    "        return start_positions, self.test(start_positions=start_positions, \n",
-    "                                          use_diagonal_board=self.use_diagonal_board,\n",
-    "                                          verify_plugboard=self.verify_plugboard)\n",
+    "        return start_positions, self.test(initial_signal=self.test_start,\n",
+    "            start_positions=start_positions, \n",
+    "            use_diagonal_board=self.use_diagonal_board,\n",
+    "            verify_plugboard=self.verify_plugboard)\n",
     "        \n",
     "    def add_connection(self, bank_before, bank_after, scrambler):\n",
     "        self.connections += [Connection([bank_before, bank_after], scrambler)]\n",
     "        \n",
     "    def read_menu(self, menu):\n",
+    "        self.connections = []\n",
     "        for item in menu:\n",
     "            scrambler = Scrambler(self.wheel1_spec, self.wheel2_spec, self.wheel3_spec,\n",
     "                                  self.reflector_spec,\n",
     "                possibles = possibles.union({frozenset((b, active[0]))})\n",
     "            if len(inactive) == 1:\n",
     "                possibles = possibles.union({frozenset((b, inactive[0]))})\n",
-    "        return possibles"
+    "        return possibles\n"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 804,
+   "execution_count": 32,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 805,
+   "execution_count": 33,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 806,
+   "execution_count": 34,
    "metadata": {
     "collapsed": false
    },
        "'opgndxcrwomnlnecjz'"
       ]
      },
-     "execution_count": 806,
+     "execution_count": 34,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 807,
+   "execution_count": 35,
    "metadata": {
     "collapsed": false
    },
        "'aas'"
       ]
      },
-     "execution_count": 807,
+     "execution_count": 35,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 808,
+   "execution_count": 36,
    "metadata": {
     "collapsed": false
    },
        " MenuIem(before='e', after='z', number=18)]"
       ]
      },
-     "execution_count": 808,
+     "execution_count": 36,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 809,
+   "execution_count": 37,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 810,
+   "execution_count": 38,
    "metadata": {
     "collapsed": false
    },
        " MenuIem(before='e', after='z', number=18)]"
       ]
      },
-     "execution_count": 810,
+     "execution_count": 38,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 811,
+   "execution_count": 39,
    "metadata": {
     "collapsed": false
    },
        "'s'"
       ]
      },
-     "execution_count": 811,
+     "execution_count": 39,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 812,
+   "execution_count": 42,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 813,
+   "execution_count": 43,
    "metadata": {
     "collapsed": false
    },
        "18"
       ]
      },
-     "execution_count": 813,
+     "execution_count": 43,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 814,
+   "execution_count": 27,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
+      "['t', 'o'] aaa\n",
+      "['h', 'p'] aab\n",
+      "['i', 'g'] aac\n",
+      "['s', 'n'] aad\n",
+      "['i', 'd'] aae\n",
+      "['s', 'x'] aaf\n",
+      "['a', 'c'] aag\n",
+      "['t', 'r'] aah\n",
+      "['e', 'w'] aai\n",
+      "['s', 'o'] aaj\n",
+      "['t', 'm'] aak\n",
+      "['m', 'n'] aal\n",
+      "['e', 'l'] aam\n",
+      "['s', 'n'] aan\n",
+      "['s', 'e'] aao\n",
+      "['a', 'c'] aap\n",
+      "['g', 'j'] aaq\n",
+      "['e', 'z'] aar\n",
       "['t', 'o'] aaa\n",
       "['h', 'p'] aab\n",
       "['i', 'g'] aac\n",
   },
   {
    "cell_type": "code",
-   "execution_count": 815,
+   "execution_count": 44,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "False"
+       "'ot:hp:gi:ns:di:sx:ac:rt:ew:os:mt:mn:el:ns:es:ac:gj:ez'"
       ]
      },
-     "execution_count": 815,
+     "execution_count": 44,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "':'.join(cat(sorted(c.banks)) for c in bombe.connections)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 45,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'aaa:aab:aac:aad:aae:aaf:aag:aah:aai:aaj:aak:aal:aam:aan:aao:aap:aaq:aar'"
+      ]
+     },
+     "execution_count": 45,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "':'.join(cat(c.scrambler.wheel_positions_l) for c in bombe.connections)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 56,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 56,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 816,
+   "execution_count": 57,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "{'a': True,\n",
-       " 'b': True,\n",
-       " 'c': True,\n",
-       " 'd': True,\n",
-       " 'e': True,\n",
-       " 'f': True,\n",
-       " 'g': True,\n",
-       " 'h': True,\n",
-       " 'i': True,\n",
-       " 'j': True,\n",
-       " 'k': True,\n",
-       " 'l': True,\n",
-       " 'm': True,\n",
-       " 'n': True,\n",
-       " 'o': True,\n",
-       " 'p': True,\n",
-       " 'q': True,\n",
-       " 'r': True,\n",
-       " 's': True,\n",
+       "{'a': False,\n",
+       " 'b': False,\n",
+       " 'c': False,\n",
+       " 'd': False,\n",
+       " 'e': False,\n",
+       " 'f': False,\n",
+       " 'g': False,\n",
+       " 'h': False,\n",
+       " 'i': False,\n",
+       " 'j': False,\n",
+       " 'k': False,\n",
+       " 'l': False,\n",
+       " 'm': False,\n",
+       " 'n': False,\n",
+       " 'o': False,\n",
+       " 'p': False,\n",
+       " 'q': False,\n",
+       " 'r': False,\n",
+       " 's': False,\n",
        " 't': True,\n",
-       " 'u': True,\n",
-       " 'v': True,\n",
-       " 'w': True,\n",
-       " 'x': True,\n",
-       " 'y': True,\n",
-       " 'z': True}"
+       " 'u': False,\n",
+       " 'v': False,\n",
+       " 'w': False,\n",
+       " 'x': False,\n",
+       " 'y': False,\n",
+       " 'z': False}"
       ]
      },
-     "execution_count": 816,
+     "execution_count": 57,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 817,
+   "execution_count": 48,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 818,
+   "execution_count": 49,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "a : abcdefghijklmnopqrstuvwxyz\n",
+      "b : a.cde.ghij.lmnop.rst..wx.z\n",
+      "c : abcdefghijklmnopqrstuvwxyz\n",
+      "d : abcdefghijklmnopqrstuvwx.z\n",
+      "e : abcdefghijklmnopqrstuvwxyz\n",
+      "f : a.cde.ghij.lmnop.rst..wx.z\n",
+      "g : abcdefghijklmnopqrst.vwxyz\n",
+      "h : abcdefghijklmnopqrstuvwxyz\n",
+      "i : abcdefghijklmnopqrstu.wxyz\n",
+      "j : abcdefghi.klmnopqrstuvwxyz\n",
+      "k : a.cde.ghij.lmnop.rst..wx.z\n",
+      "l : abcdefghijklmnopqrstuvwxyz\n",
+      "m : abcdefghijklmnopqrstuvwxyz\n",
+      "n : abcdefghijklmnopqrstuvwxyz\n",
+      "o : abcdefghijklmnopqrstuvwxyz\n",
+      "p : abcdefghijklmnopqrstuvwxyz\n",
+      "q : a.cde.ghij.lmnop.rst..wx.z\n",
+      "r : abcdefghijklmnopqrstuvwxyz\n",
+      "s : abcdefghijklmnopqrstuvwxyz\n",
+      "t : abcdefghijklmnopqrstuvwxyz\n",
+      "u : a.cde..hij.lmnop.rst..wx.z\n",
+      "v : a.cde.gh.j.lmnop.rst..wx.z\n",
+      "w : abcdefghijklmnopqrstuvwxyz\n",
+      "x : abcdefghijklmnopqrstuvwxyz\n",
+      "y : a.c.e.ghij.lmnop.rst..wx.z\n",
+      "z : abcdefghijklmnopqrstuvwxyz\n"
+     ]
+    }
+   ],
+   "source": [
+    "for b in sorted(bombe.banks):\n",
+    "    print(b, ': ', end='')\n",
+    "    for w in sorted(bombe.banks[b]):\n",
+    "        if bombe.banks[b][w]:\n",
+    "            print(w, end='')\n",
+    "        else:\n",
+    "            print('.', end='')\n",
+    "    print('')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
    "metadata": {
     "collapsed": false
    },
        "('a', 'a', 'a')"
       ]
      },
-     "execution_count": 818,
+     "execution_count": 50,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 819,
+   "execution_count": 51,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 820,
+   "execution_count": 52,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 821,
+   "execution_count": 53,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 822,
+   "execution_count": 54,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 823,
+   "execution_count": 55,
    "metadata": {
     "collapsed": false
    },
        "1"
       ]
      },
-     "execution_count": 823,
+     "execution_count": 55,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 824,
+   "execution_count": 25,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 825,
+   "execution_count": 26,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 826,
+   "execution_count": 27,
    "metadata": {
     "collapsed": false
    },
        "('a', 'a', 'b')"
       ]
      },
-     "execution_count": 826,
+     "execution_count": 27,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 827,
+   "execution_count": 28,
    "metadata": {
     "collapsed": false
    },
        "False"
       ]
      },
-     "execution_count": 827,
+     "execution_count": 28,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 828,
+   "execution_count": 29,
    "metadata": {
     "collapsed": false
    },
        "('p', 'p', 'p')"
       ]
      },
-     "execution_count": 828,
+     "execution_count": 29,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 829,
+   "execution_count": 30,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 830,
+   "execution_count": 31,
    "metadata": {
     "collapsed": false
    },
        "17576"
       ]
      },
-     "execution_count": 830,
+     "execution_count": 31,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 831,
+   "execution_count": 32,
    "metadata": {
     "collapsed": false
    },
        "(('a', 'a', 'b'), True)"
       ]
      },
-     "execution_count": 831,
+     "execution_count": 32,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 832,
+   "execution_count": 33,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 833,
+   "execution_count": 34,
    "metadata": {
     "collapsed": false
    },
        "[('a', 'a', 'b')]"
       ]
      },
-     "execution_count": 833,
+     "execution_count": 34,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 857,
+   "execution_count": 35,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 835,
+   "execution_count": 36,
    "metadata": {
     "collapsed": false
    },
        "[('a', 'a', 'b')]"
       ]
      },
-     "execution_count": 835,
+     "execution_count": 36,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 836,
+   "execution_count": 58,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 837,
+   "execution_count": 59,
    "metadata": {
     "collapsed": false
    },
        "('e', 'l', 'e')"
       ]
      },
-     "execution_count": 837,
+     "execution_count": 59,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 838,
+   "execution_count": 39,
    "metadata": {
     "collapsed": false
    },
        "'dhnpforeeimgg'"
       ]
      },
-     "execution_count": 838,
+     "execution_count": 39,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 839,
+   "execution_count": 40,
    "metadata": {
     "collapsed": false
    },
        "('j', 'e', 'o')"
       ]
      },
-     "execution_count": 839,
+     "execution_count": 40,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 840,
+   "execution_count": 41,
    "metadata": {
     "collapsed": false
    },
        " MenuIem(before='t', after='g', number=13)]"
       ]
      },
-     "execution_count": 840,
+     "execution_count": 41,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 841,
+   "execution_count": 42,
    "metadata": {
     "collapsed": false,
     "scrolled": true
        " ('z', 'z', 'k')]"
       ]
      },
-     "execution_count": 841,
+     "execution_count": 42,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 842,
+   "execution_count": 43,
    "metadata": {
     "collapsed": false
    },
        "62"
       ]
      },
-     "execution_count": 842,
+     "execution_count": 43,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 843,
+   "execution_count": 44,
    "metadata": {
     "collapsed": false,
     "scrolled": true
        " ('y', 'n', 'c')]"
       ]
      },
-     "execution_count": 843,
+     "execution_count": 44,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 858,
+   "execution_count": 45,
    "metadata": {
     "collapsed": false
    },
        " ('y', 'n', 'c')]"
       ]
      },
-     "execution_count": 858,
+     "execution_count": 45,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 844,
+   "execution_count": 46,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 845,
+   "execution_count": 47,
    "metadata": {
     "collapsed": false
    },
        "13"
       ]
      },
-     "execution_count": 845,
+     "execution_count": 47,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 846,
+   "execution_count": 48,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 847,
+   "execution_count": 49,
    "metadata": {
     "collapsed": false
    },
        "Signal(bank='e', wire='e')"
       ]
      },
-     "execution_count": 847,
+     "execution_count": 49,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 848,
+   "execution_count": 50,
    "metadata": {
     "collapsed": false
    },
        "True"
       ]
      },
-     "execution_count": 848,
+     "execution_count": 50,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 849,
+   "execution_count": 51,
    "metadata": {
     "collapsed": false
    },
        "True"
       ]
      },
-     "execution_count": 849,
+     "execution_count": 51,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 850,
+   "execution_count": 52,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 851,
+   "execution_count": 53,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 852,
+   "execution_count": 54,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "{frozenset({'e', 'y'}),\n",
-       " frozenset({'t', 'x'}),\n",
+       "{frozenset({'m'}),\n",
        " frozenset({'i', 'n'}),\n",
-       " frozenset({'m'}),\n",
-       " frozenset({'b', 'g'}),\n",
-       " frozenset({'f', 'p'})}"
+       " frozenset({'f', 'p'}),\n",
+       " frozenset({'t', 'x'}),\n",
+       " frozenset({'e', 'y'}),\n",
+       " frozenset({'b', 'g'})}"
       ]
      },
-     "execution_count": 852,
+     "execution_count": 54,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 853,
+   "execution_count": 55,
    "metadata": {
     "collapsed": false
    },
        "True"
       ]
      },
-     "execution_count": 853,
+     "execution_count": 55,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 854,
+   "execution_count": 56,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "({frozenset({1, 2}), frozenset({2, 3}), frozenset({3, 4})},\n",
+       "({frozenset({1, 2}), frozenset({3, 4}), frozenset({2, 3})},\n",
        " frozenset({1, 2}),\n",
        " frozenset({3, 4}),\n",
        " frozenset({2, 3}))"
       ]
      },
-     "execution_count": 854,
+     "execution_count": 56,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 855,
+   "execution_count": 57,
    "metadata": {
     "collapsed": false
    },
        "False"
       ]
      },
-     "execution_count": 855,
+     "execution_count": 57,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 856,
+   "execution_count": 58,
    "metadata": {
     "collapsed": false
    },
        "False"
       ]
      },
-     "execution_count": 856,
+     "execution_count": 58,
      "metadata": {},
      "output_type": "execute_result"
     }