From 0f6df37aec9fc73aab2e52c533f481b2ee0f1db7 Mon Sep 17 00:00:00 2001 From: Manish Date: Thu, 27 Jul 2023 18:19:40 +1000 Subject: [PATCH] Solution --- Three Math Games.ipynb | 354 +++++++++++++++++++++++++++++++++++++++++ Three Math Games.md | 231 +++++++++++++++++++++++++++ output_5_0.png | Bin 0 -> 20041 bytes output_9_0.png | Bin 0 -> 6597 bytes 4 files changed, 585 insertions(+) create mode 100644 Three Math Games.ipynb create mode 100644 Three Math Games.md create mode 100644 output_5_0.png create mode 100644 output_9_0.png diff --git a/Three Math Games.ipynb b/Three Math Games.ipynb new file mode 100644 index 0000000..6f03c00 --- /dev/null +++ b/Three Math Games.ipynb @@ -0,0 +1,354 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 128, + "id": "e4365f4a-71af-4b54-8000-e549c34df127", + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from ipywidgets import interactive, fixed\n", + "from IPython import display\n", + "from random import randint\n", + "from time import sleep\n", + "from sympy import symbols, Eq\n", + "from sympy.solvers import solve\n", + "from sympy.parsing.sympy_parser import parse_expr" + ] + }, + { + "cell_type": "markdown", + "id": "23fa0780-17a8-4801-ae5a-f4ee0172ae40", + "metadata": {}, + "source": [ + "# Projectile game" + ] + }, + { + "cell_type": "markdown", + "id": "0740f36c-6c52-422f-9db0-a6619a9a5ffb", + "metadata": {}, + "source": [ + "## Easy Mode" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "f39607ff-7776-4d49-8de9-2f79bff89a92", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6016d1e3623c4376bcf7aa7041f2beaf", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "interactive(children=(FloatSlider(value=0.0, description='a', max=25.0, min=-25.0), FloatSlider(value=0.0, des…" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "xlo = -2\n", + "xhi = 20\n", + "ylo = -20\n", + "yhi = 120\n", + "\n", + "def graph(a, b, c, height, distance):\n", + " plt.clf()\n", + " fix = plt.subplot()\n", + " plt.axis([xlo, xhi, ylo, yhi])\n", + " plt.plot([0, 0], [ylo, yhi], \"black\")\n", + " plt.plot([xlo, xhi], [0, 0], \"black\")\n", + " wall_height = height\n", + " wall_distance = distance\n", + " plt.plot([wall_distance, wall_distance], [0, wall_height], \"brown\")\n", + " plt.grid()\n", + " plt.title(f\"{a:.1f}*x**2 + {b:.1f}*x + {c:.1f}\")\n", + " \n", + " x = np.linspace(0, xhi, xhi*1000)\n", + " y = a*x**2 + b*x + c\n", + " success = a*wall_distance**2 + b*wall_distance + c > wall_height\n", + " x2 = []\n", + " y2 = []\n", + " for i in range(len(y)):\n", + " if y[i] < 0:\n", + " break\n", + " if not success and x[i] > wall_distance:\n", + " break\n", + " x2.append(x[i])\n", + " y2.append(y[i])\n", + " \n", + " y2[-1] = 0 # finally ball hits the ground (handling imprecisions and ball hitting walls)\n", + " plt.plot([x2[-1]], [y2[-1]], 'ro')\n", + " plt.plot(x2, y2, \"b\")\n", + " plt.show()\n", + "\n", + "\n", + "slider_range = (-25, 25, 0.1)\n", + "wall_height = randint(2, yhi-20)\n", + "wall_distance = randint(2, xhi-2)\n", + "interactive_graph = interactive(graph, a=slider_range, b=slider_range, c=slider_range, height=fixed(wall_height), distance=fixed(wall_distance))\n", + "interactive_graph" + ] + }, + { + "cell_type": "markdown", + "id": "810b43cb-8289-4952-8259-648add3bbb0e", + "metadata": {}, + "source": [ + "## Hard Mode\n", + "Now guess projectile paramaters without fiddloing with slider" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "id": "8b65fbea-7647-4e29-902e-ddd80170cdc8", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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jRry8ssvy61bt8oVdAo/7Ldu3Spz586VunXriq2trfTq1UuuXLmiN37btm3Spk0bsbOzE3d3dwkNDZXbt2/rPA8A9C4lGT9+vLi5uem878LDwwWALF++XDstISFB7/2bmJgoI0aMkDp16oitra20bNlSNm7cqLP8wtfEokWLZOnSpdKoUSOxsLCQc+fOFRt0srOz5aWXXhJnZ2f58ccfS33ubty4IZcuXdKZ9vvvvwsAvTqo8vjVVTX37bffomHDhujatWux87t164aGDRti9+7d2mkXL15E165d8dNPP2HixImYNm0a4uPj0aNHD5w4cUJvGeHh4bh06RJmzpyJN998E5s2bcKAAQMgIgCA+/fvIzAwENevX8fkyZOxcuVKhIaG4vjx48Zpuoj09HSkp6ejVq1apY4rKCjAzz//jHbt2unN69ChA65du4a0tDTtNAsLC50dMote79WrF959911ERkbi7NmzAIB79+7hvffeQ0BAAN55551il1O4T0VRFhYWOt+xl3cn0ISEBDg4OMDBwaFc46tajx49kJqaijFjxuDSpUu4ceMG1qxZg+3bt2PKlCml3vfOnTu4f/9+ievq3Llz2tsqlUrv+Sv6HL711lvo168fIiIicOvWLQDAhQsXMGvWLIwcORIvvvji47ZapTIzM+Hs7AwXFxe4ubkhLCwM6enpZd5PRBAcHIwvv/wSQ4cOxdy5c3H79m0MGzasXI/79ttvY9myZQgMDMSCBQtgbW2Nl156qUK1L1iwADt27MBHH32EKVOm4Pjx4wgNDdUZs3HjRgwePBiWlpaIjIzEqFGjsH37dnTp0gXJyckAgDFjxqBPnz4AoPMVXkm6du2Khw8f6uyveOTIEVhYWODIkSM60wDN30wAyMrKQo8ePfDll18iNDQUixYtgouLC4YPH47ly5frPc6GDRuwcuVKjB49Gp988gnc3Nz0xmRlZeHll1/GsWPHsG/fPnTq1KnU5+zNN9/U+5rz2LFjAIA2bdqUel+qAFMnLSpZcnKyAJDg4OBSx/Xv31/nf/8DBgwQGxsbna+z7t69K05OTtKtWzfttMItOm3btpXc3Fzt9IULFwoA2bVrl4iI7NixQwDIqVOnDNhd+cyZM0cASExMTKnjHjx4IABk9uzZevNWrVolAOTy5cuSlpYmffr0kT59+sjvv/+u89XV66+/rv1f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qFQ81xUREREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESlWpYPO4cOH8fLLL8Pb2xsqlQo7d+7UmS8imD59Ory8vGBvb4+AgABcuXJFZ8zDhw8RGhoKZ2dnuLq6YuTIkUhPT69sSUREREQ6Kh10MjIy0KpVK6xatarY+QsXLsSKFSuwZs0anDhxAo6OjggKCkJ2drZ2TGhoKC5evIjo6Gh89913OHz4MEaPHl3ZkoiIiIh0WFX2ji+88AJeeOGFYueJCJYtW4apU6ciODgYAPDFF1/Aw8MDO3fuREhICC5duoQ9e/bg1KlTaNeuHQBg5cqVePHFF7F48WJ4e3sXu+ycnBzk5ORob6empgIA1Go11Gp1ZdupMkVrNJeaK6qwJyX2VkjpPbI/86f0Htmf+auq3ioddEoTHx+PhIQEBAQEaKe5uLigY8eOiI2NRUhICGJjY+Hq6qoNOQAQEBAACwsLnDhxAq+88kqxy46MjMSsWbP0pv/www9wcHAwfDMGVnSL1v79+2FnZ2fCaowrOjra1CUYndJ7ZH/mT+k9sj/zlZmZWSWPY5Sgk5CQAADw8PDQme7h4aGdl5CQgDp16ugWY2UFNzc37ZjiTJkyBREREdrbqampqF+/PgIDA+Hs7GyoFowmIyNDe71Xr15wdXU1XTFGolarER0djT59+sDa2trU5RiF0ntkf+ZP6T2yP/OXlJRUJY9jlKBjTLa2trC1tdWbbm1tbRYvhqI1mkvNlaX0/gDl98j+zJ/Se2R/5quq+jLKz8s9PT0BAImJiTrTExMTtfM8PT1x//59nfl5eXl4+PChdgwRERHR4zBK0PH19YWnpydiYmK001JT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6qpWrVqwtLREYmKizvTExER4enqaqCqiKmRpCSxfrrmuemR35MLby5ZVacghIlISkwYdGxsbtG3bFjExMdppBQUFiImJgb+/vwkrI6pCAwcC//439I4eWa+eZvrAgaapi4hIAUz+1VVERASGDRuGdu3aoUOHDli2bBkyMjLw1ltvmbo0oqozcCAQHAwcOQLcuwd4eQFdu3JLDhHRYzJ50Hnttdfw4MEDTJ8+HQkJCXjuueewZ88evR2UiRTP0hLo0cPUVRARKYrJgw4AhIeHIzw83NRlEBERkcJUi1NAEBERERkDgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpFoMOERERKRaDDhERESkWgw4REREpllGCzvXr1zFy5Ej4+vrC3t4ejRs3xowZM5Cbm6sz7ueff0bXrl1hZ2eH+vXrY+HChcYoh4iIiJ5QVsZY6OXLl1FQUIC1a9fiqaeewi+//IJRo0YhIyMDixcvBgCkpqYiMDAQAQEBWLNmDS5cuIARI0bA1dUVo0ePNkZZRERE9IQxStDp27cv+vbtq73dqFEjxMXFYfXq1dqgs2nTJuTm5mL9+vWwsbFB8+bNcf78eSxZsoRBh4iIiAzCKEGnOCkpKXBzc9Pejo2NRbdu3WBjY6OdFhQUhKioKPz555+oWbNmscvJyclBTk6OznIB4OHDh1Cr1Uaq3nAyMjK01x8+fIj8/HwTVmMcarUamZmZSEpKgrW1tanLMQql98j+zJ/Se2R/5u/hw4cAABEx6uNUSdC5evUqVq5cqd2aAwAJCQnw9fXVGefh4aGdV1LQiYyMxKxZs/SmP7osc9C4cWNTl0BERGRSSUlJcHFxMdryKxR0Jk+ejKioqFLHXLp0CX5+ftrbd+7cQd++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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "xlo = -2\n", + "xhi = 20\n", + "ylo = -20\n", + "yhi = 120\n", + "\n", + "wall_height = randint(2, yhi-20)\n", + "wall_distance = randint(2, xhi-2)\n", + "\n", + "plt.clf()\n", + "fix = plt.subplot()\n", + "plt.axis([xlo, xhi, ylo, yhi])\n", + "plt.plot([0, 0], [ylo, yhi], \"black\")\n", + "plt.plot([xlo, xhi], [0, 0], \"black\")\n", + "plt.plot([wall_distance, wall_distance], [0, wall_height], \"brown\")\n", + "plt.grid()\n", + "display.display(plt.gcf())\n", + "\n", + "print(\"You're at origin, provide A, B and C values for projectile to get across wall.\")\n", + "a = float(input(\"A: \"))\n", + "b = float(input(\"B: \"))\n", + "c = float(input(\"C: \"))\n", + "\n", + "x = np.linspace(0, xhi, xhi*1000)\n", + "y = a*x**2 + b*x + c\n", + "success = a*wall_distance**2 + b*wall_distance + c > wall_height\n", + "x2 = []\n", + "y2 = []\n", + "for i in range(len(y)):\n", + " if y[i] < 0:\n", + " break\n", + " if not success and x[i] > wall_distance:\n", + " break\n", + " x2.append(x[i])\n", + " y2.append(y[i])\n", + "\n", + "if success:\n", + " plt.title(f\"Awesome, {a:.1f}*x**2 + {b:.1f}*x + {c:.1f} worked!\")\n", + "else:\n", + " plt.title(f\"Oops, {a:.1f}*x**2 + {b:.1f}*x + {c:.1f} did not work :(\")\n", + " y2[-1] = 0 # ball hits the ground after hitting wall\n", + "\n", + "plt.plot([x2[-1]], [y2[-1]], 'ro')\n", + "plt.plot(x2, y2, \"b\")\n", + "display.clear_output(wait=True)\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ef5840e-9c5a-41b0-8f79-2588f6915f78", + "metadata": {}, + "source": [ + "# Algebra practice game " + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "id": "56df3e31-3cfe-47b8-bde5-2096cff8d941", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Solve for x in following equation:\n", + "34 - x / 18 = -49\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "answer: 1494\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pretty accurate!\n" + ] + } + ], + "source": [ + "def rn(): # random integer\n", + " return randint(-100, 100)\n", + "\n", + "def rop(): # random operation\n", + " op = randint(1, 4)\n", + " if op == 1:\n", + " return '+'\n", + " elif op == 2:\n", + " return '-'\n", + " elif op == 3:\n", + " return '*'\n", + " elif op == 4:\n", + " return '/'\n", + "\n", + "def rpm(): # random plus minus\n", + " if randint(0, 1):\n", + " return '-'\n", + " return ''\n", + "\n", + "x = symbols(\"x\")\n", + "\n", + "eq = \"\"\n", + "if randint(0, 1): # one step problem\n", + " eq = f\"x {rop()} {rn()} = {rn()}\"\n", + "else:\n", + " eq = f\"{rn()} {rop()} {rpm()}x {rop()} {rn()} = {rn()}\"\n", + "eq = eq.replace('- -', '+ ').replace('+ -', '- ').replace('- +=', '- ')\n", + "lhs, rhs = [parse_expr(part) for part in eq.split(' = ')]\n", + "sympy_eq = Eq(lhs, rhs)\n", + "\n", + "solution = round(solve(sympy_eq, x)[0], 2)\n", + "\n", + "print(\"Solve for x in following equation:\")\n", + "print(eq)\n", + "ans = [float(num) for num in input(\"answer: \").split('/')]\n", + "if len(ans) == 2:\n", + " ans = ans[0]/ans[1]\n", + "else:\n", + " ans = ans[0]\n", + "\n", + "if abs(ans-solution) < 0.01:\n", + " print(\"Pretty accurate!\")\n", + "else:\n", + " print(f\"Oops! correct answer was {solution} but your answer was {ans}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4354b487-229b-40b3-92e9-74610bc74030", + "metadata": {}, + "source": [ + "# Scatter Plot Game " + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "id": "4dac8ed5-b7dd-42d5-a4ed-e51af3324867", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Guess the location of point (x, y) on graph: -28, 22\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sorry, the correct answer was (-25, 24) but you provided (-28, 22)\n" + ] + } + ], + "source": [ + "plt.clf()\n", + "xlo = -50\n", + "xhi = 50\n", + "ylo = -50\n", + "yhi = 50\n", + "\n", + "x = randint(xlo, xhi)\n", + "y = randint(ylo, yhi)\n", + "\n", + "fig = plt.subplot()\n", + "plt.axis([xlo, xhi, ylo, yhi])\n", + "plt.plot([x], [y], 'ro')\n", + "plt.show()\n", + "\n", + "gussed_x, gussed_y = [int(round(float(num.strip(' ')), 0)) for num in input(\"Guess the location of point (x, y) on graph: \").split(', ')]\n", + "\n", + "if gussed_x == x and gussed_y == y:\n", + " print(\"You got it!\")\n", + "else:\n", + " print(f\"Sorry, the correct answer was ({x}, {y}) but you provided ({gussed_x}, {gussed_y})\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d9745ef-fe26-477f-a480-e146542b04c1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Three Math Games.md b/Three Math Games.md new file mode 100644 index 0000000..079d6d5 --- /dev/null +++ b/Three Math Games.md @@ -0,0 +1,231 @@ +```python +%matplotlib inline +import matplotlib.pyplot as plt +import numpy as np +from ipywidgets import interactive, fixed +from IPython import display +from random import randint +from time import sleep +from sympy import symbols, Eq +from sympy.solvers import solve +from sympy.parsing.sympy_parser import parse_expr +``` + +# Projectile game + +## Easy Mode + + +```python +xlo = -2 +xhi = 20 +ylo = -20 +yhi = 120 + +def graph(a, b, c, height, distance): + plt.clf() + fix = plt.subplot() + plt.axis([xlo, xhi, ylo, yhi]) + plt.plot([0, 0], [ylo, yhi], "black") + plt.plot([xlo, xhi], [0, 0], "black") + wall_height = height + wall_distance = distance + plt.plot([wall_distance, wall_distance], [0, wall_height], "brown") + plt.grid() + plt.title(f"{a:.1f}*x**2 + {b:.1f}*x + {c:.1f}") + + x = np.linspace(0, xhi, xhi*1000) + y = a*x**2 + b*x + c + success = a*wall_distance**2 + b*wall_distance + c > wall_height + x2 = [] + y2 = [] + for i in range(len(y)): + if y[i] < 0: + break + if not success and x[i] > wall_distance: + break + x2.append(x[i]) + y2.append(y[i]) + + y2[-1] = 0 # finally ball hits the ground (handling imprecisions and ball hitting walls) + plt.plot([x2[-1]], [y2[-1]], 'ro') + plt.plot(x2, y2, "b") + plt.show() + + +slider_range = (-25, 25, 0.1) +wall_height = randint(2, yhi-20) +wall_distance = randint(2, xhi-2) +interactive_graph = interactive(graph, a=slider_range, b=slider_range, c=slider_range, height=fixed(wall_height), distance=fixed(wall_distance)) +interactive_graph +``` + + + + + interactive(children=(FloatSlider(value=0.0, description='a', max=25.0, min=-25.0), FloatSlider(value=0.0, des… + + + +## Hard Mode +Now guess projectile paramaters without fiddloing with slider + + +```python +xlo = -2 +xhi = 20 +ylo = -20 +yhi = 120 + +wall_height = randint(2, yhi-20) +wall_distance = randint(2, xhi-2) + +plt.clf() +fix = plt.subplot() +plt.axis([xlo, xhi, ylo, yhi]) +plt.plot([0, 0], [ylo, yhi], "black") +plt.plot([xlo, xhi], [0, 0], "black") +plt.plot([wall_distance, wall_distance], [0, wall_height], "brown") +plt.grid() +display.display(plt.gcf()) + +print("You're at origin, provide A, B and C values for projectile to get across wall.") +a = float(input("A: ")) +b = float(input("B: ")) +c = float(input("C: ")) + +x = np.linspace(0, xhi, xhi*1000) +y = a*x**2 + b*x + c +success = a*wall_distance**2 + b*wall_distance + c > wall_height +x2 = [] +y2 = [] +for i in range(len(y)): + if y[i] < 0: + break + if not success and x[i] > wall_distance: + break + x2.append(x[i]) + y2.append(y[i]) + +if success: + plt.title(f"Awesome, {a:.1f}*x**2 + {b:.1f}*x + {c:.1f} worked!") +else: + plt.title(f"Oops, {a:.1f}*x**2 + {b:.1f}*x + {c:.1f} did not work :(") + y2[-1] = 0 # ball hits the ground after hitting wall + +plt.plot([x2[-1]], [y2[-1]], 'ro') +plt.plot(x2, y2, "b") +display.clear_output(wait=True) +plt.show() + +``` + + + +![png](output_5_0.png) + + + +# Algebra practice game + + +```python +def rn(): # random integer + return randint(-100, 100) + +def rop(): # random operation + op = randint(1, 4) + if op == 1: + return '+' + elif op == 2: + return '-' + elif op == 3: + return '*' + elif op == 4: + return '/' + +def rpm(): # random plus minus + if randint(0, 1): + return '-' + return '' + +x = symbols("x") + +eq = "" +if randint(0, 1): # one step problem + eq = f"x {rop()} {rn()} = {rn()}" +else: + eq = f"{rn()} {rop()} {rpm()}x {rop()} {rn()} = {rn()}" +eq = eq.replace('- -', '+ ').replace('+ -', '- ').replace('- +=', '- ') +lhs, rhs = [parse_expr(part) for part in eq.split(' = ')] +sympy_eq = Eq(lhs, rhs) + +solution = round(solve(sympy_eq, x)[0], 2) + +print("Solve for x in following equation:") +print(eq) +ans = [float(num) for num in input("answer: ").split('/')] +if len(ans) == 2: + ans = ans[0]/ans[1] +else: + ans = ans[0] + +if abs(ans-solution) < 0.01: + print("Pretty accurate!") +else: + print(f"Oops! correct answer was {solution} but your answer was {ans}") + +``` + + Solve for x in following equation: + 34 - x / 18 = -49 + + + answer: 1494 + + + Pretty accurate! + + +# Scatter Plot Game + + +```python +plt.clf() +xlo = -50 +xhi = 50 +ylo = -50 +yhi = 50 + +x = randint(xlo, xhi) +y = randint(ylo, yhi) + +fig = plt.subplot() +plt.axis([xlo, xhi, ylo, yhi]) +plt.plot([x], [y], 'ro') +plt.show() + +gussed_x, gussed_y = [int(round(float(num.strip(' ')), 0)) for num in input("Guess the location of point (x, y) on graph: ").split(', ')] + +if gussed_x == x and gussed_y == y: + print("You got it!") +else: + print(f"Sorry, the correct answer was ({x}, {y}) but you provided ({gussed_x}, {gussed_y})") +``` + + + +![png](output_9_0.png) + + + + Guess the location of point (x, y) on graph: -28, 22 + + + Sorry, the correct answer was (-25, 24) but you provided (-28, 22) + + + +```python + +``` diff --git a/output_5_0.png b/output_5_0.png new file mode 100644 index 0000000000000000000000000000000000000000..69679ad11f334775bca434af7a70e7ce29caa5f9 GIT binary patch literal 20041 zcmeHvbyQY+*X;%b1d$L)DN#X50Z}>>!2(2Dx}-t6OB5*ql@ z?%JO7e)rt(zTX{p-2d(vpW~dtIgbx}?_aGo*PL^0zsE9CXYr}=5d=AV|DMDX1i=(Q z5R8J;IPeJ*eWf(~;J3Z2Vk>X?%+^82+5nN(v3+i4X=`Sz%V2L{ZDVX{!NYNjgPV=P z$kz6`jQ}U7`G0(Y!_wN2^P0w#2V4a2`8`z|1R>Hv|HViXO*KXk=`Z&s#1$N4mVP<7 z%5UxCuF96-(iV#0KECREo+QM4FtIT09!ZW08~zK=fsDrnPJ@}}L#|mrqYwZ1Jl$OSPaQ;SO$3mMUqH zN$>4oI^jIaQ4#MRMY&An+=k5DDtvl+`ZNU=0(y~(x_ra-81ZWNqp`U;KWbi+c!QR3 zm3&?7^^J{|EtLokjoYJDZgPo|XG=;;$KTunC-VUWA4v?7_;!%#2~hr_A&fcxXRDmGty^dfq~Y_tX+EUg7(|=G(aFFh9sLq+JrSm? z`PH9{mH6Db7v?{|B-kzV-Me@1>c;Wh+}!M70W%@3z{_CKW6FYOZMCH~GaZ#K4wtW7 zF>YM?Rj#~JwYRrNMo96Rh+fj({>#W_WF+P9sj2blwhtw?bMHnD%NAb%6dTKFx^UJ zJKuxXpR3gfgIoR192XChwmarcL`*^=H$6FA<#yp$nccVEOl2;QV^`PBPN{)Pms|Ur zbKb+l>WG-8CY`RX?&k7`*w{CBUK1)--M{4b=1o0}G$cIS=UH2{q6yWPFJE@oTR81F z0?669jbi0fW$r2|g^NcR8;yFL2*Y;_=D8m|JKEoBYH9fva`Db14S(*_il)lBnq;`R zxN935?+6B-T zkkb>vrLN?My2i%Wh ztYIl3@e(fo-3tph$z^BRdj0o(r=zX@WSCRygKcv^Kfkv)XQ`WF_-%e~{1A

