Skip to content

Instantly share code, notes, and snippets.

@redpanda-ai
Created August 23, 2018 22:30
Show Gist options
  • Save redpanda-ai/857796c9d9740a22fdcc6a8d7974866d to your computer and use it in GitHub Desktop.
Save redpanda-ai/857796c9d9740a22fdcc6a8d7974866d to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 18_03 Paint a boolean matrix\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# import numpy as np\n",
"from matplotlib import pyplot as plt \n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"from matplotlib import pyplot as plt \n",
"import matplotlib\n",
"from collections import deque\n",
"\n",
"MASK_VAL = -1\n",
"CELLS_PER_SIDE = 7 \n",
"TARGET_LABEL = \"Target\"\n",
"#Make a repeatably pseudo-random boolean matrix of 10x10\n",
"np.random.seed(seed=42)\n",
"master_matrix = np.random.randint(2, size=(CELLS_PER_SIDE, CELLS_PER_SIDE))\n",
"\n",
"\n",
"def solution(my_matrix, my_point):\n",
" \"\"\"Paints a boolean matrix at my_point and along all adjacent points to the opposite color\"\"\"\n",
" original_matrix = my_matrix.copy()\n",
" def get_adjacent_same(a_point, a_matrix):\n",
" \"\"\"Returns points that are both adjacent to the given point and are the same value\"\"\"\n",
" # val = a_matrix[a_point]\n",
" max_x, max_y = a_matrix.shape\n",
" x, y = a_point[:]\n",
"\n",
" points = ((x, y), (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1))\n",
" result = []\n",
" for _x, _y in points:\n",
" if (0 <= _x < max_x) and (0 <= _y < max_y):\n",
" if a_matrix[(_x,_y)] == val:\n",
" new_point = (_x, _y)\n",
" result.append(new_point)\n",
" my_matrix[new_point] ^= 1\n",
"\n",
" return result\n",
"\n",
" def show_plot(plots):\n",
" \"\"\"Visualizes our solution\"\"\"\n",
" _, axarr = plt.subplots(1,len(plots))\n",
" for i in range(len(plots)):\n",
" data = plots[i][1]\n",
" cmap = matplotlib.cm.spring\n",
" axarr[i].set_title(plots[i][0])\n",
" axarr[i].set_yticklabels([])\n",
" axarr[i].set_xticklabels([])\n",
" if plots[i][0] == TARGET_LABEL:\n",
" axarr[i].set_title(str(my_point))\n",
" cmap.set_bad(color='white')\n",
" masked_array = np.ma.masked_where(data == MASK_VAL, data)\n",
" axarr[i].imshow(masked_array, cmap='flag')\n",
" else:\n",
" axarr[i].imshow(data, cmap='flag') \n",
" axarr[i].tick_params(axis='both', which='both', bottom=False, top=False,\n",
" left=False, labelbottom=False)\n",
"\n",
" plt.show()\n",
" plt.close()\n",
"\n",
" # Start with just the main point\n",
" same_color_points = deque([my_point])\n",
" val = original_matrix[my_point]\n",
" \n",
" # Create a masked field for the solution plot display, so that it can be white\n",
" solution = np.arange(CELLS_PER_SIDE * CELLS_PER_SIDE).reshape((CELLS_PER_SIDE, CELLS_PER_SIDE))\n",
" solution.fill(MASK_VAL)\n",
" \n",
" # Flip everything \n",
" while same_color_points:\n",
" a_point = same_color_points.popleft()\n",
" same_color_points.extend(get_adjacent_same(a_point, my_matrix))\n",
" solution[a_point] = val\n",
"\n",
" # Highlight the provided point in the original problem in the solution plot\n",
" solution[my_point] = 1 - val\n",
" plt.rcParams[\"figure.figsize\"] = [10, 10] \n",
" show_plot([(\"Original\", original_matrix), (TARGET_LABEL, solution), (\"Repaint\", my_matrix)])\n",
"\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x720 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"solution(master_matrix.copy(), (3, 3))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAADGCAYAAADR24TZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAC9RJREFUeJzt3H2MZXddx/HPV5cC2ie0RWtLaaQFS4Gi2/AUtY3V+FArjRhDxEDVxIgBIwFjwLS2GvEhrTYqiE9RsaJCI0VjRUVTjE3B7MZS04BGQiukrXSBPiwtReDnH+dMnV13dmeGvXtn5vt6JZvduffcc3/37Jx73vc83BpjBACgqy9Z9gAAAJZJDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYOsqq6g1V9XtHe9p1zGtU1dlHY16wWVX1i1X1k8fgea6tqlcu+nlgK6qqM6tqf1V96bLHslOU7xk6vKq6PMlrkzwtyYNJ3pnk9WOM+5c5roNV1UhyzhjjP5c9FnqqqlOT3Jbk7DHGI/NtFyd5U5Izk7w/yeVjjLvWOb/nJvn9JOcm+WCSHxlj3Dbfd1qSf0nytDHGZ4/2a4H1qqo7k3xVks8n2Z/k3UleNcbYv8xxraiqs5J8JMnjxhifW+5oti57hg6jql6b5JeT/FSSk5K8IMlTk/x9VR13iOl3HdsRwpZyeZKbVoXQKUn+IskVSb4iyZ4kf76eGc3r17uSXJ/kSUn+KMm7Vta7McY9ST6U5HuO7kuATbl0jHF8kucm+fokr1/yeNggMbSGqjoxydVJXj3GePcY43/GGHcm+f4kZyX5waq6qqpuqKrrq+rBJJfPt12/aj4vr6q7quoTVXVFVd1ZVd863/fYtFV11nyo6xVV9V9Vta+qfmbVfJ5XVbdW1f1VdU9V/eahggyW6DuTvHfVz9+b5I4xxjvGGJ9JclWS86vq69Yxr4uS7Epy3Rjj0THGryepJN+yapqbk1xyFMYNR8UY494kf5spilJVj6+qa+b39P+uqrdU1RPn+y6qqo/Np0vsm7cNL1uZV1VdUlX/WlUPVtVHq+qqVfetbC92zT/fXFU/X1W3VNVDVfV384eRJPmn+e/750NrLzwGi2LbEUNre1GSJ2T6ZPuYedfnTUm+bb7pxUluSHJykj9ZPW1VPTPJm5O8LMlpmfYunX6E5/3GJM9IcnGSK6vq3Pn2zyd5TZJTkrxwvv/HN/G6YFGeneTfV/18XpIPrPwwxvh0kg/Ptx/JeUluHwcex7/9oMd+MMn5mx4tHGVVdUamDwUrpyv8UpKnZ4qjszO9/1+56iFfnek9/fQkr0jyO1X1jPm+Tyd5eaZtyyVJXllVlx3m6X8gyQ8leXKS45K8br79m+e/Tx5jHD/GuHXTL3AHE0NrOyXJvjWOsd4z358kt44xbhxjfGHl8MAq35fkr8YY/zyf13BlkiOdpHX1GOORMcYHMm1Izk+SMcbeMcb7xhifm/dQ/XaSCzf30mAhTk7y0Kqfj0/ywEHTPJDkhHXMaz2PfWh+Tli2G6vqoSQfTfLxJD9bVZXkR5O8ZozxyTHGQ0nemOSlBz32innv53uT/HWmow8ZY9w8xvi3edtye5I/zeHf8/9gjPEf83bo7Zn3TrE+znFZ274kp1TVrkME0Wnz/cn0y7+Wr1l9/xjj4ar6xBGe995V/34400YhVfX0JL+a5IIkX5bp/27vkV4EHEOfyoGxsj/JiQdNc2IODKa1rOexJyTZUhcy0NZlY4z3VNWFSd6W6cPycZneq/dOXZRkOtS7+gqwT817TFfclWm7kap6fqY9S8+a5/X4JO84zBgOue1gfewZWtutSR7NdN7DY6rq+Ey7Qf9hvulwe3ruSXLGqsc+MclXbnI8v5XphNFzxhgnJnlDphULtorbMx0SWHFHVh3Gqqovz3RV5h3rmNcdSZ5Tq7YiSZ5z0GPPzarDcLBs896dP0xyTaYPzI8kOW+McfL856T5ROsVT5rXixVnJrl7/vfbkvxlkqeMMU5K8pZs7j3fJePrIIbWMMZ4INMJ1L9RVd9RVY+bL1F8e5KPJfnjdczmhiSXVtWL5pOdr8rmA+aETJf2759PQPUdK2w1N+XA3fjvTPKsqnpJVT0h02Hi28cYH0oeu4Dg5jXmdXOm8+R+Yj4J9VXz7f+4apoLk/zNURw/HA3XZTqn9NlJfjfJr1XVk5Okqk6vqm8/aPqrq+q4qvqmJN+d/9v7c0KST44xPlNVz8t0TtBm3JfkC0m+dpOPb0EMHcYY41cy7YG5JlOIvD/TYa+LxxiPruPxdyR5dZI/y7SXaH+m48lHfOwhvC7TyvBQphVsXZcowzH01iTftXK1zBjjviQvSfILmQ6hPT8Hni/xlCS3HGpG8zl2l2U6gfT+JD+c6VDEZ5PHvmfomUluXMgrgU2af+/fmin+fzrTydTvm684fk+mC2RW3Jtp3bg70wU4P7byYSHTBTI/N5+LdGWmD+KbGc/DmdbBW+arkV+wmfnsdL508RiaD7Hdn+lQ10eWPR442qrqjUk+Psa4bh3T3pbpg8WRzqM71GOvTfLhMcabNzFMWLqquijJ9WOMM440LYsnhhasqi7NdH5RJbk206fjbxgWPEBbYmhrcZhs8V6caRfo3UnOSfJSIQQAW4c9QwBAa/YMAQCtiSEAoLUNfQP1KVXjrAUNJFns1ynvXuC8t7vtutzvTLJvjKV+8WRVLfQ48+7dfnNZv7179+4bY5y6zDEsep1YJGvb2nb6dmJD5wxdUDX2fBGDOuJgFjjvbbt2HgPbdblfkGTPDo8h5/SxEVW1d4xxwZLHsG1/abftwI+Bnb6dcJgMAGhNDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGtiCABoTQwBAK2JIQCgNTEEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0JoYAgNZ2LXsAq40FzrsWOO9ksWNftO089mXbnWTPIp+gFvibO/zPw2q2E2vbzmNfD3uGAIDWxBAA0JoYAgBaE0MAQGtiCABoTQwBAK2JIQCgNTEEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0JoYAgNbEEADQmhgCAFoTQwBAa2IIAGhNDAEAre3ayMR7k9SCBpIkY4HzXrRFLpdFW+Ry387LZV1270727Fnc/GvHL0FoYzuvzTt9O2HPEADQmhgCAFoTQwBAa2IIAGhNDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGtiCABoTQwBAK2JIQCgNTEEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0tmsjE+9OsmdBA0mSWuC8WZvlvoWNsewRwIbYTuxMO3252zMEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0JoYAgNbEEADQmhgCAFoTQwBAa2IIAGhNDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGtiCABobddGJt6bpBY0kEUbyx7AF2G7LnOgH9uJ5diuy3yrsGcIAGhNDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGtiCABoTQwBAK2JIQCgNTEEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0JoYAgNbEEADQmhgCAFrbtZGJdyfZs6CBJEktcN7b2Vj2ALaoC5Y9AOD/sZ1YDtuJQ1vvdsKeIQCgNTEEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0JoYAgNbEEADQmhgCAFoTQwBAa2IIAGhNDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGu7NjLx3iS1oIEs2nYd97EwFjhvyx16sZ3YmXb6dsKeIQCgNTEEALQmhgCA1sQQANCaGAIAWhNDAEBrYggAaE0MAQCtiSEAoDUxBAC0JoYAgNbEEADQmhgCAFoTQwBAa2IIAGhNDAEArYkhAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGtiCABorcYY65+46r4kdy1uOLAhTx1jnLrMAVgn2GKsE3Cgda0TG4ohAICdxmEyAKA1MQQAtCaGAIDWxBAA0JoYAgBaE0MAQGtiCABoTQwBAK2JIQCgtf8FrmF9+h3Lfs8AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 720x720 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"solution(master_matrix.copy(), (0, 0))"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAADGCAYAAADR24TZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAC9lJREFUeJzt3H2MZXddx/HPV7Yt1Za2ugWxLUykPKko2gYKQUtSidraQIwYIgaqf6gQqxKqBAy11YhiqpL4hEriAxW0NooSK2pNiqEpJN1YakzBNKEVbNd2S0t36QNCv/5xztTpZh9mpnv3zuzv9Uo2u3Pvmd/85uw997zvOffc6u4AAIzqq5Y9AQCAZRJDAMDQxBAAMDQxBAAMTQwBAEMTQwDA0MTQEVZV76iq9x3pZdcxVlfV2UdiLNisqvrVqvrZo/BzLq2qdy/658BWVFXPqqp9VfWUZc/lWFE+Z+jQquqSJG9N8pwkDyb5myRv7+4Hljmv/VVVJ3lud9++7Lkwpqo6PcktSc7u7of3u+/yJFcmeVV3X7+OsXYm+dskL0jylCS3Jbmsu2+c739qktuTfEd333NEfxHYgKq6I8kzknwlyb4kH0nyU929b5nzWlVVK0k+k+S47v7ycmezdTkydAhV9dYk707yc0lOSXJekmcn+eeqOv4Ay+84ujOELeWSJNcdIISek+S1Se7ewFj7kvxYktOTnJZpO/zw6jbW3Y8k+Yckb3jy04Yn7eLuPinJi5N8e5K3L3k+bJAYOoiqelqmV7KXdvdHuvt/u/uOJD+UZCXJj1TVFVV1bVVdXVUPJrlkvu3qNeO8oarurKr7quqdVXVHVX33fN/jy1bVynyq641V9V9VtaeqfmHNOC+pqpuq6oGquruqfudAQQZL9H1JPnqA2383yduSfGm9A3X3I9396e5+LElletV9WpKvXbPYDUku2vRs4Qjr7t1J/jFTFKWqTqiqq+bn9P+pqvdW1Ynzfa+sqs/Nb5fYM+8bXr86VlVdVFX/VlUPVtVnq+qKNfet7i92zF/fUFW/XFU3VtXeqvqn+ehqkvzr/PcD86m1lx2FVbHtiKGDe3mSpyb567U3zoc+r0vyqvmmVye5NsmpSf587bJV9U1Jfi/J65M8M9PRpTMO83NfkeT5SS5IcnlVvXC+/StJ3pJkZ5KXzfe/eRO/FyzKi5J8eu0NVfXaJI9293WbGbCqbk3ySJK/S/K+/U6J3Zbk2zY5VzjiqurMTC8KVt+u8GtJnpcpjs7O9Px/+Zpv+fpMz+lnJHljkj+squfP930x05HPUzNF/5uq6jWH+PE/nORHkzw9yfFJLptv/67571O7+6TuvmnTv+AxTAwd3M4kew5yjvXu+f4kuam7P9Tdj+1/eiDJDyb5cHd/rLu/lGkjONybtK7s7oe7+5NJPpn5yb67d3X3x7v7y/MRqj9Icv7mfjVYiFOT7F39oqpOTvKuJD+z2QG7+1uTPC3TE/3H9rt7b6YXGLBsH6qqvUk+m+SeJL9YVZXkx5O8pbs/3917M20Pr9vve9/Z3Y9290eT/H2msw/p7hu6+9/nfcutST6YQz/n/3F3/+e8H7om89Ep1sd7XA5uT5KdVbXjAEH0zPn+ZHrwH8w3rL2/ux+qqvsO83N3r/n3Q0lOSpKqel6S30xybpKvzvR/t+twvwQcRfcnOXnN11ckef8c75s2vz/og1V1W1XdMr9QyPyzvvBkxoYj5DXdfX1VnZ/kA5leLB+f6bl619RFSaZTvmuvALu/u7+45us7M+03UlUvzXRk6VvmsU5I8leHmMMB9x2sjyNDB3dTkkeT/MDaG6vqpEyHQf9lvulQR3ruTnLmmu89McnXbXI+v5/kU5muGHtakndk2rBgq7g10ymBVRck+emq2l1Vu5OcleSaqnrbJsc/Lsk3rvn6hZmOnsKWMB/d+ZMkV2V6wfxwkm/u7lPnP6fMb7RedVpVfc2ar5+V5K753x/IdHr4rO4+Jcl7s7nnfJeMr4MYOoju/kKmN1D/dlV9b1UdN1+ieE2SzyV5/zqGuTbJxVX18vnNzldk8wFzcqZL+/dV1QuSvGmT48CiXJcnHsa/INOr2hfPf+5K8hOZ3lC9egHBDQcaqKrOq6pXVNXxVXXiHFDPSPKJNYudn+mKMthK3pPpPaUvSvJHSX6rqp6eJFV1RlV9z37LXzk/zr8zyffn/4/+nJzk8939SFW9JNOp4s24N8ljeeILCfYjhg6hu3890xGYqzKFyCcynfa6oLsfXcf3/0eSS5P8RaajRPsynU8+7PcewGWZNoa9mTawv9zEGLBIf5bkwtWrZbr7vu7evfon00UA96/5/JWzktx4kLFOyBRN9yX57yQXJrmou+9KHv+coQuT/OnCfhvYhO6+N9O2cHmmqyhvT/Lx+Yrj6zNdILNqd6bTy3dlugDnJ7v7U/N9b07yS/N7kS7P9EJ8M/N5KMmvJLlxvhr5vM2Mc6zzoYtH0XyK7YFMp7o+s+z5wJFWVe9Kck93v2cdy96S6YXF4d5Hd6DvvTTT6YOf38Q0Yemq6pVJru7uMw+3LIsnhhasqi7O9P6iSvIbSV6a6VNzrXiAQYmhrcVpssV7daZDoHcleW6S1wkhANg6HBkCAIbmyBAAMDQxBAAMbUOfQL2zqlcWNJFksR+nfM4Cx97utut6vyPJnu6lfvDkzp07e2VlZZlTgMft2rVrT3efvsw52E8cm7brer8j69tPbCiGVpLcvLn5rMsi92qLnPd2t13X+7kLHHu9VlZWcvPNHl1sDVV157LnsBL7iWPRdl3v691POE0GAAxNDAEAQxNDAMDQxBAAMDQxBAAMTQwBAEMTQwDA0MQQADA0MQQADE0MAQBDE0MAwNDEEAAwNDEEAAxNDAEAQxNDAMDQxBAAMDQxBAAMTQwBAEMTQwDA0MQQADA0MQQADG3HsiewVi9w7Frg2Mli575o23nuwFjsJ5ZjO899PRwZAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoe3YyMK7ktSCJpIkvcCxF22R62XRFrnet/N6ATbOfuLgtvPz4bG+n3BkCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAICh7djIwuckuXlBE0mSWuDYHJz1Dhwp9hPHpmN9vTsyBAAMTQwBAEMTQwDA0MQQADA0MQQADE0MAQBDE0MAwNDEEAAwNDEEAAxNDAEAQxNDAMDQxBAAMDQxBAAMTQwBAEMTQwDA0MQQADA0MQQADE0MAQBDE0MAwNDEEAAwNDEEAAxNDAEAQ9uxkYV3JakFTWTRetkTeBK26zpni6vFPrIWOXr3dt6ij23beT/BuBwZAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoOzay8DlJbl7QRJKkFjj2dtbLnsAWde6yJ8AhLfRxW54tDuSc6Wl62XOwn2DbcWQIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGtmMjC+9KUguayKJt13kfDb3Asa33LawX+T+/zdUCH7kLXO+7qnYtbPD1ziG2e7YfR4YAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGJoYAgCGJoYAgKGJIQBgaGIIABiaGAIAhiaGAIChiSEAYGhiCAAYmhgCAIYmhgCAoYkhAGBoYggAGFp19/oXrro3yZ2Lmw5syLO7+/RlTsA2wRZjm4AnWtc2saEYAgA41jhNBgAMTQwBAEMTQwDA0MQQADA0MQQADE0MAQBDE0MAwNDEEAAwNDEEAAzt/wC6mH8cj1ndowAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x720 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"solution(master_matrix.copy(), (4, 3))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x720 with 3 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"solution(master_matrix.copy(), (0, 1))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment