Some changes to day 8
[ou-summer-of-code-2017.git] / 08-word-chains / explore-word-chain-4.ipynb
index c2bca54e673d7b4e8236f540d5057f7dd72bd263..da9196ad34d3e3269db135f8df7d4a1045d5b21d 100644 (file)
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": 4,
    "metadata": {
     "collapsed": true
    },
@@ -16,7 +16,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": 5,
    "metadata": {
     "collapsed": false
    },
        "2336"
       ]
      },
-     "execution_count": 2,
+     "execution_count": 5,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "words = [w.strip() for w in open('08-words.txt').readlines()]\n",
+    "words = [w.strip() for w in open('08-offices.txt').readlines()]\n",
     "len(words)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": 6,
    "metadata": {
     "collapsed": false
    },
@@ -59,7 +59,7 @@
        " 'achy']"
       ]
      },
-     "execution_count": 3,
+     "execution_count": 6,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -70,7 +70,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 7,
    "metadata": {
     "collapsed": true
    },
@@ -87,7 +87,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 8,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 9,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 10,
    "metadata": {
     "collapsed": false
    },
        "['able']"
       ]
      },
-     "execution_count": 7,
+     "execution_count": 10,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 11,
    "metadata": {
     "collapsed": false
    },
        "['axle', 'abbe', 'ably']"
       ]
      },
-     "execution_count": 8,
+     "execution_count": 11,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 12,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 13,
    "metadata": {
     "collapsed": false
    },
        "0"
       ]
      },
-     "execution_count": 10,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 14,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 15,
    "metadata": {
     "collapsed": false
    },
        "[['abbe', 'able']]"
       ]
      },
-     "execution_count": 12,
+     "execution_count": 15,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 16,
    "metadata": {
     "collapsed": false
    },
        "[['abbe', 'able', 'axle'], ['abbe', 'able', 'ably']]"
       ]
      },
-     "execution_count": 13,
+     "execution_count": 16,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 17,
    "metadata": {
     "collapsed": false
    },
        "[['abbe', 'able', 'ably', 'ally']]"
       ]
      },
-     "execution_count": 14,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 18,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 19,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 20,
    "metadata": {
     "collapsed": false
    },
        "['abbe', 'able', 'ably', 'ally']"
       ]
      },
-     "execution_count": 17,
+     "execution_count": 20,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 21,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 22,
    "metadata": {
     "collapsed": false
    },
        "['abbe', 'able', 'ably', 'ally']"
       ]
      },
-     "execution_count": 19,
+     "execution_count": 22,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 23,
    "metadata": {
     "collapsed": false
    },
        "['cart', 'cant', 'cans', 'vans']"
       ]
      },
-     "execution_count": 20,
+     "execution_count": 23,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 24,
    "metadata": {
     "collapsed": false
    },
        "['cart', 'cant', 'cane', 'vane']"
       ]
      },
-     "execution_count": 21,
+     "execution_count": 24,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 25,
    "metadata": {
     "collapsed": false
    },
        " 'vane']"
       ]
      },
-     "execution_count": 22,
+     "execution_count": 25,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 26,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 27,
    "metadata": {
     "collapsed": false
    },
        "['cart', 'cant', 'cane', 'vane']"
       ]
      },
-     "execution_count": 24,
+     "execution_count": 27,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 28,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 29,
    "metadata": {
     "collapsed": false
    },
        "['cart', 'cant', 'cane', 'vane']"
       ]
      },
-     "execution_count": 26,
+     "execution_count": 29,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 77,
+   "execution_count": 30,
    "metadata": {
     "collapsed": false
    },
        "94"
       ]
      },
-     "execution_count": 77,
+     "execution_count": 30,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 78,
+   "execution_count": 31,
    "metadata": {
     "collapsed": false
    },
        "2204"
       ]
      },
-     "execution_count": 78,
+     "execution_count": 31,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 79,
+   "execution_count": 32,
    "metadata": {
     "collapsed": false
    },
        "1"
       ]
      },
-     "execution_count": 79,
+     "execution_count": 32,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 80,
+   "execution_count": 33,
    "metadata": {
     "collapsed": false,
     "scrolled": true
        "Counter({1: 75, 2: 6, 3: 7, 4: 2, 5: 2, 6: 1, 2204: 1})"
       ]
      },
-     "execution_count": 80,
+     "execution_count": 33,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 81,
+   "execution_count": 34,
    "metadata": {
     "collapsed": false
    },
        "[5]"
       ]
      },
-     "execution_count": 81,
+     "execution_count": 34,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 82,
+   "execution_count": 35,
    "metadata": {
     "collapsed": false
    },
        "[{'abbe', 'able', 'ably', 'ally', 'axle'}]"
       ]
      },
-     "execution_count": 82,
+     "execution_count": 35,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 83,
+   "execution_count": 36,
    "metadata": {
     "collapsed": false
    },
        "['buns', 'bunk', 'punk']"
       ]
      },
-     "execution_count": 83,
+     "execution_count": 36,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 84,
+   "execution_count": 37,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 85,
+   "execution_count": 38,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 86,
+   "execution_count": 39,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 87,
+   "execution_count": 40,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "['late', 'lats', 'lets', 'leas', 'seas', 'seam', 'swam', 'sway']\n",
-      "['leap', 'heap', 'hear', 'dear', 'deer']\n",
-      "['peel', 'peek', 'perk', 'park', 'nark']\n",
-      "['sing', 'sang', 'sand', 'said', 'sail', 'hail', 'haul']\n",
-      "['vats', 'bats', 'bets', 'bees', 'been', 'teen', 'then', 'thin', 'this', 'thus', 'thud']\n",
-      "['sues', 'sees', 'seen', 'sewn', 'hewn']\n",
-      "['rash', 'bash', 'bast', 'bait', 'bail', 'hail', 'hair', 'heir']\n",
-      "['apex', 'aped', 'sped', 'seed', 'deed', 'dead', 'deal', 'veal']\n",
-      "['gulf', 'golf', 'gold', 'bold', 'bond', 'bony', 'tony']\n",
-      "['snag', 'shag', 'shat', 'seat', 'peat', 'pent', 'pint', 'mint']\n",
-      "['rife', 'rime', 'rims', 'rums', 'cums', 'cuss']\n",
-      "['diss', 'kiss', 'kits']\n",
-      "['gyps', 'gaps', 'gads', 'wads', 'wade', 'wide', 'tide']\n",
-      "['bilk', 'bill', 'bell', 'tell', 'teal', 'tear', 'tzar']\n",
-      "['logo', 'loge', 'lode', 'lade', 'jade', 'jape']\n",
-      "['hunt', 'bunt', 'buns', 'nuns', 'nubs']\n",
-      "['glow', 'glop', 'plop', 'prop', 'prep', 'peep', 'keep']\n",
-      "['iamb', 'lamb', 'lams', 'laps', 'lips', 'pips']\n",
-      "['pain', 'lain', 'laid', 'land', 'lend', 'vend', 'veld']\n",
-      "['fake', 'bake', 'bare', 'bars', 'ears', 'errs', 'ergs', 'eggs', 'egos']\n"
+      "['bops', 'bogs', 'begs', 'bees', 'byes', 'eyes', 'eyed']\n",
+      "['foal', 'foil', 'fail']\n",
+      "['bush', 'bash', 'base', 'bale', 'ball', 'boll']\n",
+      "['rift', 'lift', 'life', 'live', 'give', 'gave']\n",
+      "['club', 'clue', 'flue', 'flee', 'fled', 'pled', 'pied', 'lied', 'lien', 'mien']\n",
+      "['rung', 'dung', 'ding', 'dins', 'dies', 'lies', 'lien']\n",
+      "['baas', 'bags', 'bugs', 'bums', 'sums', 'sumo']\n",
+      "['fits', 'bits', 'bins', 'bind']\n",
+      "['lids', 'bids', 'bias', 'boas', 'boat', 'boot', 'soot', 'snot', 'snob']\n",
+      "['cake', 'came', 'cams', 'caws', 'cows', 'tows']\n",
+      "['tort', 'toot', 'trot', 'troy', 'tray', 'tram', 'cram']\n",
+      "['sews', 'pews', 'pees', 'peed', 'pied']\n",
+      "['lack', 'hack', 'hawk', 'haws', 'hows', 'tows']\n",
+      "['dots', 'dons', 'dens', 'dent', 'pent', 'pest', 'peso']\n",
+      "['ekes', 'eyes', 'byes', 'bees', 'beet', 'bent', 'lent', 'lept']\n",
+      "['ruin', 'rain', 'gain', 'grin', 'grid', 'arid', 'acid', 'aced', 'iced']\n",
+      "['sing', 'sins', 'bins', 'bias', 'bras', 'bray', 'tray', 'trap']\n",
+      "['lira', 'lire', 'wire', 'wise', 'wish']\n",
+      "['gash', 'cash', 'case', 'cape', 'rape']\n",
+      "['crop', 'coop', 'coot', 'loot', 'loft']\n"
      ]
     }
    ],
   },
   {
    "cell_type": "code",
-   "execution_count": 38,
+   "execution_count": 41,
    "metadata": {
     "collapsed": false
    },
        "['cops', 'coos', 'coon', 'coin', 'chin', 'thin', 'this', 'thus', 'thug']"
       ]
      },
-     "execution_count": 38,
+     "execution_count": 41,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 39,
+   "execution_count": 42,
    "metadata": {
     "collapsed": false
    },
        "[2204]"
       ]
      },
-     "execution_count": 39,
+     "execution_count": 42,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 40,
+   "execution_count": 73,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "['hate', 'have', 'hove', 'love']"
+       "[2204]"
       ]
      },
-     "execution_count": 40,
+     "execution_count": 73,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "astar_search('hate', 'love')"
+    "[len(r) for r in reachables if 'stay' in r ]"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 41,
+   "execution_count": 43,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "['wars', 'ware', 'wave', 'wove', 'love']"
+       "['hate', 'have', 'hove', 'love']"
       ]
      },
-     "execution_count": 41,
+     "execution_count": 43,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "astar_search('wars', 'love')"
+    "astar_search('hate', 'love')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 61,
+   "execution_count": 44,
    "metadata": {
     "collapsed": false
    },
    "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 0 ns, sys: 0 ns, total: 0 ns\n",
-      "Wall time: 210 Âµs\n"
-     ]
-    },
     {
      "data": {
       "text/plain": [
-       "5"
+       "['wars', 'ware', 'wave', 'wove', 'love']"
       ]
      },
-     "execution_count": 61,
+     "execution_count": 44,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "%time len(astar_search('wars', 'love'))"
+    "astar_search('wars', 'love')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 62,
+   "execution_count": 45,
    "metadata": {
     "collapsed": false
    },
      "output_type": "stream",
      "text": [
       "CPU times: user 0 ns, sys: 0 ns, total: 0 ns\n",
-      "Wall time: 252 Âµs\n"
+      "Wall time: 850 Âµs\n"
      ]
     },
     {
        "5"
       ]
      },
-     "execution_count": 62,
+     "execution_count": 45,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "%time len(astar_search_closed('wars', 'love'))"
+    "%time len(astar_search('wars', 'love'))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 63,
+   "execution_count": 46,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 24 ms, sys: 0 ns, total: 24 ms\n",
-      "Wall time: 24.2 ms\n"
+      "CPU times: user 0 ns, sys: 0 ns, total: 0 ns\n",
+      "Wall time: 353 Âµs\n"
      ]
     },
     {
      "data": {
       "text/plain": [
-       "404"
+       "5"
       ]
      },
-     "execution_count": 63,
+     "execution_count": 46,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "%time len(dfs_search('wars', 'love'))"
+    "%time len(astar_search_closed('wars', 'love'))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 64,
+   "execution_count": 47,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 5min 20s, sys: 76 ms, total: 5min 20s\n",
-      "Wall time: 5min 20s\n"
+      "CPU times: user 76 ms, sys: 0 ns, total: 76 ms\n",
+      "Wall time: 75.1 ms\n"
      ]
     },
     {
      "data": {
       "text/plain": [
-       "5"
+       "404"
       ]
      },
-     "execution_count": 64,
+     "execution_count": 47,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "%time len(bfs_search('wars', 'love'))"
+    "%time len(dfs_search('wars', 'love'))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 65,
+   "execution_count": null,
    "metadata": {
     "collapsed": false
    },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "CPU times: user 1.44 s, sys: 0 ns, total: 1.44 s\n",
-      "Wall time: 1.43 s\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "5"
-      ]
-     },
-     "execution_count": 65,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
+   "source": [
+    "# %time len(bfs_search('wars', 'love'))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
    "source": [
     "%time len(bfs_search_closed('wars', 'love'))"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 42,
+   "execution_count": 50,
    "metadata": {
     "collapsed": false
    },
        "['fear', 'feat', 'fest', 'lest', 'lost', 'lose', 'love']"
       ]
      },
-     "execution_count": 42,
+     "execution_count": 50,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 43,
+   "execution_count": 51,
    "metadata": {
     "collapsed": false
    },
        "['fail', 'fall', 'pall', 'pals', 'pass']"
       ]
      },
-     "execution_count": 43,
+     "execution_count": 51,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 44,
+   "execution_count": 52,
    "metadata": {
     "collapsed": false
    },
        "['star', 'soar', 'boar', 'boor', 'boon', 'born']"
       ]
      },
-     "execution_count": 44,
+     "execution_count": 52,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 45,
+   "execution_count": 53,
    "metadata": {
     "collapsed": false
    },
        " 'pass']"
       ]
      },
-     "execution_count": 45,
+     "execution_count": 53,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 46,
+   "execution_count": 54,
    "metadata": {
     "collapsed": false
    },
        " 'past']"
       ]
      },
-     "execution_count": 46,
+     "execution_count": 54,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 47,
+   "execution_count": 55,
    "metadata": {
     "collapsed": false
    },
        "[1]"
       ]
      },
-     "execution_count": 47,
+     "execution_count": 55,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 48,
+   "execution_count": 56,
    "metadata": {
     "collapsed": false
    },
        "[2204]"
       ]
      },
-     "execution_count": 48,
+     "execution_count": 56,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 49,
+   "execution_count": 57,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 7.9 s per loop\n"
+      "1 loop, best of 3: 12.3 s per loop\n"
      ]
     }
    ],
   },
   {
    "cell_type": "code",
-   "execution_count": 50,
+   "execution_count": 58,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "10 loops, best of 3: 141 ms per loop\n"
+      "1 loop, best of 3: 200 ms per loop\n"
      ]
     }
    ],
   },
   {
    "cell_type": "code",
-   "execution_count": 51,
+   "execution_count": 59,
    "metadata": {
     "collapsed": false
    },
        " 'exit']"
       ]
      },
-     "execution_count": 51,
+     "execution_count": 59,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 88,
+   "execution_count": 60,
    "metadata": {
     "collapsed": false
    },
     {
      "data": {
       "text/plain": [
-       "{2: [['heel', 'keel'], ['wane', 'wave'], ['cell', 'sell'], ['cons', 'cobs']],\n",
-       " 3: [['hank', 'haws'], ['bars', 'bets'], ['rats', 'paws'], ['lock', 'hack']],\n",
-       " 4: [['rule', 'sore'], ['wavy', 'rape'], ['peas', 'ping'], ['bond', 'toll']],\n",
-       " 5: [['cope', 'yowl'], ['lose', 'loci'], ['rump', 'dash'], ['four', 'dyes']],\n",
-       " 6: [['boon', 'sell'], ['lots', 'pomp'], ['cola', 'turn'], ['boos', 'laid']],\n",
-       " 7: [['eave', 'inns'], ['meek', 'mere'], ['keys', 'wily'], ['slam', 'yore']],\n",
-       " 8: [['hack', 'flip'], ['crag', 'huge'], ['flux', 'gill'], ['play', 'busy']],\n",
-       " 9: [['lacy', 'whey'], ['wren', 'rook'], ['lire', 'drip'], ['grab', 'lame']],\n",
-       " 10: [['over', 'turn'], ['worn', 'anew'], ['stow', 'elks'], ['ergo', 'rich']],\n",
-       " 11: [['bask', 'idea'], ['gabs', 'thud'], ['idea', 'clod'], ['mark', 'ibis']],\n",
-       " 12: [['umps', 'torn'], ['futz', 'shun'], ['abut', 'face'], ['slug', 'open']],\n",
-       " 13: [['umps', 'skin'], ['chum', 'rats'], ['fury', 'chum'], ['omen', 'zany']],\n",
-       " 14: [['chug', 'gaff'], ['atom', 'fizz']],\n",
-       " 15: [['chug', 'oxen']]}"
+       "{2: [['exes', 'exec'], ['rush', 'tush'], ['wile', 'wily'], ['shoo', 'shot']],\n",
+       " 3: [['bins', 'fink'], ['waft', 'wand'], ['heel', 'jell'], ['tent', 'west']],\n",
+       " 4: [['yore', 'polo'], ['hale', 'case'], ['horn', 'look'], ['tang', 'nuns']],\n",
+       " 5: [['crab', 'baas'], ['yens', 'dead'], ['work', 'paps'], ['tune', 'zaps']],\n",
+       " 6: [['mist', 'sold'], ['bats', 'sort'], ['leek', 'mads'], ['loop', 'dome']],\n",
+       " 7: [['rime', 'hoof'], ['grim', 'reed'], ['lies', 'eave'], ['ties', 'whiz']],\n",
+       " 8: [['drag', 'lied'], ['ages', 'yawl'], ['earl', 'deal'], ['gins', 'scab']],\n",
+       " 9: [['tyre', 'swum'], ['dike', 'flux'], ['hour', 'laze'], ['trek', 'bait']],\n",
+       " 10: [['ides', 'rasp'], ['egos', 'racy'], ['shim', 'ills'], ['bark', 'arty']],\n",
+       " 11: [['ergo', 'apex'], ['whey', 'owns'], ['anew', 'rapt'], ['thug', 'bate']],\n",
+       " 12: [['ream', 'imps'], ['meat', 'umps'], ['daze', 'knee'], ['clay', 'over']],\n",
+       " 13: [['oxen', 'blab'], ['blip', 'omen'], ['twig', 'ibis'], ['chew', 'umps']],\n",
+       " 14: [['amen', 'blip'], ['umps', 'futz'], ['amps', 'glib'], ['chum', 'whys']],\n",
+       " 15: [['thug', 'ibis']]}"
       ]
      },
-     "execution_count": 88,
+     "execution_count": 60,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 91,
+   "execution_count": 64,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 54,
-   "metadata": {
-    "collapsed": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": [
-       "[('amen', 'doff', 15), ('chug', 'jinn', 14), ('amen', 'flog', 14)]"
-      ]
-     },
-     "execution_count": 54,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
-   "source": [
-    "[(s[0], s[-1], len(s)) for s in solutions if len(s) >= 14]"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 55,
+   "execution_count": 66,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 360 ms per loop\n"
+      "1 loop, best of 3: 487 ms per loop\n"
      ]
     }
    ],
   },
   {
    "cell_type": "code",
-   "execution_count": 56,
+   "execution_count": 67,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 384 ms, sys: 0 ns, total: 384 ms\n",
-      "Wall time: 385 ms\n"
+      "CPU times: user 768 ms, sys: 0 ns, total: 768 ms\n",
+      "Wall time: 768 ms\n"
      ]
     },
     {
        "14"
       ]
      },
-     "execution_count": 56,
+     "execution_count": 67,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 57,
+   "execution_count": 68,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 124 ms, sys: 0 ns, total: 124 ms\n",
-      "Wall time: 121 ms\n"
+      "CPU times: user 176 ms, sys: 0 ns, total: 176 ms\n",
+      "Wall time: 176 ms\n"
      ]
     },
     {
        "15"
       ]
      },
-     "execution_count": 57,
+     "execution_count": 68,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 58,
+   "execution_count": 69,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 32 ms, sys: 0 ns, total: 32 ms\n",
-      "Wall time: 32.4 ms\n"
+      "CPU times: user 72 ms, sys: 0 ns, total: 72 ms\n",
+      "Wall time: 70.6 ms\n"
      ]
     },
     {
        "14"
       ]
      },
-     "execution_count": 58,
+     "execution_count": 69,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 59,
+   "execution_count": 70,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 16 ms, sys: 0 ns, total: 16 ms\n",
-      "Wall time: 17.1 ms\n"
+      "CPU times: user 32 ms, sys: 0 ns, total: 32 ms\n",
+      "Wall time: 35.7 ms\n"
      ]
     },
     {
        "14"
       ]
      },
-     "execution_count": 59,
+     "execution_count": 70,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 73,
+   "execution_count": 71,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 268 ms, sys: 4 ms, total: 272 ms\n",
-      "Wall time: 272 ms\n"
+      "CPU times: user 376 ms, sys: 4 ms, total: 380 ms\n",
+      "Wall time: 382 ms\n"
      ]
     },
     {
        "14"
       ]
      },
-     "execution_count": 73,
+     "execution_count": 71,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 74,
+   "execution_count": 72,
    "metadata": {
     "collapsed": false
    },
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 64 ms, sys: 0 ns, total: 64 ms\n",
-      "Wall time: 64.1 ms\n"
+      "CPU times: user 72 ms, sys: 4 ms, total: 76 ms\n",
+      "Wall time: 76.9 ms\n"
      ]
     },
     {
        "14"
       ]
      },
-     "execution_count": 74,
+     "execution_count": 72,
      "metadata": {},
      "output_type": "execute_result"
     }