X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=09-resolving-the-bill%2Fresolving-the-bill-solution.ipynb;h=dc846ae48a37dd38c6d0f608bde46ee34550e1d0;hb=9016ac45d2a303fbd6499a902cce3619d1f4f1d4;hp=ed427e6b9a64f08d7e3c66085a448cb1e58cbddd;hpb=737bfafa601efeaee26d9d6cfd3c18ea34722868;p=ou-summer-of-code-2017.git

diff --git a/09-resolving-the-bill/resolving-the-bill-solution.ipynb b/09-resolving-the-bill/resolving-the-bill-solution.ipynb
index ed427e6..dc846ae 100644
--- a/09-resolving-the-bill/resolving-the-bill-solution.ipynb
+++ b/09-resolving-the-bill/resolving-the-bill-solution.ipynb
@@ -78,7 +78,19 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 104,
+   "execution_count": 2,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "import sys\n",
+    "sys.setrecursionlimit(10**6)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
    "metadata": {},
    "outputs": [
     {
@@ -87,7 +99,7 @@
        "148"
       ]
      },
-     "execution_count": 104,
+     "execution_count": 3,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -100,7 +112,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 105,
+   "execution_count": 4,
    "metadata": {
     "collapsed": true
    },
@@ -114,7 +126,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 106,
+   "execution_count": 5,
    "metadata": {
     "collapsed": true
    },
@@ -134,7 +146,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 107,
+   "execution_count": 6,
    "metadata": {
     "collapsed": true
    },
@@ -158,7 +170,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 108,
+   "execution_count": 7,
    "metadata": {
     "collapsed": true
    },
@@ -178,7 +190,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 109,
+   "execution_count": 8,
    "metadata": {
     "collapsed": true
    },
@@ -195,7 +207,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 110,
+   "execution_count": 9,
    "metadata": {
     "collapsed": true
    },
@@ -250,7 +262,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 111,
+   "execution_count": 10,
    "metadata": {
     "collapsed": true
    },
@@ -301,7 +313,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 112,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
@@ -310,7 +322,7 @@
        "22"
       ]
      },
-     "execution_count": 112,
+     "execution_count": 11,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -323,7 +335,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 113,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [
     {
@@ -332,7 +344,7 @@
        "22"
       ]
      },
-     "execution_count": 113,
+     "execution_count": 12,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -345,7 +357,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 114,
+   "execution_count": 13,
    "metadata": {},
    "outputs": [
     {
@@ -354,7 +366,7 @@
        "22"
       ]
      },
-     "execution_count": 114,
+     "execution_count": 13,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -367,14 +379,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 30,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 7.07 s per loop\n"
+      "100 loops, best of 3: 13.1 ms per loop\n"
      ]
     }
    ],
@@ -382,12 +394,32 @@
     "%%timeit\n",
     "sum(1 for s in bills\n",
     "   if s != 0\n",
-    "   if is_subseq(bills[0], bills[s]))"
+    "   if is_subseq_greedy(bills[0], bills[s]))"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1 loop, best of 3: 7.88 s per loop\n"
+     ]
+    }
+   ],
+   "source": [
+    "%%timeit\n",
+    "sum(1 for s in bills\n",
+    "   if s != 0\n",
+    "   if is_subseq(bills[0], bills[s]))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
    "metadata": {
     "scrolled": true
    },
@@ -419,7 +451,7 @@
        " 146]"
       ]
      },
-     "execution_count": 14,
+     "execution_count": 15,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -432,15 +464,15 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 16,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "CPU times: user 148 ms, sys: 0 ns, total: 148 ms\n",
-      "Wall time: 148 ms\n"
+      "CPU times: user 148 ms, sys: 4 ms, total: 152 ms\n",
+      "Wall time: 150 ms\n"
      ]
     },
     {
@@ -449,7 +481,7 @@
        "(True, False)"
       ]
      },
-     "execution_count": 15,
+     "execution_count": 16,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -460,7 +492,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 17,
    "metadata": {
     "collapsed": true
    },