rQQ% z@6ALn_1U0>oP=a=Dnje`S8rT_mbUhGa#2yybQnOX={1vqJe{semz@W{c3{5`&D3;u z%E4+VEtbGU!(6?Ab)I{)(wF@Kj!DEGpI&1SnTv}{snw*9{Zm`pLL{WfwBO&iDO;^L z33ko;{z7ic_xH@n=rfMhU>NshMWL$_HlNG3wzh^T2K(>v_yNAXba=6kH&Y=V)=TpsUzY z%gWmNoRpN*TyJJXT|>is;9#DPHxdFn<2#(X`nERdn3$N~a2!KmGtUPK+s%ib!ol$` zFE1Y$9K8R{=j>E=@d&qB!IkGWHt%62!ufOD4z|0h+*~T>yu7@+AXda03py-^&U|!{ zF*7s!y*CpVaY-u3Xr{id&i6s`JJ|Ab!-m}{(wJf*2a7yQg>mlt_c1Xs>qbU2KRVA} zL!U=R<$<(x80-vRxGzk4i{MH{B88bhDGA9%q>w&_Y>iJmHLdGKyJ>DEQ+s>6^ViLy zeoay$qG0X_jZ_(0r>$P)trXFt&F-#p2g{|U!$ViqYWGT^tsZ$@OG{2TZg0;}a2U+A21xNb=EJ1oa&c0_UM`Dpq!wYP^`O*Y)mep-|y`G$HO&Qc5PhGsHbe9=XSn=Cdn z?O|{m|LpAS&H3JkIqIdKZn^*bV&0V^eIdV~fYiak0q^YDu%E@23qnN5CdU;jQTGan zi*pq#wcoyBd$MU&sSC1SyePhM^dU0x>Ltm*5COY+U$|VM+2E6#7Q<-;hqe86pY8_e z&vhktrO92&&&vyeyOLe7{ajEml^mgY&d|_sZ>^F3q1&>>aLGl8zgukzJ7mypKm?& z;H8hx#O~T;gK?Sf=B8~@YHFfV_S57b)~i=*eu$m~+Aj^wwJmfcVC86(`#@A!x^d>r znOIux0L_)&Oo|b=9SsRd$qCrZh$kGd@yeZ%J7QwUh|^50ZiIY^>|Hr>a&m#u{0Il; zj+ZY_@$vE1eEpiBKAHIxl2u4_v_F?#!x%)K601p^zARPmrJu!m&7s$lM|Rp{1xq|m z-2E2jhf8gSexf;Mk9D7>YO7Cewm+Aik&*HFLLWO)^Xd%6b<;k!KpOsYoK?FMlV6@D zbMx?wFD?>LP*A{{U1Vb;fSh44A}c{mLlekZeRvK|S3O+R3ZfM3qAc~`gYBP|dV`-0 zP7@H+y}&-BZEpT1Len|@b`hsa9wKPJSR+O6_7e907);dZvuAs$3aln23Fw3QFS@HKN%bvQc`^%wpTE(Vm0oje&eU1kI+Q&RQ9WJTp6ss`CL+ z%Ba?i#|ah=0r7d;H1=Afc%+bffMU`o>4Y2^5dH1NLFWzFFISM?>r*Z7!o!)+!z|*q-vl@y zXQQ`wA-6i`NJ~dj(g!{5T@_9?u_p;+M;QjSFY%nUG|oaYIq2<$z*X1Zul(%C$Lyo| z`GOxJ-Fx#He9AfMB!Ys1PLpqLv24XC)|1CpR0!b_5mA_$nl7D`u(PupY|Zx?aP0J? z%VUbc+MlU(B4v6+jJ%7DWiPfI4Trt^9nzz1RT+Ss_jsgCMk_WeBf?e?D&Z0D$;bp1 zTKswnp`N8ku`X22mPz&_+j}PIcWA5ttWczOQ@~-F&7`QT=U{obR32#p%uv+5zP_Gh z+Mi=!(aG;|T!Dl*jJhcsM&(u?JHPred&9Kvk+rpTVRr-yyV1|>?fZVZ#m|z*qKSH>vb-ll@gbZT<(wginK}J4FeTWY zNy*7!rc??yabiufo_AZRj`sTa_~0X@ZUBB&QjkXCTV+JOC)+2Z&RHp73}}&)hk;7!vncegmgkzqoSf1Kka!d?k0SJjVqVg zYYpgfZ>wMHuEd5qg}XMKNh$Z^y&2turlzJ4G-H|cWnFVv9==wv0y)D8@J#!a%a%e)R;;bw-e#h1L_M@AYBWy?#1cpyf()9rdPt9|&vrEtL3%G1& zAtAAX4)c#>Wn?(|*YOpZX3wXtvX-=cxD_E_0oYjAz#w^NyaWypw|D#D-bT?0$<=uX zu4MQEckhJz8pXBLo?NFDw12dcnRwgX-M#CJx!Tf_|8nBw%nb9zix(LgKfCN$ELSQ)`8%rl%Pp z>CHSD{_&Pmt13`g(+T^B$N}5&-VcxPQgr}f$ki_?wOW#7L32Ngb4Ms2K76<|y?z^} zuK@y+6(Gb@*w{LCz9a%0=r+}OCI>jrCoGJN`i9Zt#azpZ%F519ch6ML0e(M?hxZi@ zmA}Wy!RYGtHb=Tf_J>=RpWsXjM6j!U8G{QtcY7SJHF8HNYn~xz6H`z)533l6COoJg zU@`I70ZdnYAK>*rxuhQ84=vGLlr8Rnv-eb7LiqCHT{Pxn%*ASJI z%ZRvx-g$^VV49hjz~toQJUra^ksNdYz)r5%LIW)wd3d_V?9S5>FF?B5h18bsu%a1A z$%TogkRW=|oSnv^8&GZC`SDTME~UP)ae?N?bYHd_WWSe?eX5}9G#_Jq^Wnn`(~-d=b&fE>0t2Hf4ReG`&Jm}%71+Mr=v0^oh;g(}$TP_EZ(E%dMT$jg$s zXu+6}t5zChIW3>4ZZnSm6<)3!;T!2?d|R74i1gqUK2^L?~>^l8>=qb?wzxJ@$e!idHI! zMjXbG@FX4GCN!`tBO@bM;g6M83XV7q zQfU5D$c%RDgTkTuOR?s$y+)R zP+mtC`g0rmwLISB<>le`9;ek}Ni;MziuPHjotF1-kW4-RApNJDahj&un+z7UoxXDA z%6Fb0LYIJpv4+jMw26U*gQEBLV+=ezyotp{^@P~BXx?FDgapzfSk+n|K!NS)x<8kS zv%o7XtRY}K%K*s98q)ZaM)IA4R_rt6vr9MJ_SOyZ3kyTWoPmVIWypu{jVl}+Ik#I#(#vAs z(!0rg{`}crI8ltdrIXBFQ6ckv(wpS^cWnzdC=hy7Sd!~lJAs#;!l+IRqI0IzK zFDfSp)&|>E08lX);5@P^x78ofLSTEEe{kx_6xVE|7bHc$qM{<$X5Rsk7yvQCZ9a5k zZF`#>5GZ7g<3yh02rYLKsDNR^<-jSB{q*Tm62xL%Q&ZN)VEXG+2Rp3x@;bUrH(y7b$7G&YFPn-;Xr@^VsaMtfUCX>33)tjAR^PTx8iZaYBSyX zmfvRD7sv_}VY(au;nx*(08s9f=M9Tt6&RyFP(BkYE1ZZvKuduZvyON#`_z@&w=74_ zL-lDqT#}!ql7D;pM;s@wX=qwe(XNX?jiXeieO=FjnRHK(|ePzu;gBpcbhF?X%GGH5~9M)Jva` zkSe!>@Ifhe_bS`vVO5yh-@hD2!(>H|6d;aYflSNRZ)NL4K*fk$zHvhV#rnW?^o;aB z7MFtkzz@JC6oBgY&};H_U%!e&z)mAI!FTxN4ygS%Fpw-ZhGrzvHSC8jO82sr0)UG` zLZWyK=L3JVwuVCJK?xn#-SO9-VHYiphQX!gw&Xs>Us~@c{0%eCS};9v9OP$oe2GiH zDTI4PcIsQa9ut5>Ln>~4U)WcFwwJSWGm7&GKPvSM78qW+di5T}!i#Xay9x|t`Rx}Y z+asljC{+rcNvF#t`as1yPqPN4O98ij6ESc=Bx-7E=r-6~=$Ez3Y>5~5hHz1J`{WF3 z2E-d@Ts+nap?z`HE_z?JVvFyi$J@88?CrxL|K9^T)nC|1)wm&;o)c<8YY4-!a}dYL zSy@?Orp;ctu-+ekEptDj*>wyy$F(_a^I&&vKVP`F)Pc=YI0VL>pI!ltD`^>3k4;M= z%|Jvza2`lJD?7Wej*bp|+;XUm(4e4R?XF?C52xV4A(^Hz%7}~<3+0YV#l06jIh6My zq-6mTGZgA;G>+Y{98rg@qqVHnf`+;amK6!Y+GFrTZW#;bnSsG~AR0KAmzO7IXI0X% zaKf2qeSOV-l_@?gwqOVH5sgR=HDV-feQ7%*F0zmY*ija|x`st4ur6`sho>ik;V&w2 zS6BB_1(f3gx#Lm`*+v~CBvE`;x}{$nBQ_n(zQ4Qj1VH6duE5+{nnZ@SELTQ25F@_D zBhF`1Wnx*j$IQv5#>c$?u62*iOkZSlewUP#gmS4WCC@KP2GJPLTes3VNHTesIIb~5 zK)Y_-by+^*wuFA4y1M#xs|g8|sIxRQ&fvqL<@SXDd5M>|s8ybqm_%+6IOL?GWHwE|{O&uL)_NPd1$0-Q7j$5y$B$LtFPXxGY`8?nFQdkPW5n8+TxE3ehZr z{fZAB;483@scUFpAo=#lxV|U1F2WYb(a{H zpG?Gzj|5iD$Cm+EZ-76NzvjvwypXZCzlpN&7w`Dg3=UEuAt522P;$+Z>lt9*x^)XO zPH0J1Q`5cHXx^5zt#d$o_m?I zXy|zu4ugou2wVGR^xL-y!m7hS)s9U}=uY?(z-mm^cwwR3epYt2v__EJ)k>*t!{gAA zO9wn2kcR7k?K0o|VUdUvTN`2nbF(;FtyRv8iwFq|Tb&%c#jXJ~bKG4`Xdld?H!w9l z1E;!j&ceb%pd~kFadEM*|JU$vq1Mzjzo*$g-riWlzkZP&;3zr=Fa9{Z2DeJ3X&70m zGt%-W^NC?q&e4V{5MX3~)XK_A@bBOHz++1an!{=WL=*$`{6-NtY!YE{mdd-#!oswG zWqU`00C4SX%#2S@Tqs?J1Q zL>nsG(?mp4Dxi{f||M;(`Kq=X~9hmzyAd$cQ{CR;T3?Jz9o+wVnND()Iii!$tOUqygi0Y-* zcMV(rx3FD0fftY)fHL`1V@x|iuDKiEkQt(LZ;hH zIa&Qi1clLcR~{TC+kie`z;qza)|v#e3J47KT%nBZa?$sgmi=?vu&5~2E5Ul9@$W-I z5M*_AwIgbId^{mG;(v`vOOX?gqPVeP9}oQmT$iR*ErN-K1thRp8hIeorAv2QD&c@a zT;$c@lKcecjh6NeP=GZ%9({XFupI^$%*ynEk(IPA?jDdjSCD0A!Xwk;MBGTU95y_qao~(27`h$+O zt*uw7smve&7Ir_8m$w4IuzPTTg&ZCoy^V-$|X=fNsf}c#8ah$>4@K+ zo5@sQY5gdC0kRc`RUps^Rmb}a&EaBjO9hsX3uuV@e-r2bzx}Z*8S0((V$TIh=kc7mhBc(0O(Y^eC`y-Ir7T9bqD5GG# zYez=tfR1W_U4m#S+XU4E>o2RbNTiF7m<})^?U9s8q5b;E{ zD8T1@Kn@^neKCOBbwG$XO-P7?09Qf*C$$FnXp(d1bX(Wa!HmNL0El=Ani5U*(e{Op z?)%1vo87W}&YM@m*;FwRASmsT394L*tgRVkH&t z?4yrDR1gS(Q1U4;QCj0gC)H=E?`^%BqvZ~q3O8@!sM#C*^S*xvuAcY; z^Pe}(h6?etJdSvyZ&?Oy%>2*;Mh`uuc{<-%idsQeVqj#v?IH*~AQYfd+S&}DYo1js z>(tlRH_F|a?>&=~las>Qa1Y`$+`BVXmR?0o?L!$&BBTW;*gIS{ObEl(tEZK=w{cW0 z46goT_CJwFl@F@7|nzs;2rigIdVpf!6B>D@2do0Y$kg zDr!j{^(sDl#>B>EOJCd7bq>N9f@o=JIXXKtGBHUCiozIyQShv;uI74p2@P$Ya>cV1 zhwCkow=C&^JM934C`QnM@L@RHS6`A#2m<-`zYKAKs?-p9gfU=iDdnj90kb_0P^BAi`;*G7A@MXc#LFq|i5j<4}>#WqVO>Q>F|JNWAdNAhG9}4RW)oeaWihf*V5M zYJdvujVeBRc`wHtR*1q+*l=k7`^W!b3KDUF1YFhzxd&kL>&i;ur-epdK--$m1e{Kh zjUxm^Jn-}9C8$b3*yFNS{VT4RbnJmUq_fn<5cc#Wkp1*1$?LlQojFalAjQ5FB)5Fs zdVDm2p&KVL@zRSIFG6Bt&0D)5tjywR8??TXx_dXl{b(OHv$uV8Zf@>&nXfjexsd{P zEWqJnpzJNSkdRQG&5X>;moF&`gwS>5gF52mc&8dbS1s@q{-FINSo|t;1i*!6OhgPw zT?h^UW8y1=ffg6AU-TUq7|`_w-j5KK_=@G_4=D851bqwjb?;dxVg`PAk+2X_#2TZ2zLcipH*elV zF(Cx?l-O-x%O(LN0*I>zS-AsNW4O|VLQ_+7hzqn7p9jgcpbuaiz~ zZ23>QA_D^nmP8)xtcS-#G+wTI((e!)s zDy*_nJY0?HA93RlIEt^3w60ydCV6ytbDo?Qwu;b3D~~`os#BdD&WIuiP~eCd5DqdO z_a8l~v-u&cyvPl>OvltT^VTnbacr6de}UGAFw;Iua*FyqIYnV)Ss7n#QaA0={)O6< z6}Jp}v^4CNhp8aR2z0w2EZw?c)PZWh#Qw8bj$;rteRJSCG;Si(# zcD~huz{lmdstuN@b8#NW{30iZHi#$84;UD(J1nc;Fzz~4RaJ#LGC<7Y(yl@D!X;s+ z%ObGdK*0f|OdH8lQVl%I#K z>|DF5jsm(Q6#{|({_)ooD5Y?Crm^@T9)}pim1l$;<4Zrj!~8vig^eA($7_PLw|fSh z8JohsVRo8NAiB(&kuie+hxSQU49(b~(^wte*rxH=y1`g883TXmL`#Oo1*5K0M!%?y zx^avKpO6MZ_3W(Iaj~8lgG2Mw@s6nW54y2gIfh%x9x)HFd(so}IEze-zYMFWVuXiB z?-?6MXA6D*UK1-Ay+A}~!~uRaj(Tbt8BPXhB7fL2ni-KAWP4sbY+f)$HGBVhncxriI-!#X(X^As2X*W|^jzueI z!omL3=u7hr3xa{45gvQrzei7LmYs?b&Mb`)VZZmV;A;?V4g6ESg84&~sA4~3y0+tv zgo3cb{SJPR8G%R-fRb|l5j`lL_A4WAKy1L_;NSp~p%F-jH8}iAcUAQpxVdkPL+Ls; zTw0y-a}Yz=8R4uzPGMunie?YK*x*yw;MGzsvN&6DT=wkgvuAWlIe}neG+g{?=%?4{ zIoZe?fk%2HSk(E(>O??v_FV}HeQL>*UPWhTf!lZPtOa``Mv z2TrXspeNJ=@_fEHz(phKK0ILXHmb~>c6aqoyr!^rE2VT({%1^0cdCKUcMELRPL6Ra zPDDBi=O$mryi-xba(DNbSn=Sj=}fFy`dQN)Cf1)5?dD*=g7dv@#q@H^l*m{lR3_=x1kqKFKD{v0g;c*eTT;rzS zC>Qbs)YkPR_p68o4XMq^BOL1{@WVm=Sq0T@O zfFA&TP|tVAae*-wvTth$kB!Z)1S!@XY=u#I)RX=}LGFtNm#+-!Y&;VMgCzalUi8@z zb~O>PljHu56lq2_wj0$M++pvW7yHhx?iAOIf7=2JlzfRzBi_c0n(kZ|CIO8j+0lWP zceZ&|yIWGz$8L}BiEUFSrP^xsH-h#s%O5PcN)F<9rD#DQsU zMHbs)BtI!aeE$5YO#ekLb8R1$*S%3)2Uww_C>?qK{(Z%DKFKoz;Hmx!c(W6XgG+_r zQK1oWr344%we96!0br$q`gy^1fEmzrcXvVE6y&MezCI<(GSI|SD=7W@j5v6el??Vt zF+k8Opl@IL8EqUZh!sF?{3S%8*xM;0Rm#+Ktf>D+b;HnS?A?P=uZ4a^#~E7IEVb0Z zgfi(1V*fMEnR@5S{ms&3WK;!ir+0$aQoZCk#>|hneogQYz6Kxqk{x)b&?L7)Nenm$oVXwDuss&~=I*~I@0K3qV z$aNKC^`!g*n1nH?%maenzbF0Zwyhd#3stGemcO9y$8=IMXtxbA`5Hm2|E(kNM$JcJO7kv42H}UQp z75RvJ5=oRy!nKXSg8xl$&e2>C`ACC@SCgkxLnLZs0sP6yA@gc0PfB(si=&el}(U2xB?*&AN>U7quzT1~ePWKwbheVYyybA<)x z{6aot4l*ZeiApya_u})}NZN!{Gqe9bZ*6-j+~bp^xoI2SK&ibgQ{|#ukhqpEPrwf$)0IF#Ux6_?&cFKT%QTIG$H9l`(6iFfk!9R~3eH`h z4e9*-8@club7RKT;zuNg*-xCFG@YR`z|G&ky4f~e?dr~6>v|Z@=SrFP8S{9JNPG9W zyfVaMS!&Q!O6nxw;Ix;x|H71!sR5~$UkPX|IYmf(-eqnVW`F&}@6Ro->6Xtk493rX z8db&uH+{l28}jw=Sg@nKc)E4C$i#q=se$^3P-1Jr@;Q>XPGjv&`ovaN(Q(1hWg)Z` zs(pNzcxV7LbQFy@q3{>eeoxIxPeBLI={B#(NTHte_XhKy0p?TM&aMqtq~q~BteD(x z_ri)Uum*yycuxT5Dc*w1T{PicozJY9>-H=!pI*rDIV-IZ zw(c8QhRMiipxu#RO^PA;26KB6V{ysrSGiY;^q))0eW$cd8%~kNI^N=}>3U*g-5x|M ztpUhUZVvuJUF3u&@|LWPTN`z}mS}e$s5T08aH|w7T+h7gZCg}4p2ed#&4nMNU^=v4 zWaPe#L(9_Jn^_YtE~ZI$UEh~!7WlQOGw`Y01N@F^QScRs9c*?B%Nmx@&#RAdxzHHC1u=Gq6jS3M6oI+HJ@CPdPa=Qf`oukX((@%|!@pt%K z$bEe~)U^sv&vw-pZozG-@V(nfIfONA>hy}JPZQ!ayy3Bf2bb{q7QgZGU$xf;93%doP;2^Q-DxTGjg-R--tb9x^71K_;LJRnaP;gpX>bLAQ&%Q z>IBz5A3uKr*hML?Yaely{E z^E;hWsZzH&iaR-F(s#pL7>1?zy*cvCD9ZRQ0k!xEo`%n6ngBqU4+wZ!YQ=;olLg)Y zYy=8!EVM!cqst^fp%z^B-+ti)NN{byw|!sWc%6T!BRARxsdp1^PehX*Wx zm|(+?A4DP|B2aX)-<(B}Ei<#!9~KM&sFk3U`9`%${Csxj057MCw$~X7w((^SU;pMi zio(LLgrmOgr?Kg6Mn*)WR(_0&v+VlMMRs=c3mI{7jD|NCUIPy~33fAV1eD8~h6Ws9 z(**Q{g@i!Ye7tB46VH{o>g#a#@NZed@t4m((Gb;?)$*`aT?{`k{FW6~^ zF2Kv(xukByrA ztgOC*l^%{R1}K{V4JV=dz`MFy)Wb^gJ}EQiwQFMK_BAdmQDxK+fx5X(I#es2d69Tf zDFnK2ff){DJuC!#Klq?ip`KR&@+cc*80Yq^_4E0KRh_XGPTrZk{Y9RduC5+bERBNQ z92BZ|P!0}KfDW$|GnJ?c&ezLldZCfLGtp~%Nm`8v0>532jmEXQ=CB&hYGir&Pu%oD zt48e(InQzjFDjlJ{fVDEPeke9@jFR_#icMr4vFu{;(qj?b6jBm>qNUjJ7MY3ffu_P z2x;2AEN#_jb^kT^E>Cy_R5n%9`vdu6A8w{(qi%#UoenO&I1fVginKvy!*-g#E^!2x zNEbahl_J}(9w&SuO||<^*j1Dw5O`+NPQ!2w&vBXx3McqBPU1u z{79ZYp0=XFOguA0Qcn1d*~H)*f{fL>jKt^l=S^VyW^m%r@{rP=bv?+Q7E+3H)&1+! zTkz?-2wVvXqny{TFx=h$enPztu1gF3rtOA`1=Cuou0VQ!dIu&kzd!=*=|^o_bKOoN ztjVOuyZ*jS43xI5b?Z|#l`dl6e4-N>Alu6g!e=$~9!BjC2$79xj4xmQT((IahUn$A z;n|}wRyyMuLi}go`XZFJ8Kt|9ZK~ff+LUNN#>T)D9q#61vV4=E5KW9T(b&#@0m^ApV6GdEHpR$>zhRIO}kZwJO@r~^Xx&Y zD3}12An{b{a~LVo-Rktb_(nZVf2KEz6&&|h1*rL)6>KVEf<%Zf!Q7a@*uYwlY=8VE)@N296k#v=)`psR+G; z@Roj=zS@}aqUJ5JgwNh`!Ph#N;|4I05x0oOHZ(os;LyIu1F)r(SKNP?1Z(6=5G>xP z4^lJ$i}@Zdt84IZ`1SF6=QJ>EU%z>yU3*Ht|27-~NXbkIgVCha(E(+4((3q%P@m?p zT}6R3p5|b!KhozqxD6>Ol0#weoT^t~331`3a_%Sgg@yDr{E_2WH^&y6I`G!&Z zyt<3yc^B~v41A2LIA0hpL7oPs4XSb<#se&Z0X=t-#ZeD>7Lqi&SY}MQbOw4?&n!^mmY<*9Y==1XA{G{JY;4s3{HX@{EPyr+I$(fK9YWjQP606!Ih8EP z@Z@*bDJx808gawexnG&$*%hm`XE+;5z;;E+YZ$qinF$3e2#GjAdJGwZzzYhZ7_Q{Gy}gClR9;WB8z4P&Lei_Zu;x_=R+0+F0w~Id%W)l@Ff_`o9}<#u z>Tx@DI4u?RqrDxE;zVdcH*j1ooyh~6SS4+!-}xV1=Vm*<^(aCj_5bcoh`fCL8oC>X zdkg@2zpYgWkQamhAfdwgZwJu7H9>{Ty=VtTmdpD0y?$d~%N;dxF7jB0cqEE%Y6}0COX{{lTV;gCwP-FhV0H zoHekep5;(4@g%to>z1pc_xd5Z;<*z{k~SP1OJ)vc{wsu|R-qx_@;g2-R?AJH;4 zn+`Bu%SV7CME?m;X#nK7hSpinqYZe0X=!Os8r92e@lfaWPcY$&gNJ1etkb$ZX>wti zpMC!oTgv0(5wHcmEH4*SVCmK4tY(2Z{RBE7YDNSF9V~=jul>sg@Rxn*;r;tw!NI}p z#lj7b6XG|)(G|goej#Y=JIGAMmkbfpbfQ<2*&}GSf~ACL7Yf z+3QVeXxwT9GoJ$h`K6s;DAkO>x8tX!28WSE@ui$@4=AY}(9H{WNp0xka9kb304Wmc zm3Z0>XlMThMGSPB)In21zTJWnYUiFYgs#k+1Kg zmosP?&seY90g3y+{K54O5OD(di1G>w?ts(`jjY4WLrI0TfQB_$%1lu3PrFwpe|EGBfo&50cTJ_ z0nhTU^3+POk0koD}qr3O9JWG~&p_@L@pL1w7M5LBVnu)25r*qvWlKs3TJ8Yw;|1rx)ykLY)={i+q60^cqa-m1w}*#>pWLmB-fp%MJ9^NYtt3S z5)vYSUeWFeXcIdxI6B-%j|}GPz23GL7x#k1-3%@Hh23bkEzt1LEvPY=(+m=nD+GvoqT7=w?iC5*W? z@`8@53}Dvs2B*3%^mjvGXR*pE%|*>WizAg6AhfXAnAvH(4tBqZ;z5(5r-rfcrVp?i zrqJgM4P+Z-9iYn%Nc7T^J+_I?qDC~k7)BqVKLW4EhWoKVenj?w~ zl-e-EnsK@AuAXa*{JHOdJbT76O&|VR+jbTPj3nk;o)^^T0#%P(=TRz zKvzwUef6IGRbGt8$`b@rcIn2A!q(X1%mo3q6~jA<&}UJW96w;df~G;vFXXK0|?#2rb$r&RZF8GkDmb{YMC1!f~a~GzbDIymrD1 z-W4(qv|vuhQLFh8SstGU`K?h6Ge%eiqS=g%n8um1*DHa7HOc$b&Eyo!+PTc{9#=J%WL z-o1N})jQm$B?q0>cVMv~I%ndK_J=OyW&QAhF1*^IA=vUTK=hSCS90DrS2#Rm2_i6q zq7Lm#gS{FGB&Z@d%GiNSgx)XUGAt|Bd{Bd(;Bh0p$9d@gQLS*y2OM)B8Zs|}6~=nJ z7F)jP@h9-t_(L&8Bjot_PcVm`Y?DTzp;2%+>4S;idTEFkTE_z6B>Be1#-cBdI?or>2JswyJ<7JS6!b|G!!AHy?SQropQE8+1Gmb%u&`te$z07!eej15{WPcy&V1-m zT3Xsw?co70<@p#R>Y+K~7WMwUysn2qWjp+(v9a-brxg8tGqWr>tu4?(mL&b*CN$HK zLPsG-e)W9eu|%``8-HIYE`7bdz0uu1V4yJbCvT!njbQcDhh7S3pfpCi*x_WwPN7YQ zkZ^J;H9qcGs8ZSnqK|`)3am<9@R}=r_rnrcQJw{Lf#x=e-^A?M0lMjc|X zv;$B0}k~0Cf3{vMi^bUnoQ?G z=uD*=dG85lB!IGeRwcpzb>qUnEouHwANHMK2<@E`eZ4&A3$JxU?%$P>$hock;(q{| C%pLdu literal 0 HcmV?d00001 diff --git a/output_9_0.png b/output_9_0.png new file mode 100644 index 0000000000000000000000000000000000000000..48ff6dbba914b968e2292b845feac5f9b8d4e601 GIT binary patch literal 6597 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 literal 0 HcmV?d00001