Add files via upload
This commit is contained in:
1 parent
3185524b7f
commit
09676bf160
1 file changed
+373
-172
+373
-172
@@ -8,23 +8,33 @@
|
||||
"\n",
|
||||
"# RaceTrack\n",
|
||||
"\n",
|
||||
"From 538's [The Riddler](https://fivethirtyeight.com/features/can-you-zoom-around-the-race-track/) on 6 August 2021:\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",
|
||||
"> The game of [RaceTrack](https://link.springer.com/chapter/10.1007/978-3-642-13122-6_26) was published by recreational mathematician Martin Gardner in 1973. There have been a few modifications and even some neat [digital versions](https://harmmade.com/vectorracer/#) since then, and it’s high time we had a race here on The Riddler. So without further ado, welcome to 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 on The Riddler: the Riddler-opolis 500!\n",
|
||||
">\n",
|
||||
"> You begin at the midpoint of the starting line at the bottom (the thicker border), and your goal is to circumnavigate the race track shown below in a single counterclockwise loop. You’ll be moving from point to point on the grid, without ever venturing into the gray surrounding square or the central circle. If the center is at the origin (with radius 3), the starting point in blue is at (0, -5). The starting line is between (0, -3) and (0, -7).\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",
|
||||
">\n",
|
||||
"> For your first move, you can choose among nine grid points surrounding and including the starting position. From there, you have inertia. So for your second move, you again have nine possible destinations, but they are determined by your current velocity vector. That is, you can maintain your current direction and speed, or you can alter your destination by one 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 wall.\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",
|
||||
">\n",
|
||||
"> \n",
|
||||
">\n",
|
||||
"> How quickly can you navigate the track? At no time can your path venture into the wall. (Being tangent to the wall is allowed, as is being on a grid point along a wall.)\n",
|
||||
"> How quickly can you navigate the track? \n",
|
||||
">\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# Defining Points and the Track\n",
|
||||
"\n",
|
||||
"First some imports: "
|
||||
"I will define the following:\n",
|
||||
"- `Point`: a point in the 2-D plane, implemented as a complex number. `X(p)` and `Y(p)` give coordinates\n",
|
||||
"- `Path`: a list of points representing the car's moves\n",
|
||||
"- `track`: all the legal grid points\n",
|
||||
"- `start`: the single starting point\n",
|
||||
"- `finish`: a Path defining the finish line\n",
|
||||
"- `zero`: a vector (your starting velocity vector)\n",
|
||||
"- `radius`: the radius of the central circle, whose center is defined as the origin\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",
|
||||
"- `velocity(path)`: the car's velocity when it has just made the last move in a path"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -34,33 +44,23 @@
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"from typing import List, Tuple, Iterator\n",
|
||||
"import math"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now define a `Point` in the 2-D plane as a complex number (with functions to extract the `X` and `Y` components), and a `Path` as a list of points. Then define some global variables: the points in the `track`; the `finish` line; the `start` point; the `zero` vector; and the allowable `deltas` (the nine possible changes on each move)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"Point = Vector = complex\n",
|
||||
"Path = List[Point]\n",
|
||||
"from typing import List, Tuple\n",
|
||||
"\n",
|
||||
"Point = Vector = complex\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",
|
||||
"start = Point(0, -5)\n",
|
||||
"finish = [Point(0, -3), Point(0, -7)]\n",
|
||||
"zero = Vector(0, 0)\n",
|
||||
"radius = 3\n",
|
||||
"deltas = [Vector(x, y) for y in (1, 0, -1) for x in (-1, 0, 1)]\n",
|
||||
"\n",
|
||||
"def X(point) -> float: return point.real\n",
|
||||
"def Y(point) -> float: return point.imag\n",
|
||||
"\n",
|
||||
"track = {Point(x, y) for x in range(-7, 8) for y in range(-7, 8) if abs(Point(x, y)) >= 3}\n",
|
||||
"finish = [Point(0, -3), Point(0, -7)]\n",
|
||||
"start = sum(finish) / 2 # midpoint of finish line\n",
|
||||
"zero = Vector(0, 0)\n",
|
||||
"deltas = [Vector(x, y) for y in (1, 0, -1) for x in (-1, 0, 1) ]"
|
||||
"def velocity(path) -> Vector:\n",
|
||||
" \"\"\"Velocity of the car at the end of the path.\"\"\"\n",
|
||||
" return zero if len(path) == 1 else path[-1] - path[-2] "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -69,16 +69,16 @@
|
||||
"source": [
|
||||
"# Visualization\n",
|
||||
"\n",
|
||||
"I think it will be helpful to introduce a way to visualize the track and the path(s) on it:"
|
||||
"I think it will be helpful now to introduce a way to visualize the racetrack and the path(s) on it:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def plot(paths=(), track=track, start=start, finish=finish):\n",
|
||||
"def plot(paths=()):\n",
|
||||
" \"\"\"Plot the track and any paths, along with the start and finish line.\"\"\"\n",
|
||||
" fig, ax = plt.subplots()\n",
|
||||
" plt.xticks([]); plt.yticks([])\n",
|
||||
@@ -87,29 +87,30 @@
|
||||
" ax.plot(*XY(track), 'k,' ) # grid points\n",
|
||||
" for path in paths:\n",
|
||||
" ax.plot(*XY(path), 'o-') # paths\n",
|
||||
" ax.plot(*XY([start]), 'bD') # start\n",
|
||||
" ax.plot(*XY(finish), 'b:') # finish\n",
|
||||
" lengths = {len(path) - 1 for path in paths}\n",
|
||||
" plt.title(f'{len(paths)} paths, lengths {lengths}')\n",
|
||||
"\n",
|
||||
"def XY(points): return [X(p) for p in points], [Y(p) for p in points]"
|
||||
" ax.plot(*XY([start]), 'bD') # start point\n",
|
||||
" ax.plot(*XY(finish), 'b:') # finish line\n",
|
||||
" plt.title(f'{len(paths)} paths of {set(len(path) - 1 for path in paths)} moves')\n",
|
||||
" \n",
|
||||
"def XY(points) -> Tuple[List[float], List[float]]: \n",
|
||||
" \"\"\"A tuple of: (the x-coordinates of points, the y-coordinates of points).\"\"\"\n",
|
||||
" return [X(p) for p in points], [Y(p) for p in points]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here is a single path consisting of the first move from the start point:"
|
||||
"Below is my replication of the diagram above: nine paths for the second move (two of which crash)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
@@ -120,14 +121,53 @@
|
||||
],
|
||||
"source": [
|
||||
"path = [start, Point(1, -4)]\n",
|
||||
"plot([path])"
|
||||
"paths = [path + [Point(path[-1] + velocity(path) + d)] \n",
|
||||
" for d in deltas]\n",
|
||||
"plot(paths)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Here are nine paths for the second move (two of which crash into the circle in the center):"
|
||||
"# Navigating Regions\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."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def Q1(p: Point) -> bool: \"upper right quadrant\"; return X(p) >= 0 and Y(p) >= 0\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",
|
||||
" current = 0\n",
|
||||
" for p in path:\n",
|
||||
" if regions[current](p):\n",
|
||||
" current += 1\n",
|
||||
" if current == len(regions):\n",
|
||||
" return True\n",
|
||||
" return False"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Possible and Legal Moves\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",
|
||||
"- `possible_moves(path)` is general; it returns up to 9 points that are on the track and have the right velocity. \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)."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -136,19 +176,120 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def velocity(path) -> Vector:\n",
|
||||
" \"\"\"Velocity of the car at the end of the path.\"\"\"\n",
|
||||
" return zero if len(path) == 1 else path[-1] - path[-2] "
|
||||
"def possible_moves(path) -> List[Point]:\n",
|
||||
" \"\"\"All moves with the right velocity that end up on the track.\"\"\"\n",
|
||||
" p, v = path[-1], velocity(path)\n",
|
||||
" return {(p + v + Δ) for Δ in deltas} & track\n",
|
||||
" \n",
|
||||
"def legal_moves(path) -> List[Point]:\n",
|
||||
" \"\"\"What points can be reached in one step from this path?\"\"\"\n",
|
||||
" p = path[-1]\n",
|
||||
" return [p2 for p2 in possible_moves(path)\n",
|
||||
" if not (Q4(p) and Q3(p2)) # Don't go backwards over the finish line\n",
|
||||
" and not intersects_circle(p, p2)]\n",
|
||||
"\n",
|
||||
"def intersects_circle(p: Point, p2: Point, radius=radius, N=20):\n",
|
||||
" \"\"\"Are any of N+1 points on the line segment [p, p2] inside the circle's radius?\"\"\"\n",
|
||||
" linepoints = (p + (i / N) * (p2 - p) for i in range(N + 1))\n",
|
||||
" return any(abs(q) < radius for q in linepoints)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The math for solving for the intersection of a line segment and a circle looked [complicated](https://stackoverflow.com/questions/6091728/line-segment-circle-intersection), so instead I just define N+1 points along the line from point *p* to point *p2* and ask if any of those points is within the radius of the circle. If N is too small this could miss an intersection, but on the small grid for this race track, it shouldn't be a problem."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# A Frontier of Possible Paths\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",
|
||||
"\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. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def expand(frontier) -> dict:\n",
|
||||
" \"\"\"The {(endpoint, velocity): path} mapping extended one move in all legal ways.\"\"\"\n",
|
||||
" return {(p, velocity([path[-1], p])): path + [p] \n",
|
||||
" for path in frontier.values() \n",
|
||||
" for p in legal_moves(path)}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"I will show how the frontier expands over the first few steps:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"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": "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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>"
|
||||
]
|
||||
@@ -158,46 +299,23 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plot([path + [Point(path[-1] + velocity(path) + d)] for d in deltas])"
|
||||
"frontier = {(start, zero): [start]}\n",
|
||||
"\n",
|
||||
"for i in range(6):\n",
|
||||
" frontier = expand(frontier)\n",
|
||||
" plot(frontier.values())\n",
|
||||
" plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Complete Paths and Legal Moves\n",
|
||||
"(Note that the growth is much slower then 9<sup><i>n</i></sup>.)\n",
|
||||
"\n",
|
||||
"For our circle-in-the-middle track, I can say that a path `is_complete` if the path goes from the fourth quadrant to the first, second, third, and back to the fourth:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def Q1(p) -> bool: return X(p) >= 0 and Y(p) >= 0 # upper right\n",
|
||||
"def Q2(p) -> bool: return X(p) < 0 and Y(p) >= 0 # upper left\n",
|
||||
"def Q3(p) -> bool: return X(p) < 0 and Y(p) < 0 # lower left \n",
|
||||
"def Q4(p) -> bool: return X(p) >= 0 and Y(p) < 0 # lower right\n",
|
||||
" \n",
|
||||
"def is_complete(path, regions=(Q4, Q1, Q2, Q3, Q4)) -> bool:\n",
|
||||
" \"\"\"Does the path complete a tour of the regions, in order?\"\"\"\n",
|
||||
" for p in path:\n",
|
||||
" if regions[0](p):\n",
|
||||
" regions = regions[1:]\n",
|
||||
" return not regions"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Now I'll define the `legal_moves` that can be made. Given a path, `legal_moves(path)` yields all points that can follow on to the end of the path. Each point must be a point on the track (not inside the circle), the velocity vector can differ from the previous velocity vector only by an allowable delta, and the line from the previous final point on the path to the new point must not intersect the circle. \n",
|
||||
"# Searching for Fastest Complete Paths\n",
|
||||
"\n",
|
||||
"I have inserted a hack here: to make sure that paths start off going counterclockwise, for the first two steps I insist that the deltas be either up or to the right or zero.\n",
|
||||
"\n",
|
||||
"I got the calculation for `intersects_circle` from several posts on math overflow."
|
||||
"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. "
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -205,42 +323,6 @@
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def legal_moves(path, track=track, deltas=deltas) -> Iterator[Point]:\n",
|
||||
" \"\"\"What points can be reached in one step from this path?\"\"\"\n",
|
||||
" if len(path) <= 2: # Make sure we start counterclockwwise\n",
|
||||
" deltas = [Point(x, y) for y in (0, 1) for x in (0, 1)]\n",
|
||||
" p, v = path[-1], velocity(path)\n",
|
||||
" for d in deltas:\n",
|
||||
" new_p = p + v + d\n",
|
||||
" if new_p in track and not intersects_circle(p, new_p, 3, zero):\n",
|
||||
" yield new_p\n",
|
||||
" \n",
|
||||
"def intersects_circle(p, q, r, c):\n",
|
||||
" \"\"\"Does a line from p to q intersect a circle of radius r at center c?\"\"\"\n",
|
||||
" if p == q:\n",
|
||||
" return abs(c - p) < r\n",
|
||||
" norm = (q - p) / abs(q - p)\n",
|
||||
" v = abs(X(norm) * Y(c - p) - Y(norm) * X(c - p)) # Norm of the 2D cross-product\n",
|
||||
" return (v < r)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Finding a Fastest Path\n",
|
||||
"\n",
|
||||
"I can use a breadth-first search, adding each legal move to each path until I find path(s) that are complete. \n",
|
||||
"\n",
|
||||
"I keep track of a `frontier`, which is a mapping of `{(point, velocity): path}` for all paths of the longest length explored so far. The reason for this is that there may be an exponential number of paths that arrive at the some position with the same velocity in the same number of moves. But none of them will have any advantage in reaching the finish line ahead of the others, so I only need to keep one of them. In the end, I return the completed paths I have found, but there may be many other paths that are not returned, because I only kept one for each `(point, velocity)` pair along the way. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def search(path=[start]) -> Path:\n",
|
||||
" \"\"\"Find the shortest possible complete path(s).\"\"\"\n",
|
||||
@@ -248,24 +330,18 @@
|
||||
" completed = []\n",
|
||||
" while not completed:\n",
|
||||
" frontier = expand(frontier)\n",
|
||||
" completed = [path for path in frontier.values() if is_complete(path)]\n",
|
||||
" return completed\n",
|
||||
"\n",
|
||||
"def expand(frontier) -> dict:\n",
|
||||
" \"\"\"The {(point, velocity): path} mapping extended one step in all legal ways.\"\"\"\n",
|
||||
" return {(p, velocity(path + [p])): path + [p] \n",
|
||||
" for path in frontier.values() \n",
|
||||
" for p in legal_moves(path)}"
|
||||
" completed = list(filter(is_complete, frontier.values()))\n",
|
||||
" return completed"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 9,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO2deXxU5dn3v/csmUkmOwkIyqJRqGhUBHkrbR9BUSu4tHbR1hppXaB9a3xstS7tU7C1T+2r7dNq69JNpH7U6mNVUGoFWSxVZKkWEMomAoJIFkLWSWbm3O8fZ2aYSWaSyWQmM2dyfT+f80nmnHs7Z87vXNd9n/uaW2mtEQQh+7FlugGCICSGiFUQLIKIVRAsgohVECyCiFUQLIKIVRAsgog1RSilFiilnhyEeu5VStUrpQ71ke5mpdRBpdS/Ulj3v5RSHymlbk1VmULi5JRYlVKt3baAUuqhNNQzXSn1YarLTaDe0cB3gYla6+P6SL4A+JbW+syI/Kcrpf4WFHvUC3allEsp9Qel1F6lVItS6h2l1CWRaYJl3QjMT8kJCf0ip8SqtS4MbcAIoAN4LsPNSiVjgQat9eEE0pYDW7rt8wHPAtfHSO8A9gPnASXAfwHPKqXGdUu3BShRStkTb7aQErTWObkB1wHvAyrO8TnAP4CHgKPAv4ELIo5/HdgGtATLmRvc78F8CBhAa3AbhWnJngUWBfO8B0yJKO8O4EDw2PbIurq1qyRYRh2wF/gB5kN1Zrd6F/Zy7nZAAyfFOX6y+dX3eQ03AV/otm9MsGxXH3kXAg8Dfw229x/AccAvgSPB6z0pIv2pwCqgKXjtLg/u/yRwCLBHpP08sCn4vw24E9gNNAS/g/LgMTfwZHB/E7AeGJHpezPpezrTDUjbicEKYEEvx+cAfuBWwAlcFRRt6IueDVQBCtPatANnB49NBz7sVt4CwAvMCorlp8Da4LEJmFZrVPDzOKAqTrsWAS8BRcF0O4Dr49Ubp4zPBtviiXO8T7FieiZe4BPd9ucH91/aR/6FQD0wOSiaFcAeoCZ4fe4FVgbTOoFdwN1AHnA+5kNtQvD4buDCiLKfA+4M/v+fwFrgBMAFPAY8HTw2F1gCFATrnAwUZ/reTPqeznQD0nJS5tM/AJzYS5o5wEEiLC+wDrg2TvoXgVuC/8cT6/KIzxOBjuD/JwOHMa2js5c22YFOzD5paN9cYFW8emOUsQHT8tX2kqZXsQbFsxx4LM7xmzEt/Lu9lLEQ+F23PNsiPlcDTcH/P4NpPW0Rx58m+LANCvuPwf+LgDZgbPDzNqI9opGY7r4D+AbwJnBGpu/JVGw51WeNoAZYo7Xe00e6Azr4DQfZi+nSopS6RCm1VinVqJRqwrSYFX2UFzlC2w64lVIOrfUuTAuwADislHpGKTUqRv4KTMuyt1ubju+j3kjOAa4GFiilnP3IB4BSygb8CegCvh3juAO4B7gWmNRHcR9H/N8R43Nh8P9RwH6ttRFxPPK8nwKuVEq5gCuBf2qtQ9doLPCCUqop+D1tw3xQjwiex9+AZ4Ij4/8vmWuSLeSyWJ9IIN3xSikV8XkMcDB4UzwPPIDZxykFlmK6xGBarn6htX5Ka/1pzJtLAz+Lkawe0yqM7damA/2oR2N6AWWYViZhgtfiD5g3+he01r4YyUYEy36x24NuIBwERgcfFCHC56213oop3kuAr2KKN8R+4BKtdWnE5tZaH9Ba+7TW92itJwLTgEsx7w1LknNiVUpNw3wiJzIKPByoVUo5lVJfwhzkWIpp3VyYgzz+4CuMiyLyfQwMU0qVJNimCUqp84MPAS+mVQl0T6e1DmAOkPxEKVWklBoLfAdzkCRhtNadwX/zurVDKaXcof1KKXewTSEewbwGl2mtO+IUH7JMnXGOJ8PbmK7t94LfxXTgMuCZiDRPAbXAfxD93T6Keb3GAiilKpVSVwT/n6GUqg6OXDdjPgh7XHerkHNixRwF/ovWuiWBtG8Dp2BatJ8AX9RaNwTz1mIK5wjm03xxKJPW+t+Yfar3g+5XLJc2EhdwX7CeQ5gPibvjpL0Z88Z9H1iDeZP+MYFz6Y6m5/c7FvNB8V7wcwfmyDTBm30ucBZwKOJd9TXdygi9sjFIEVrrLuByTMtZjzmKXBO8ziGexuyzr9Ba10fs/xXmd/OaUqoFc7Dp/wSPHQf8L6ZQtwGr6eeDL5tQqfNkrIVSag5wQ9A1zTmUUgeB72mtU3pzKqW+DPxaaz08leUKfZOLllUwuROYr5TamKoCg2X9N+Y7Y2GQcWS6AUJ60Fovwnxnm8oyJ6eyPKF/DFk3WBCshrjBgmARRKyCYBH61WetqKjQ48aNS1NTBEHYuHFjvda6Mtaxfol13LhxbNiwITWtEgShB0qpvfGOiRssCBZBxCoIFkHEKggWQcQqCBZBxCoIFkHEKggWQcQqCBYhLWKN/vEFyWe1fJmoU/L1TVrEmmxwgOTLjnyZqFPy9Y24wYJgEUSsgmARRKyCYBFErIJgEUSsgmARRKyCYBFErIJgEUSsgmARRKyCYBFErIJgEUSsgmARRKyCYBEk6kbyZUWdkq9vJOpG8mVFnZKvb8QNFgSLIGIVBIsgYhUEiyBiFQSLIGIVBIsgYhUEiyBiFQSLIGIVBIsgYhUEiyBiFQSL0K+VzwVrsHT+g1S1VVFgL6I90MJuz25m3VObc3UONcSy5hhL5z/IxI7T8TiKUUrhcRQzseN0ls5/MKfqHIqkxbIqpZKauCz5Bp6vqq0Kh8MZtc9hc3JaRzXv3PpcwnVqINE4kdOc1dht0beSw+akqq0q4fqy+ZpmMl8kaRGrVSIaci1fa2MDBfaimMdsyk6AQFL194VN2WPuj9eWWGTrNc10vkikz5oDtDY28MbPn6Kq8yQ8juKYadoDLUz5n6vTUv/2216JWW97oCUt9Q1VpM9qYVobG1j6/Yc48N9rOSNwFh1GB1s738Nv+KLS+Q0fuz2709aO3Z7dPerUWrPX2Je2OociIlYLElOkFVs4/WdXcNH/zGNr/hba/M1orWnzN7M1f0taR2Zn3VPbrc4W2gItjHdMYNnPH01bvUMN1R9fesqUKXrDhg1pbI7QG93d3fqujzk8qo7zb7kBh9PZdwGDyJ53N9K6aB9FjhJ2jtjBhd+dl+kmWQKl1Eat9ZRYx6TPagEiRXqG4yzqjY/ZW7EvK0Ua4sSzJrMHaFm0j1M+Hs+ynz8qgh0gItYsxooijUQEm1pErFlITJFW7uP8WmuINBIRbOoQsWYRuSTSSESwqUHEmgXkqkgjEcEOHBFrBhkKIo1EBDswRKyDQPeIlF35u1CGLW0iff2hReQtfJTytiM0esromjOPC26uScGZDLzO7oJd/u2HGe0eG742O7o2c9mDd6a1rVZF3rOmmVBEisN2TIRaa5RS5nvS4+tSaklff2gR5Y8+gDtwbEaR1+6kcd5taRNsMnXueXcjnU8ewmMvilpawm/42OxdN2QFO+jvWa0S0ZCpKBilFF5/O6f/7IqERNqf+vIWPholGgB3wEf5ow+wePXqhMoA+GDvB4wbOy6htKO3rU+qzk+M+0KPNWAcNifj86oTbmc2f/epyBeJRN2kOV+8yBOXPT9ha5pofYZhMKztSOz6Aj6K9+1KqByAMxSQYHpXN6EmWmd+VWHM/RKtExvps6aZ9kBL2iNSDMPg7Wf/SvOjDzMmTpoGTxnT1yVuWfvD3ydPoyLGQ6KvOiVap3/IRP40syt/d4+naqqiYAzD4K1nXmHZ+ZdRuuA2PC1H2H72dLz2aIvttTvpmpO+UdeuOfOSqnNH1+aY0Tr72/akvI25gIg1zdjsyuyjBtpTFgUTS6T75tzCOWtW8LmnHqFx3m3Ue8owgHpPWVoHlwAuuLkmqTove/BONnvXhaN12v0ttPlbOKXoNF6+82dpa69VkdHgNNLR0sKeBSsJ6ACf+MklOPPdAyovyt099D4NnjLavlTD9Fvm4Bpg2dnCeytXoZccochRymbbOi69745MN2lQ6W00WCxrGln184UUO8s4UHFwQELtzZJefOe8nBEqwGkzpqMuK6PF30S1MVUsbAQi1jTR0dLC2JaxHOmq54Jbr0+qjKEk0khEsLERsaaJgVjVoSrSSESwPRGxpoFkraqINBoRbDQi1jTQX6sqIo2PCPYYItYU0x+rKiJNDBGsicxgSjGrfr6QaudZbCneRHVQbN0jUjqvuwnP8MrwK5iAp4x9c27JqVcwqea0GdN5j1W0LDlCtWMqy7/5a0Z7ThxS0TrynjWFxHqvGisixUBhQ+fke9J0897KVdhfbsPjyM1onUF/z9o9kmKo5IvVV40VBWND05JXkLC7O9jnl4k6E8132ozp2JRKSbROMmTiuwghUTcpyhfuq+rovmp5nCgYT1d7wtY0Xju11vj9fvx+P4ZhEAgEMAwDwzDQWlNfX09DQwNKKWw2G3a7HZvNhs1mw+l04nDE//qz4ZrGI98+dKJ1IpE+a4oI91WL/hXuqwI0espiRqQ0esr6XYfWGq/XS1dXFz6fLyzSZAmJ1ul0kpeXh8vlSokFSDeDEcmUjchocAqIGgH+zg1Rxzqvuwmj2+KJ/YmCMQyD9vZ2Ghsb+fjjjzly5AhtbW10dXUNSKihsjs7O2ltbY0qv729PSWWIF3EitbxGz52dG3OUIsGBxFrCgj3VYcd6PFe1V1aEu6j9icipauri6amJg4fPkxTUxNer3fA4uwLwzDo6OgI19vc3Izf709rnckQitYxdCAcyZQLg0t9IaPBA6S3yBrDMHj9vFm4vG188u/LyXO7+izP6/XS2tpKV1dXOpudMEopXC4XhYWF5OXlZbo5UWz77hKauho496E5mW5KypComzTSm1V988mXOKFuL51XX9enULu6umhoaKCxsTFrhArH+sn19fUcOXIkKy3tUEEGmAZA1Ahwt76qYRh0/O4x6ooqOO/Line truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
@@ -282,36 +358,78 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We see that the fastest path takes 12 moves, and there are several ways to get there.\n",
|
||||
"\n",
|
||||
"# Submitting your Answer\n",
|
||||
"\n",
|
||||
"I'll need some help to put my answers into the form requested by The Riddler:\n",
|
||||
"I'll need a bit of work to put my answers into the form requested by The Riddler:\n",
|
||||
"\n",
|
||||
"> Finally, submitting your answer can be tricky work. Please be sure to submit both your total time, as well as your sequence of moves. Each move should be assigned a digit from 1 through 9, corresponding to the nine possible destinations of the move:\n",
|
||||
">\n",
|
||||
"> 1 2 3\n",
|
||||
"> 4 5 6\n",
|
||||
"> 7 8 9"
|
||||
"> 7 8 9\n",
|
||||
"\n",
|
||||
"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": 10,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"Digits = List[int]\n",
|
||||
"\n",
|
||||
"def digits_from_path(path) -> Digits:\n",
|
||||
" \"\"\"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[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]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def encode_path(path) -> List[int]:\n",
|
||||
" \"\"\"The digits representing the moves (as coded changes in acceleration).\"\"\"\n",
|
||||
" return [deltas.index(velocity(path[:i + 1]) - velocity(path[:i])) + 1\n",
|
||||
" for i in range(1, len(path))]\n",
|
||||
"for path in search([start]):\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",
|
||||
" print(digits)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Alternative Paths\n",
|
||||
"\n",
|
||||
"def decode_path(digits, start=start) -> Path:\n",
|
||||
" \"\"\"The points that the digits represent.\"\"\"\n",
|
||||
" velocity = zero\n",
|
||||
" path = [start]\n",
|
||||
" for d in digits:\n",
|
||||
" velocity += deltas[d - 1]\n",
|
||||
" path.append(velocity + path[-1])\n",
|
||||
" return path"
|
||||
"Here we search from several different opening move sequences and get different results, but all of 12 moves:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -320,38 +438,48 @@
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 3, 6]\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, 3]\n",
|
||||
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 6, 3]\n",
|
||||
"[3, 3, 1, 7, 7, 5, 7, 8, 9, 9, 6, 6]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for path in search():\n",
|
||||
" print(encode_path(path))\n",
|
||||
" assert path == decode_path(encode_path(path)) "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"To get an idea of some of the paths that were discarded by the `frontier`, here we start with a path that is tighter around the circle, and search for completions:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"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
|
||||
"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>"
|
||||
]
|
||||
@@ -361,7 +489,80 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plot(search(decode_path([3, 5, 2, 4, 4])))"
|
||||
"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": [],
|
||||
"source": [
|
||||
"def test_intersects(expected: bool, segments: List[Path]):\n",
|
||||
" \"\"\"Test if segments do the expected thing with `intersects_circle`.\"\"\"\n",
|
||||
" plot(segments)\n",
|
||||
" for p, q in segments:\n",
|
||||
" assert intersects_circle(p, q) is expected"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"test_intersects(True, [ # Line segments that intersect the circle\n",
|
||||
" [Point(-2, 3), Point(5, 2)], \n",
|
||||
" [Point(-1, 5), Point(4, 0)], \n",
|
||||
" [Point(2, 4), Point(2, -4)],\n",
|
||||
" [Point(-3, -1),Point(1, -4)],\n",
|
||||
" [Point(-6, 0), Point(7, 7)]])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAOsAAAD7CAYAAACL3GNOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAa9UlEQVR4nO3dfZRcdX3H8fd3Zmdn9ik7+xQ3AYQSJA2NFGmQBq0Qnk8hohHQYqtwrLW1wWAtp2grpqhFaz2Kx/pc8AlrKUeNIVatErYKGAnIQUsRIQIJyRLyMJPd7MzszM6vf9x7N7O78zx39s69832dM2d379zfvb+5cz97f797729GjDEopVpfyOsKKKWqo2FVyic0rEr5hIZVKZ/QsCrlExpWpXxCw9okIvJlEflQk9chInKHiBwWkZ9XmPdWEdkvIltrWP6nReSQiNwpIrqveCzQb4CI3CciaRGZtB+/btJ6rhWRnzZj2RW8GrgION4Y88pSM4lIH3ATcLExZn3B9HUisl1EkiLyzPxyxpiNwErg9cDpblde1SbQYbVtNMb02o+VXlfGZScCzxhjjlaYb9D++at5048CtwM3lipojHkR2A8M1VtJ5Y52CGtVRGSziNwtIv8hIhMi8oiI/H7B8zeJyNP2c4+LyOvt6auAzwFr7aN3omCxAyKyzS6zQ0RW2GVERD5hN0uTIvKYiKwuUa/lIvJduzn6lIi83Z7+NuBLBev9xzIvr8P+mS+caIz5uTHma8CuCpsnX7CMouzWxf3260qIyC4ROceevtt+rW8tmL9fRL4qIi+KyLMi8g8iEhKRqF1+dcG8IyKSEpGl9t+Xi8ij9nwPiMjpBfP+nYg8b2/zX4vIBRVem38YYwL7AO4DXgQOAPcD55WZdzOQBa4EIsDfAr8FIvbzVwHLsf7BvRHrqLTMfu5a4Kfzlvdl4BDwSqwd/U7gm/ZzlwAPA3FAgFXOsorUawz4DBADzrBfzwWl1lukvAB/CewpM8+FWEfoUs+PAf8MhMvMcy2QA64DwsCHgOeAfwWiwMXABNBrz/9VYAvQB5wEPAm8zX7uduDDBcv+a+D79u9nYh3pz7bX81bgGXsdK4HdwHJ73pOAFV7vh67tz15XoKkvznpD++w38q32zlL0zbPD+rOCv0PAPuCPSsz/KHBFwY5aLKxfKvj7j4En7N/Pt3fOPwRCZep/AjAD9BVMuxX4cqn1FlnGAax/QhvKzFMprGvtbZcBlpaY51rgNwV/vxwwwEsKph20/+GE7WWdVvDcO4D7Cuqzq+C5+4G32L9/FvjgvHX/GjgXOMUO8oXY/2SD9Ah0M9gYs8MYM2GMyRhjvoL1pv9xmSK7C8rmgT1YR1NE5C0FTa8EsBoYrlCF8YLfp4Bee9n3Ap/GOuq8ICJfEJElRcovBw4ZYyYKpj0LHFdhvYWWAn8P3FJDmfnei9Uy6DHG7C8z3wsFv6cAjDHzp/VibbdOrNfiKHxd9wJdInK2iJyIFfBv28+dCLzHeR/s9+IErKPpU8ANWP9494vIN0Vkec2vtkUFOqxFGKxmYSknOL/YlyqOB/baO8wXgY3AkDEmjnWyxllWzUOXjDGfMsb8AfB7wKkUP8mzFxi0z+Y6Xgo8X8N68ljNzVUiUu61l7MK2GqMydVZfj7naH9iwbTZ12XX+S7gT4BrgHsK/mHtxmoixwse3caYf7fLfsMY82p72Qb4qEt19lxgwyoicRG5RERiItIhIm8GXgP8oEyxPxCRDSLSgfUfOgP8DOjBeuNftJd9HdaR1fECcLyIdFZZt7Pso0YEq++bxmruzmGM2Q08ANxqv47TgbdhHeVqkcF6r8Pz6hESkRhWH13sdRR7DRF7Ga4wxsxghfHDItJn/zP8G+DrBbN9A+vcwJvt3x1fBP7S3n4iIj0icpm9nJUicr6IRLG2aYoi29WvAhtWrB3sQxw7wXQ98DpjTLlrrVuwdpDDwJ9h9fOyxpjHgY8DD2IF8+VYTWrHvcD/AuMicqCKui3B2ukOYzX/DgL/UmLeP8E6UbIXqyn4AWPMf1exjkLOWeD57/drsHbo72Ed2VLAD4uUDzPvTLILrsf6R7UL+ClWIG93njTG7LCfXw78V8H0ncDbsboRh4GnsPrLYJ2b+AjW+z2O1QV4n8v19ozYHfS2JyKbgVOMMX/qdV3cJiLdwBGss+E13bwhIidgBeIV9j8t5ZEgH1mVzRgzhXWE+bqIfKfaciLyKaxuwBc0qN7TI6styEdWFQwaVqV8QpvBSvmEhlUpnyh7c/Z8w8PD5qSTTmpSVZRSDz/88AFjzEix52oK60knncTOnTvdqZVSagERebbUc9oMVsonNKxK+YSGVSmf0LAq5RMaVqV8oqazwUqp2jy5Y5wHtzzN5KEMvYNR1l6xglPPHq1rWRpWpZrkyR3jbL/zCXLT1ujCyUMZtt/5BEBdgW1KM7jeDyTQcq1Rzot1BrHcg1ueng2qIzed58EtT9e17qaEtd7BAVquNcp5sc6glRvflWTyUPEP1yg1vRJtBivlovFdSR6657c89/gh6xO6imS7dzBa17I1rEq5oDCksd4IazesINbdwU/u+s2cpnBHZ4i1V6yoax0aVqUaUCykq19zHJ0xK1odkbCeDVbKS5VC6jj17NG6wzmfhlWpGlQb0mbQsCpVBS9D6tCwKlVGK4TUoWFVqohWCqlDw6pUgVYMqcP7GijVAlo5pI7WqYlSHvBDSB2tVyOlFoGfQupoSs1EpK4bpbVca5TzYp2LVa7RkHrxXjiaEtZWHQmh5Vp3nYsxCsaNI6kX74WjdY/5SrnAj83dUvxXY6WqEKSQOvxbc6WKCGJIHf5/BUoR7JA6gvNKVFtqh5A6gveKVFtop5A6gvvKVCC1Y0gdwX+FKhDaOaSO9nmlypc0pMe03ytWvqAhXah9X7kfPHYX/PgWSO6B/uPhgpvh9Ku9rlVTaUhL0y3Qqh67C7a+C7Ip6+/kbutvCGRgNaSV6aibVi3341uOBdWRTVnTqwyrH0bd+G0UjI660XILJffUNr3R9blUNuijYHTUjVqo/3ir6TtfrB+MgQa+Ic5L2tytn26hVnXBzXP7rAASgnQCtmyEyz4OkZh39auRhrRxuqValdMvLTwbfP774eBT8D//DPsfhzd+HfqP87aeFWhI3aNbrJWdfnXxk0nLfh++/Q74wrlw9VfhxHMWv24VaEjdp1vOj1ZdDsP3wjevga+sh0s/Amf9eUv0YzWkzaNb0K9GVsLb74Vv/QV8729h76Oe9mM1pM2nW9LPYv3wpn+H+271rB+rIV08ukX9LhSC8/9+0fuxGtLFp1s2KBapH6sh9Y5u4SBpYj9WQ+o93dJB43I/ttkh3bZrG7c9chvjR8cZ7Rll05mbuOzky1xZdtBoWIPIhX7sYhxJt+3axuYHNpOeSQOw7+g+Nj+wGUADW4TUcoPxmjVrzM6dOysv1CcjGtqi3P4nrH7s4Weq6sfOD+krLn5p00bBXHz3xew7um/B9GU9y/jhlT90fX1+KCciDxtj1hR7TkfdtEO5KvqxXoyCGT86XtP0Rtfnx3KFtBncDsr0Y708cTTaM1r0yDraM9r0dfuRhrVdzOvHjn/qOh7qfB/P/Tbv2dndTWdumtNnBYiFY2w6c9Oi1cFPNKxtZjz6RzzUeRfPPZUhFkqw9qwsq695HZ1dkUWvi3MS6eb7b2Y6P82ynmV6NrgMDWubWNDcfe1xrD74b3Q+fQ/84D7P7iu+7OTLuPvJuwG449I7Fn39fqJhDbiyfdL81zy9r1jVRsMaUFWdOPLovmJVHw1rwNR1dreFx8eqYzSsAdHwJZgWGx+rFtKw+pyr10lbYHysKk3D6lNNu5lB+7EtS8O6CL7zi+f52A9+zd5EiuXxLm68ZCWve0VrjoKZFdB+rJvvxWLTsDbZd37xPO/91i9JZWcAeD6R4r3f+iVATTuJJ7cFBqwf69Z74RUdddPkcq/6yL08n0gtmN4ZDvGKl8Yrlu87OkPf4/s5pSPOdAfsWdrB3uEO8uHKR7ixsTHOPffcqupZrqyYPFdOfp0rJ7/BU5FT+fjA+zkUHnFtnc90/guJRIIzuj/UUD0r+cVzCaZn8gumHxfv4v6bzq9qGTrqJsDl9hYJKlB0pynUd3SGE/flGJzIMx2Ls6tESI0xdn0MxhTWzfCqV51DLpcFrDIiYrdixf69dOALA2AkxH/2vYXfRk5hY+Jj3Hrgej4x8A880bm6bLlaxONxmK69XC3rK7XNS71HxeiomwBbHu8qemQ9Lt7Ff7xj7YLps83dJ+3xpBt+Z7a5a4whnU4zPT1NNpsll8uRz5cPfTmhUIhIJEIkEqGzs5NoNFo2wLAWXrycrm9ewz8evsm1fux1318CwB2XLtwebirVylke72rqet2iYW2yGy9ZOaefBNAVCXPjJSvnzFeqT9rRGSKdTjN56AjT09MNhXO+fD5PJpMhk8kAVnij0SjRaJSurq7iwfVxP7ba96JVaVibzDlxUeoMZKmQEsozNTVJOpF2NaDl5PN5UqkUqVSKiYkJurq66O7upqNj3m7i0+uxld6LVteUE0yqslIfn5Inx+TkJNPTdXTgmkBEiEaj9Pb20tnZuXCG/7vHuh4b6ar7eux1378O0FE34MEJJlVauSPpxERytknaKpx+cjqdpquri76+vrlH2oBej21FGtZFUq5PeuTIEaampryuYkWpVIp0Ok1PTw99fX3H+rQ+7sf6iYa1ycrdzJBKpTj84hFmZmYqL6hFGGOYnJwkk8nQ399/rGns036sn2hYm6RcSPP5PIlEwhdH01Ky2SwHDx6kt7eXvr4+a6LeV9xUGlaXVbotMJfLcfjwYbLZrMc1bZwxhomJCbLZLPF4nFAoZD2h/dim0LC6pJp7dzOZDIlEwlfN3mqk02kOHDjAwMAAkYj9wWvaj3WdhrVB1d5gPzU1RTKZdOWLine truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"test_intersects(False, [ # Line segments that do not intersect the circle\n",
|
||||
" [Point(-2, 3), Point(5, 3)], \n",
|
||||
" [Point(-1, 5), Point(4, 1)], \n",
|
||||
" [Point(3, 4), Point(3, -4)],\n",
|
||||
" [Point(-3, -2),Point(1, -4)],\n",
|
||||
" [Point(-7, 0), Point(7, 7)]])"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
Reference in new issue
Block a user