@@ -471,7 +503,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [
     {
@@ -698,7 +730,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 31,
    "metadata": {
     "collapsed": true
    },
@@ -709,20 +741,24 @@
     "        return s2 == s3\n",
     "    elif not s2:\n",
     "        return s1 == s3\n",
+    "    elif len(s1) + len(s2) != len(s3):\n",
+    "        return False\n",
     "    else:\n",
-    "        if s1[-1] == s2[-1] and s1[-1] == s3[-1]:\n",
-    "            return is_interleave_recursive(s1[:-1], s2, s3[:-1]) or is_interleave(s1, s2[:-1], s3[:-1])\n",
+    "        if s1[-1] == s3[-1] and s2[-1] == s3[-1]:\n",
+    "            return (is_interleave_recursive(s1[:-1], s2, s3[:-1]) \n",
+    "                    or \n",
+    "                    is_interleave_recursive(s1, s2[:-1], s3[:-1]) )\n",
     "        elif s1[-1] == s3[-1]:\n",
     "            return is_interleave_recursive(s1[:-1], s2, s3[:-1])\n",
     "        elif s2[-1] == s3[-1]:\n",
-    "            return is_interleave(s1, s2[:-1], s3[:-1])\n",
+    "            return is_interleave_recursive(s1, s2[:-1], s3[:-1])\n",
     "        else:\n",
     "            return False"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 20,
    "metadata": {
     "collapsed": true
    },
@@ -798,7 +834,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 21,
    "metadata": {
     "collapsed": true
    },
@@ -871,7 +907,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 22,
    "metadata": {
     "collapsed": true
    },
@@ -951,7 +987,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 23,
    "metadata": {
     "collapsed": true
    },
@@ -975,7 +1011,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [
     {
@@ -984,7 +1020,7 @@
        "[30]"
       ]
      },
-     "execution_count": 23,
+     "execution_count": 24,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -996,7 +1032,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 24,
+   "execution_count": 25,
    "metadata": {},
    "outputs": [
     {
@@ -1005,7 +1041,7 @@
        "[30]"
       ]
      },
-     "execution_count": 24,
+     "execution_count": 25,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1017,7 +1053,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 25,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [
     {
@@ -1026,7 +1062,7 @@
        "[30]"
       ]
      },
-     "execution_count": 25,
+     "execution_count": 26,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1038,7 +1074,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 102,
+   "execution_count": 27,
    "metadata": {},
    "outputs": [
     {
@@ -1047,7 +1083,7 @@
        "[30]"
       ]
      },
-     "execution_count": 102,
+     "execution_count": 27,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1060,7 +1096,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 26,
+   "execution_count": 28,
    "metadata": {},
    "outputs": [
     {
@@ -1277,7 +1313,7 @@
        "True"
       ]
      },
-     "execution_count": 26,
+     "execution_count": 28,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1291,7 +1327,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 27,
+   "execution_count": 32,
    "metadata": {},
    "outputs": [
     {
@@ -1300,7 +1336,7 @@
        "[30]"
       ]
      },
-     "execution_count": 27,
+     "execution_count": 32,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1312,14 +1348,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 28,
+   "execution_count": 33,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 2.81 s per loop\n"
+      "1 loop, best of 3: 3.12 s per loop\n"
      ]
     }
    ],
@@ -1331,14 +1367,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 29,
+   "execution_count": 34,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 916 ms per loop\n"
+      "1 loop, best of 3: 971 ms per loop\n"
      ]
     }
    ],
@@ -1350,14 +1386,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 30,
+   "execution_count": 35,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 1.45 s per loop\n"
+      "1 loop, best of 3: 1.56 s per loop\n"
      ]
     }
    ],
@@ -1369,14 +1405,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 31,
+   "execution_count": 36,
    "metadata": {},
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "1 loop, best of 3: 705 ms per loop\n"
+      "1000 loops, best of 3: 510 µs per loop\n"
      ]
     }
    ],
@@ -1403,7 +1439,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 32,
+   "execution_count": 37,
    "metadata": {},
    "outputs": [
     {
@@ -1412,7 +1448,7 @@
        "(4.223305555555555, 4, 13, 23.899999999999636)"
       ]
      },
-     "execution_count": 32,
+     "execution_count": 37,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1428,7 +1464,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 33,
+   "execution_count": 38,
    "metadata": {},
    "outputs": [
     {
@@ -1437,7 +1473,7 @@
        "(11.13438888888889, 11, 8, 3.8000000000029104)"
       ]
      },
-     "execution_count": 33,
+     "execution_count": 38,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1453,7 +1489,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 34,
+   "execution_count": 39,
    "metadata": {},
    "outputs": [
     {
@@ -1462,7 +1498,7 @@
        "(15.36486111111111, 15, 21, 53.5)"
       ]
      },
-     "execution_count": 34,
+     "execution_count": 39,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1487,7 +1523,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 95,
+   "execution_count": 40,
    "metadata": {
     "collapsed": true
    },
@@ -1501,7 +1537,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 84,
+   "execution_count": 41,
    "metadata": {
     "collapsed": true
    },
@@ -1525,7 +1561,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 82,
+   "execution_count": 42,
    "metadata": {},
    "outputs": [
     {
@@ -1549,7 +1585,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 83,
+   "execution_count": 43,
    "metadata": {},
    "outputs": [
     {
@@ -1570,7 +1606,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 85,
+   "execution_count": 44,
    "metadata": {},
    "outputs": [
     {
@@ -1606,7 +1642,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 99,
+   "execution_count": 45,
    "metadata": {},
    "outputs": [
     {
@@ -1630,7 +1666,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 100,
+   "execution_count": 46,
    "metadata": {},
    "outputs": [
     {