Add files via upload

This commit is contained in:
Peter Norvig authored and GitHub committed 2021-08-09 01:06:37 -07:00
1 parent 09676bf160
commit 219acabf36
1 file changed
+360 -263
+360 -263
View File
@@ -10,11 +10,11 @@
"\n", "\n",
"From 538's [The Riddler](https://fivethirtyeight.com/features/can-you-zoom-around-the-race-track/) on 6 August 2021 (slightly edited):\n", "From 538's [The Riddler](https://fivethirtyeight.com/features/can-you-zoom-around-the-race-track/) on 6 August 2021 (slightly edited):\n",
"\n", "\n",
"> The game of [RaceTrack](https://link.springer.com/chapter/10.1007/978-3-642-13122-6_26) was published by recreational mathematician [Martin Gardner](http://www.martin-gardner.org/) in [1973](https://www.scientificamerican.com/article/mathematical-games-1973-01/). There have been some neat [digital versions](https://harmmade.com/vectorracer/#) since then, and it’s high time we had a race here on The Riddler: the Riddler-opolis 500!\n", "> The game of [RaceTrack](https://link.springer.com/chapter/10.1007/978-3-642-13122-6_26) was published by recreational mathematician [Martin Gardner](http://www.martin-gardner.org/) in [1973](https://www.scientificamerican.com/article/mathematical-games-1973-01/). There have been some neat [digital versions](https://harmmade.com/vectorracer/#) since then, and it’s high time we had a race here: the Riddler-opolis 500!\n",
">\n", ">\n",
"> You begin at the blue point on the starting line below the circle (diagram shown below) with a velocity vector of zero, and your goal is to circumnavigate the track in a counterclockwise loop. You’ll be moving from point to point on the grid, without ever venturing into the outer wall or the central circle. (Moving tangent to the circle is allowed, as is being on a grid point along a wall.)\n", "> You begin at the blue point on the starting line below the circle (diagram shown below) with a velocity vector of zero, and your goal is to circumnavigate the track in a counterclockwise loop. You’ll be moving from point to point on the grid, without ever crashing into the outer wall or the central circle. (Moving tangent to the circle is allowed, as is being on a grid point along a wall.)\n",
">\n", ">\n",
"> For each move you have a choice of nine possible destinations, corresponding to the 3x3 grid that surrounds the point formed by adding your current velocity vector to your current position. That is, you can maintain your current velocity, or you can alter your velocity (and hence your destination) by one grid point in any direction (horizontally, vertically or diagonally). For example, if your first move was up and to the right, then your possible second moves are shown below, although two of them will cause you to crash into the central circle.\n", "> For each move you have a choice of nine possible destinations, corresponding to the 3x3 grid that surrounds the point formed by adding your current velocity vector to your current position. That is, you can maintain your current velocity, or you can alter your velocity (and hence your destination) by accelerating one grid point in any direction (horizontally, vertically or diagonally). For example, if your first move was up and to the right, then your nine possible second moves are shown below, although two of them will cause you to crash into the central circle.\n",
">\n", ">\n",
"> ![](https://fivethirtyeight.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-04-at-10.44.11-PM.png?w=400)\n", "> ![](https://fivethirtyeight.com/wp-content/uploads/2021/08/Screen-Shot-2021-08-04-at-10.44.11-PM.png?w=400)\n",
">\n", ">\n",
@@ -24,17 +24,16 @@
"\n", "\n",
"# Defining Points and the Track\n", "# Defining Points and the Track\n",
"\n", "\n",
"I will define the following:\n", "I will start by defining the following:\n",
"- `Point`: a point in the 2-D plane, implemented as a complex number. `X(p)` and `Y(p)` give coordinates\n", "- `Point(x, y)`: a point in the 2-D plane, implemented as a complex number.\n",
"- `Path`: a list of points representing the car's moves\n", "- `Path`: a list of points representing the car's positions as it moves.\n",
"- `track`: all the legal grid points\n", "- `track`: all the legal grid points on the race track.\n",
"- `start`: the single starting point\n", "- `start`: the single starting point.\n",
"- `finish`: a Path defining the finish line\n", "- `zero`: a zero vector (your starting velocity vector).\n",
"- `zero`: a vector (your starting velocity vector)\n", "- `radius`: the radius of the central circle (whose center is defined as the origin).\n",
"- `radius`: the radius of the central circle, whose center is defined as the origin\n", "- `accelerations`: the nine possible acceleration vectors, to changes the car's velocity.\n",
"- `deltas`: the nine possible changes to the car's velocity on each move\n", "- `X(point)`, `Y(point)`: the x- and y-coordinates of a point, respectively.\n",
"- `X(point)`, `Y(point)`: the x- and y-coordinates of a point, respectively\n", "- `velocity(path)`: the car's current velocity when it has just made the last move in a path."
"- `velocity(path)`: the car's velocity when it has just made the last move in a path"
] ]
}, },
{ {
@@ -50,10 +49,9 @@
"Path = List[Point]\n", "Path = List[Point]\n",
"track = {Point(x, y) for x in range(-7, 8) for y in range(-7, 8) if abs(Point(x, y)) >= 3}\n", "track = {Point(x, y) for x in range(-7, 8) for y in range(-7, 8) if abs(Point(x, y)) >= 3}\n",
"start = Point(0, -5)\n", "start = Point(0, -5)\n",
"finish = [Point(0, -3), Point(0, -7)]\n",
"zero = Vector(0, 0)\n", "zero = Vector(0, 0)\n",
"radius = 3\n", "radius = 3\n",
"deltas = [Vector(x, y) for y in (1, 0, -1) for x in (-1, 0, 1)]\n", "accelerations = [Vector(x, y) for y in (1, 0, -1) for x in (-1, 0, 1)]\n",
"\n", "\n",
"def X(point) -> float: return point.real\n", "def X(point) -> float: return point.real\n",
"def Y(point) -> float: return point.imag\n", "def Y(point) -> float: return point.imag\n",
@@ -78,17 +76,17 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"def plot(paths=()):\n", "def plot(paths=(), finish=[Point(0, -3), Point(0, -7)]):\n",
" \"\"\"Plot the track and any paths, along with the start and finish line.\"\"\"\n", " \"\"\"Plot the track and any paths, along with the start and finish line.\"\"\"\n",
" fig, ax = plt.subplots()\n", " fig, ax = plt.subplots()\n",
" plt.xticks([]); plt.yticks([])\n", " plt.xticks([]); plt.yticks([])\n",
" ax.set_aspect('equal');\n", " ax.set_aspect('equal');\n",
" ax.add_artist(plt.Circle((0, 0), 3, alpha=0.1, color='k', ec='w'))\n", " ax.add_artist(plt.Circle((0, 0), 3, alpha=0.1, color='k', ec='w'))\n",
" ax.plot(*XY(track), 'k,' ) # grid points\n", " ax.plot(*XY(track), 'k,' ) # grid points\n",
" for path in paths:\n", " ax.plot(*XY([start]), 'ks', ms=10) # start point\n",
" ax.plot(*XY(path), 'o-') # paths\n", " ax.plot(*XY(finish), 'k:') # finish line\n",
" ax.plot(*XY([start]), 'bD') # start point\n", " for path in paths: # paths\n",
" ax.plot(*XY(finish), 'b:') # finish line\n", " ax.plot(*XY(path), 'o-') \n",
" plt.title(f'{len(paths)} paths of {set(len(path) - 1 for path in paths)} moves')\n", " plt.title(f'{len(paths)} paths of {set(len(path) - 1 for path in paths)} moves')\n",
" \n", " \n",
"def XY(points) -> Tuple[List[float], List[float]]: \n", "def XY(points) -> Tuple[List[float], List[float]]: \n",
@@ -100,7 +98,7 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"Below is my replication of the diagram above: nine paths for the second move (two of which crash)." "Below is my replication of The Riddler's diagram above: the first move goes up and to the right, and there are nine paths for the second move (two of which crash into the central circle)."
] ]
}, },
{ {
@@ -110,7 +108,7 @@
"outputs": [ "outputs": [
{ {
"data": { "data": {
"image/png": "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 truncated "image/png": "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 truncated
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
@@ -120,9 +118,9 @@
} }
], ],
"source": [ "source": [
"path = [start, Point(1, -4)]\n", "path1 = [start, Point(1, -4)]\n",
"paths = [path + [Point(path[-1] + velocity(path) + d)] \n", "paths = [path1 + [Point(path1[-1] + velocity(path1) + a)] \n",
" for d in deltas]\n", " for a in accelerations]\n",
"plot(paths)" "plot(paths)"
] ]
}, },
@@ -130,9 +128,11 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Navigating Regions\n", "# Circumnavigating the Track\n",
"\n", "\n",
"The goal of the race is to circumnavigate the center circle. I can describe that in a way that's generalizable to different tracks by saying that `is_complete(path)` is true if the path enters *regions* of points in a prescribed order. For our track a path is complete if it travels from the fourth [quadrant](https://mathworld.wolfram.com/Quadrant.html) to the first, second, third, and back to the fourth. A *region* is defined by a predicate that is true of any point in the region." "The goal of the race is to circumnavigate the center circle. I can test for that by seeing if the path goes from the fourth [quadrant](https://mathworld.wolfram.com/Quadrant.html) to the first, second, third, and back to the fourth. The function `is_complete(path)` does that.\n",
"\n",
"If you want to generalize this to other race tracks, you can change the definition of `quadrant` (there could be more than 4 quadrants/regions, and they could have any shape), and change the `regions` in the parameter list of `is_complete`."
] ]
}, },
{ {
@@ -141,33 +141,38 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"def Q1(p: Point) -> bool: \"upper right quadrant\"; return X(p) >= 0 and Y(p) >= 0\n", "def is_complete(path, regions=(4, 1, 2, 3, 4)) -> bool:\n",
"def Q2(p: Point) -> bool: \"upper left quadrant\"; return X(p) < 0 and Y(p) >= 0\n",
"def Q3(p: Point) -> bool: \"lower left quadrant\"; return X(p) < 0 and Y(p) < 0 \n",
"def Q4(p: Point) -> bool: \"lower right quadrant\"; return X(p) >= 0 and Y(p) < 0\n",
"\n",
"circumnavigate = (Q4, Q1, Q2, Q3, Q4)\n",
" \n",
"def is_complete(path, regions=circumnavigate) -> bool:\n",
" \"\"\"Does the path go through all the regions in the prescribed order?\"\"\"\n", " \"\"\"Does the path go through all the regions in the prescribed order?\"\"\"\n",
" current = 0\n", " i = 0\n",
" for p in path:\n", " for p in path:\n",
" if regions[current](p):\n", " if quadrant(p) == regions[i]:\n",
" current += 1\n", " i += 1\n",
" if current == len(regions):\n", " if i == len(regions):\n",
" return True\n", " return True\n",
" return False" " return False\n",
"\n",
"def quadrant(p: Point) -> int: \n",
" \"\"\"What quadrant of the 2-D plane is this point in?\"\"\"\n",
" if X(p) >= 0:\n",
" return 1 if Y(p) >= 0 else 4\n",
" else:\n",
" return 2 if Y(p) >= 0 else 3"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Possible and Legal Moves\n", "# Legal Moves\n",
"\n", "\n",
"I'm thinking about how to solve for our specific track, and also how to make the code general enough that it could handle other tracks. I'll do that by splitting up responsibility:\n", "I'm considering how to solve for our specific central-circle-track, and also make the code general enough that it can handle other tracks. I'll do that by splitting up responsibility for determining legal moves:\n",
"- `possible_moves(path)` is general; it returns up to 9 points that are on the track and have the right velocity. \n", "- `all_moves(path)` is general; it considers points with all 9 accelerations and returns the points that are on the track.\n",
"- `legal_moves(path)` is specific; it won't cross into the center circle, and it won't pass from the fourth quadrant backwards into the third (while that is not technically illegal, it was causing problems, and no fast path should do that)." "- `circle_track_moves(path)` is specific; it limits moves in the following ways:\n",
" - It won't let a move intersect the center circle (even if the start and end points of a move are outside the circle).\n",
" - It won't make moves that stay in one place (they are legal, but wasteful and not needed on this track).\n",
" - It won't pass from the fourth quadrant backwards into the third (such moves are legal, but wasteful).\n",
" \n",
"In the code below `p` is the previous point on a path, `p1` is where the next point would be if the velocity remained constant, and `p2` is the point we arrive at when acceleration is applied."
] ]
}, },
{ {
@@ -176,22 +181,27 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"def possible_moves(path) -> List[Point]:\n", "def all_moves(path) -> List[Point]:\n",
" \"\"\"All moves with the right velocity that end up on the track.\"\"\"\n", " \"\"\"Moves with any allowable acceleration that end up on the track.\"\"\"\n",
" p, v = path[-1], velocity(path)\n", " p1: Point = path[-1] + velocity(path)\n",
" return {(p + v + Δ) for Δ in deltas} & track\n", " return {(p1 + a) for a in accelerations} & track\n",
" \n", " \n",
"def legal_moves(path) -> List[Point]:\n", "def circle_track_moves(path) -> List[Point]:\n",
" \"\"\"What points can be reached in one step from this path?\"\"\"\n", " \"\"\"Reasonable moves on the circle track.\"\"\"\n",
" p = path[-1]\n", " p = path[-1]\n",
" return [p2 for p2 in possible_moves(path)\n", " return [p2 for p2 in all_moves(path)\n",
" if not (Q4(p) and Q3(p2)) # Don't go backwards over the finish line\n", " if p2 != p\n",
" and not (quadrant(p) == 4 and quadrant(p2) == 3) # Don't go backwards over finish line\n",
" and not intersects_circle(p, p2)]\n", " and not intersects_circle(p, p2)]\n",
"\n", "\n",
"def intersects_circle(p: Point, p2: Point, radius=radius, N=20):\n", "def intersects_circle(p: Point, p2: Point, center=zero, radius=radius, N=20) -> bool:\n",
" \"\"\"Are any of N+1 points on the line segment [p, p2] inside the circle's radius?\"\"\"\n", " \"\"\"Does a line from p to p2 intersect a circle with given center and radius?\"\"\"\n",
" linepoints = (p + (i / N) * (p2 - p) for i in range(N + 1))\n", " return any(abs(q - center) < radius for q in waypoints(p, p2, N))\n",
" return any(abs(q) < radius for q in linepoints)" "\n",
"def waypoints(p, p2, N) -> List[Point]:\n",
" \"\"\"All the points that are i/N of the way from p to p2\"\"\"\n",
" return [p + (i / N) * (p2 - p)\n",
" for i in range(N + 1)]"
] ]
}, },
{ {
@@ -209,7 +219,9 @@
"\n", "\n",
"Now I want to expand paths by adding legal moves to the end until I find complete path(s). I could keep all my paths in a `list`, but there will be an exponential number of them (up to 9<sup><i>n<i/></sup> paths of length *n* and it looks like *n* will be around 10 to 13).\n", "Now I want to expand paths by adding legal moves to the end until I find complete path(s). I could keep all my paths in a `list`, but there will be an exponential number of them (up to 9<sup><i>n<i/></sup> paths of length *n* and it looks like *n* will be around 10 to 13).\n",
"\n", "\n",
"Instead I will keep track of a `frontier`, which I define as a mapping of `{(endpoint, velocity): path}`. The idea is that there may be many paths that arrive at the some endpoint with the same velocity in the same number of moves, but if so, the best continuation of all of them will be the same, so I only need to keep one of them. " "Instead I will keep track of a `frontier`, which I define as a mapping of `{(endpoint, velocity): path}`. The idea is that there may be many paths that arrive at the some endpoint with the same velocity in the same number of moves, but if so, the best continuation of all of them will be the same, so I only need to keep one of them. \n",
" \n",
"*Note:* Before I added the limitation that moves can't pass backwards from the fourth quadrant to the third, I had a bug: sometimes the frontier would capture a `(endpoint, velocity)` pair for a path that was in the third quadrant but hadn't circumnavigated and was replacing a path to the same point that had circumnavigated. This meant that I was discarding some valid paths."
] ]
}, },
{ {
@@ -218,8 +230,8 @@
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"def expand(frontier) -> dict:\n", "def expand(frontier, legal_moves=circle_track_moves) -> dict:\n",
" \"\"\"The {(endpoint, velocity): path} mapping extended one move in all legal ways.\"\"\"\n", " \"\"\"The {(endpoint, velocity): path} frontier extended one move in all legal ways.\"\"\"\n",
" return {(p, velocity([path[-1], p])): path + [p] \n", " return {(p, velocity([path[-1], p])): path + [p] \n",
" for path in frontier.values() \n", " for path in frontier.values() \n",
" for p in legal_moves(path)}" " for p in legal_moves(path)}"
@@ -229,119 +241,42 @@
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"I will show how the frontier expands over the first few steps:" "# Searching for Fastest Complete Paths\n",
"\n",
"Now all I have to do to solve the problem is repeatedly expand the frontier until some path(s) are complete. The first completed paths found are guaranteed to be the fastest (i.e., have the fewest moves), because we are expanding one move at a time. In the end, I return a list of all the completed paths in the frontier, but there may be many other paths that are not returned, because the frontier only keeps one path for each `(endpoint, velocity)` pair along the way. "
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 7,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydd3wUZf6An3drsimbHhJ66L0LiBQriIogotjLqXenHtb7eXqeh/U8e++9nB7qIdgAAaUoRQjSeyd9k2ySzfad+f2xm2WT3RRCgCy8z+eDbmbmO/PO7Dz7fd935p0RqqoikUhaP5oTXQCJRNI0pKwSSZQgZZVIogQpq0QSJUhZJZIoQcoqkUQJUtYTgBBinBDi0HHYzhQhxEEhhE0IMaiB5cYKIbYJIaqEENlNXPdIIUSlEOJ3IUS/liu1pD6iWlYhxO1CiDVCCJcQ4oM68zoJIdTAiVrz7x8h81OEEP8VQlgC/z4VQiQeo3KqQoiux2LdjfAMcLuqqvGqqq5rYLkZwA+qqiaoqpoPIIToHTi25YF/C4UQvWsCVFVdASQBO4A/HMudkPiJalmBfOAx4L0GlkkKnKzxqqo+GjL9MSAZyAG6AJnAzGNV0BNER2BzE5ZLibBcPnBpYF4aMBf4PHQBVVUVYAuQetQllTRKVMuqqur/VFX9GihtRnhn4GtVVStVVa0AZgN9Ii0YkqVvEULkCyEKhBD3hMw/TQixQghhDcx7RQhhCMxbGlhsfSC7Xx4Sd48QojgQc0PI9IlCiC2BammeEOLeesqlEUI8KITYH1jPR0IIsxDCKISwAdrAdnc3cix0gBI6QVVVq6qq+1T/LW4C8AGRagdKIL5BAsfvViHEzsB+PSqE6BI4bpVCiFk1xyyw/M1CiF1CiDIhxNya6rkQ4g0hxDN11j1HCHF34HO2EOIrIUSJEGKvEGJGyHKnBWoLlUKIIiHEc42Vu1WhqmrU/8OfJT+oM60ToAJ5wCHgfSAtZP6FwPf4s2sysBi4s57116zrMyAO6AeUAOcE5g8BRuA/aTsBW0PXFYjtGvL3OMALPALogYmAHUgOzC8ARgc+JwOD6ynXjcAu/LWDeOB/wMf1bbeedbTD/2N3Tj3zrYGyKsCDEebfgL8qnNrIdlT82TkR/4+iC1gUKLsZf4a+LrDsWYAFGAwYgZeBpYF5Y4CDgAg5Pg4gG3/yWQs8BBgC694DjA8suwK4JvA5Hhhxos/dIzrPT3QBWmQnIssaDwwNCJQJfAnMD5mfDSwMnIQK8CNgqGf9NbL2DJn2FPBuPcvfCcyuc6LWldUB6EKmFdecPMAB4I9AYiP7vQi4NeTvHoCnZr2NyYq/TasCXzWynTjgVuCCCPP0wK+B9UT8sQspy6iQv9cC94X8/SzwQuDzu8BTdb5LT+B7EIHjMyYw72ZgceDzcOBAne3eD7wf+LwUeJiQH+1o+hfV1eCGUFXVpqrqGlVVvaqqFgG3A+eFdCJ9gT8jJOD/td8NfNLIag+GfN6PX3iEEN2FEN8KIQqFEJXAE/jbeQ1RqqqqN+RvO/6TEmAq/my7XwixRAgxsp51ZAfKEVqmmh+nRlFV9V6gO/7jMrSB5aqBN4CPhBAZdWZfBLQHslVVfaGRTRaFfHZE+Ltm/2vtl6qqNvzZv63qt+5z4IrA7CuBTwOfOwLZgeaIVQhhBR7g8PH4Q2B/twkhfhNCXNhIeVsVJ62sEagZXiQC/x8AvKmqanXgZHgDvyAN0T7kcwf8nTAArwPbgG6qqibiP0EEzURV1d9UVb0YyAC+BmbVs2g+/hM0tExeakvQ2LZ2ApuA3o0sqgFMQNs603sBK1VVLWjqNptArf0SQsTh78TKC0z6DLhUCNERfzb9KjD9ILBXVdWkkH8JqqpOBP++qqp6Bf7j+m/gy8C6o4KollUIoRNCxODvSNEKIWKEELrAvOFCiB6BTphU4CXgZ9XfmQTwG3CTECJWCBEL3AKsb2ST/xBCmIQQffC31f4bmJ4AVAI2IURP4M914orwt5+ask8GIcRVQgizqqqewHp99Sz+GXCXEKKzECIef0b/b52M3RRc+Nt4oeU4VwgxSAihDdRGngPK8bfHQ9EH4luS/wA3CCEGCiGM+Pdrlaqq+wBU/2WoEuAd/E0bayBuNVAphLgv8L1qhRB9hRDDAvt0tRAiXfX3YtfE1HdsWx1RLSvwIP7q09+AqwOfHwzMywHmAVX4M4eLw1Un8HfOdMLf+ZQXWP76Rra3BH+HziLgGVVVFwSm34u/OlYFvM1hiWuYCXwYqJpd1oT9ugbYF6hS/ymwb5F4D/gYf1tsL+AE/tKE9ddFIfxcSML/Y1CBv4nQFZigqqqzznJa6vQkHy2qqi4C/oE/Yxbgv7Q2vc5inwHn4Be7Js6Hv1o+EP/xsOAX2hxYZAKwOdBT/iIwPcL+tFpqetQkDSCE6IT/y9c3I2u1eoQQ/wFswJ8CWaepcTr8PdDbVFX9v2NVPomfaM+skpbhOfzZqEQ0/XbDEUAh/gz81jEsmySAzKxN4GTPrJLoQMoqkUQJshoskUQJUlaJJEpo9AbsUNLS0tROnTodo6JIJJK1a9daVFVNjzTviGTt1KkTa9asaZlSSSSSMIQQ++ubJ6vBEkmUIGWVSKIEKatEEiVIWSWSKEHKKpFECVJWiSRKkLJKJFHCMZFViOY9JEHGtY64E7FNGdc4x0TW5g4OkHGtI+5EbFPGNY6sBkskUYKUVSKJEqSsEkmUIGWVSKIEKatEEiVIWSWSKEHKKpFECVJWiSRKkLJKJFGClFUiiRKkrBJJlCBllUiiBDnqRsa1im3KuMaRo25kXKvYpoxrHFkNlkiiBCmrRBIlSFklkihByiqRRAlSVokkSpCySiRRgpRVIokSpKwSSZQgZZVIogQpq0QSJUhZJZIoQcoqkUQJctSNjGsV25RxjSNH3ci4VrFNGdc4shoskUQJUlaJJEqQskokUYKUVSKJEqSsEkmUIGWVSKIEKatEEiVIWSWSKEHKKpFECVJWiSRKkLJKJFGClFUiiRLkqBsZ1yq2KeMaR466kXGtYpsyrnFkNVgiiRKkrBJJlCBllUiiBCmrRBIlSFklkihByiqRRAlSVokkSpCySiRRgpRVIokSpKwSSZQgZZVIogQpq0QSJchRNzKuVWxTxjWO7qjXEIFoGdEQ7XGqquL1evF6vSiKgs/nQ1EUFEVBVVUsFgulpaUIIdBoNGi1WjQaDRqNBr1ej05X/9ffWvbxVI8L5ZjIKjk2qKqK0+nE7Xbj8XiCkjaXGmn1ej0GgwGj0dgiGUBybJCytnIURcHpdAYlPRo5I63b5XLhcrkAv7xGoxGj0UhsbKwUt5UhZW2luN1u7HY7TqezRQVtCEVRcDgcOBwOqqqqiI2NxWQyNVhdlhw/5LfQynA6ndhsNtxu9wkth8/nw2azUV1djdFoJD4+HoPBcELLdKojZW0luN1uqqqqglXS1kJNO9npdBIbG0tCQoLMtCcIedRPMIqiUFlZid1uP9FFaRSHw4HT6SQuLo6EhATZpj3OSFlPIA6Hg8rKSnw+34kuSpNRVRWbzYbL5cJsNsuq8XFE3sF0AlAUBavVSnl5eVSJGorH46G0tJSqqqoTXZRTBplZjzNer5fy8nI8Hs+JLspRo6oqVVVVeDwekpKS0Gjkb/+xRB7d44jL5aK0tPSkEDUUp9OJxWI56fartSFlPU7Y7XbKysqittrbGF6vl9LS0lbXm30yIWU9DtjtdqxWa4vcH9qaURSF8vJyKewxQo66OcZxNaKeKjRX2Nb8HZ7IuFDku26OYZzT6aSioqJZ24hmaoQ9kjZsa/0OT3RcKLIafIzwer2nRNW3PmqEPV73NZ8KSFmPAfJE9VPzgyVpGaSsxwCr1SovYwRwOp3yxokWQsrawtQMa5McpjWMIjoZkLK2ID6fj8rKyhNdjFaHqqpUVFScsu33lkLK2oJUVFSc8u3U+vB4PLI6fJRIWVuImjGfkvqprq7G6/We6GJELVLWFkJmjcapufFf0jykrC2A3W6Xvb9NxOFwyM6mZiJlbQFsNtuJLkJUIY9X85DjWY8Sp9Mp22FHiMvlwuv1HtWznCq++Ybi51/AW1CALiuLjLvuxHzRRY3G7VhVyIo5u7GVuYhPMTLy4i50H96m0bity35i2ecfUVVqISE1jdHTr6XX6DObXf7mIGU9SqLh2UmtDVVVsdvtJCYmNiu+4ptvKPjHQ6iBDj1vfj4F/3gIoEFhd6wq5KdPt+F1+3vsbWUufvp0G0CDwm5d9hML3noFr9s/OKHKUsKCt14BOK7CylE3RxHn9XrlcLBm4nA4al13PZLvovj5F4Ki1qA6nRQ//0KDcSvm7A6KWoPXrbBizu4G45Z9/lFQ1MNxLpZ9/lGTyyxH3ZzguLonnKTp+Hw+HA5H8O8jOY7egoIjml6DrSzyD2t902uoKrUc0fRIyFE3Jxh5XfXoaG6tRJeVdUTTa4hPMR7R9OD85JSI0xNS0xqMa2mkrM2k5u1tkubjcrmalXEy7roTtNpa00RMjH96A3Q/LbxdqjNoGHlxl3pjqkot+CJ8zzqDkdHTr21iiVsGKWszae6JJjmMoijNuuaaOHEiwhSLiIkBIdBlZ5P16CMNdi65nV52/lZEbIKe+GR/Jo1PMXLmVT3r7VyqKrUw6+H78Xk8jLz0ChLS0kEIEtLSOe+W22VvcLQgO5ZaBpfLhdHYcDW0Lo7cXNQqG22fe5bEiRObFLNi9m6qypxMuWcw2V2TGl2+RlR7ZQVTH3iE7O49OX3aVUdUzpZGZtZmIu9Yahmacxwrf5iHMBqJHzu2Scsf2l7OpiV5DDizfbNFbQ1IWZtBzRvGJUfPkcqq+nxU/riA+DFj0MTFNbq82+ll8UdbMafHMnxyTqPLt1ZRQcraLNxut2yvthCKohxRR50jNxdfiYXE8yc0afma6u9Z1/VLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydd3hUVd7HP+dOn0kmk94IJCEJhNANnSgKiqKy2FB3V9Btru9ady1b7euurq4VdV9dFVFRERFQUbEgvYQaCJBAQnpvM5lMv+f9Y0IIYQDl1WcXnM/zzPPMnHN+c+v3/H7n3HPOFVJKwoQJ89+P8p/egTBhwnwzwmINE+Y0ISzWMGFOE8JiDRPmNCEs1jBhThPCYg0T5jQhLNb/AoQQq4QQv/iet2ESQiwXQnQIIRadoJwQQswXQrQKIZ77Fv+/XAjRJIT4x3ezx2H6clqJVQhxsxCiUAjhEUK81idvvBBiZfdN1iSEWCSESO6Vf78QwieE6Oz1yezOK+iT3imEkEKIK76HY7hfCPHGd/2/34ArgUQgVkp51QnKDQWuBnKllDf3zhBCTBNCbBNCOIUQVUKI2YfzpJSXAucCdwohbN/D/v/gOa3ECtQCDwOvhMiLBv4XSAcGAA7g1T5l3pFSRvT6lAFIKdf0TgcuATqBT76n4/hPMAAokVL6T1IuBmiWUjb0ThRCDAHeAv4ERAEjga29y0gpd3d/jf1O9jjM0UgpT7sPQcG+dpIyowFHr9/3A298w/9/FXj1BPmvAS8CKwlWCl8DA3rlPw1UAXaCN3RBd/qFgBfwEawMdnanrwIeAtZ1/99nQFx3nhF4A2gB2oEtQOJx9iu3+7/agT3AzO70B/ps9+cnOLapQGWI9LeAh77BuVOBQScpcz+wqPu4HEARkAP8AWjsPncX9CqfAiwDWoEDwC97pbuAmF5lRwHNgK7798+AvUAb8Onh6wQI4Mnu7XUAu4Ch/+l7+0Sf082zfhvOJnjD9ubS7jB5jxDiplBGQggzwZBx/kn+/ycEBRYH7ADe7JW3haDniSF4ky8SQhillJ8Aj3DEw4/oZfNj4AYgAdADd3anzyXoydIIeqxfE7xB++63DlhOUOgJwC3Am0KIQVLK+/ps99/HOXaFbrGGyB7fXaZICFEnhHhDCBETolwVME0IIUJtoxeXAgsIRkTbCQpJAVKBB4F/9Sq7EKgmKM4rgUeEEFOllLXABqB3c+XHwHtSSp8QYhbwR+ByIB5Y0/1fABcQvEdyABvB0L/lJPv8n+U/XVucyoeTeFZgOMFauKBX2hCCF1sDTATqgGtD2F4HlAPiBP//GvB2r98RQABIO075NmBEL6/yRp/8VcCfe/3+H+CTXp5hPTD8JOekAKgHlF5pC4H7j7fdPvYxgIegp5sQIt8LHCJ4c0cAi4E3Q5S7rLts+wm2dT+wstfvSwl6fE3370hAEhRRWve5jexV/m+Hrz/wC+DL7u+CYGVxdvfvFfSKIghWBl0EmwTnASUEKyHlePv63/Q54zyrECKL4EW6TUq55nC6lLJYSlkrpQxIKdcTDFWvDPEXc4HXZffVPQFVvf67k2DlkNK9D78TQuzt7nltJ+gZ407yf/W9vncRFAQEvc+nwNtCiFohxGPdXrQvKUCVlFLtlVZB0FOdFCllK2AhGFH8KUQRF8GmQUn38T4CzAhR7gGCYgzldXvTu03sIthODvT6DcFzkAK0Sikdvcr3Pq73gAlCiBSCnlIS9KAQFOXTQoj27uvQSlDQqVLKL4HngHlAgxDif4UQ1pPs83+UM0qsQogBwOcE21YLTlJcErxwve3TgCnA699gc2m97CII3py1QogC4B5gNhAtpbQRbBMd3ta3muYkpfRJKR+QUg4hGBFcAswJUbQWSOsOZQ/TH6j5FtvyEwylh4TI3sU32/dcYGmfSuP/Qy0QI4SI7JXWc1xSynaCof9sgiHwwl4VbRVwo5TS1utj6q6skVI+I6U8C8gjGDHc9R3t8/fCaSVWIYRWCGEkGMpqhBBGIYS2Oy8V+BKYJ6V8MYTtj4QQ0d3PEccCtwJL+xS7DlgvpTz4DXZnhhBishBCT7DtuklKWUUwhPMDTYBWCHEv0LvGbgDS+4jqRMd8rhBimBBCQ7DDykcwLOzLJsAJ3C2E0AkhphAML9/+JtvphYdgm7kvrwI3CCEyu9v19wAfhiin7f6P74Tuc7oe+Fv39R4O/Jyj+wjeIliBXdH9/TAvAn8QQuQBCCGihBBXdX8fI4QY1x2lOAE3oc/rfw2nlViBPxMMkX4P/LT7+5+7834BZAL39X5e2sv2GoI9iQ6CnvNRKWXfTqQ5nLxj6TBvAfcRDK3OItjhBMGQdQXB9lAFwZugqpfd4QEJLUKIbd9gO0kEQz07wV7Nrwn2oh6FlNILzAQuItgb+jwwR0q57xsez2FUQtwXUspXCJ63TQSPy0OwwuuhVwX0XXnVw1xL8JFcLbAEuE9KubJX/jIgG2iQUu7stc9LgEcJNiHswG6C5weCFehLBPsTKgh2Lj3+He/3d4o4edMsTF+6B2RUSyn/fLKypxtCiByCveg5Usryb2k7lmDvrK1PGzPMd8Dp5lnDfM9IKUsIdrqsEUI8803thBAfEIwA/hIW6vdD2LOeAmeyZw3z30tYrGHCnCaEw+AwYU4TwmINE+Y0QfttCsfFxcn09PTvaVfChAmzdevWZillfKi8byXW9PR0CgsLv5u9ChMmzDEIISqOlxcOg8OEOU0IizVMmNOEsFjDhDlNCIs1TJjThLBYw4Q5TfhWvcFhTg8e+HIBi8tfQtW0oQSiuSLjl9x33nXfyPaqfy5g/aBBBEw6NC4fE/fvZ9FvT257+1/ns9JhxYkOCz7Oj7Tz1J/mntSu8IFR5GkPYfSpuHUKe/zp5N+3/aR2dz93PaI9HqPfjFvbhbQ18djNr53U7o57bmFT5nYchg4iPVGMKxvFk48+e1K7fzx4DUNG7MQQ4cXTqad45wjuuvfksw+ve2wJa51GVI+KYlCYbHGz4O7LTmoXirBnPcN44MsFLKp4EqltQwiQ2jYWVTzJA1+ebC5+UKhrhuURMOtBCAJmPWuG5XHVP09se/tf57PcEY0TPSBwome5I5rb/3ri2YaFD4xilCjD5FMRgMmnMkqUUfjAqBPa3f3c9ehb+mHyWxAITH4L+pZ+3P3c9Se0u+OeW1g1aB0OYwcIcBg7WDVoHXfcc8sJ7f7x4DWMGFeIMdKLEGCM9DJiXCH/ePCaE9pd99gS1rQbkJ7g8UmPypp2A9c9tuSEdsfjexHrydfKCtt9X3aLy19CKL6j7RUfi8tfOqnt+kGDQNvnltAqwfQTsNJhJYDmqLQAGlY6TrxKSp72EJo+M181ajD9RIj2eLTy6KBQK7WI9pBjCXrYlLkdv+boc+PX+NiUeWJPPmTETjS6o8fQa3SSISN2HsciyFqnEdQ+Y+9VGUw/Bb4XsZ7q5ICw3f/fTtW0fav03gRMoZZ2On76YZyEzj9e+mGMvtBz1I+X3pPvN3+r9MM4DB3fKv0whgjvt0oH8FTYUT2hj+N46ScjHAafYSiB6NDpakTI9N5oXL7j5t2xr5IKV+jVWiyEtjte+mHcutC33/HSe/K1Xd8qHUB1Ool0R4XMi/AcPwJwe7x4O0NXOp7OY1e/8VTYaXplN40v7EQYNSGsQDGcmuzCYj3DuCLjl0j16JtLSkDjYn3N+hPaTty/H/x9av2Aiq25gyUNbUzctDekaM+PtKMJsXxRf92JxbrHn04gxB3o8FlAPb73MUS24xfHvlhAJwR+/7HpqtNJ5Y03MmtjFNpAH+FJUFSJw3vsfHm3x8ujv/8LdZviCfiObooEfILinUeWfT4s0qYXduKtcfDIWZF4syORSp8mjCKYbHEf99hORFisZxj3nXcdVw24A+GPRkoQ/mhovhxtIJlbv7r1hIJd9NvrKCjag6bLC1Ki6fJi3V6HZ5uTe83R/Cw1LqRon/rTXC4yt2LBC0gseEhWutjrs/Dcl6XH3V7+fdvZLjNxGRQk4NYqNHktJOCAj38XUrBSldyk/pyoyA66NE4kEpfWicvSgNZn5t133z1KsIeF6tq+A9+YyxldMZUItw0kRLqiGH1oOF0WF7/+/NdHCfawUCNq97CheQZFGyfh9ylICW6Hnp2b8rnr3rePEqmvxkHkhQO4d1QES+JgeEDL+VYJmqBghUGhwOY55d7gbzX5PD8/X4YH8p9+fLK7nl8vXM2AvAU41TqeOfcZJqZOPKGNZ8F1FP1zD/si0nj2wlto7PTw+JUjmDw0kecqG1hQ24JPSmYnxXD7gEQ0jlaW3ruX2KRSmlQH/mgdh5IKWLqzjjsvyOHm87KPu62VK7OoL09jyjvldHXEkv3gdJTN8yD/ZzDjCVCO+BTX7mZa3thL7bB/cZfcSbTWDI3JlEeV81jmY2z4YgM5OTnMnj0bxeM5ItQHH+aCmHR+vvRtspqzEIqeJROzuWCHi8QbnPx1/70MiRvCi9NeRCcNPULdGjeJ8YGxJKjrUMZ8TmRiIxfN3Ienwo79i0o8JW0oFi2RZ6dhGpvIjV/u5yOzn8FNfp7d2UmS3M5dNjurWvMpfeB8dIZQC0ceQQixVUqZHyov7Fl/AFw4NImZQ7OpKZ5DkintpB4WwDDqMpRcDWc1lRBfVsyQZCt3vreTtbsbeCi7H5vGDznK0z5Y00GbRcERbWe0P5OOjjauy4FZI1N4/LOSE3pYABQN8UMdqJ1dtJSlwOTfQuErR3lYqUrsn1fisbSwzdAASFQRILMzD4HCOmUdM2bMoKSkhHcXLqS8W6ip/3iMf2QPx+p2cdmqzwg+05I0JOvxGhV0G/rxxJQnKG4u5sbPbuThP/6eiNo9HMycikUzGo1UiZ20DIkGRWiO8qRRF2WQdPdYLAUpPUId0w5jHH6iAxqs2oWgfDfDGcJi/YHwwMw8bEYLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [ "source": [
"frontier = {(start, zero): [start]}\n", "def search(path=[start], legal_moves=circle_track_moves) -> List[Path]:\n",
"\n", " \"\"\"Find the shortest possible complete path(s).\"\"\"\n",
"for i in range(6):\n", " frontier = {(path[-1], velocity(path)): path}\n",
" frontier = expand(frontier)\n", " complete_paths = []\n",
" plot(frontier.values())\n", " while not complete_paths:\n",
" plt.show()" " frontier = expand(frontier, legal_moves)\n",
" complete_paths = list(filter(is_complete, frontier.values()))\n",
" return complete_paths"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"(Note that the growth is much slower then 9<sup><i>n</i></sup>.)\n", "# Solutions"
"\n",
"# Searching for Fastest Complete Paths\n",
"\n",
"Now all I have to do to solve the problem is repeatedly expand the frontier until some path(s) are complete. The first completed paths are guaranteed to be the fastest (i.e., have the fewest moves), because we are expanding one move at a time. In the end, I return a list of all the completed paths in the frontier, but there may be many other paths that are not returned, because I only kept one path for each `(endpoint, velocity)` pair along the way. "
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 8,
"metadata": {}, "metadata": {},
"outputs": [],
"source": [
"def search(path=[start]) -> Path:\n",
" \"\"\"Find the shortest possible complete path(s).\"\"\"\n",
" frontier = {(path[-1], velocity(path)): path}\n",
" completed = []\n",
" while not completed:\n",
" frontier = expand(frontier)\n",
" completed = list(filter(is_complete, frontier.values()))\n",
" return completed"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"image/png": "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 truncated "image/png": "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 truncated
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
@@ -351,14 +286,16 @@
} }
], ],
"source": [ "source": [
"plot(search([start]))" "solutions = search([start])\n",
"\n",
"plot(solutions)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"We see that the fastest path takes 12 moves, and there are several ways to get there.\n", "We see that the fastest path takes 12 moves, and there are 7 ways to get there (with other ways discarded).\n",
"\n", "\n",
"# Submitting your Answer\n", "# Submitting your Answer\n",
"\n", "\n",
@@ -370,30 +307,65 @@
"> 4 5 6\n", "> 4 5 6\n",
"> 7 8 9\n", "> 7 8 9\n",
"\n", "\n",
"I will define two functions to translate back and forth between my path and The Riddler's list of digits: " "I will define two functions to translate back and forth between my `Path` and The Riddler's list of `Digits`: "
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"Digits = List[int] # each int is 1-9\n",
"\n",
"def digits_from_path(path) -> Digits:\n",
" \"\"\"The digits that the path represents.\"\"\"\n",
" return [1 + accelerations.index(velocity(path[:i + 1]) - velocity(path[:i]))\n",
" for i in range(1, len(path))]\n",
"\n",
"def path_from_digits(digits, start=start) -> Path:\n",
" \"\"\"The path that the digits represent.\"\"\"\n",
" v = zero # Velocity\n",
" path = [start]\n",
" for d in digits:\n",
" v += accelerations[d - 1]\n",
" path.append(v + path[-1])\n",
" return path"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 10,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"data": {
"text/plain": [
"[[3, 3, 1, 7, 7, 8, 4, 8, 9, 9, 6, 3],\n",
" [3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 6, 6],\n",
" [3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 6, 3],\n",
" [3, 3, 1, 7, 7, 8, 4, 8, 9, 9, 3, 3],\n",
" [3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 9],\n",
" [3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 6],\n",
" [3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 3]]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [ "source": [
"Digits = List[int]\n", "[digits_from_path(path) for path in solutions]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Alternative Solutions\n",
"\n", "\n",
"def digits_from_path(path) -> Digits:\n", "We can search from five different two-move opening sequences and one five-move sequence, and get different solution paths. Every solution is 12 moves. I don't understand why every plot has exactly 7 solution paths; I suppose it is because the finish line is crowded and there are only so many ways to get there."
" \"\"\"The digits that the path represents.\"\"\"\n",
" return [deltas.index(velocity(path[:i + 1]) - velocity(path[:i])) + 1\n",
" for i in range(1, len(path))]\n",
"\n",
"def path_from_digits(digits, start=start) -> Path:\n",
" \"\"\"The path that the digits represent.\"\"\"\n",
" velo = zero # Velocity\n",
" path = [start]\n",
" for d in digits:\n",
" velo += deltas[d - 1]\n",
" path.append(velo + path[-1])\n",
" return path"
] ]
}, },
{ {
@@ -402,127 +374,104 @@
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "data": {
"output_type": "stream", "image/png": "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 truncated
"text": [ "text/plain": [
"[3, 3, 1, 7, 7, 8, 4, 8, 9, 9, 6, 3]\n", "<Figure size 432x288 with 1 Axes>"
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 6, 6]\n", ]
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 6, 3]\n", },
"[3, 3, 1, 7, 7, 8, 4, 8, 9, 9, 3, 3]\n", "metadata": {},
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 9]\n", "output_type": "display_data"
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 6]\n", },
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 3]\n" {
] "data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO2deZhU1Zn/P6eWruqu3jcWA422QERQkdaJSwYCKApGjUmEiQrMhIjmF3BMIGqSCSQxkzhqJlGjmGVE4qgxk8RoJAqiqMQgNNEgStgkgGBDr/TeXVX3/P6oharqqu7q6qquut3v53n66ap7z3ZP3e9933vuee9RWmsEQch8LOlugCAI8SFiFQSTIGIVBJMgYhUEkyBiFQSTIGIVBJMgYk0SSqnVSqknBqGeu5VSdUqpmj7SLVNKHVNK/S2Jdf9NKfWRUur2ZJUpxM+QEqtSqjXiz6uUejAF9cxQSn2Y7HLjqHcM8DVgktZ6ZB/JVwNf1lqfG5J/slLqJb/Ywx6wK6UcSqlfKqUOKaValFJvK6WuDE3jL+tLwKqkHJDQL4aUWLXWuYE/YATQAfwmzc1KJhVAvdb6RBxpi4FdEdvcwDPAF6OktwFHgOlAAfAfwDNKqXER6XYBBUopa/zNFpKC1npI/gGLgA8AFWP/YuDPwIPASeDvwKyQ/f8K7AZa/OUs9W934bsIGECr/280Pkv2DLDOn+c9oCqkvDuAo/59e0LrimhXgb+MWuAQ8C18F9XZEfWu7eXYrYAGzoix/0zfT99nH+4EPhuxbay/bEcfedcCDwN/8rf3z8BI4MdAo7+/p4akPwvYDDT5++5q//ZPADWANSTtZ4Cd/s8W4E7gAFDv/w2K/fucwBP+7U3AdmBEus/NhM/pdDcgZQcGrwCre9m/GPAAtwN2YL5ftIEfeh5QCSh81qYdON+/bwbwYUR5q4FOYK5fLD8Atvr3TcRntUb7v48DKmO0ax3wByDPn24v8MVY9cYo4wp/W1wx9vcpVnyeSSfw8Yjt2f7tV/WRfy1QB0zzi+YV4CCw0N8/dwOv+tPagf3AN4AsYCa+i9pE//4DwGUhZf8GuNP/+d+BrcDHAAfwKPCUf99S4Hkgx1/nNCA/3edmwud0uhuQkoPyXf29wOm9pFkMHCPE8gLbgJtipH8WuM3/OZZYXw75Pgno8H8+EziBzzrae2mTFejCd08a2LYU2Byr3ihlVOOzfMt7SdOrWP3ieRl4NMb+Zfgs/Du9lLEW+HlEnt0h36cATf7Pn8RnPS0h+5/Cf7H1C/t//J/zgDagwv99N+Ee0Sh87r4N+DfgTeCcdJ+TyfgbUvesISwEtmitD/aR7qj2/8J+DuFzaVFKXamU2qqUalBKNeGzmKV9lBc6QtsOOJVSNq31fnwWYDVwQin1tFJqdJT8pfgsy6GINp3WR72hXAAsAFYrpez9yAeAUsoC/AroBr4SZb8N+A5wEzC1j+KOh3zuiPI91/95NHBEa22E7A897ieB65RSDuA64K9a60AfVQC/V0o1+X+n3fgu1CP8x/ES8LR/ZPy/EumTTGEoi/XxONKdppRSId/HAsf8J8Vvgfvw3eMUAuvxucTgs1z9Qmv9pNb6UnwnlwbuiZKsDp9VqIho09F+1KPxeQFF+KxM3Pj74pf4TvTPaq3dUZKN8Jf9bMSFbiAcA8b4LxQBgsettX4fn3ivBL6AT7wBjgBXaq0LQ/6cWuujWmu31vo7WutJwMXAVfjODVMy5MSqlLoY3xU5nlHgcmC5UsqulPo8vkGO9fismwPfII/H/wjj8pB8x4ESpVRBnG2aqJSa6b8IdOKzKt7IdFprL74Bku8rpfKUUhXAV/ENksSN1rrL/zEroh1KKeUMbFdKOf1tCvAIvj74tNa6I0bxAcvUFWN/IryFz7X9uv+3mAF8Gng6JM2TwHLgnwn/bdfg668KAKVUmVLqGv/nTymlpvhHrpvxXQh79LtZGHJixTcK/DutdUscad8CxuOzaN8HPqe1rvfnXY5POI34rubPBTJprf+O757qA7/7Fc2lDcUB/NBfTw2+i8Q3YqRdhu/E/QDYgu8k/Z84jiUSTc/ftwLfheI9//cOfCPT+E/2pcB5QE3Is+obIsoIPLIxSBJa627ganyWsw7fKPJCfz8HeArfPfsrWuu6kO0/wffbbFBKteAbbPon/76RwP/hE+pu4DX6eeHLJFTyPBlzoZRaDCzxu6ZDDqXUMeDrWuuknpxKqeuBh7TW5cksV+iboWhZBR93AquUUjuSVaC/rP/E98xYGGRs6W6AkBq01uvwPbNNZpnTklme0D+GrRssCGZD3GBBMAkiVkEwCf26Zy0tLdXjxo1LUVMEQdixY0ed1ros2r5+iXXcuHFUV1cnp1WCIPRAKXUo1j5xgwXBJIhYBcEkiFgFwSSIWAXBJIhYBcEkiFgFwSSIWAXBJKRErOEvX5B8ZsuXjjolX9+kRKyJBgdIvszIl446JV/fiBssCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQaJuJF9G1Cn5+kaibiRfRtQp+fpG3GBBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJIlZBMAn9WvlcMAfrVz1AZVslOdY82r0tHHAdYO53lg+5OocbYlmHGOtXPcCkjsm4bPkopXDZ8pnUMZn1qx4YUnUOR1JiWZVSCU1clnwDz1fZVonNZg/bZrPYObtjCm/f/pu469RAvHEiZ9unYLWEn0o2i53Ktsq468vkPk1nvlBSIlazRDQMtXytDfXkWPOi7rMoK168CdXfFxZljbo9Vluikal9mu58ocg96xCgtaGe1+9/ksquM3DZ8qOmafe2UPXfC1JS/54VL0Stt93bkpL6hityz2piWhvqWf/NBzn6n1s5x3seHUYH73e9h8dwh6XzGG4OuA6krB0HXAd61Km15pBxOGV1DkdErCYkqkhLdzH5nmu4/L9v4f3sXbR5mtFa0+Zp5v3sXSkdmZ37neURdbbQ5m1hgm0iG+9fk7J6hxuqP750VVWVrq6uTmFzhN6IdHfruo9zYnQtM29bgs1u77uAQeTgOztoXXeYPFsB+0bs5bKv3ZLuJpkCpdQOrXVVtH1yz2oCQkV6ju086ozjHCo9nJEiDXD6edM4CLSsO8z44xPYeP8aEewAEbFmMGYUaSgi2OQiYs1Aooq07DAzl5tDpKGIYJOHiDWDGEoiDUUEmxxErBnAUBVpKCLYgSNiTSPDQaShiGAHhoh1EIiMSNmfvR9lWFIm0k0PriNr7RqK2xppcBXRvfgWZi1bmIQjGXidkYLd8NVHqLCMlWidOJDnrCkmEJFis5wSodYapZTvOelptUm1pJseXEfxmvtwek/NKOq02mm4ZUXKBJtInQff2UHXEzW4rHlhS0t4DHfKJ3FkMoP+nNUsEQ3pioJRStHpaWfyPdfEJdL+1Je1dk2YaACcXjfFa+7juddei6sMgH8c+gfjKsbFlXbM7u1R68xauwZiiPX086ax54n1PdaAkWid2EjUTYrzxYo8cViz47am8dZnGAYlbY3R6/O6yT+8P65yAM5RQJzpHRFCDVAcoy0Bcqy5MbZLtE405J41xbR7W1IekWIYBm898yea1zzM2Bhp6l1FzNgWv2XtD29Mu5jSKMJscBX1mm8w+mYoIRP5U8z+7AM9rqrJioIxDIO/PP0CG2d+msLVK3C1NLLn/Bl0WsMtdqfVTvfi1I26di++pUedGmiaNbfXfNGidVIdIWRmRKwpxmJVvntUb3vSomCiifTw4tu4YMsrXPvkIzTcsoI6VxEGUOcqSungEsCsZQvD6mzILqDFnsPIF3/Prs3bYuYLROtorQctQsjMyGhwCuloaeHg6lfxai8f//6V2LOdAyovzN2t+YB6VxFtn1/IjNsW4xhg2cnm0K59HFm0CIe7i+wHHmHyjAtjp73jVfZ69nLZ/UsHsYWZSW+jwWJZU8jm+9eSby/iaOmxAQm1N0s6585bMk6oABWTxzPm8cfpsjvoWH5rrxZWiA8Ra4roaGmhoqWCxu46Zt3+xYTKMKNIQxHBJhcRa4oYiFU1u0hDEcEmDxFrCkjUqg4lkYYigk0OItYU0F+rOlRFGooIduCIWJNMf6zqcBBpKCLYgSEzmJLM5vvXMsV+HrvydzLFL7bIiJSuRTfjKi8LPoLxuoo4vPi2jHwEk2wqJo+Hxx/nyKJFsPxWnr/iM5yjLsHR7OaNaRcPSoSQWRGxJpGgVdWnrGpkREppWyPGw/+FBT2sRBpKQLA1/7KAyuf+F665BIWvbzrX3McmEMFGISVucGQkxXDJF+1eNVoUjAVNS1ZO3O7uYB/fYNRZMXk8Hpu9x3o6wWidJNdn1nyhSNRNkvJFs6oQO/LE1d0etzWN1U6tNR6PB4/Hg2EYeL1eDMPAMAy01tTV1VFfX49SCovFgtVqxWKxYLFYsNvt2Gyxf/7B6NPCjpNRt/cVrZNofWbMF4q4wUkieK+a97fgvSr4Ik8SiUiJhtaazs5Ouru7cbvdQZEmSkC0drudrKwsHA5HUixAvCSzb4YDMhqcBMJGgL+6JGxf16KbMSKcvf5EwRiGQXt7Ow0NDRw/fpzGxkba2tro7u4ekFADZXd1ddHa2hpWfnt7e1IsQV9Ei9ZJdYSQmRHLmgRiWVUAZ2FB8B7V1d0e9zuRuru7aW9vp7Ozc8CijBfDMOjo6KCjo4OWlhays7PJycnp1V0eCLOWLWQTUPyhL6SubpDeF2VWRKwDJOxeNcKqGoZBx88fpTavlE+88TJZTkef5XV2dtLa2kp3d3eqmhwXXq+X1tZW2tracDgc5ObmkpWVlfR6Zi1byKE7XsVjtzBzx5tJL38oIW7wAAmOAJcc7TFb6c0n/sDHag/RtWBRn0LLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO2deZwU1bn3v6eX6Z59HxYvMIqAoqOyet1CYlARXHLNglcJkjdEYt44ueZCQJMbMa9J8MXkTYxxSWKixFeNuUmMBKJgcENFlmgARTYNIsgyzAzDTE9Pb+f+0QvdPd3TPT3V010zz/fz6c/0VJ2nzqnq+tXz1Knz1FFaawRByH8suW6AIAjpIWIVBJMgYhUEkyBiFQSTIGIVBJMgYhUEkyBiNQil1FKl1OP9UM/dSqkmpdShFOVuVUodVEr9w8C6/6GU+lgpdZtR2xTSZ0CJVSnVHvfxK6V+loV6PqmU+sjo7aZR7wjgP4HxWuuhKYovBb6mtT43yv5spdTzIbHHPGBXSjmUUo8opfYppU4opd5SSl0ZXSa0ra8AdxqyQ0KvGFBi1VqXhD/AEKAT+H2Om2Uko4BjWusjaZStArbHLfMCTwNfTlDeBuwHpgHlwH8BTyul6uPKbQfKlVLW9JstGILWekB+gJuA9wGVZP084DXgZ8Bx4D3g01HrvwTsAE6EtrMgtLyY4EUgALSHPsMJerKngRUhm3eAyVHbWwwcCK3bGV1XXLvKQ9s4CuwDvkPwojo9rt5He9h3K6CB05KsPz3406c8hluBz8YtGxnatiOF7aPAA8BfQ+19DRgK/ARoCR3vCVHlzwReAlpDx+6a0PJ/BQ4B1qiy/wZsDX23AEuAvcCx0G9QFVrnBB4PLW8FNgFDcn1uZnxO57oBWdsxWAcs7WH9PMAH3AbYgdkh0YZ/6FnAaEAR9DYuYGJo3SeBj+K2txRwAzNDYvkhsCG0bhxBrzU89H89MDpJu1YAfwZKQ+V2AV9OVm+SbcwItaU4yfqUYiUYmbiBM+KWF4aWX5XC/lGgCZgUEs064ANgbuj43A28GCprB/YAdwAFwKUEL2rjQuv3ApdFbfv3wJLQ9/8ANgD/AjiAh4EnQ+sWACuBolCdk4CyXJ+bGZ/TuW5AVnYqePX3A6f2UGYecJAozwtsBL6YpPwzwDdC35OJ9YWo/8cDnaHvpwNHCHpHew9tsgJdBO9Jw8sWAC8lqzfBNjYT9HyNPZTpUawh8bwAPJxk/a0EPfzbPWzjUeCXcTY7ov5vAFpD3y8h6D0tUeufJHSxDQn716HvpUAHMCr0/w5iI6JhBMN9G/C/gNeBc3J9ThrxGVD3rFHMBdZrrT9IUe6ADv3CIfYRDGlRSl2plNqglGpWSrUS9Jg1KbYX3UPrApxKKZvWeg9BD7AUOKKUekopNTyBfQ1Bz7Ivrk2npKg3minA9cBSpZS9F3YAKKUswG8BD/D1BOttwF3AF4EJKTZ3OOp7Z4L/S0LfhwP7tdaBqPXR+/0EcJ1SygFcB/xdax0+RqOAPymlWkO/0w6CF+ohof14Hngq1DP+fzM5JvnCQBbrY2mUO0UppaL+HwkcDJ0UfwDuJXiPUwGsJhgSQ9Bz9Qqt9RNa64sJnlwauCdBsSaCXmFUXJsO9KIeTTAKqCToZdImdCweIXiif1Zr7U1QbEho28/EXej6wkFgROhCESay31rrdwmK90rgBoLiDbMfuFJrXRH1cWqtD2itvVrru7TW44ELgasInhumZMCJVSl1IcErcjq9wHVAo1LKrpT6PMFOjtUEvZuDYCePL/QI4/Iou8NAtVKqPM02jVNKXRq6CLgJehV/fDmttZ9gB8n3lVKlSqlRwDcJdpKkjda6K/S1IK4dSinlDC9XSjlDbQrzIMFjcLXWujPJ5sOeqSvJ+kx4k2Bo+63Qb/FJ4GrgqagyTwCNwCeI/W0fIni8RgEopWqVUteGvn9KKdUQ6rluI3gh7HbczcKAEyvBXuA/aq1PpFH2TWAMQY/2feBzWutjIdtGgsJpIXg1fzZspLV+j+A91fuh8CtRSBuNA1gWqucQwYvEHUnK3krwxH0fWE/wJP11GvsSj6b77zuK4IXindD/nQR7pgmd7AuA84BDUc+qb4zbRviRTQCD0Fp7gGsIes4mgr3Ic0PHOcyTBO/Z12mtm6KW/5Tgb7NGKXWCYGfT+aF1Q4H/JijUHcDL9PLCl08o4yIZc6GUmgfMD4WmAw6l1EHgW1prQ09OpdQXgPu11nVGbldIzUD0rEKQJcCdSqktRm0wtK0fEHxmLPQztlw3QMgOWusVBJ/ZGrnNSUZuT+gdgzYMFgSzIWGwIJgEEasgmIRe3bPW1NTo+vr6LDVFEIQtW7Y0aa1rE63rlVjr6+vZvHmzMa0SBKEbSql9ydZJGCwIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJiErYo19+YLYmc0uF3WKXWqyItZMkwPELj/sclGn2KVGwmBBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJknUjdnlRp9ilRrJuxC4v6hS71EgYLAgmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkGybsQuL+oUu9RI1o3Y5UWdYpcaCYMFwSSIWAXBJIhYBcEkiFgFwSSIWAXBJIhYBcEkiFgFwSSIWAXBJIhYBcEkiFgFwSTYct0AwXhWNi5jbEEDRdZSXP4T7PJs4+r7lgy4Ogcb4lkHGCsbl9HgnEqxrQylFMW2MhqcU1nZuGxA1TkYyYpnVUplNHBZ7PpuN7agAZvFHrPMZrHT4JzCG7c+2uu606GhcErCOscWNKS9jXw+prm0iyYrYjVLRsNAs/N0dVFkLU24zqrsVBRUZ1R/KqzKnnB5srYkIl+Paa7topF71gGAp6uL57/7E0Z2jabaOSRhGZf/BGf+6Oqs1L9z4SqKbWUJ6xSMQ+5ZTYynq4uVi+9hx+KVTFAX4rQV8kHbTnwBb0w5X8DLLs+2rLVjl2dbtzq11vyzY1fW6hyMiFhNSCKRbm3fQM03J3LJA/PZ5t5Ih68NrTUdvja2uTdmtWf26vuWxNTp8rXTFejk9JKzeW7Zz7JW72BD9SaWnjx5st68eXMWmyP0RHy42+FrY6/7Xc6/Yw7Vw4flunkxvProE9RtL8emCthd/R4zltya6yaZAqXUFq315ITrRKz5j5lEGo0ItveIWE2KWUUajQi2d4hYTcZAEGk0Itj0EbGahIEm0mhEsOkhYs1zBrJIoxHBpkbEmqcMFpFGI4LtGRFrjonPSNnp3ooqtgwqkUYTLdg97dupLx4r2TohRKw5JJyREj3QXesASlkGnUijefXRJxj2TjUOS2HM1BK+gDfrgzjymZ7EKnPdZNkuURaMUha6/J3UfHMiM+9flFKoA3Gum0vm3UBAB7qVzyRbJxPMYheNZN1k2S5Z5kmBxZm2N01Wn9Yan8+Hz+cjEAjg9/sJBAIEAgG01jQ1NXHs2DGUUlgsFqxWKxaLBYvFgt1ux2ZL/vP3x7EptBYnXC7ZOomRrJss4/KfMCwjRWuN2+3G4/Hg9XojIs2UsGjtdjsFBQU4HA5DPEC6GHlsBgMykD/L7HRvRetYQfUmCyYQCOByuWhububw4cO0tLTQ0dGBx+Ppk1DD2+7q6qK9vT1m+y6XyxBPkIpE2TrZzhAyMyLWLKOclsg9am+yYDweD62trRw5coTW1lbcbnefxZmKQCBAZ2dnpN62tjZ8Pl/W6gtn62it+y1DyMxIb3AW8XR18d6SVRRYChi6+Hwq6mpT2rjdbtrb2/F4PP3QwtQopXA4HJSUlFBQUJCVOvYtfpG9J3Zw6QNfy8r2zUS/9wYLQZ7/9k+octSy1/NuSqF6PB6OHTtGc3Nz3ggVTt4nNzU10dLSklVPK/SMdDBlCU9XF6P8Y2jXx7nov76UtFwgEKCtrQ2Xy9WPrcuMzs5O3G43xcXFlJaW9mtnlCCeNWuk41U7Ozs5evSoKYQaRmtNe3s7TU1NeRUBDAbEs2aBVF7VTN40GV6vl2PHjlFSUkJpafrPRYXMEc+aBXryqj6fj2PHjplaqGG01pw4cYLm5uas91QLIlbDiXhVb3ev2tXVxbFjx/B6vUmszUm4A2qg7Ve+IWI1mGReNTywwe/357B12SMcMXR1deW6KQMWEauBJPOqLpeL1tbWfhkVlEsCgQAtLS0i2CwhWTcG2iXyqmGhDhYyFWz8kMx0yZffPlt20WRFrGbJaDDSLpFXdbvdHD9+PKM6zExYsL25h1Uqs1MxH377bNpFI2GwQcR7VZ/PNyhC32SEBSu9xMYhYjWAeK8qJ2qQ8AVLMAYRqwHEe9XW1lZ5jBHC7XZz4oTkpxqBiLWPxHtVl8uF2+3OdbPyinzKIjIzItY+Eu1VS6uraGtry3WT8g6tNcePHx+09+9GIWLtA/Fe9fjx44P+PjUZXq9XwuE+ImLtA9Fe1VlWKuFvCjo6OiQftg+IWDMk3quK10hNeOC/kBki1gyJ9qoFJcXS+5smnZ2d0tmUISLWDIj3qu3t7blukqmQ45UZknzeC6LnrKly1PJ+23vUl5Xiam7OddNMRVdXFz6fD5vNxsrGZZxXeCFjSs9m58JVg36um54Qz5om4Tlrim1lkUHZI0tGs2bh/8txy8yH1hqXyxU5pkoplFIU28pocE5lZeOyXDcxL5GsmzRJNGeNzWJnnPOcjOoe7HR2diY9pjLXTWIk6yZNks2/0pt5WYST+P1+Q45pPp8zRthFI2FwmiSbf0XmZckcOaa9Q8SaJsnmZXnPvTVHLTI/O91bZa6bXiBiTZPwvCy+gDcyL8s/XG8y5Y6bct000zL5jpvY1ilz3aSLzHXTSzY2Pk6RrZjh35kLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
} }
], ],
"source": [ "source": [
"for path in search([start]):\n", "openings = [3, 3], [3, 5], [3, 6], [6, 2], [6, 3], [3, 5, 2, 4, 4]\n",
" digits = digits_from_path(path)\n", "for digits in openings:\n",
" assert path == path_from_digits(digits_from_path(path)) # Inverses\n", " plot(search(path_from_digits(digits)))"
" assert digits == digits_from_path(path_from_digits(digits)) # Inverses\n",
" print(digits)"
] ]
}, },
{ {
"cell_type": "markdown", "cell_type": "markdown",
"metadata": {}, "metadata": {},
"source": [ "source": [
"# Alternative Paths\n", "# Tests and Visualizations\n",
"\n", "\n",
"Here we search from several different opening move sequences and get different results, but all of 12 moves:" "Below are a few unit tests; there should be more.\n",
"\n",
"Here are three tests/visualizations for `intersects_circle`:"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 12,
"metadata": {}, "metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO2deZxT1f333yfLJLNvmWGTRUGo1FGRxUdccAEXcOnPLrRqkbZW2j6VPrbi/qvYl/2JP/z1sW7VVivSvtTq41KoFEFxV2SpFhBkFxFEGIbZJ8kkOc8fNwmZTDKTySST3Mz3/Xrd12TuPeeec5fP/X7Pued7j9JaIwhC9mPJdAUEQUgMEasgmAQRqyCYBBGrIJgEEasgmAQRqyCYBBFrilBKzVdK/bUPyrlbKVWrlDrQTbrrlVL7lVL/TmHZ/1ZKfamUuiFV+xQSJ6fEqpRqjlr8SqkH01DOOUqpL1K93wTKHQr8ChirtR7YTfL5wM+01idH5D9RKfVqUOwdXrArpRxKqSeUUnuUUk1KqY+UUhdHpgnu68fAnSk5IKFH5JRYtdZFoQUYALQBz2e4WqlkOHBYa30wgbQVwKaode3Ac8CPYqS3AXuBKUAp8J/Ac0qpEVHpNgGlSilr4tUWUoLWOicX4BpgF6DibJ8NvAc8CDQAnwLnR2z/AbAFaAruZ05wfSHGQyAANAeXwRiW7DlgcTDPJ8CEiP3dDOwLbtsaWVZUvUqD+zgE7AHuwHioTo0qd1EXx24FNHBcnO2jjEvf7TncAHwzat2w4L4d3eRdBDwC/DNY3/eAgcD9wJHg+R4Xkf4E4E2gPnjuLguu/1/AAcAakfY/gA3B3xbgFmAncDh4DSqC25zAX4Pr64G1wIBM35tJ39OZrkDaDgxWAfO72D4b8AE3AHZgZlC0oQs9AxgJKAxr0wqcGtx2DvBF1P7mA25gelAs9wCrg9vGYFitwcH/RwAj49RrMfB3oDiYbhvwo3jlxtnHRcG6FMbZ3q1YMTwTN/C1qPX5wfWXdJN/EVALjA+KZhWwG5gVPD93A28E09qBHcBtQB5wHsZDbUxw+05gWsS+nwduCf7+P8Bq4BjAATwGPBPcNgdYChQEyxwPlGT63kz6ns50BdJyUMbT3w8c20Wa2cB+IiwvsAb4fpz0LwO/CP6OJ9bXIv4fC7QFf48CDmJYR3sXdbICHow2aWjdHODNeOXG2Mc6DMs3t4s0XYo1KJ7XgMfibL8ew8J/3MU+FgF/isqzJeL/GqA++PssDOtpidj+DMGHbVDYfw7+LgZagOHB/7fQ0SMahOHu24AfAu8DJ2X6nkzFklNt1ghmAe9qrXd3k26fDl7hIHswXFqUUhcrpVYrpeqUUvUYFtPVzf4ie2hbAadSyqa13oFhAeYDB5VSzyqlBsfI78KwLHui6jSkm3IjmQh8F5ivlLL3IB8ASikL8BfAC/w8xnYbcBfwfWBcN7v7KuJ3W4z/i4K/BwN7tdaBiO2Rx/00cIVSygFcAfxLax06R8OBl5RS9cHrtAXjQT0geByvAs8Ge8b/O5lzki3kslifSiDdEKWUivh/GLA/eFO8ANyH0cYpA5ZhuMRgWK4eobV+Wmt9JsbNpYF7YySrxbAKw6PqtK8H5WgML6Acw8okTPBcPIFxo39Ta90eI9mA4L5fjnrQ9Yb9wNDggyJE+Li11psxxHsxcCWGeEPsBS7WWpdFLE6t9T6tdbvW+i6t9VhgMnAJxr1hSnJOrEqpyRhP5ER6gauBuUopu1Lq2xidHMswrJsDo5PHF3yFcUFEvq+ASqVUaYJ1GqOUOi/4EHBjWBV/dDqttR+jg+S3SqlipdRw4JcYnSQJo7X2BH/mRdVDKaWcofVKKWewTiH+gHEOLtVat8XZfcgyeeJsT4YPMVzbm4LX4hzgUuDZiDRPA3OBs+l4bR/FOF/DAZRSVUqpy4O/z1VK1QR7rhsxHoSdzrtZyDmxYvQCv6i1bkog7YfA8RgW7bfAt7TWh4N552II5wjG03xJKJPW+lOMNtWuoPsVy6WNxAEsCJZzAOMhcVuctNdj3Li7gHcxbtI/J3As0Wg6X9/hGA+KT4L/t2H0TBO82ecApwAHIt5VXxW1j9ArmwApQmvtBS7DsJy1GL3Is4LnOcQzGG32VVrr2oj1v8e4NiuUUk0YnU2nBbcNBP4fhlC3AG/RwwdfNqFS58mYC6XUbODaoGuacyil9gM3aa1TenMqpb4DPKS1rk7lfoXuyUXLKhjcAtyplFqfqh0G9/VfGO+MhT7GlukKCOlBa70Y451tKvc5PpX7E3pGv3WDBcFsiBssCCZBxCoIJqFHbVaXy6VHjBiRpqoIgrB+/fparXVVrG09EuuIESNYt25damolCEInlFJ74m0TN1gQTIKIVRBMgohVEEyCiFUQTIKIVRBMgohVEEyCiFUQTEJaxNrx4wuSz2z5MlGm5OuetIg12eAAyZcd+TJRpuTrHnGDBcEkiFgFwSSIWAXBJIhYBcEkiFgFwSSIWAXBJIhYBcEkiFgFwSSIWAXBJIhYBcEkiFgFwSSIWAXBJEjUjeTLijIlX/dI1I3ky4oyJV/3iBssCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQcQqCCZBxCoIJkHEKggmQaJuJF9WlCn5ukeibiRfVpQp+bpH3GBBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJIlZBMAkiVkEwCSJWQTAJIlZBMAm2TFdASD1L5y5gdF4NBdZiWv1NbPNu5NIHbsm5MvsbYllzjKVzF1DjnEShrQSlFIW2Emqck1g6d0FOldkfSYtlVUolNXBZ8vU+3+i8GmwWe4d1NoudGudEPrh+UY/LToSa/IkxyxydV5PwPrL5nGYyXyRpEatZIhpyLZ/X46HAWhxzm1XZKcurTKr87rAqe8z18eoSi2w9p5nOF4m0WXMAr8fDq7++n2GekVQ6B8RM0+pv4oT/uTQt5W+98RUKbSUxyxRSh7RZTYzX42Hpzfey5ealjFOTcdry2d24FV+gvUM6X6Cdbd6NaavHNu/GTmVqrfmsZVvayuyPiFhNSCyRbmhejeuXp3LWI9ey0b2GFl8jWmtafI1sdK9Ja8/spQ/c0qHMVl8znkAbo4pOZPmCB9NWbn9D9cSXnjBhgl63bl0aqyN0RbS72+JrZKd7M6fddjWVgwdlunodeGfR01RvKsWm8the+SkX3XJ9pqtkCpRS67XWE2JuE7FmP2YSaSQi2J4jYjUpZhVpJCLYniFiNRm5INJIRLCJI2I1Cbkm0khEsIkhYs1yclmkkYhgu0fEmqX0F5FGIoLtGhFrhomOSNnq3oAqtPQrkUYSKdgdzZsYUThaonWCiFgzSCgiJXKgu9YBlLL0O5FG8s6ipxn0SSUOS36HqSV8gfa0D+LIZroSq8x1k+Z8saJglLLg8bfh+uWpTH9oXrdCzcW5bs6afSUBHeiUPplonWQwS75IJOomzfniRZ7kWZwJW9N45Wmt8fl8+Hw+AoEAfr+fQCBAIBBAa01tbS2HDx9GKYXFYsFqtWKxWLBYLNjtdmy2+Je/L85NvrUw5nqJ1omNRN2kmVZ/U8oiUrTWuN1uvF4v7e3tYZEmS0i0drudvLw8HA5HSixAoqTy3PQHZCB/mtnq3oDWHQXVkyiYQCBAa2srdXV1fPXVVxw5coSWlha8Xm+vhBrat8fjobm5ucP+W1tbU2IJuiNWtE66I4TMjIg1zSinJdxG7UkUjNfrpb6+noMHD1JfX4/b7e61OLsjEAjQ1tYWLrexsRGfz5e28qKjdQB2NH/SbzuXukPc4DTi9XgY7j+eZt3AwJtPo6y6CoAxzIibx+1209zcjNfr7atqxsTv99Pc3ExLSwsOh4OioiLy8vJSXk5ImAd276bx4U+pzBuA1+Mhz+FIeVlmRyxrGnn19vupcFSx07s5LNR4eL1eDh8+TF1dXcaFGkmonVxbW8uRI0fSZmkHHnssO9s+oco5iBV3/T4tZZgdEWuaCFvV9gbO+M8fxE0XCASor6+ntrYWj8fThzXsOW1tbRw6dIjGxsa0tGnH3fhNWn3NDGkdgTfLz0UmELGmiUSsaujmb21t7ePaJY/WmubmZmpra1PuAYh17RoRaxrozqqGrOmRI0fw+/0ZqGHvaW9v5/DhwzQ1pfY1i1jX+IhY00BXVtXn83H48GFTWdN4aK1pamqirq4uZT3VYl3jI2JNMV1ZVY/Hw+HDh2lvb4+T25yEOqBSdVxiXWMjYk0x8axqaGCDWd3e7gh5DKnoJBPrGhsRawqJZ1VbW1upr6/vk1FBmSQQCHDkyJGUCFasa2ck6iaF+WJZ1ZBQ+wvJCjb6nCZqXbPl2qcrXyRpEatZIhpSmS+WVXW73TQ0NCRVhpkJCbYnbdhY5zQR65oN1z6d+SIRNzhFRFtVn8/XL1zfeIQE25teYmm7dkTEmgKirWoqbtRcIPTA6g3Sdj2KiDUFRFvV+vr6nHs9kyxut7tXAyfEuh5FxNpLoq1qa2srbrc709XKKnobRSTW1UDE2ksirWpxZQWNjY2ZrlLWobWmoaEh6fa7WFcDEWsviLaqDQ0N/b6dGo/29vZeucNiXUWsvSLSqjpLisX97YaWlpak42HFuopYkybaqqY6+iQXCQ38T5b+bl1FrEkSaVXzigql9zdB2traku5s6u/WVcSaBNFWtbm5OdNVMhW9OV/92brKB9N6QOScNRWOKnY1fsqIkmJa6+oyXTVT4fF48Pl8XX5kPB4Djz2Wj9peoKb4NPbc/gZOa0G/mSNHLGuChOasKbSVhAdlDysayYob/2+Ga2Y+tNa9Cr734UNrTb6tEKUUhbYSapyTWDp3QQprmX1I1E2CxJqzxmaxM8Z5UlJl93fa2to6vHft0bXIr+k3c+REIlE3CRJv/pWezMsiHMXv99PW1hbLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"for opening in ([3, 3], [3, 5], [3, 6], [6, 2], [6, 3]):\n",
" plot(search(path_from_digits(opening)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Tests\n",
"\n",
"The code that I have the least confidence in is `intersects_circle`. Here are some tests and visualizations for it:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
"def test_intersects(expected: bool, segments: List[Path]):\n", "def test_intersects(expected: bool, segments: List[Path]):\n",
" \"\"\"Test if segments do the expected thing with `intersects_circle`.\"\"\"\n", " \"\"\"Test if segments do the expected thing with `intersects_circle`.\"\"\"\n",
" plot(segments)\n", " plot(segments, finish=[])\n",
" for p, q in segments:\n", " for p, q in segments:\n",
" assert intersects_circle(p, q) is expected" " assert intersects_circle(p, q) is expected"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": 13,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"image/png": "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 truncated "image/png": "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 truncated
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
@@ -542,12 +491,12 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 15, "execution_count": 14,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"image/png": "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 truncated "image/png": "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 truncated
"text/plain": [ "text/plain": [
"<Figure size 432x288 with 1 Axes>" "<Figure size 432x288 with 1 Axes>"
] ]
@@ -564,6 +513,154 @@
" [Point(-3, -2),Point(1, -4)],\n", " [Point(-3, -2),Point(1, -4)],\n",
" [Point(-7, 0), Point(7, 7)]])" " [Point(-7, 0), Point(7, 7)]])"
] ]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# The waypoints that are checked to see if they are outside the circle\n",
"p, q = Point(-7, 0), Point(5, -6)\n",
"plot([waypoints(p, q, 20)], finish=[])\n",
"assert not intersects_circle(p, q)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here's a visualization for `expand(frontier)` showing the first few expansions.\n",
"Note that the growth in number of paths is much slower then 9<sup><i>n</i></sup>."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAfX0lEQVR4nO3deXwb5Z3H8c+jW7LlI04cJ0BJQxNuStOwJFBou+kSFghpOQrLtS13G0gCLbR0X7C0paVbWiBpoYRCaaFQ7pJCslzLFSABcpQAKRAIoUASkjixLdm69ewfM3JkW5dlydLIv/fr5ZelkR7No9F8NY+emWdGaa0RQlQ/W6UrIIQojIRVCIuQsAphERJWISxCwiqERUhYhbAICeswUUpppdTnyjyPvZVSa5RSAaXU3BzPa1NKvaiU6lBKnTKI19+plPpQKXVqaWosBqNmwqqUciulbjdXpoC50v572uMTzMAE0/6uLFNdnlNKnVuO187jcuA5rbVfa70wx/NOBpxAq9b6PgClVKtS6i9KqU1KqU6l1EtKqUPTC2mtm4HrgB+W6w2I7GomrIAD+Aj4MtAIXAncr5Sa0O95TVrrevPvp8NbxbLbE3irgOeNAtZrraNp0+qB14Avmo//CViilKrvV/ZNoKUEdRWDpbWu2T9gLXCieXsCoAFHgWU3AlcA64CdwB2Ax3ysGXgM2GY+9hiwu/nYz4AEEAaCwG/N6Rq4EFhvlrkJUOZjnwOeBzqB7cB9Oep1PEYgO4DngH3N6c/0m+/kHK/xU+DOApZBF/DFftOOBDYXUPY54BrgZbM+j2KE/G7zdV8DJqQ9/zBzWqf5/zBz+qnAyn6vfQnwN/O2G/gV8E/gU+AWwGs+Ntr8bDqAHcAywFbp9bLo9bnSFSjbG4Ox5oq7j3k/FdZPgI/N8I3OUX4jxlZkD4wtzUvANeZjLcCJgA/wAw8Aj/RbUc/t93raXHGagM+YQT/afOwvwH9htHQ8wJey1Gky0A38G0Yz9nLgPcCVbb4ZXsNnBvuaPM872Fx+jf2mTwTiwMF5yj9n1m0vjJbOOuBd4GsYraA7gTvM547C+AI703zsP8z7LWZ9A8CktNd+DTjVvH0j8DfzNfwYXwrXmo9da4bXaf4dgfkFacW/ilegLG/K+GCeBhalTasHpporw1jgQeCJHK+xEbgw7f4xwPtZnnswsLPfipoprF9Ku38/8EPz9p3ArZhb5xx1uhK4P+2+DePL5yvZ5tuv/PEYW9/3gOYcz2sA3gCuyPL4r8z380iO13gO+K+0+78G/jft/izg7+btM4FX+5VfDnzLvP1n4Crz9iQzvD5AYXx57ZVWbjrwgXn7J8Bi4HOVXidL8VdLv1kBUErZgLuAKHBRarrWOqi1Xqm1jmutPzUfO0op1ZDj5T5Ku/0hMN6ch08ptcjszOoCXgCalFL2PNXbkna7B+MLBIwtpAJeVUq9pZQ6O0v58WY9Uu8padZxtzzzTT0/tQVqB87J9ByllBdj67RCa31thsdbgbnAkVrrr+eZ5adpt0MZ7qfef5/3ZfqQXe/rHoytLcBpGF8SPcAYjNCuMnu2O4DHzelgdIa9BzyplNqglLJ0x1hNhVUppYDbMbacJ2qtYzmenhpupHI8Z4+0258BNpm3vwfsDRyqtW7A+B2X/lqDGsqktd6itT5Paz0euAC4Octunk0YnUjGzIz3uwfG1rXQeXViNIP36/+YUsoNPGK+3gVZXmIS0Km1XlboPAvQ532ZPsOu9/UkMFopdTBGaO8xp2/HCP3+Wusm869Ra10PoLUOaK2/p7WeiLElv1QpNaOE9R5WNRVW4HfAvsAsrXUo/QGl1KHmfkibUqoFWIixm6Mzx+vNUUrtrpQaBfwIuM+c7sdYSTrMx/67X7lPMX7bFUQpdbJSanfz7k6MsCcyPPV+4Fil1AyllBPjSyOC0YkzGBHA1a8OToyfBiHgLHOrnYnTLF9KS4HJSqnTlFIOc9/vfhi/8dFax826XYfRMnjKnJ4Efg/cYG7xUUrtppSaad4+Tin1OfNLrQtjmWZarpZQM2FVSu2JsTU4GNiSti/1dPMpEzGaSAGMjqMIu5pW2dyD8a2+wfy7xpx+I+DF+GZfYb5uugXASeZBBLn2d6YcAryilApidJbM01p/0P9JWut3gDOA35jznoXxxRTt/9w8kgz87A8DjgOOwvgSSi2/I/o9z26WLxmtdbs57+9hNNEvB47TWm9Pe9o9GJ1TD5jhTfkBRlN3hfmT5GmMVg8YrYCnMXqjlwM3a62fK2Xdh1Nq14HoRym1EaOz5ulK16XUlFLnA3Mwdo90D7Ls5cBJWut/KUvlRFY1s2UVg/IgRsfUB0qpbxZaSCm1DfhP4MflqpjIzlHpCojhp7XegdHsHGy5MfmfJcpFmsFCWIQ0g4WwCAmrEBYxqN+so0eP1hMmTChTVYQQq1at2p6tb2BQYZ0wYQIrV64sTa2EEAMopfofdtlLmsFCWISEVQiLkLAKYRESViEsQsIqhEVIWIWwCAmrEBZRlrAaY32lnFXLVWKeUi6/soS12MEBUq46ylVinlIuP2kGC2ERElYhLELCKoRFSFiFsAgJqxAWIWEVwiIkrEJYhIRVCIuQsAphERJWISxCwiqERUhYhbAIGXUj5apinlIuPxl1I+WqYp5SLj9pBgthERJWISxCwiqERUhYhbAICasQFiFhFcIiJKxCWISEVQiLkLAKYRESViEsQsIqhEVIWIWwCBl1I+WqYp5SLj8ZdSPlqmKeUi4/aQYLYRESViEsQsIqhEVIWIWwCAmrEBYhYRXCIiSsQliEhFUIi5CwCmERElYhLELCKoRFSFiFsAgZdSPlqmKeUi4/GXUj5apinlIuP2kGC2ERElYhLELCKoRFSFiFsAgJqxAWIWEVwiIkrEJYhIRVCIuQsAphERJWISxCwiqERUhYhbAIGXUj5apinlIuP8eQXyEDq4xosHo5rTXxeJx4PE4ymSSRSJBMJkkmk2it2b59O+3t7SilsNls2O12bDYbNpsNp9OJw5H946+W9zjSy6UrS1hFeWitCYfDRKNRYrFYb0iLlQqt0+nE5XLhdrtLsgUQ5SFhrXLJZJJwONwb0qGEM9NrRyIRIpEIYITX7Xbjdrvxer0S3CojYa1S0WiUnp4ewuFwSQOaSzKZJBQKEQqFCAQCeL1efD5fzuayGD7yKVSZcDhMMBgkGo1WtB6JRIJgMEh3dzdut5v6+npcLldF6zTSSVirRDQaJRAI9DZJq0Xqd3I4HMbr9eL3+2VLWyGy1CssmUzS1dVFT09PpauSVygUIhwOU1dXh9/vl9+0w0zCWkGhUIiuri4SiUSlq1IwrTXBYJBIJEJjY6M0jYeRHMFUAclkko6ODnbu3GmpoKaLxWK0t7cTCAQqXZURQ7aswywej7Nz505isVilqzJkWmsCgQCxWIympiZsNvnuLydZusMoEonQ3t5eE0FNFw6H2b59e829r2ojYR0mPT097Nixw7LN3nzi8Tjt7e1V15tdSySsw6Cnp4eOjo6SHB9azZLJJDt37pTAlomMuilzuVRQR4piA1vNn2Ely6WTa92UsVw4HKazs7OoeVhZKrCD+Q1brZ9hpculk2ZwmcTj8RHR9M0mFdjhOq55JJCwloGsqIbUF5YoDQlrGXR0dMhuDFM4HJYDJ0pEwlpiqWFtYpdqGEVUCySsJZRIJOjq6qp0NaqO1prOzs4R+/u9VCSsJdTZ2Tnif6dmE4vFpDk8RBLWEkmN+RTZdXd3E4/HK10Ny5KwlohsNfJLHfgviiNhLYGenh7p/S1QKBSSzqYiSVhLIBgMVroKliLLqzgS1iEKh8PyO2yQIpGILLMiSFiHyArnTqo2WmtZbkWQUTdDKBePx2U4WJFCoVCf/a5W++yHq1w6GXUzhHL9VzhRuEQiQSgU6r1vtc9+uMqlk2bwEMh+1aGRVsngSFiLlLp6myheJBKRlskgSFiLJCva0CWTSdnnOggS1iJJE640ZDkWTsJaJDliqTRkORZOwlqE1BXGxdBJWAsnYS1CNBqV36slkkwmpaOuQBLWItTqiborRbauhZGwFkHCWlryk6IwEtYiyMpVWrI8CyNhLYJsWUtLlmdhJKxFkC1BacnyLIyEtQjSE1xasjwLI0PkitDW1lZUOZGdVT57GSJnsXJbtmwpqpzIziqfvQyRs5hSfEuKXWR5FkbCWgRZuUrLZpPVsBCylIpgt9srXYWaImEtjCylIkhYS0uWZ2EkrEWQLUFpyfIsjCylIjgcjkpXoabI8iyMhLUITqez0lWoGTabTcJaIAlrERwOhzTdSsThcEjveoFkjSuSbF1Lw+VyVboKliFhLZLb7a50FWqCfOkVTsJaJAnr0NlsNjweT6WrYRkS1iI5nU7pGBkil8slv1cHQUbdDKGcbBWGJn35We2zH65y6WTUzRDKSViL178JbLXPfrjKpZNm8BC4XC7pzSySx+OR3V+DJEtriHw+X6WrYEmy3AZPwjpEXq9XDkQfJGmRFEfCOkRKKerr6ytdDUuR5VUcCWsJ+Hw+2Y1TILfbLR1zRZKwloBsXQvn9/srXQXLkrCWiM/nk99hecgyGhoJawk1NjbK7ogs7HY7DQ0Nla6GpcmaVUJOp1Oaw1k0NDTIF9kQydIrsbq6Omnq9ePz+fB6vZWuhuVJF2aJKaVobm5m+/btcsEljNZGY2Nj1sfffWULyxe/T3BHhPpRbqbP3ovJh8oVDzKRLWsZ2O12mpqaRvyIErvdTnNzc9bl8O4rW3j27rcJ7ogAENwR4dm73+bdV+SKB5nIqJsylXO73Tm3KLVOKUVTU1PO/c/LF79PPNr3CnLxaJLli98f1HyKrZ8VyqWTUTdlLOfz+UbsfsXGxsa8A/RTW9RCp2dSrZ99qcqlk2Zwmfn9/hEX2KamprwH6gd3hlG2zFub+lFyFo5MJKzLine truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"frontier = {(start, zero): [start]}\n",
"\n",
"for i in range(4):\n",
" frontier = expand(frontier)\n",
" plot(frontier.values())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Additional tests:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'tests pass'"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"assert start == Point(0, -5) == 0-5j\n",
"assert path1 == [start, Point(1, -4)] == [0-5j, 1-4j]\n",
"\n",
"assert X(start) == 0 and Y(start) == -5 \n",
"assert velocity([start]) == 0\n",
"assert velocity(path1) == Vector(1, 1)\n",
"assert XY(path1) == ([0, 1], [-5, -4])\n",
"\n",
"assert quadrant(start) == 4\n",
"assert quadrant(Point(1, 2)) == 1\n",
"assert quadrant(Point(-5, 4)) == 2\n",
"assert quadrant(Point(-1, -1)) == 3\n",
"\n",
"assert waypoints(0, 10, 10) == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n",
"assert waypoints(zero, Point(10, 20), 10) == [\n",
" 0j,1+2j,2+4j,3+6j,4+8j,5+10j,6+12j,7+14j,8+16j,9+18j,10+20j]\n",
"\n",
"# There are 9 moves from the start point\n",
"assert all_moves([start]) == {-1-4j, -1-5j, -1-6j, \n",
" 0-4j, 0-5j, 0-6j, \n",
" 1-4j, 1-5j, 1-6j}\n",
"\n",
"# But 3 moves are backwards and 1 stays in the same place; those are disallowed\n",
"assert circle_track_moves([start]) == [0-6j, 1-6j, 1-5j, 0-4j, 1-4j]\n",
"assert expand({(start, zero): [start]}) == {\n",
" (0-6j, 0-1j): [0-5j, 0-6j],\n",
" (1-6j, 1-1j): [0-5j, 1-6j],\n",
" (1-5j, 1+0j): [0-5j, 1-5j],\n",
" (0-4j, 0+1j): [0-5j, 0-4j],\n",
" (1-4j, 1+1j): [0-5j, 1-4j]}\n",
"\n",
"for path in solutions:\n",
" digits = digits_from_path(path)\n",
" assert path == path_from_digits(digits_from_path(path)) # Inverses\n",
" assert digits == digits_from_path(path_from_digits(digits)) # Inverses\n",
"\n",
"'tests pass'"
]
} }
], ],
"metadata": { "metadata": {