      "## Constraints\n",
      "\n",
      "* Can we assume we already have a stack class that can be used for this problem?\n",
      "    * Yes"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
 
</s> remove     "* None tower(s)\n",
    "* 0 disks\n",
 </s> add     "* None tower(s) -> Exception\n",
    "* 0 disks -> None\n", </s> remove     "* None tower(s)\n",
    "* 0 disks\n",
 </s> add     "* None tower(s) -> Exception\n",
    "* 0 disks -> None\n", </s> remove     "def hanoi(num_disks, src, dest, buff):\n",
    "    # TODO: Implement me\n",
    "    pass"
 </s> add     "class Hanoi(object):\n",
    "\n",
    "    def move_disks(self, num_disks, src, dest, buff):\n",
    "        # TODO: Implement me\n",
    "        pass" </s> remove     "def hanoi(num_disks, src, dest, buff):\n",
    "    if src is None or dest is None or buff is None:\n",
    "        return\n",
    "    if num_disks > 0:\n",
    "        hanoi(num_disks-1, src, buff, dest)\n",
    "        data = src.pop()\n",
    "        dest.push(data)\n",
    "        hanoi(num_disks-1, buff, dest, src)"
 </s> add     "class Hanoi(object):\n",
    "\n",
    "    def move_disks(self, num_disks, src, dest, buff):\n",
    "        if src is None or dest is None or buff is None:\n",
    "            raise TypeError('Cannot have a None input')\n",
    "        self._move_disks(num_disks, src, dest, buff)\n",
    "\n",
    "    def _move_disks(self, num_disks, src, dest, buff):\n",
    "        if num_disks == 0:\n",
    "            return\n",
    "        self.move_disks(num_disks-1, src, buff, dest)\n",
    "        dest.push(src.pop())\n",
    "        self.move_disks(num_disks-1, buff, dest, src)"
    "    * Yes\n",
    "* Can we assume the inputs are valid?\n",
    "    * No\n",
    "* Can we assume this fits memory?\n",
      "## Constraints\n",
      "\n",
      "* Can we assume we already have a stack class that can be used for this problem?\n",
    "    * Yes\n",
    "* Can we assume the inputs are valid?\n",
    "    * No\n",
    "* Can we assume this fits memory?\n",
      "    * Yes"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
keep keep add keep keep keep keep keep keep
 Update hanoi challenge (#121)

Update constraints and test cases.  Move implementation to a class.  Update tests. 
recursion_dynamic/hanoi/hanoi_challenge.ipynb