diff --git a/README.md b/README.md index b45b0ab..ef341a3 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ [pre-commit]: https://github.com/pre-commit/pre-commit [black]: https://github.com/psf/black -This codebase is a python package designed to provide a lot of helper functions for ARC-challenge users. Feel free to use it and contribute to it. It is still a work in progress, so please be patient. +This codebase is a python package designed to provide a lot of helper functions for ARC-challenge users. Feel free to use it and contribute to it. It is still a work in progress, so please be patient. ## Features diff --git a/docs/conf.py b/docs/conf.py index 5535524..158a337 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,4 +1,5 @@ """Sphinx configuration.""" + project = "Arclang" author = "Sai Surbehera" copyright = "2024, Sai Surbehera" diff --git a/noxfile.py b/noxfile.py index 67295ef..920a001 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,4 +1,5 @@ """Nox sessions.""" + import os import shlex import shutil diff --git a/poetry.lock b/poetry.lock index 9ef121b..f767a1e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2639,4 +2639,4 @@ tests-strict = ["pytest (==4.6.0)", "pytest (==4.6.0)", "pytest (==6.2.5)", "pyt [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "018b0a4828675b811d822db9fcbb09e16934f973cf8a5b8604ac3538afd7831c" +content-hash = "e1202140ae2e3b00a10a84a0c6123ca8a3b1cc11a86c1762e46c3c8b0cbd7a35" diff --git a/pyproject.toml b/pyproject.toml index e5625c5..1330d30 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,7 @@ python = "^3.12" click = ">=8.0.1" numpy = "^2.0.0" matplotlib = "^3.9.0" +jinja2 = "^3.1.4" [tool.poetry.dev-dependencies] Pygments = ">=2.10.0" diff --git a/random/testing_p3.ipynb b/random/testing_p3.ipynb index 7db74aa..8e7ddfd 100644 --- a/random/testing_p3.ipynb +++ b/random/testing_p3.ipynb @@ -1743,7 +1743,7 @@ ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1757,7 +1757,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.2" + "version": "3.11.0" } }, "nbformat": 4, diff --git a/random/testing_p4.ipynb b/random/testing_p4.ipynb new file mode 100644 index 0000000..26e49e7 --- /dev/null +++ b/random/testing_p4.ipynb @@ -0,0 +1,1647 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "from functools import reduce\n", + "from collections import namedtuple\n", + "from typing import List, Tuple, Union\n", + "\n", + "MAXSIDE = 100\n", + "MAXAREA = 40 * 40\n", + "MAXPIXELS = 40 * 40 * 5\n", + "\n", + "import sys\n", + "import os\n", + "\n", + "sys.path.append(os.path.abspath(os.path.join('..', 'src', 'arclang')))\n", + "sys.path.append(os.path.abspath(os.path.join('..', 'src')))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "from image import Image, Point" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "# from arclang.image import Image, Piece\n", + "from matplotlib.colors import ListedColormap, BoundaryNorm\n", + "\n", + "def display_matrix(matrix):\n", + " colors = [\n", + " \"#000000\", # black\n", + " \"#0074D9\", # blue\n", + " \"#FF4136\", # red\n", + " \"#2ECC40\", # green\n", + " \"#FFDC00\", # yellow\n", + " \"#AAAAAA\", # grey\n", + " \"#F012BE\", # fuchsia\n", + " \"#FF851B\", # orange\n", + " \"#7FDBFF\", # teal\n", + " \"#870C25\", # brown\n", + " ]\n", + " cmap = ListedColormap(colors)\n", + " bounds = np.arange(-0.5, 10, 1)\n", + " norm = BoundaryNorm(bounds, cmap.N)\n", + "\n", + " fig, ax = plt.subplots(1, 1, figsize=(5, 5))\n", + "\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n", + " ax.set_title(\"Matrix\")\n", + "\n", + " fig.colorbar(\n", + " cax, ax=ax, ticks=np.arange(0, 10), orientation=\"vertical\"\n", + " ).ax.set_yticklabels(\n", + " [\n", + " \"Symbol 0\",\n", + " \"Symbol 1\",\n", + " \"Symbol 2\",\n", + " \"Symbol 3\",\n", + " \"Symbol 4\",\n", + " \"Symbol 5\",\n", + " \"Symbol 6\",\n", + " \"Symbol 7\",\n", + " \"Symbol 8\",\n", + " \"Symbol 9\",\n", + " ]\n", + " )\n", + "\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from function import compress3,compress2" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "img1 = Image(0, 0, 5, 5, [\n", + " [1, 1, 0, 2, 2],\n", + " [1, 1, 0, 2, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 3, 0, 4, 4],\n", + " [3, 3, 0, 4, 4]\n", + " ])\n", + "img2 = Image(0, 0, 5, 5, [\n", + " [1, 1, 1, 1, 1],\n", + " [1, 2, 2, 2, 1],\n", + " [1, 2, 3, 2, 1],\n", + " [1, 2, 2, 2, 1],\n", + " [1, 1, 1, 1, 1]\n", + " ])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2rRp1NXV8d57791w3rJly3j++edvukERkbuFO3/lpP598PG+tX4aroDvI+7pSz5309+enTt3LsePH2fr1q3/cF5eXh719fXO5ezZsze7SxERkS51U2/Pzps3j927d/Pb3/6W/v37/8O5ZrMZs9l8U82JiIjcSToUmg6Hg9zcXLZv3055eTlhYWG3qy8REZE7TodCc+7cuWzZsoVf/epXeHt788knnwDg6+vL/ffff1saFBERuVN06DPNV199lfr6esaPH09wcLBzef31129XfyIiIneMDr89KyIi0l3p3rMiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERHpUuXl5ZhMJurq6m6pTmhoKGvXrnVLTzei0BQREQAuXrxITk4OAwYMwGw2ExQUxJQpU6ioqOjq1txu69atmEwmkpOTO7TdLf0ItYiI3DtSUlJoaWmhtLSUQYMGUVNTw969e6mtre3q1tzqT3/6E//rf/0vxo0b1+FtdaYpIiLU1dWxb98+Vq5cyYQJExg4cCCjRo0iLy+PadOmAZCZmUliYqLLdq2trfTp04eNGzcCMH78eHJzc1mwYAE9e/YkMDCQDRs20NjYSEZGBt7e3gwePJiysrJreqioqCAmJgaLxcKYMWM4fvy4y/Pbtm0jKioKs9lMaGgoJSUlHT7OtrY2vvnNb/L8888zaNCgDm+v0BQRucc1NDS4LM3NzdfMsVqtWK1WduzYcd3nAbKystizZw/nz593ju3evZumpibS0tKcY6WlpQQEBHDw4EFyc3PJyckhNTWVuLg4jhw5wuTJk5k1axZNTU0u9RctWkRJSQmHDh2id+/eJCUl0draCkBVVRUzZsxg5syZHDt2jGXLlpGfn4/dbu/Qa1FUVESfPn349re/3aHtnBydrL6+3gFo0aJFyz231NfXu+1vZP37OBwf39pS//71+ywsLLzuvt98801Hz549HRaLxREXF+fIy8tz/P73v3eZM3ToUMfKlSud60lJSY709HTn+uOPP+547LHHnOufffaZ48EHH3TMmjXLOXb+/HkH4KisrHQ4HA7Hb37zGwfg2Lp1q3NObW2t4/7773e8/vrrDofD4Xj22WcdCQkJLr0sWrTIMXToUOf6wIEDHWvWrLnha7tv3z5Hv379HBcvXnQ4HA7HnDlzHNOnT7/h/OvRmaaIyD3u7Nmz1NfXO5e8vLzrzktJSeHcuXPs3LmTqVOnUl5eTmxsrMvZXFZWFjabDYCamhrKysrIzMx0qRMTE+N87OHhgb+/P9HR0c6xwMBAAC5cuOCy3dixY52Pe/XqRUREBCdOnADgxIkTxMfHu8yPj4+nurqatra2f/oaXLlyhVmzZrFhwwYCAgL+6fwb0ReBRETucT4+Pvj4+Biaa7FYSEhIICEhgfz8fLKysigsLCQ9PR2A2bNn8/3vf5/Kykr2799PWFjYNV+o6dGjh8u6yWRyGTOZTAC0t7ffwlF1zKlTp/jTn/5EUlKSc+yL/Xt6evLRRx/x0EMP/dM6Ck0REbmhoUOHsmPHDue6v78/ycnJ2Gw2KisrycjIcNu+Dhw4wIABAwC4fPkyJ0+eJDIyEoDIyMhrLn2pqKggPDwcDw+Pf1r74Ycf5tixYy5jS5cu5cqVK7z88suEhIQY6lGhKSIi1NbWkpqaSmZmJjExMXh7e3P48GFWrVrF9OnTXeZmZWWRmJhIW1sbc+bMcVsPRUVF+Pv7ExgYyJIlSwgICHBeR7lw4UJGjhxJcXExaWlpVFZWsm7dOtavX2+otsVi4Stf+YrLmJ+fH8A14/+IQlNERLBarYwePZo1a9Zw6tQpWltbCQkJITs7m8WLF7vMnTRpEsHBwURFRdG3b1+39bBixQrmz59PdXU1w4cPZ9euXXh5eQEQGxvLG2+8QUFBAcXFxQQHB1NUVOR827izmBwOh6Mzd9jQ0ICvr29n7lJEpFPU19cb/uzwRr74G1n/Pvh431o/DVfA9xH39PVlV69epV+/fthsNp5++mm31b0b6ExTREQMaW9v59KlS5SUlODn5+e86UF3otAUERFDzpw5Q1hYGP3798dut+Pp2f0ipPsdsYiI3JTQ0FA6+RO9O45ubiAiImJQl51pRpU/hodVJ7rdwQePlnd1C13G8XFXdyCd4Ysv3Mi9T2eaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEG6UFJE5A4UV/8YHm239ie67epnwHvuaUgAnWmKiIgYptAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTRER6VLl5eWYTCbq6upuqU5oaChr1651S083otAUEREALl68SE5ODgMGDMBsNhMUFMSUKVOoqKjo6tbc4pe//CWPPvoofn5+PPjggwwfPpxNmzZ1qIZ+T1NERABISUmhpaWF0tJSBg0aRE1NDXv37qW2trarW3OLXr16sWTJEh5++GG8vLzYvXs3GRkZ9OnThylTphiqoTNNERGhrq6Offv2sXLlSiZMmMDAgQMZNWoUeXl5TJs2DYDMzEwSExNdtmttbaVPnz5s3LgRgPHjx5Obm8uCBQvo2bMngYGBbNiwgcbGRjIyMvD29mbw4MGUlZVd00NFRQUxMTFYLBbGjBnD8ePHXZ7ftm0bUVFRmM1mQkNDKSkp6dAxjh8/nq9//etERkby0EMPMX/+fGJiYnjvPeM/1K3QFBG5xzU0NLgszc3N18yxWq1YrVZ27Nhx3ecBsrKy2LNnD+fPn3eO7d69m6amJtLS0pxjpaWlBAQEcPDgQXJzc8nJySE1NZW4uDiOHDnC5MmTmTVrFk1NTS71Fy1aRElJCYcOHaJ3794kJSXR2toKQFVVFTNmzGDmzJkcO3aMZcuWkZ+fj91uv6nXxOFwsHfvXj766CO++tWvGt5OoSkico8LCQnB19fXuSxfvvyaOZ6entjtdkpLS/Hz8yM+Pp7FixfzwQcfOOfExcURERHh8jmgzWYjNTUVq9XqHBs2bBhLly5lyJAh5OXlYbFYCAgIIDs7myFDhlBQUEBtba1LbYDCwkISEhKIjo6mtLSUmpoatm/fDsDq1auZOHEi+fn5hIeHk56ezrx583jxxRc79FrU19djtVrx8vLiqaee4sc//jEJCQmGt+9QaL766qvExMTg4+ODj48PY8eOve4ptoiI3DnOnj1LfX29c8nLy7vuvJSUFM6dO8fOnTuZOnUq5eXlxMbGupzNZWVlYbPZAKipqaGsrIzMzEyXOjExMc7HHh4e+Pv7Ex0d7RwLDAwE4MKFCy7bjR071vm4V69eREREcOLECQBOnDhBfHy8y/z4+Hiqq6tpa2sz+lLg7e3N0aNHOXToED/84Q957rnnKC8vN7x9h0Kzf//+rFixgqqqKg4fPszXvvY1pk+fzocfftiRMiIi0om+ONH5YjGbzTeca7FYSEhIID8/n/3795Oenk5hYaHz+dmzZ3P69GkqKyvZvHkzYWFhjBs3zqVGjx49XNZNJpPLmMlkAqC9vd0dh9ch9913H4MHD2b48OEsXLiQb3zjG9c9877h9h3ZWVJSEk8++SRDhgwhPDycH/7wh1itVg4cONDhxkVE5M43dOhQGhsbnev+/v4kJydjs9mw2+1kZGS4bV9fzpLLly9z8uRJIiMjAYiMjLzm0peKigrCw8Px8PC46X22t7ff8DPc67npS07a2tr4xS9+QWNjo8sp9d9rbm52aaihoeFmdykiIrdJbW0tqampZGZmEhMTg7e3N4cPH2bVqlVMnz7dZW5WVhaJiYm0tbUxZ84ct/VQVFSEv78/gYGBLFmyhICAAJKTkwFYuHAhI0eOpLi4mLS0NCorK1m3bh3r1683XH/58uU8+uijPPTQQzQ3N/PWW2+xadMmXn31VcM1Ohyax44dY+zYsXz66adYrVa2b9/O0KFD/2GTzz//fEd3IyIinchqtTJ69GjWrFnDqVOnaG1tJSQkhOzsbBYvXuwyd9KkSQQHBxMVFUXfvn3d1sOKFSuYP38+1dXVDB8+nF27duHl5QVAbGwsb7zxBgUFBRQXFxMcHExRURHp6emG6zc2NvKv//qv/OUvf+H+++/n4YcfZvPmzS7f/P1nTA6Hw9GRg2ppaeHMmTPU19fz5ptv8m//9m+8++67NwzO651phoSEEFX+GB5W3VuhO/jg0fKubqHLOD7u6g6kMzRcAd9HPv9mpo+Pz63VamjA19fXLX8j265+xofj33NLX1929epV+vXrh81m4+mnn3Zb3btBh/+JeHl5MXjwYABGjBjBoUOHePnll/npT3963flms/kffugsIiJ3h/b2di5dukRJSQl+fn7Omx50J7d8qtfRD1FFROTudObMGcLCwujfvz92ux1Pz+73bmGHjjgvL48nnniCAQMGcOXKFbZs2UJ5eTlvv/327epPRETuEKGhoXTwE717TodC88KFC8yePZvz58/j6+tLTEwMb7/9dofupiAiInK36lBofnFDXhERke5I954VERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNT9bhwoInIX2J//N3w8b/7HlQEaPmvD1039yOd0pikiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(img1)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9Ke88MILFBQUcOzYMaKjo5k6dSqXLl3q6tbuqIaGBqKjo3n11Ve7upW75r333mP+/PkcOnSId999l5aWFqZMmUJDQ0NXt3ZHDRo0iJUrV1JZWcnRo0f56le/ysyZM/nwww+7urW75siRI7z++utERUV1dSv3raSkJH7zm99QUlLC6dOn2b17NxMmTKCmpqarW3OJZcuW8frrr/PKK6/wu9/9jm9961s888wz/OY3vzFco0eE5tq1a8nMzCQtLY3hw4fzox/9iIceeog33nijq1u7o5588km+973v3fC+rN3Vvn37SE1NJSIigujoaOx2O+fOnaOysrKrW7ujpk+fzlNPPUVISAihoaF8//vfx2q1cujQoa5u7a64fv06X//619m0aRO9e/fu6nbuS7W1tRw4cIBVq1YxceJEhgwZwujRo8nJyWHGjBkApKenk5CQ4LReS0sL/fr1Y/PmzQBMmDCB7OxsFi1aRO/evfH392fTpk00NDSQlpaGp6cnw4YNu+EnIeXl5URFRWGxWBg7diwnT550en3Hjh1ERERgNpsJCgqiuLi4U/u4ZcsWcnNzeeqppxg6dChZWVk89dRTnarT7UOzubmZyspKp99cfOCBB5g8eTIVFRVd2JncDXV1dQD06dOnizu5e1pbW9m+fTsNDQ2MGzeuq9u5K+bPn8/TTz99099W7enq6+udlqampg5zrFYrVquVXbt23fB1gIyMDPbt28fFixcdY3v37qWxsZGUlBTHWElJCX5+fhw+fJjs7GyysrJITk4mNjaWY8eOMWXKFObMmUNjY6NT/SVLllBcXMyRI0fo27cv06dPp6WlBYDKykpmzZrF7NmzOXHiBMuXLycvLw+73W74fWhqaurwY9wPPvgg77//vuEa3T40r1y5QmtrK/7+/k7j/v7+fPzxx13UldwNbW1tLFq0iLi4OB599NGubueOO3HiBFarFbPZzLe+9S127tzJ8OHDu7qtO2779u0cO3aMFStWdHUr96zAwEC8vb0dy43eK3d3d+x2OyUlJfj4+BAXF0dubi4ffPCBY05sbCxhYWFs2bLFMWaz2UhOTsZqtTrGoqOjWbZsGSEhIeTk5GCxWPDz8yMzM5OQkBDy8/Opqalxqg1QUFBAfHw8kZGRlJSUUF1dzc6dO4FPPzGcNGkSeXl5hIaGkpqayoIFC1izZo3h92Hq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+OrVq5w+fZrw8HAAwsPDKS8vd5pfXl5OaGgobm5uhrexevVqioqK2LdvH48//nine9QlJyIiQk1NDcnJyaSnpxMVFYWnpydHjx5l9erVzJw502luRkYGCQkJtLa2Mm/ePJf1UFhYiK+vL/7+/ixduhQ/Pz8SExMBWLx4MaNGjaKoqIiUlBQqKirYsGEDGzduNFx/1apV5Ofns23bNoKCgvj444+Bv38JygiFpoiIYLVaGTNmDOvWrePMmTO0tLQQGBhIZmYmubm5TnMnT55MQEAAERERDBgwwGU9rFy5koULF1JVVcWIESPYs2cPHh4eAMTExPDmm2+Sn59PUVERAQEBFBYWkpqaarj+a6+9RnNzM1/72tecxgsKCli+fLmhGqb29vZ2w1t0gfr6ery9vSG7EszGkl1E5J7WdB1eGUldXR1eXl63Veqzv5F140fi5W78Y8cb1vpbK94HKl3S1+ddv36dgQMHYrPZePbZZ11W936gI00RETGkra2NK1euUFxcjI+Pj+OmBz2JQlNERAw5d+4cwcHBDBo0CLvdjrt7z4uQnrfHIiJyS4KCgrjLZ/TuObrkRERExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQg3RFIROQe5D3ix7f/oxZN1+HASNc0JICONEVERAxTaIqIiBik0BQRETFIoSkiImLQbYXmypUrMZlMLFq0yEXtiIiI3LtuOTSPHDnC66+/TlRUlCv7ERERuWfdUmhev36dr3/962zatInevXu7uicREZF70i2F5vz583n66aeZPHnyF85tamqivr7eaREREbkfdfrmBtu3b+fYsWMcOXLE0PwVK1bw4osvdroxERGRe02njjTPnz/PwoUL+clPfoLFYjG0Tk5ODnV1dY7l/Pnzt9SoiIhIV+vUkWZlZSWXLl0iJibGMdba2sqvfvUrNmzYQFNTE25ubk7rmM1mzGaza7oVERHpQp0KzUmTJnHixAmnsbS0NB555BG+853vdAhMERGR7qRToenp6cmjjz7qNPbwww/j6+vbYVxERKS70R2BRESkS5WVlWEymaitrb2tOkFBQaxfv94lPd3MbYdmWVnZHW9SRETuvMuXL5OVlcXgwYMxm83079+fqVOnUl5e3tWtucSHH35IUlISQUFBmEymW8ou/Z6m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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(img2)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "def compress3(img: Image) -> Image:\n", + " if img.w * img.h <= 0:\n", + " return Image() # badImg equivalent\n", + "\n", + " row = np.zeros(img.h, dtype=bool)\n", + " col = np.zeros(img.w, dtype=bool)\n", + " row[0] = col[0] = True\n", + "\n", + " for i in range(1, img.h):\n", + " for j in range(img.w):\n", + " if img.mask[i, j] != img.mask[i-1, j]:\n", + " row[i] = True\n", + " break\n", + "\n", + " for j in range(1, img.w):\n", + " for i in range(img.h):\n", + " if img.mask[i, j] != img.mask[i, j-1]:\n", + " col[j] = True\n", + " break\n", + "\n", + " rows = np.where(row)[0]\n", + " cols = np.where(col)[0]\n", + "\n", + " ret = Image(img.x, img.y, len(cols), len(rows))\n", + " ret.mask = img.mask[np.ix_(rows, cols)]\n", + "\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAGdCAYAAABwyyjqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABGv0lEQVR4nO3df1xU953v8dcEZMZk+KGggIqCEQgS0GD8BbHRG1GTgBIpYnKrAoG7ZSNXG693CwpY6MZfQe3WmG69ZoaHrpvYGK3a4G6uW1qDWH8ljTbcSLStthpUroBCAwTm/pGb2UzR5qCj+OP9fDzOI3O+8z2f8zlDwjuHmXPG5HA4HIiIiMg3eqCnGxAREblbKDRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0Rb5m2bJlmEymnm5DRO5QCk3pMXa7HZPJhMlk4v333+/yvMPhICQkBJPJRFJSUrfrv/LKK+zcudMNnYqIfEmhKT3OYrGwdevWLuO/+tWv+NOf/oTZbL6hujcSmkuXLuUvf/nLDe1PRO59Ck3pcc888ww/+9nP+OKLL1zGt27dyqhRowgKCrrlPTQ3NwPg6emJxWK55fsTkbuTQlN63PPPP099fT3vvfeec6ytrY23336bF154ocv8V199lfj4ePz9/enduzejRo3i7bffdpljMplobm6mvLzc+SfgjIwM4D/ft/z444954YUX6NOnD0888YTLc1+x2WyYTCbeeOMNl/qvvPIKJpOJd999110vg4jcBRSa0uNCQ0MZP348//qv/+ocq6iooLGxkdmzZ3eZ/6Mf/YjHHnuMkpISXnnlFTw9PUlLS+MXv/iFc87mzZsxm81MmDCBzZs3s3nzZv7u7/7OpU5aWhotLS288sor5OTkXLO3zMxMkpKSePnllzl79iwAx48f5wc/+AEvvvgizzzzjDteAhG5S3j2dAMiAC+88AL5+fn85S9/oXfv3vzLv/wLTz75JAMGDOgy9+TJk/Tu3du5Pn/+fOLi4lizZg3PPvssAN/5znf47ne/y9ChQ/nOd75zzX2OGDHimu+l/rWNGzcSHR3Niy++yJ49e5g3bx5BQUGsWbPmBo9WRO5WCk25I8yaNYuFCxeyZ88epk2bxp49e/inf/qna879emBevnyZjo4OJkyY4HKmasR3v/tdQ/OCgoJ47bXXeP7555kwYQIffvgh7733Hj4+Pt3an4hRn3/+OW1tbW6p5eXlpffp3UihKXeEfv36MXnyZLZu3UpLSwsdHR18+9vfvubcPXv28MMf/pAPP/yQ1tZW53h3r68MCwszPHf27Nls2bKFX/ziF/y3//bfeOqpp7q1LxGjPv/8c/o/aOWKo8Mt9YKCgvj973+v4HQThabcMV544QVycnL47LPPePrpp/Hz8+syZ//+/UyfPp1vfetbbNiwgeDgYHr16oXNZjP0p9av+/oZ6zepr6/nyJEjAHz88cd0dnbywAP6SIC4X1tbG1ccHXz/wVDMppv7d6zV0cmKz/5AW1ubQtNN9F+93DGee+45HnjgAQ4ePHjNT80CbN++HYvFwr/927+RlZXF008/zeTJk68515139nnppZe4cuUKy5cv5/3332fdunVuqy1yLWbTA1hMHje13GzoSlc605Q7htVq5fXXX+cPf/gDycnJ15zj4eGByWSio+M//3T1hz/84Zo3MXjooYdoaGi46b7efvtt3nrrLf7pn/6JvLw8fvvb37J06VKSkpKIiIi46foicvfQ/4bIHWXevHkUFxdf90+nzz77LC0tLUybNo2f/OQnlJSUMHbsWIYNG9Zl7qhRo/jf//t/s2bNGt58801+85vfdLufCxcukJuby6RJk5g/fz4A69evx8fHh4yMDDo7O7tdU0TuXgpNuav8l//yX9i0aROfffYZCxcu5F//9V9ZuXIlzz33XJe5a9asYdSoUSxdupTnn3+e119/vdv7y83NpbW11XmTAwB/f39++tOfUl1dzauvvnrTxyQidw+Tw+Fw9HQTIiLypaamJnx9fSl+aCgWk8dN1frc0cEPmk/T2NioS6TcRGeaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTRER6VGVlZWYTKabvu1laGjoLb8vtELzJrz22muEhoZisVgYO3Yshw4d6umWBPj1r39NcnIyAwYMwGQyXfO+tNIzli9fzujRo/H29qZ///6kpKTwySef9HRb8v9dvHiR3NxcBg8ejNlsJigoiKlTp1JVVdXTrblFe3s7JSUlPPzww1gsFkaMGMHevXu7VUOheYPeeustXn75ZYqLizl27BgjRoxg6tSpXLhwoadbu+81NzczYsQIXnvt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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(compress3(img1))" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[1 0 2]\n", + " [0 0 0]\n", + " [3 0 4]]\n", + "Result dimensions: 3x3\n" + ] + } + ], + "source": [ + "img1 = Image(0, 0, 5, 5, np.array([\n", + " [1, 1, 0, 2, 2],\n", + " [1, 1, 0, 2, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 3, 0, 4, 4],\n", + " [3, 3, 0, 4, 4]\n", + "]))\n", + "\n", + "result = compress3(img1)\n", + "print(result.mask)\n", + "print(f\"Result dimensions: {result.w}x{result.h}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "def connect(img: Image, id: int) -> Image:\n", + " assert 0 <= id < 3\n", + " ret = Image.empty(img.x, img.y, img.w, img.h)\n", + "\n", + " if id == 0 or id == 2: # Horizontal\n", + " for i in range(img.h):\n", + " last, lastc = -1, -1\n", + " for j in range(img.w):\n", + " if img.mask[i, j]:\n", + " if lastc != -1:\n", + " ret.mask[i, last:j+1] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = j\n", + " if lastc != -1:\n", + " ret.mask[i, last:] = lastc\n", + "\n", + " if id == 1 or id == 2: # Vertical\n", + " for j in range(img.w):\n", + " last, lastc = -1, -1\n", + " for i in range(img.h):\n", + " if img.mask[i, j]:\n", + " if lastc != -1:\n", + " ret.mask[last:i+1, j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = i\n", + " if lastc != -1:\n", + " ret.mask[last:, j] = lastc\n", + "\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAGdCAYAAABwyyjqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKNElEQVR4nO3dfVhU97nu8e8EZCbJ8KKggIqCUQhS0GB8g9hoFTUJKA1FTFoVKOxTtnK08XhaVMBAG19S1LTGtHWbGS6t26SxWrXB7Bx3SQ1iVYyNpp5Ita22KipHQKEBAnP+yM7sTNV2oSOo3J/rWldn/ea3nvWsScOdNTNrjcnhcDgQERGRf+qBrm5ARETkXqHQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BT5gmXLlmEymbq6DRG5Syk0pcvY7XZMJhMmk4n333//uucdDgchISGYTCYSExM7XP+ll15ix44dbuhUROQzCk3pchaLhS1btlw3/t577/GXv/wFs9l8S3VvJTSXLl3K3/72t1van4jc/xSa0uWefvppfv7zn/Ppp5+6jG/ZsoURI0YQFBR0x3tobGwEwNPTE4vFcsf3JyL3JoWmdLnnnnuO2tpa3n33XedYS0sLb731Fs8///x183/wgx8QFxeHv78/Dz74ICNGjOCtt95ymWMymWhsbKS0tNT5FnB6ejrw359b/v73v+f555+nZ8+ePPHEEy7Pfc5ms2EymXj99ddd6r/00kuYTCbefvttd70MInIPUGhKlwsNDWXs2LH8+7//u3OsrKyM+vp6Zs6ced38V155hccee4yioiJeeuklPD09SU1N5Ve/+pVzzqZNmzCbzYwbN45NmzaxadMm/sf/+B8udVJTU2lqauKll14iOzv7hr1lZGSQmJjICy+8wNmzZwE4duwYL774It/85jd5+umn3fESiMg9wrOrGxABeP7558nLy+Nvf/sbDz74ID/72c948skn6du373VzT548yYMPPuhcnzdvHrGxsaxevZpnnnkGgG984xt861vfYtCgQXzjG9+44T6HDRt2w89S/96GDRuIiorim9/8Jrt372bOnDkEBQWxevXqWzxaEblXKTTlrjBjxgwWLFjA7t27mTp1Krt37+aHP/zhDed+MTCvXLlCW1sb48aNczlTNeJb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SZMIDg4mKiqKvn37uq2HFStWMH/+fKqrqxk+fDi7du3Cy8sLgNjYWN58800KCgooLi4mODiYoqIi0tPTDddfunQpJpOJpUuX8te//tX5Dd3vf//7hmuYHEbPSd2koaEBX19fyK0Cs/WfbyByD3NUzerqFqQTNHzahu++Kurr6/Hx8bm9Wv/1N/K7R+oxe99erearDayI9XVLX1907do1+vXrh81m49lnn3Vb3XvBLX2m+eqrrxIaGorFYmH06NEdujBURETuTe3t7Vy8eJHi4mL8/PycNz3oTjocmm+88QYvvPAChYWFHDlyhGHDhjFlypTrvjosIiL3lzNnzhAYGMiWLVt4/fXX8fTsfp/wdTg0V69eTXZ2NhkZGQwdOpQf//jHPPTQQ7z++ut3oj8REblLhIaG4nA4OHv2LBMnTuzqdrpEh0KzpaWFqqoqJk2a9N8FHniASZMmUVlZecNtmpubr7uFk4iIyL2oQ6F5+fJl2tranHdz+FxgYCAXLly44TbLly93uX1TSEjIrXcrIiLShe74zQ3y8vJcbt909uzZO71LERGRO6JDn+IGBATg4eFBTU2Ny3hNTQ1BQUE33MZsNv/DWzaJiIjcKzp0punl5cWIESPYu3evc6y9vZ29e/e63GhXRETkftTh7wu/8MILzJkzh8cff5xRo0axdu1a54+LioiI3M86HJppaWlcunSJgoICLly4wPDhw9mzZ891Xw4SERG539zSlanz5s1j3rx57u5FRETkrqafBhMRETGo+90DSUTkHpC3/VF8LLd3XtPwSTsr3NSPfEZnmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRES6VHl5OSaTibq6utuqExoaytq1a93S080oNEVEBIBLly6Rk5PDgAEDMJvNBAUFMWXKFCoqKrq6NbcYP348JpPpuuWZZ54xXEO/pykiIgCkpKTQ0tJCaWkpgwYNoqamhr1791JbW9vVrbnFL37xC1paWpzrtbW1DBs2jNTUVMM1dKYpIiLU1dWxb98+Vq5cyYQJExg4cCCjRo0iLy+PadOmAZCZmUliYqLLdq2trfTp04eNGzcCn53N5ebmsmDBAnr27ElgYCAbNmygsbGRjIwMvL29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YKKioujbt6/belixYgXz58+nurqa4cOHs2vXLry8vACIjY3lzTffpKCggOLiYoKDgykqKiI9Pd1w/XPnzvHYY48513/wgx/wgx/8gCeffJLy8nJDNUwOh8PRkYO6XQ0NDfj6+hJV/gQeVmW23N9+51fe1S1IJ2i4Cr6PQX19PT4+PrdX67/+RpJbBWbrP9/gH2m+Bj8a4Za+vujatWv069cPm83Gs88+67a69wKlloiIGNLe3s7ly5cpKSnBz8/PedOD7kShKSIihpw5c4awsDD69++P3W7H07P7RUj3O2IREbkloaGhdPInencdXXIiIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExKBOv43e57dg2vPIv7v1rvsid6OGrm5AOkWDuQEIce8t5n40wn21xG06PTSvXr0KQEhISGfvWkTkjrp69epnP+sl961OD82+ffty9uxZvL29MZlMnbrvhoYGQkJCOHv2bLc6y9Vx67i7g648bofDwdWrV936g8xyd+r00HzggQfo379/Z+/WhY+PT7f6Y/I5HXf3ouPuXDrD7B70RSARERGDFJoiIiIGdavQNJvNFBYWYjabu7qVTqXj1nF3B931uKVzmRzd/We4RUTuIg0NDW7/fLS+vr5bfr59J3SrM00REZHbodAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiLSpcrLyzGZTNTV1d1WndDQUNauXeuWnm5GoSkiIgBcunSJnJwcBgwYgNlsJigoiClTplBRUdHVrbnNz3/+cx599FEsFgvR0dG8/fbbHdpeoSkiIgCkpKTwwQcfUFpaysmTJ9m5cyfjx4+ntra2q1tzi/379/Pcc8/xzW9+kw8++IDk5GSSk5M5fvy44RoKTRERoa6ujn379rFy5UomTJjAwIEDGTVqFHl5eUybNg2AzMxMEhMTXbZrbW2lT58+bNy4EYDx48eTm5vLggUL6NmzJ4GBgWzYsIHGxkYyMjLw9vZm8ODBlJWVXddDRUUFMTExWCwWxowZc12Ybdu2jaioKMxmM6GhoZSUlHToGF955RWmTp3KokWLiIyMpLi4mNjYWNatW2e4hkJTROQ+19DQ4LI0NzdfN8dqtWK1WtmxY8cNnwfIyspiz549nD9/3jm2e/dumpqaSEtLc46VlpYSEBDAwYMHyc3NJScnh9TUVOLi4jhy5AiTJ09m1qxZNDU1udRftGgRJSUlHDp0iN69e5OUlERraysAVVVVzJgxg5kzZ3Ls2DGWLVtGfn4+drvd8OtQWVnJpEmTXMamTJlCZWWl4Ro4RETkrlFfX+8A7uhSWFh4w32/9dZbjp49ezosFosjLi7OkZeX5/jd737nMmfo0KGOlStXOteTkpIc6enpzvUnn3zS8cQTTzjXP/30U8fDDz/smDVrlnPs/PnzDsBRWVnpcDgcjl//+tcOwLF161bnnNraWseDDz7oeOONNxwOh8Px/PPPOxISElx6WbRokWPo0KHO9YEDBzrWrFlz09e2R48eji1btriMvfrqq44+ffrcdJu/pzNNEZH73NmzZ6mvr3cueXl5N5yXkpLCuXPn2LlzJ1OnTqW8vJzY2FiXs7msrCxsNhsANTU1lJWVkZmZ6VInJibG+djDwwN/f3+io6OdY4GBgQBcvHjRZbuxY8c6H/fq1YuIiAhOnDgBwIkTJ4iPj3eZHx8fT3V1NW1tbUZfitum0BQRuc/5+Pi4LP/o59MsFgsJCQnk5+ezf/9+0tPTKSwsdD4/e/ZsTp8+TWVlJZs3byYsLIxx48a51OjRo4fLuslkchkzmUwAtLe3u+PwDAsKCqKmpsZlrKamhqCgIMM1FJoiInJTQ4cOpbGx0bnu7+9PcnIyNpsNu91ORkaG2/Z14MAB5+MrV65w8uRJIiMjAYiMjLzu0peKigrCw8Px8PAwVH/s2LHs3bvXZezdd991OcP9ZzwNzxQRkftWbW0tqampZGZmEhMTg7e3N4cPH2bVqlVMnz7dZW5WVhaJiYm0tbUxZ84ct/VQVFSEv78/gYGBLFmyhICAAJKTkwFYuHAhI0eOpLi4mLS0NCorK1m3bh3r1683XH/+/Pk8+eSTlJSU8Mwzz7B161YOHz7MT3/6U8M1FJoiIoLVamX06NGsWbOGU6dO0draSkhICNnZ2SxevNhl7qRJkwgODiYqKoq+ffu6rYcVK1Ywf/58qqurGT58OLt27cLLywuA2NhY3nzzTQoKCiguLiY4OJiioiLS09MN14+Li2PLli0sXbqUxYsXM2TIEHbs2MGXvvQlwzVMDofD0dEDExGRO6OhoQFfX1+31qyvr8fHx8dt9a5du0a/fv2w2Ww8++yzbqt7L9CZpoiIGNLe3s7ly5cpKSnBz8/PedOD7kShKSIihpw5c4awsDD69++P3W7H07P7RUj3O2IREbkloaGhdPdP9HTJiYiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RkbuIl5dXh34U+Z8JCgpy/lKI3D79yomIyF3mk08+oaWlxS21vLy8sFgsbqklCk0RERHD9PasiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYtD/B2ycJJ9M9wBfAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(connect(img1,0))" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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q1atorq6mvb2dt5//33eeecdp/8J+Efu+tCUrmvOnDkcPXqULVu2uLuVWyI8PJyPP/6Y3/3ud2RnZzN79mw+++wzd7d1U50+fZp58+bxi1/8osMZhPy306dPU19f71hyc3OvOi85OZkzZ86wY8cOpkyZQnl5OTExMU5nc5mZmdhsNgBqamooKysjIyPDqc4331f28PDA39+fqKgox9jXJzF/+7mSb/5lpEePHoSHh3Ps2DEAjh07RlxcnNP8uLg4qqurnb6U/u955ZVXGDx4MA8++CBeXl7MnTuX9PR07rnHeBTe9aEZEBCAh4cHNTU1TuM1NTX07t3bTV3JzTZ37lx27drFb37zG/r16+fudm4JLy8vBg0axPDhw1m2bBlDhw7llVdecXdbN1VVVRXnz58nJiYGT09PPD09+eCDD/jJT36Cp6en4V+md7uvP1X99WI2m68512KxEB8fT15eHvv27SMtLY2CggLH87NmzeLkyZNUVlayadMmQkNDGTt2rFONbt26Oa2bTCansa+/m/ZWf4l7z5492b59O42NjfzpT3/i//7f/4vVamXgwIGGa9z1oenl5cXw4cPZs2ePY6y9vZ09e/Z0mfd7uhK73c7cuXPZtm0b//mf/0loaKi7W3Kb9vb2a743dbeYMGECR44c4eOPP3YsjzzyCN/97nf5+OOP8fC4se+jFBgyZIjTp8/9/f1JSkrCZrNRUlJCenq6y/b1zQ+uXbp0iePHjxMREQFAREREh0tfKioqCAsL6/TP2WKx0LdvX7788ku2bt3KtGnTDG/r2ak93aGef/55Zs+ezSOPPMLIkSNZs2aN45Ncd7MrV67whz/8wbH+X//1X3z88cf06NGD/v37u7Gzm2fOnDls3ryZX/3qV3h7ezvet/b19eXee+91c3c3T25uLo8//jj9+/fn8uXLbN68mfLyct577z13t3ZTeXt7d3i/+v7778ff379LvI/tSrW1taSkpJCRkUF0dDTe3t4cOnSIlStXdgiVzMxMEhISaGtrY/bs2S7robCwEH9/fwIDA1m8eDEBAQEkJSUBsGDBAkaMGEFRURGpqalUVlaydu1a1q1bZ7j+7373O/7yl78wbNgw/vKXv7B06VLa29v5X//rfxmu0SVCMzU1lQsXLpCfn8+5c+cYNmwYu3fv7vDhoLvNoUOHGD9+vGP9+eefB2D27Nmd+sTZneS1114DvvrY+zfZbDbS0tJufUO3yPnz55k1axZnz57F19eX6Oho3nvvPeLj493dmtwhrFYro0aNYvXq1Zw4cYLW1laCg4PJyspi0aJFTnMnTpxIUFAQkZGR9OnTx2U9LF++nHnz5lFdXc2wYcPYuXMnXl5eAMTExPDWW2+Rn59PUVERQUFBFBYWduq/6y+++IIlS5Zw8uRJrFYrTzzxBBs3bsTPz89wDZPdbrd38rhEROQmaWhowNfXl4L7B2Ix3difl7+wt/FC40nq6+vx8fFxUYdf/RWrb9++2Gw2nn76aZfVvRN0iTNNERG5ce3t7Vy8eJHi4mL8/PwcNz3oShSaIiJiyKlTpwgNDaVfv36UlJTg6dn1IqTrHbGIiFyXkJAQuvo7enf9JSciIiKuotAUERExSKEpIiJikEJTRETEoC4Vms3NzSxduvSuv7XY39Jx67i7gq563HJrdambG3x90bCrL/S93em4ddxdwd1y3HfCzQ26si51pikiInIjFJoiIiIG3fKbG7S3t3PmzBm8vb0d36l2qzQ0NDj9s6vQceu4uwJ3Hrfdbufy5cv06dOnU19oLHeeWx6aZ86cITg4+Fbv1om79+8uOu6uRcd9650+fbrLfOl5V3XLQ9Pb2/urB//0AXhZb/Xu3eunw93dgXvkVLm7A/fRz7xraLkCrz/237/fXKB570fgfWMf3mm+3AAxvi7qSMANoen4k6yXFcxdLDS7Kv2cu54u+jO/1W85ya2nP76LiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIuFV5eTkmk4m6urobqhMSEsKaNWtc0tO1KDRFRASACxcukJ2dTf/+/TGbzfTu3ZvJkydTUVHh7tZcZs2aNYSHh3PvvfcSHBzMD37wA7744gvD29/yrwYTEZHbU3JyMi0tLZSWljJw4EBqamrYs2cPtbW17m7NJTZv3syPfvQj3njjDWJjYzl+/DhpaWmYTCZWrVplqIbONEVEhLq6Ovbu3cuKFSsYP348AwYMYOTIkeTm5jJ16lQAMjIySEhIcNqutbWVXr16sWHDBgDGjRtHTk4O8+fPp3v37gQGBrJ+/XoaGxtJT0/H29ubQYMGUVZW1qGHiooKoqOjsVgsjB49mqNHjzo9v3XrViIjIzGbzYSEhFBcXNypY9y3bx9xcXE8++yzhISEMGnSJJ555hkOHDhguIZCU0TkLtfQ0OC0NDc3d5hjtVqxWq1s3779qs8DZGZmsnv3bs6ePesY27VrF01NTaSmpjrGSktLCQgI4MCBA+Tk5JCdnU1KSgqxsbEcPnyYSZMmMXPmTJqampzqL1y4kOLiYg4ePEjPnj1JTEyktbUVgKqqKqZPn86MGTM4cuQIS5cuJS8vj5KSEsOvQ2xsLFVVVY6QPHnyJO+++y5PPPGE4RoKTRGRu1xwcDC+vr6OZdmyZR3meHp6UlJSQmlpKX5+fsTFxbFo0SI++eQTx5zY2FjCw8PZuHGjY8xms5GSkoLVanWMDR06lCVLljB48GByc3OxWCwEBASQlZXF4MGDyc/Pp7a21qk2QEFBAfHx8URFRVFaWkpNTQ3btm0DYNWqVUyYMIG8vDzCwsJIS0tj7ty5vPTSS4Zfh2effZbCwkIeffRRunXrxgMPPMC4ceNYtGiR4RoKTRGRu9zp06epr693LLm5uVedl5yczJkzZ9ixYwdTpkyhvLycmJgYp7O5zMxMbDYbADU1NZSVlZGRkeFUJzo62vHYw8MDf39/oqKiHGOBgYEAnD9/3mm7MWPGOB736NGD8PBwjh07BsCxY8eIi4tzmh8XF0d1dTVtbW2GXofy8nJefPFF1q1bx+HDh3nnnXf49a9/TVFRkaHtQaEpInLX8/HxcVrMZvM151osFuLj48nLy2Pfvn2kpaVRUFDgeH7WrFmcPHmSyspKNm3aRGhoKGPHjnWq0a1bN6d1k8nkNGYymQBob293xeEZlpeXx8yZM8nMzCQqKoqnnnqKF198kWXLlhnuRaEpIiLXNGTIEBobGx3r/v7+JCUlYbPZKCkpIT093WX72r9/v+PxpUuXOH78OBEREQBERER0uPSloqKCsLAwPDw8DNVvamrinnucY+/rbe12u6EauuRERESora0lJSWFjIwMoqOj8fb25tChQ6xcuZJp06Y5zc3MzCQhIYG2tjZmz57tsh4KCwvx9/cnMDCQxYsXExAQQFJSEgALFixgxIgRFBUVkZqaSmVlJWvXrmXdunWG6ycmJrJq1SoefvhhRo0axR/+8Afy8vJITEw0HLwKTRERwWq1MmrUKFavXs2JEydobW0lODiYrKysDh+UmThxIkFBQURGRtKnTx+X9bB8+XLmzZtHdXU1w4YNY+fOnXh5eQEQExPDW2+9RX5+PkVFRQQFBVFYWEhaWprh+kuWLMFkMrFkyRL+8pe/OD6h++Mf/9hwDZPd6DmpizQ0NODr6ws5VWC2/uMN7iYvh7u7A/f4l8/d3YH76GfeNTRfgZ8Op76+Hh8fnxsq9fXvyB8drsfsfWO1mi83sDzG1yV9fdOVK1fo27cvNpuNp59+2mV17wTX9Z7mq6++SkhICBaLhVGjRnXqwlAREbkztbe3c/78eYqKivDz83Pc9KAr6XRovvnmmzz//PMUFBRw+PBhhg4dyuTJkzt8dFhERO4up06dIjAwkM2bN/PGG2/g6dn13uHrdGiuWrWKrKws0tPTGTJkCD/72c+47777eOONN25GfyIicpsICQnBbrdz+vRpJkyY4O523KJTodnS0kJVVRUTJ0787wL33MPEiROprKy86jbNzc0dbuEkIiJyJ+pUaF68eJG2tjbH3Ry+FhgYyLlz5666zbJly5xu3xQcHHz93YqIiLjRTb+5QW5urtPtm06fPn2zdykiInJTdOpd3ICAADw8PKipqXEar6mpoXfv3lfdxmw2/91bNomIiNwpOnWm6eXlxfDhw9mzZ49jrL29nT179jjdaFdERORu1OnPCz///PPMnj2bRx55hJEjR7JmzRrHl4uKiIjczTodmqmpqVy4cIH8/HzOnTvHsGHD2L17d4cPB4mIiNxtruvK1Llz5zJ37lxX9yIiInJb01eDiYiIGNT17oEkInIHyN32ID6WGzuvafiineUu6ke+ojNNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiIm5VXl6OyWSirq7uhuqEhISwZs0al/R0LQpNEREB4MKFC2RnZ9O/f3/MZjO9e/dm8uTJVFRUuLs1lxg3bhwmk6nD8uSTTxquoe/TFBERAJKTk2lpaaG0tJSBAwdSU1PDnj17qK2tdXdrLvHOO+/Q0tLiWK+trWXo0KGkpKQYrqEzTRERoa6ujr1797JixQrGjx/PgAEDGDlyJLm5uUydOhWAjIwMEhISnLZrbW2lV69ebNiwAfjqbC4nJ4f58+fTvXt3AgMDWb9+PY2NjaSnp+Pt7c2gQYMoKyvr0ENFRQXR0dFYLBZGjx7N0aNHnZ7funUrkZGRmM1mQkJCKC4u7tQx9ujRg969ezuW999/n/vuu0+hKSIi/62hocFpaW5u7jDHarVitVrZvn37VZ8HyMzMZPfu3Zw9e9YxtmvXLpqamkhNTXWMlZaWEhAQwIEDB8jJySE7O5uUlBRiY2M5fPgwkyZNYubMmTQ1NTnVX7hwIcXFxRw8eJCePXuSmJhIa2srAFVVVUyfPp0ZM2Zw5MgRli5dSl5eHiUlJdf9umzYsIEZM2Zw//33G95GoSkicpcLDg7G19fXsSxbtqzDHE9PT0pKSigtLcXPz4+4uDgWLVrEJ5984pgTGxtLeHg4GzdudIzZbDZSUlKwWq2OsaFDh7JkyRIGDx5Mbm4uFouFgIAAsrKyGDx4MPn5+dTW1jrVBigoKCA+Pp6oqChKS0upqalh27ZtAKxatYoJEyaQl5dHWFgYaWlpzJ07l5deeum6XpMDBw5w9OhRMjMzO7WdQlNE5C53+vRp6uvrHUtubu5V5yUnJ3PmzBl27NjBlClTKC8vJyYmxulsLjMzE5vNBkBNTQ1lZWVkZGQ41YmOjnY89vDwwN/fn6ioKMdYYGAgAOfPn3fabsyYMY7HPXr0IDw8nGPHjgFw7Ngx4uLinObHxcVRXV1NW1ub0ZfCYcOGDURFRTFy5MhObafQFBG5y/n4+DgtZrP5mnMtFgvx8fHk5eWxb98+0tLSKCgocDw/a9YsTp48SWVlJZs2bSI0NJSxY8c61ejWrZvTuslkchozmUwAtLe3u+LwOq2xsZEtW7bw3HPPdXpb93169qfD3bZrucVeDnd3B3Kr6Wd+1xgyZAjbt293rPv7+5OUlITNZqOyspL09HSX7Wv//v30798fgEuXLnH8+HEiIiIAiIiI6HDpS0VFBWFhYXh4eHRqP7/85S9pbm7me9/7Xqd71CUnIiJCbW0tKSkpZGRkEB0djbe3N4cOHWLlypVMmzbNaW5mZiYJCQm0tbUxe/Zsl/VQWFiIv78/gYGBLF68mICAAJKSkgBYsGABI0aMoKioiNTUVCorK1m7di3r1q3r9H42bNhAUlIS/v7+nd5WoSkiIlitVkaNGsXq1as5ceIEra2tBAcHk5WVxaJFi5zmTpw4kaCgICIjI+nTp4/Leli+fDnz5s2jurqaYcOGsXPnTry8vACIiYnhrbfeIj8/n6KiIoKCgigsLCQtLa1T+/j888/58MMP+Y//+I/r6tFkt9vt17XldWpoaMDX1/dW7lJE5Jaor6/Hx8fnhmp8/TuyPi8IH8uNfeyk4Yt2fIvOuqSvb7py5Qp9+/bFZrPx9NNPu6zunUBnmiIiYkh7ezsXL16kuLgYPz8/x00PuhKFpoiIGHLq1ClCQ0Pp168fJSUleHp2vQjpekcsIiLXJSQkhFv8jt5tR9dpioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBikOwKJiNyG6tf+HLvp/huq0WBvBBJd05AAOtMUERExTKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExKBOh+Zvf/tbEhMT6dOnDyaTie3bt9+EtkRERG4/nQ7NxsZGhg4dyquvvnoz+hEREbltdfpbTh5//HEef/zxm9GLiIjIbe2mv6fZ3NxMQ0OD0yIiIvK18vJyTCYTdXV1N1QnJCSENWvWuKSna7npobls2TJ8fX0dS3Bw8M3epYiIXIcLFy6QnZ1N//79MZvN9O7dm8mTJ1NRUeHu1lymrq6OOXPmEBQUhNlsJiwsjHfffdfw9jf9S6hzc3N5/vnnHesNDQ0KThGR21BycjItLS2UlpYycOBAampq2LNnD7W1te5uzSVaWlqIj4+nV69evP322/Tt25c//elP+Pn5Ga5x0880zWYzPj4+TouIiNxe6urq2Lt3LytWrGD8+PEMGDCAkSNHkpuby9SpUwHIyMggISHBabvW1lZ69erFhg0bABg3bhw5OTnMnz+f7t27ExgYyPr162lsbCQ9PR1vb28GDRpEWVlZhx4qKiqIjo7GYrEwevRojh496vT81q1biYyMxGw2ExISQnFxcaeO8Y033uD//b//x/bt24mLiyMkJITHHnuMoUOHGq6h6zRFRO5yf/u5kubm5g5zrFYrVquV7du3X/V5gMzMTHbv3s3Zs2cdY7t27aKpqYnU1FTHWGlpKQEBARw4cICcnByys7NJSUkhNjaWw4cPM2nSJGbOnElTU5NT/YULF1JcXMzBgwfp2bMniYmJtLa2AlBVVcX06dOZMWMGR44cYenSpeTl5VFSUmL4ddixYwdjxoxhzpw5BAYG8tBDD/Hiiy/S1tZmuAb2Trp8+bL9o48+sn/00Ud2wL5q1Sr7Rx99ZP/Tn/5kaPv6+no7oEWLFi133VJfX9/ZX6nX/B15qvtOe12P/7yh5VT3nVfts6Cg4Kr7fvvtt+3du3e3WywWe2xsrD03N9f++9//3mnOkCFD7CtWrHCsJyYm2tPS0hzrjz32mP3RRx91rH/55Zf2+++/3z5z5kzH2NmzZ+2AvbKy0m632+2/+c1v7IB9y5Ytjjm1tbX2e++91/7mm2/a7Xa7/dlnn7XHx8c79bJw4UL7kCFDHOsDBgywr169+pqvbXh4uN1sNtszMjLshw4dsm/ZssXeo0cP+9KlS6+5zd/q9JnmoUOHePjhh3n44YcBeP7553n44YfJz8/vbCkREbkFTp8+TX19vWPJzc296rzk5GTOnDnDjh07mDJlCuXl5cTExDidzWVmZmKz2QCoqamhrKyMjIwMpzrR0dGOxx4eHvj7+xMVFeUYCwwMBOD8+fNO240ZM8bxuEePHoSHh3Ps2DEAjh07RlxcnNP8uLg4qqurDZ8ptre306tXL37+858zfPhwUlNTWbx4MT/72c8MbQ/X8efZcePGYbfbOyydOUUWEZFb528/V2I2m68512KxEB8fT15eHvv27SMtLY2CggLH87NmzeLkyZNUVlayadMmQkNDGTt2rFONbt26Oa2bTCanMZPJBHwVYrdSUFAQYWFheHh4OMYiIiI4d+4cLS0thmroPU0REbmmIUOG0NjY6Fj39/cnKSkJm81GSUkJ6enpLtvX/v37HY8vXbrE8ePHiYiIAL4Kt7+99KWioqJDCP49cXFx/OEPf3AK6+PHjxMUFISXl5ehGjf9khMREbn91dbWkpKSQkZGBtHR0Xh7e3Po0CFWrlzJtGnTnOZmZmaSkJBAW1sbs2fPdlkPhYWF+Pv7ExgYyOLFiwkICCApKQmABQsWMGLECIqKikhNTaWyspK1a9eybt06w/Wzs7NZu3Yt8+bNIycnh+rqal588UX+5//8n4ZrKDRFRASr1cqoUaNYvXo1J06coLW1leDgYLKysli0aJHT3IkTJxIUFERkZCR9+vRxWQ/Lly9n3rx5VFdXM2zYMHbu3Ok4A4yJieGtt94iPz+foqIigoKCKCwsJC0tzXD94OBg3nvvPX7wgx8QHR1N3759mTdvHj/84Q8N1zDZ7XZ7Zw/sRjQ0NODr63srdykickvU19ff8LXoX/+OPNV9Jz6m+2+slr2R/pcSXdLXN125coW+fftis9l4+umnXVb3TqAzTRERMaS9vZ2LFy9SXFyMn5+f46YHXYlCU0REDDl16hShoaH069ePkpISPD27XoR0vSMWEZHrEhISwi1+R++2o0tOREREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAzSHYFERG5D/7m6lvvu++sN1WhqaoI01/QjX9GZpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETHIbZec1I8djo+nh7t27xam3xxwdwtuYR8/0t0tuI1+5l1Dw5dt+O6tcncbcgvoTFNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERG3Ki8vx2QyUVdXd0N1QkJCWLNmjUt6uhaFpoiIAHDhwgWys7Pp378/ZrOZ3r17M3nyZCoqKtzdmkuUlJRgMpmcFovF0qka+j5NEREBIDk5mZaWFkpLSxk4cCA1NTXs2bOH2tpad7fmMj4+Pnz++eeOdZPJ1KntdaYpIiLU1dWxd+9eVqxYwfjx4xkwYAAjR44kNzeXqVOnApCRkUFCQoLTdq2trfTq1YsNGzYAMG7cOHJycpg/fz7du3cnMDCQ9evX09jYSHp6Ot7e3gwaNIiysrIOPVRUVBAdHY3FYmH06NEcPXrU6fmtW7cSGRmJ2WwmJCSE4uLiTh+nyWSid+/ejiUwMLBT2ys0RUTucg0NDU5Lc3NzhzlWqxWr1cr27duv+jxAZmYmu3fv5uzZs46xXbt20dTURGpqqmOstLSUgIAADhw4QE5ODtnZ2aSkpBAbG8vhw4eZNGkSM2fOpKmpyan+woULKS4u5uDBg/Ts2ZPExERaW1sBqKqqYvr06cyYMYMjR46wdOlS8vLyKCkp6dRrceXKFQYMGEBwcDDTpk3j008/7dT2Ck0RkbtccHAwvr6+jmXZsmUd5nh6elJSUkJpaSl+fn7ExcWxaNEiPvnkE8ec2NhYwsPD2bhxo2PMZrORkpKC1Wp1jA0dOpQlS5YwePBgcnNzsVgsBAQEkJWVxeDBg8nPz6e2ttapNkBBQQHx8fFERUVRWlpKTU0N27ZtA2DVqlVMmDCBvLw8wsLCSEtLY+7cubz00kuGX4fw8HDeeOMNfvWrX7Fp0yba29uJjY3lz3/+s+EaCk0Rkbvc6dOnqa+vdyy5ublXnZecnMyZM2fYsWMHU6ZMoby8nJiYGKezuczMTGw2GwA1NTWUlZWRkZHhVCc6Otrx2MPDA39/f6KiohxjX/9J9Pz5807bjRkzxvG4R48ehIeHc+zYMQCOHTtGXFyc0/y4uDiqq6tpa2sz9DqMGTOGWbNmMWzYMB577DHeeecdevbsyeuvv25oe1Boiojc9Xx8fJwWs9l8zbkWi4X4+Hjy8vLYt28faWlpFBQUOJ6fNWsWJ0+epLKykk2bNhEaGsrYsWOdanTr1s1p3WQyOY19/eGb9vZ2VxzedevWrRsPP/wwf/jDHwxvo9AUEZFrGjJkCI2NjY51f39/kpKSsNlslJSUkJ6e7rJ97d+/3/H40qVLHD9+nIiICAAiIiI6XPpSUVFBWFgYHh7X9zWTbW1tHDlyhKCgIMPb6JITERGhtraWlJQUMjIyiI6Oxtvbm0OHDrFy5UqmTZvmNDczM5OEhATa2tqYPXu2y3ooLCzE39+fwMBAFi9eTEBAAElJSQAsWLCAESNGUFRURGpqKpWVlaxdu5Z169Z1qv7o0aMZNGgQdXV1vPTSS/zpT38iMzPTcA2FpoiIYLVaGTVqFKtXr+bEiRO0trYSHBxMVlYWixYtcpo7ceJEgoKCiIyMpE+fPi7rYfny5cybN4/q6mqGDRvGzp078fLyAiAmJoa33nqL/Px8ioqKCAoKorCwkLS0NMP1L126RFZWFufOnaN79+4MHz6cffv2MWTIEMM1THa73d7ZA7sRDQ0N+Pr6Uj92OD6e13dKfacy/eaAu1twC/v4ke5uwW30M+8aGr5sw3dvFfX19fj4+NxYrf//d2RJSQn33XffDdVqamoiLS3NJX1905UrV+jbty82m42nn37aZXXvBDrTFBERQ9rb27l48SLFxcX4+fk5bnrQlSg0RUTEkFOnThEaGkq/fv0oKSnB07PrRUjXO2IREbkuISEh3OJ39G47uuRERETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNSp0Fy2bBkjRozA29ubXr16kZSUxOeff36zehMREbmtdCo0P/jgA+bMmcP+/ft5//33aW1tZdKkSU53wBcREblbdermBrt373ZaLykpoVevXlRVVfGtb33LpY2JiIjcbm7ojkD19fXAV9+wfS3Nzc00Nzc71hsaGm5klyIiIm5z3aHZ3t7O/PnziYuL46GHHrrmvGXLlvHCCy9c725ERLqkp4am4eN9YzUaLkOaS7qRr133p2fnzJnD0aNH2bJly9+dl5ubS319vWM5ffr09e5SRETEra7rTHPu3Lns2rWL3/72t/Tr1+/vzjWbzZjN5utqTkRE5HbSqdC02+3k5OSwbds2ysvLCQ0NvVl9iYiI3HY6FZpz5sxh8+bN/OpXv8Lb25tz584B4Ovry7333ntTGhQREblddOo9zddee436+nrGjRtHUFCQY3nzzTdvVn8iIiK3jU7/eVZERKSr0r1nRUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIi4lbl5eWYTCbq6upuqE5ISAhr1qxxSU/XotAUEREALly4QHZ2Nv3798dsNtO7d28mT55MRUWFu1tzuS1btmAymUhKSurUdjf0JdQiInL3SE5OpqWlhdLSUgYOHEhNTQ179uyhtrbW3a251B//+Ef+5V/+hbFjx3Z6W51piogIdXV17N27lxUrVjB+/HgGDBjAyJEjyc3NZerUqQBkZGSQkJDgtF1rayu9evViw4YNAIwbN46cnBzmz59P9+7dCQwMZP369TQ2NpKeno63tzeDBg2irKysQw8VFRVER0djsVgYPXo0R48edXp+69atREZGYjabCQkJobi4uNPH2dbWxne/+11eeOEFBg4c2OntFZoiIne5hoYGp6W5ubnDHKvVitVqZfv27Vd9HiAzM5Pdu3dz9uxZx9iuXbtoamoiNTXVMVZaWkpAQAAHDhwgJyeH7OxsUlJSiI2N5fDhw0yaNImZM2fS1NTkVH/hwoUUFxdz8OBBevbsSWJiIq2trQBUVVUxffp0ZsyYwZEjR1i6dCl5eXmUlJR06rUoLCykV69ePPfcc53a7msKTRGRu1xwcDC+vr6OZdmyZR3meHp6UlJSQmlpKX5+fsTFxbFo0SI++eQTx5zY2FjCw8PZuHGjY8xms5GSkoLVanWMDR06lCVLljB48GByc3OxWCwEBASQlZXF4MGDyc/Pp7a21qk2QEFBAfHx8URFRVFaWkpNTQ3btm0DYNWqVUyYMIG8vDzCwsJIS0tj7ty5vPTSS4Zfhw8//JANGzawfv16w9v8LYWmiMhd7vTp09TX1zuW3Nzcq85LTk7mzJkz7NixgylTplBeXk5MTIzT2VxmZiY2mw2AmpoaysrKyMjIcKoTHR3teOzh4YG/vz9RUVGOscDAQADOnz/vtN2YMWMcj3v06EF4eDjHjh0D4NixY8TFxTnNj4uLo7q6mra2tn/4Gly+fJmZM2eyfv16AgIC/uH8a9EHgURE7nI+Pj74+PgYmmuxWIiPjyc+Pp68vDwyMzMpKCggLS0NgFmzZvGjH/2IyspK9u3bR2hoaIcP1HTr1s1p3WQyOY2ZTCYA2tvbb+CoOufEiRP88Y9/JDEx0TH29f49PT35/PPPeeCBB/5hHYWmiIhc05AhQ9i+fbtj3d/fn6SkJGw2G5WVlaSnp7tsX/v376d///4AXLp0iePHjxMREQFAREREh0tfKioqCAsLw8PD4x/WfvDBBzly5IjT2JIlS7h8+TKvvPIKwcHBhnpUaIqICLW1taSkpJCRkUF0dDTe3t4cOnSIlStXMm3aNKe5mZmZJCQk0NbWxuzZs13WQ2FhIf7+/gQGBrJ48WICAgIc11EuWLCAESNGUFRURGpqKpWVlaxdu5Z169YZqm2xWHjooYecxvz8/AA6jP89Ck0REcFqtTJq1ChWr17NiRMnaG1tJTg4mKysLBYtWuQ0d+LEiQQFBREZGUmfPn1c1sPy5cuZN28e1dXVDBs2jJ07d+Ll5QVATEwMb731Fvn5+RQVFREUFERhYaHjz8a3islut9tv5Q4bGhrw9fWlfuxwfDz/8Sn13cT0mwPubsEt7ONHursFt9HPvGto+LIN371V1NfXG37v8Jq1vv4d+RH4eN9gX5fB92Fc0tc3Xblyhb59+2Kz2Xj66addVvdOoDNNERExpL29nYsXL1JcXIyfn5/jpgddiUJTREQMOXXqFKGhofTr14+SkhI8PbtehHS9IxYRkesSEhLCLX5H77ajmxuIiIgY5LYzTd+9Ve7atdxiXfXDMF2ZfuZyt9KZpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQ7ggkInIbiq1/FI+2G/sV3XblS+BD1zQkgM40RUREDFNoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiLhVeXk5JpOJurq6G6oTEhLCmjVrXNLTtSg0RUQEgAsXLpCdnU3//v0xm8307t2byZMnU1FR4e7WXOKdd97hkUcewc/Pj/vvv59hw4axcePGTtXQ92mKiAgAycnJtLS0UFpaysCBA6mpqWHPnj3U1ta6uzWX6NGjB4sXL+bBBx/Ey8uLXbt2kZ6eTq9evZg8ebKhGjrTFBER6urq2Lt3LytWrGD8+PEMGDCAkSNHkpuby9SpUwHIyMggISHBabvW1lZ69erFhg0bABg3bhw5OTnMnz+f7t27ExgYyPr162lsbCQ9PR1vb28GDRpEWVlZhx4qKiqIjo7GYrEwevRojh496vT81q1biYyMxGw2ExISQnFxcaeOcdy4cTz11FNERETwwAMPMG/ePKKjo/nwQ+Nf1K3QFBG5yzU0NDgtzc3NHeZYrVasVivbt2+/6vMAmZmZ7N69m7NnzzrGdu3aRVNTE6mpqY6x0tJSAgICOHDgADk5OWRnZ5OSkkJsbCyHDx9m0qRJzJw5k6amJqf6CxcupLi4mIMHD9KzZ08SExNpbW0FoKqqiunTpzNjxgyOHDnC0qVLycvLo6Sk5LpeE7vdzp49e/j888/51re+ZXg7haaIyF0uODgYX19fx7Js2bIOczw9PSkpKaG0tBQ/Pz/i4uJYtGgRn3zyiWNObGws4eHhTu8D2mw2UlJSsFqtjrGhQ4eyZMkSBg8eTG5uLhaLhYCAALKyshg8eDD5+fnU1tY61QYoKCggPj6eqKgoSktLqampYdu2bQCsWrWKCRMmkJeXR1hYGGlpacydO5eXXnqpU69FfX09VqsVLy8vnnzySX76058SHx9vePtOheZrr71GdHQ0Pj4++Pj4MGbMmKueYouIyO3j9OnT1NfXO5bc3NyrzktOTubMmTPs2LGDKVOmUF5eTkxMjNPZXGZmJjabDYCamhrKysrIyMhwqhMdHe147OHhgb+/P1FRUY6xwMBAAM6fP++03ZgxYxyPe/ToQXh4OMeOHQPg2LFjxMXFOc2Pi4ujurqatrY2oy8F3t7efPzxxxw8eJAf//jHPP/885SXlxvevlOh2a9fP5YvX05VVRWHDh3i29/+NtOmTePTTz/tTBkREbmFvj7R+Xoxm83XnGuxWIiPjycvL499+/aRlpZGQUGB4/lZs2Zx8uRJKisr2bRpE6GhoYwdO9apRrdu3ZzWTSaT05jJZAKgvb3dFYfXKffccw+DBg1i2LBhLFiwgO985ztXPfO+5vad2VliYiJPPPEEgwcPJiwsjB//+MdYrVb279/f6cZFROT2N2TIEBobGx3r/v7+JCUlYbPZKCkpIT093WX7+maWXLp0iePHjxMREQFAREREh0tfKioqCAsLw8PD47r32d7efs33cK/mui85aWtr45e//CWNjY1Op9R/q7m52amhhoaG692liIjcJLW1taSkpJCRkUF0dDTe3t4cOnSIlStXMm3aNKe5mZmZJCQk0NbWxuzZs13WQ2FhIf7+/gQGBrJ48WICAgJISkoCYMGCBYwYMYKioiJSU1OprKxk7dq1rFu3znD9ZcuW8cgjj/DAAw/Q3NzMu+++y8aNG3nttdcM1+h0aB45coQxY8bwxRdfYLVa2bZtG0OGDPm7Tb7wwgud3Y2IiNxCVquVUaNGsXr1ak6cOEFrayvBwcFkZWWxaNEip7kTJ04kKCiIyMhI+vTp47Ieli9fzrx586iurmbYsGHs3LkTLy8vAGJiYnjrrbfIz8+nqKiIoKAgCgsLSUtLM1y/sbGRf/7nf+bPf/4z9957Lw8++CCbNm1y+uTvP2Ky2+32zhxUS0sLp06dor6+nrfffpt/+7d/44MPPrhmcF7tTDM4OLgzuxQRuSPU19fj4+NzQzUaGhrw9fUlsvxRPKw3dv+Ztitf8um4D13S1zdduXKFvn37YrPZePrpp11W907Q6Z+Il5cXgwYNAmD48OEcPHiQV155hddff/2q881m899901lERO4M7e3tXLx4keLiYvz8/Bw3PehKbvg2ep19E1VERO5Mp06dIjQ0lH79+lFSUoKnZ9e7E2unjjg3N5fHH3+c/v37c/nyZTZv3kx5eTnvvffezepPRERuEyEhIXTyHb27TqdC8/z588yaNYuzZ8/i6+tLdHQ07733XqfupiAiInKn6lRofn1DXhERka5I954VERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNT1bhwoInIH2Jf3V3w8r//LlQEavmzD10X9yFd0pikiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEp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fwIDA1m8eDEBAQEkJSUBsGDBAkaMGEFRURGpqalUVlaydu1a1q1bZ7h+S0sLn332mePxX/7yFz7++GOsViuDBg0yVEOhKSIiWK1WRo0axerVqzlx4gStra0EBweTlZXFokWLnOZOnDiRoKAgIiMj6dOnj8t6WL58OfPmzaO6upphw4axc+dOvLy8AIiJieGtt94iPz+foqIigoKCKCwsJC0tzXD9M2fO8PDDDzvWX375ZV5++WUee+wxysvLDdUw2e12e2cO6kY1NDTg6+tLZPmjeFi7VmZ/8ki5u1twi+hD49zdgtvoZ941tF35kk/HfUh9fT0+Pj43VOvr35HkVIHZ+o83+Huar8BPh7ukr2+6cuUKffv2xWaz8fTTT7us7p2ga6WWiIhct/b2di5evEhxcTF+fn6Omx50JQpNEREx5NSpU4SGhtKvXz9KSkrw9Ox6EdL1jlhERK5LSEgIt/gdvduOLjkRERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYtAtv43e17dg2v3Av7v0rvt3hHp3NyC3nH7mXUJDQwPBBLv2FnM/He66WuIytzw0L1++DEBwcPCt3rWIyE11+fLlr77WS+5atzw0+/Tpw+nTp/H29sZkMt3SfTc0NBAcHMzp06e71FmujlvH3RW487jtdjuXL1926Rcyy+3plofmPffcQ79+/W71bp34+Ph0qV8mX9Nxdy067ltLZ5hdgz4IJCIiYpBCU0RExKAuFZpms5mCggLMZrO7W7mldNw67q6gqx633Fome1f/Gm4RkdtIQ0ODy98fra+v75Lvb98MXepMU0RE5EYoNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiLhVeXk5JpOJurq6G6oTEhLCmjVrXNLTtSg0RUQEgAsXLpCdnU3//v0xm8307t2byZMnU1FR4e7WXOaXv/wlDz74IBaLhaioKN59991Oba/QFBERAJKTk/noo48oLS3l+PHj7Nixg3HjxlFbW+vu1lxi3759PPPMMzz33HN89NFHJCUlkZSUxNGjRw3XUGiKiAh1dXXs3buXFStWMH78eAYMGMDIkSPJzc1l6tSpAGRkZJCQkOC0XWtrK7169WLDhg0AjBs3jpycHObPn0/37t0JDAxk/fr1NDY2kp6ejre3N4MGDaKsrKxDDxUVFURHR2OxWBg9enSHMNu6dSuRkZGYzWZCQkIoLi7u1DG+8sorTJkyhYULFxIREUFRURExMTGsXbvWcA2FpojIXa6hocFpaW5u7jDHarVitVrZvn37VZ8HyMzMZPfu3Zw9e9YxtmvXLpqamkhNTXWMlZaWEhAQwIEDB8jJySE7O5uUlBRiY2M5fPgwkyZNYubMmTQ1NTnVX7hwIcXFxRw8eJCePXuSmJhIa2srAFVVVUyfPp0ZM2Zw5MgRli5dSl5eHiUlJYZfh8rKSiZOnOg0NnnyZCorKw3XwC4iIreN+vp6O3BTl4KCgqvu++2337Z3797dbrFY7LGxsfbc3Fz773//e6c5Q4YMsa9YscKxnpiYaE9LS3OsP/bYY/ZHH33Usf7ll1/a77//fvvMmTMdY2fPnrUD9srKSrvdbrf/5je/sQP2LVu2OObU1tba7733Xvubb75pt9vt9meffdYeHx/v1MvChQvtQ4YMcawPGDDAvnr16mu+tt26dbNv3rzZaezVV1+19+rV65rb/C2daYqI3OVOnz5NfX29Y8nNzb3qvOTkZM6cOcOOHTuYMmUK5eXlxMTEOJ3NZWZmYrPZAKipqaGsrIyMjAynOtHR0Y7HHh4e+Pv7ExUV5RgLDAwE4Pz5807bjRkzxvG4R48ehIeHc+zYMQCOHTtGXFyc0/y4uDiqq6tpa2sz+lLcMIWmiMhdzsfHx2n5e1+fZrFYiI+PJy8vj3379pGWlkZBQYHj+VmzZnHy5EkqKyvZtGkToaGhjB071qlGt27dnNZNJpPTmMlkAqC9vd0Vh2dY7969qampcRqrqamhd+/ehmsoNEVE5JqGDBlCY2OjY93f35+kpCRsNhslJSWkp6e7bF/79+93PL506RLHjx8nIiICgIiIiA6XvlRUVBAWFoaHh4eh+mPGjGHPnj1OY++//77TGe4/4ml4poiI3LVqa2tJSUkhIyOD6OhovL29OXToECtXrmTatGlOczMzM0lISKCtrY3Zs2e7rIfCwkL8/f0JDAxk8eLFBAQEkJSUBMCCBQsYMWIERUVFpKamUllZydq1a1m3bp3h+vPmzeOxxx6juLiYJ598ki1btnDo0CF+/vOfG66h0BQREaxWK6NGjWL16tWcOHGC1tZWgoODycrKYtGiRU5zJ06cSFBQEJGRkfTp08dlPSxfvpx58+ZRXV3NsGHD2LlzJ15eXgDExMTw1ltvkZ+fT1FREUFBQRQWFpKWlma4fmxsLJs3b2bJkiUsWrSIwYMHs337dh566CHDNUx2u93e2QMTEZGbo6GhAV9fX5fWrK+vx8fHx2X1rly5Qt++fbHZbDz99NMuq3sn0JmmiIgY0t7ezsWLFykuLsbPz89x04OuRKEpIiKGnDp1itDQUPr160dJSQmenl0vQrreEYuIyHUJCQmhq7+jp0tOREREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqI3Ea8vLw69aXI/0jv3r0d3xQiN07fciIicpv54osvaGlpcUktLy8vLBaLS2qJQlNERMQw/XlWRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMej/A2DNINg9UQ5bAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Horizontal result:\n" + ] + }, + { + "data": { + "image/png": "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t6/LelixYgULFiygsrKS4cOHs3v3bjw8PACIiorirbfeIi8vj8LCQgICAigoKCAlJcVw/aVLl2IymVi6dCl//vOfHZ/Q/dGPfmS4hslu9JzURerq6vD29u7IXd49/vnzzu6gc7wc2tkddB79zLuU2tpavLy8bqvGV78jf3isFrPn7dVqvFbHiihvl/T1ddevX6dfv37YbDZmzJjhsrr3glt6T/PVV18lKCgIi8XC6NGj23VhqIiI3JtaW1u5dOkShYWF+Pj4OG560JW0OzTffPNNXnjhBfLz8zl27BjDhg1jypQpbT46LCIi95ezZ8/i7+/P1q1beeONN3B373rv8LU7NNesWUNGRgapqakMHTqUn/70pzz44IO88cYbd6I/ERG5SwQFBWG32zl37hwTJ07s7HY6RbtCs6mpiaNHjzJp0qT/LvDAA0yaNImKioobbtPY2NjmFk4iIiL3onaF5pUrV2hpaXHczeEr/v7+XLx48YbbLF++3On2TYGBgbferYiISCe64zc3yM7Odrp907lz5+70LkVERO6Idr2L6+fnh5ubG1VVVU7jVVVV9OnT54bbmM3mv3vLJhERkXtFu840PTw8GDFiBPv27XOMtba2sm/fPqcb7YqIiNyP2v154RdeeIG5c+fy+OOPM2rUKNatW+f4clEREZH7WbtDMzk5mcuXL5OXl8fFixcZPnw4e/fubfPhIBERkfvNLV2ZOn/+fObPn+/qXkRERO5q+mowERERg7rePZBERO4B2Tsewctye+c1dV+0ssJF/chf6UxTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqISKcqKyvDZDJRU1NzW3WCgoJYt26dS3q6GYWmiIgAcPnyZTIzMxkwYABms5k+ffowZcoUysvLO7s1lxg/fjwmk6nN8vTTTxuuoe/TFBERABITE2lqaqKkpIRBgwZRVVXFvn37qK6u7uzWXOKdd96hqanJsV5dXc2wYcNISkoyXENnmiIiQk1NDfv372flypVMmDCBgQMHMmrUKLKzs5k2bRoAaWlpxMXFOW3X3NxM79692bRpE/DXs7msrCwWLlxIjx498Pf3Z+PGjdTX15OamoqnpyeDBw+mtLS0TQ/l5eVE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kCFDCAkJ4Uc/+hFWq5WDBw+2u3EREbn7DR06lPr6ese6r68vCQkJ2Gw2iouLSU1Nddm+vp4lV69e5dSpU4SFhQEQFhbW5tKX8vJyQkJCcHNzu+V9tra23vQ93Bu55UtOWlpa+MUvfkF9fb3TKfXfamxsdGqorq7uVncpIiJ3SHV1NUlJSaSlpREZGYmnpydHjhxh1apVTJ8+3Wlueno6cXFxtLS0MHfuXJf1UFBQgK+vL/7+/ixZsgQ/Pz8SEhIAWLRoESNHjqSwsJDk5GQqKipYv349GzZsMFx/+fLlPP744zz88MM0Njby7rvvsnnzZl577TXDNdodmsePH2fs2LF88cUXWK1WduzYwdChQ/9uky+++GJ7dyMiIh3IarUyevRo1q5dy+nTp2lubiYwMJCMjAxycnKc5k6aNImAgADCw8Pp27evy3pYsWIFCxYsoLKykuHDh7N79248PDwAiIqK4q233iIvL4/CwkICAgIoKCggJSXFcP36+nr+6Z/+iT/96U90796dRx55hC1btjh98vcfMdntdnt7DqqpqYmzZ89SW1vL22+/zb/+67/ywQcf3DQ4b3SmGRgY2J5diojcE2pra/Hy8rqtGnV1dXh7exNe9g3crLd3/5mW61/y6fgPXdLX112/fp1+/fphs9mYMWOGy+reC9r9E/Hw8GDw4MEAjBgxgsOHD/PKK6/w+uuv33C+2Wz+u286i4jIvaG1tZUrV65QVFSEj4+P46YHXclt30avvW+iiojIvens2bMEBwfTv39/iouLcXfvendibdcRZ2dn8+STTzJgwACuXbvG1q1bKSsr47333rtT/YmIyF0iKCiIdr6jd99pV2heunSJOXPmcOHCBby9vYmMjOS9995r190URERE7lXtCs2vbsgrIiLSFenesyIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDut6NA0VE7gEHcv+Cl/utf7kyQN2XLXi7qB/5K51pioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0REelUZWVlmEwmampqbqtOUFAQ69atc0lPN6OvButAkUfGd3YLneKTx8s6u4VOo5+53EsuX75MXl4e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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 1 0 1 0]\n", + " [0 0 0 0 0]\n", + " [0 2 0 2 0]\n", + " [0 0 0 0 0]\n", + " [0 3 0 3 0]]\n", + "Vertical result:\n" + ] + }, + { + "data": { + "image/png": "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zZo1VFZW0tbWxvvvv88777zj8B8B/8h9H5rSdc2dO5eTJ0+ybdu2zm6lQ4SGhvLJJ5/wu9/9jszMTObMmcMXX3zR2W3dUVVVVcyfP59f/vKX151ByH+rqqqirq7OvmRnZ99wXmJiIufOnWP37t1MmTKF0tJSoqKiHM7m0tPTKSwsBKC6upqSkhLS0tIc6nz7c2UXFxd8fHwYMmSIfeybk5i//V7Jt98Z6dmzJ6GhoVRUVABQUVFBTEyMw/yYmBgqKysdfpT+73n11VcZPHgwDz/8MG5ubsybN4/U1FQeeMB4FN73oenr64uLiwvV1dUO49XV1fj7+3dSV3KnzZs3j7179/LBBx/Qr1+/zm6nQ7i5uTFo0CCGDx/OihUrGDp0KK+++mpnt3VHHTt2jIsXLxIVFYWrqyuurq58+OGH/PSnP8XV1dXwH9P73Tffqv5mMZvNN51rsViIjY0lJyeHgwcPkpKSQm5urv352bNnc+bMGcrLy9myZQvBwcGMHTvWoUa3bt0c1k0mk8PYN79N29E/4t6rVy927dpFQ0MDf/zjH/m///f/YrVaGThwoOEa931ourm5MXz4cPbv328fa2trY//+/V3m856uxGazMW/ePHbu3Ml//ud/Ehwc3NktdZq2trabfjZ1v5gwYQInTpzgk08+sS+PPfYY3//+9/nkk09wcbm936MUCA8Pd/j2uY+PDwkJCRQWFlJUVERqaqrT9vXtL65duXKFU6dOERYWBkBYWNh1l76UlZUREhLS7n/OFouFvn378vXXX7Njxw6mTZtmeFvXdu3pHvXCCy8wZ84cHnvsMUaOHMm6devs3+S6n127do3f//739vX/+q//4pNPPqFnz57079+/Ezu7c+bOncvWrVv59a9/jbu7u/1za09PT7p3797J3d052dnZPPnkk/Tv35+rV6+ydetWSktLee+99zq7tTvK3d39us+re/TogY+PT5f4HNuZampqSEpKIi0tjcjISNzd3Tl69CirV6++LlTS09OJi4ujtbWVOXPmOK2HvLw8fHx88PPzY8mSJfj6+pKQkADAwoULGTFiBPn5+SQnJ1NeXs769evZsGGD4fq/+93v+POf/8ywYcP485//zPLly2lra+P//J//Y7hGlwjN5ORkLl26xLJly7hw4QLDhg1j375913056H5z9OhRxo8fb19/4YUXAJgz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b8/OmzePvXv38tvf/pZ+/fr93blmsxmz2XxLzYmIiNxN2hWaNpuNrKwsdu7cSWlpKcHBwXeqLxERkbtOu0Jz7ty5bN26lV//+te4u7tz4cIFADw9PenevfsdaVBERORu0a7PNF9//XXq6uoYN24cAQEB9uWtt966U/2JiIjcNdr99qyIiEhXpXvPioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVEpFOVlpZiMpmora29rTpBQUGsW7fOKT3djEJTREQAuHTpEpmZmfTv3x+z2Yy/vz+TJ0+mrKyss1tzum3btmEymUhISGjXdrf1I9QiInL/SExMpLm5meLiYgYOHEh1dTX79++npqams1tzqj/84Q/87//9vxk7dmy7t9WZpoiIUFtby4EDB1i1ahXjx49nwIABjBw5kuzsbKZOnQpAWloacXFxDtu1tLTQu3dvNm3aBMC4cePIyspiwYIFeHt74+fnx8aNG2loaCA1NRV3d3cGDRpESUnJdT2UlZURGRmJxWJh9OjRnDx50uH5HTt2EBERgdlsJigoiIKCgnYfZ2trK9///vd58cUXGThwYLu3V2iKiNzn6uvrHZampqbr5litVqxWK7t27brh8wDp6ens27eP8+fP28f27t1LY2MjycnJ9rHi4mJ8fX05fPgwWVlZZGZmkpSURHR0NMePH2fSpEnMmjWLxsZGh/qLFi2ioKCAI0eO0KtXL+Lj42lpaQHg2LFjzJgxg5kzZ3LixAmWL19OTk4ORUVF7Xot8vLy6N27N88//3y7trOzdbC6ujoboEWLFi333VJXV+e0v5F1H2Oz/f72lrqPb9xnbm7uDff99ttv27y9vW0Wi8UWHR1ty87Otn366acOc8LDw22rVq2yr8fHx9tSUlLs60888YTt8ccft69//fXXth49ethmzZplHzt//rwNsJWXl9tsNpvtgw8+sAG2bdu22efU1NTYunfvbnvrrbdsNpvN9txzz9liY2Mdelm0aJEtPDzcvj5gwADb2rVrb/raHjhwwNa3b1/bpUuXbDabzTZnzhzbtGnTbjr/RnSmKSJyn6uqqqKurs6+ZGdn33BeYmIi586dY/fu3UyZMoXS0lKioqIczubS09MpLCwEoLq6mpKSEtLS0hzqREZG2h+7uLjg4+PDkCFD7GN+fn4AXLx4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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "Both directions result:\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAGdCAYAAABwyyjqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJxklEQVR4nO3dfVRU973v8fcEZMY4PAkKqCgYhQARDcYniI1WUZOAEili0qpA4N5ylKuN13uKihg4jQ8JalpjmnoMsLQeY2O0aoM5OZ6QGsT6lAdNuJHqaaVVUbkCCg0QmPtHV+ZkqrYbHUHl81prr87+zW9/93dPGj7ZM7P3mGw2mw0RERH5hx7o7AZERETuFQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTZFvWb58OSaTqbPbEJG7lEJTOk1RUREmkwmTycRHH3103fM2m43AwEBMJhNxcXHtrv/SSy+xa9cuJ3QqIvJXCk3pdBaLha1bt143/uGHH/KnP/0Js9l8S3VvJTSXLl3KX/7yl1van4jc/xSa0umeeuopfvWrX/H11187jG/dupXhw4fj7+9/x3toaGgAwNXVFYvFcsf3JyL3JoWmdLpnn32Wmpoa3n//fftYc3Mzb7/9Ns8999x181955RWio6Px8fGhe/fuDB8+nLffftthjslkoqGhgeLiYvtbwCkpKcB/f275xRdf8Nxzz+Ht7c3jjz/u8Nw3CgsLMZlMvPnmmw71X3rpJUwmE++++66zXgYRuQcoNKXTBQUFMWbMGP7t3/7NPlZSUkJdXR0zZ868bv6rr77Ko48+Sl5eHi+99BKurq4kJSXxm9/8xj5n8+bNmM1mxo4dy+bNm9m8eTP/83/+T4c6SUlJNDY28tJLL5GRkXHD3lJTU4mLi+OFF16gqqoKgBMnTvDiiy/y/PPP89RTTznjJRCRe4RrZzcgAvDcc8+RnZ3NX/7yF7p3784vf/lLnnjiCfr06XPd3FOnTtG9e3f7+rx584iKimLNmjU8/fTTAPzgBz/ghz/8IQMHDuQHP/jBDfc5dOjQG36W+rc2btxIREQEzz//PHv37mXOnDn4+/uzZs2aWzxaEblXKTTlrjBjxgwWLFjA3r17mTJlCnv37uWnP/3pDed+OzCvXLlCa2srY8eOdThTNeKHP/yhoXn+/v689tprPPvss4wdO5ZPPvmE999/Hw8Pj3btT8Sor776iubmZqfUcnNz0+f0TqTQlLtCr169mDhxIlu3bqWxsZHW1la+973v3XDu3r17+Zd/+Rc++eQTmpqa7OPtvb4yODjY8NyZM2eyZcsWfvOb3/A//sf/YMKECe3al4hRX331Fb0ftHLV1uqUev7+/vzXf/2XgtNJFJpy13juuefIyMjgwoULPPnkk3h5eV0358CBA0ydOpXvfOc7bNiwgYCAALp160ZhYaGht1q/7dtnrP9ITU0NR48eBeCLL76gra2NBx7QVwLE+Zqbm7lqa+XHDwZhNt3e/8eabG2svPAHmpubFZpOon/r5a7xzDPP8MADD3Do0KEbfmsWYMeOHVgsFt577z3S0tJ48sknmThx4g3nOvPOPnPnzuXq1ausWLGCjz76iHXr1jmttsiNmE0PYDG53NZyu6Er19OZptw1rFYrr7/+On/4wx+Ij4+/4RwXFxdMJhOtrf/91tUf/vCHG97EoEePHtTW1t52X2+//TZvvfUWP/3pT8nKyuLTTz9l6dKlxMXFERISctv1ReTeof8MkbvKnDlzyM3Nvelbp08//TSNjY1MmTKFn//85+Tl5TFq1CgGDRp03dzhw4fzH//xH6xZs4Zt27bxu9/9rt39XLx4kczMTMaPH8+8efMAWL9+PR4eHqSkpNDW1tbumiJy71Joyj3lu9/9Lps2beLChQssWLCAf/u3f2PVqlU888wz181ds2YNw4cPZ+nSpTz77LO8/vrr7d5fZmYmTU1N9pscAPj4+PCLX/yC8vJyXnnllds+JhG5d5hsNputs5sQEZG/qq+vx9PTk9weA7GYXG6r1le2Vl5sOENdXZ0ukXISnWmKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUSkU5WWlmIymW77tpdBQUF3/L7QXSY0X3vtNYKCgrBYLIwaNYrDhw93dkt33G9/+1vi4+Pp06cPJpPphvdnvd+sWLGCESNG4O7uTu/evUlISODLL7/s7LbuuNdff53IyEg8PDzw8PBgzJgxlJSUdHZbHW7lypWYTCYWLFjQ2a3cky5dukRmZib9+/fHbDbj7+/P5MmTKSsr6+zWnKKlpYW8vDweeughLBYLQ4cOZd++fe2q0SVC86233uKFF14gNzeX48ePM3ToUCZPnszFixc7u7U7qqGhgaFDh/Laa691disd5sMPP2Tu3LkcOnSI999/n5aWFiZNmkRDQ0Nnt3ZH9evXj5UrV3Ls2DGOHj3Kd7/7XaZNm8bnn3/e2a11mCNHjvDGG28QGRnZ2a3csxITE/n4448pLi7m1KlT7N69m3HjxlFTU9PZrTnF0qVLeeONN/jZz37GF198wQ9/+EOeeeYZPv74Y8M1ukRorlmzhoyMDFJTUwkPD+fnP/85Dz74IG+++WZnt3ZHPfnkk/zLv/zLDe/Ler/at28fKSkpREREMHToUIqKijh79izHjh3r7NbuqPj4eJ566ikGDx5MSEgIP/nJT7BarRw6dKizW+sQ165d4/vf/z4bN27E29u7s9u5J9XW1nLgwAFWrVrF+PHjGTBgACNHjiQ7O5upU6cCkJaWRlxcnMN2LS0t9O7dm02bNgEwbtw4srKyWLBgAd7e3vj5+bFx40YaGhpITU3F3d2dQYMG3fCdkLKyMiIjI7FYLIwePZqTJ086PL9jxw4iIiIwm80EBQVRUFDQrmPcvHkzixcv5qmnnmLgwIFkZmby1FNPtavOfR+azc3NHDt2zOE3Fx944AEmTpxIeXl5J3YmHaGurg6Anj17dnInHae1tZVt27bR0NDAmDFjOrudDjF37lyefvrpm/62aldXX1/vsDQ1NV03x2q1YrVa2bVr1w2fB0hPT2ffvn2cP3/ePrZ3714aGxtJTk62jxUXF+Pr68vhw4fJysoiMzOTpKQkoqOjOX78OJMmTWLWrFk0NjY61F+0aBEFBQUcOXKEXr16ER8fT0tLCwDHjh1jxowZzJw5kxMnTrB8+XJycnIoKioy/Do0NTVd92Pc3bt356OPPjJc474PzcuXL9Pa2oqfn5/DuJ+fHxcuXOikrqQjtLW1sWDBAmJiYnjkkUc6u5077sSJE1itVsxmMz/84Q/ZuXMn4eHhnd3WHbdt2zaOHz/OihUrOruVu1ZgYCCenp725UavlaurK0VFRRQXF+Pl5UVMTAyLFy/ms88+s8+Jjo4mNDSUzZs328cKCwtJSkrCarXax4YOHcrSpUsZPHgw2dnZWCwWfH19ycjIYPDgwSxbtoyamhqH2gC5ubnExsYyZMgQiouLqa6uZufOncBf3zGcMGECOTk5hISEkJKSwrx583j55ZcNvw6TJ09mzZo1VFZW0tbWxvvvv88777zj8B8B/8h9H5rSdc2dO5eTJ0+ybdu2zm6lQ4SGhvLJJ5/wu9/9jszMTObMmcMXX3zR2W3dUVVVVcyfP59f/vKX151ByH+rqqqirq7OvmRnZ99wXmJiIufOnWP37t1MmTKF0tJSoqKiHM7m0tPTKSwsBKC6upqSkhLS0tIc6nz7c2UXFxd8fHwYMmSIfeybk5i//V7Jt98Z6dmzJ6GhoVRUVABQUVFBTEyMw/yYmBgqKysdfpT+73n11VcZPHgwDz/8MG5ubsybN4/U1FQeeMB4FN73oenr64uLiwvV1dUO49XV1fj7+3dSV3KnzZs3j7179/LBBx/Qr1+/zm6nQ7i5uTFo0CCGDx/OihUrGDp0KK+++mpnt3VHHTt2jIsXLxIVFYWrqyuurq58+OGH/PSnP8XV1dXwH9P73Tffqv5mMZvNN51rsViIjY0lJyeHgwcPkpKSQm5urv352bNnc+bMGcrLy9myZQvBwcGMHTvWoUa3bt0c1k0mk8PYN79N29E/4t6rVy927dpFQ0MDf/zjH/m///f/YrVaGThwoOEa931ourm5MXz4cPbv328fa2trY//+/V3m856uxGazMW/ePHbu3Ml//ud/Ehwc3NktdZq2trabfjZ1v5gwYQInTpzgk08+sS+PPfYY3//+9/nkk09wcbm936MUCA8Pd/j2uY+PDwkJCRQWFlJUVERqaqrT9vXtL65duXKFU6dOERYWBkBYWNh1l76UlZUREhLS7n/OFouFvn378vXXX7Njxw6mTZtmeFvXdu3pHvXCCy8wZ84cHnvsMUaOHMm6devs3+S6n127do3f//739vX/+q//4pNPPqFnz57079+/Ezu7c+bOncvWrVv59a9/jbu7u/1za09PT7p3797J3d052dnZPPnkk/Tv35+rV6+ydetWSktLee+99zq7tTvK3d39us+re/TogY+PT5f4HNuZampqSEpKIi0tjcjISNzd3Tl69CirV6++LlTS09OJi4ujtbWVOXPmOK2HvLw8fHx88PPzY8mSJfj6+pKQkADAwoULGTFiBPn5+SQnJ1NeXs769evZsGGD4fq/+93v+POf/8ywYcP485//zPLly2lra+P//J//Y7hGlwjN5ORkLl26xLJly7hw4QLDhg1j375913056H5z9OhRxo8fb19/4YUXAJgz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b8/OmzePvXv38tvf/pZ+/fr93blmsxmz2XxLzYmIiNxN2hWaNpuNrKwsdu7cSWlpKcHBwXeqLxERkbtOu0Jz7ty5bN26lV//+te4u7tz4cIFADw9PenevfsdaVBERORu0a7PNF9//XXq6uoYN24cAQEB9uWtt966U/2JiIjcNdr99qyIiEhXpXvPioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVEpFOVlpZiMpmora29rTpBQUGsW7fOKT3djEJTREQAuHTpEpmZmfTv3x+z2Yy/vz+TJ0+mrKyss1tzum3btmEymUhISGjXdrf1I9QiInL/SExMpLm5meLiYgYOHEh1dTX79++npqams1tzqj/84Q/87//9vxk7dmy7t9WZpoiIUFtby4EDB1i1ahXjx49nwIABjBw5kuzsbKZOnQpAWloacXFxDtu1tLTQu3dvNm3aBMC4cePIyspiwYIFeHt74+fnx8aNG2loaCA1NRV3d3cGDRpESUnJdT2UlZURGRmJxWJh9OjRnDx50uH5HTt2EBERgdlsJigoiIKCgnYfZ2trK9///vd58cUXGThwYLu3V2iKiNzn6uvrHZampqbr5litVqxWK7t27brh8wDp6ens27eP8+fP28f27t1LY2MjycnJ9rHi4mJ8fX05fPgwWVlZZGZmkpSURHR0NMePH2fSpEnMmjWLxsZGh/qLFi2ioKCAI0eO0KtXL+Lj42lpaQHg2LFjzJgxg5kzZ3LixAmWL19OTk4ORUVF7Xot8vLy6N27N88//3y7trOzdbC6ujoboEWLFi333VJXV+e0v5F1H2Oz/f72lrqPb9xnbm7uDff99ttv27y9vW0Wi8UWHR1ty87Otn366acOc8LDw22rVq2yr8fHx9tSUlLs60888YTt8ccft69//fXXth49ethmzZplHzt//rwNsJWXl9tsNpvtgw8+sAG2bdu22efU1NTYunfvbnvrrbdsNpvN9txzz9liY2Mdelm0aJEtPDzcvj5gwADb2rVrb/raHjhwwNa3b1/bpUuXbDabzTZnzhzbtGnTbjr/RnSmKSJyn6uqqqKurs6+ZGdn33BeYmIi586dY/fu3UyZMoXS0lKioqIczubS09MpLCwEoLq6mpKSEtLS0hzqREZG2h+7uLjg4+PDkCFD7GN+fn4AXLx4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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 1 0 1 0]\n", + " [0 0 0 0 0]\n", + " [0 2 0 2 0]\n", + " [0 0 0 0 0]\n", + " [0 3 0 3 0]]\n" + ] + } + ], + "source": [ + "def connect(img: Image, id: int) -> Image:\n", + " assert 0 <= id < 3\n", + " ret = Image.empty(img.x, img.y, img.w, img.h)\n", + "\n", + " if id == 0 or id == 2: # Horizontal\n", + " for i in range(img.h):\n", + " last = -1\n", + " lastc = -1\n", + " for j in range(img.w):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " for k in range(last + 1, j):\n", + " ret.mask[i, k] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = j\n", + "\n", + " if id == 1 or id == 2: # Vertical\n", + " for j in range(img.w):\n", + " last = -1\n", + " lastc = -1\n", + " for i in range(img.h):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " for k in range(last + 1, i):\n", + " ret.mask[k, j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = i\n", + "\n", + " return ret\n", + "\n", + "# Test function\n", + "def test_connect():\n", + " # Test image\n", + " img = Image(0, 0, 5, 5, np.array([\n", + " [1, 0, 1, 0, 1],\n", + " [0, 0, 0, 0, 0],\n", + " [2, 0, 2, 0, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 0, 3, 0, 3]\n", + " ]))\n", + " display_matrix(img)\n", + "\n", + " # Test horizontal connection\n", + " result_h = connect(img, 0)\n", + " print(\"Horizontal result:\")\n", + " display_matrix(result_h)\n", + " print(result_h.mask)\n", + "\n", + " # Test vertical connection\n", + " result_v = connect(img, 1)\n", + " print(\"Vertical result:\")\n", + " display_matrix(result_v)\n", + " print(result_v.mask)\n", + "\n", + " # Test both directions\n", + " result_both = connect(img, 2)\n", + " print(\"Both directions result:\")\n", + " display_matrix(result_v)\n", + " print(result_both.mask)\n", + "\n", + "test_connect()" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [], + "source": [ + "img1 = Image(0, 0, 5, 5, np.array([\n", + " [1, 1, 0, 2, 2],\n", + " [1, 1, 0, 2, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 3, 0, 4, 4],\n", + " [3, 3, 0, 4, 4]\n", + " ]))" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zZo1VFZW0tbWxvvvv88777zj8B8B/8h9H5rSdc2dO5eTJ0+ybdu2zm6lQ4SGhvLJJ5/wu9/9jszMTObMmcMXX3zR2W3dUVVVVcyfP59f/vKX151ByH+rqqqirq7OvmRnZ99wXmJiIufOnWP37t1MmTKF0tJSoqKiHM7m0tPTKSwsBKC6upqSkhLS0tIc6nz7c2UXFxd8fHwYMmSIfeybk5i//V7Jt98Z6dmzJ6GhoVRUVABQUVFBTEyMw/yYmBgqKysdfpT+73n11VcZPHgwDz/8MG5ubsybN4/U1FQeeMB4FN73oenr64uLiwvV1dUO49XV1fj7+3dSV3KnzZs3j7179/LBBx/Qr1+/zm6nQ7i5uTFo0CCGDx/OihUrGDp0KK+++mpnt3VHHTt2jIsXLxIVFYWrqyuurq58+OGH/PSnP8XV1dXwH9P73Tffqv5mMZvNN51rsViIjY0lJyeHgwcPkpKSQm5urv352bNnc+bMGcrLy9myZQvBwcGMHTvWoUa3bt0c1k0mk8PYN79N29E/4t6rVy927dpFQ0MDf/zjH/m///f/YrVaGThwoOEa931ourm5MXz4cPbv328fa2trY//+/V3m856uxGazMW/ePHbu3Ml//ud/Ehwc3NktdZq2trabfjZ1v5gwYQInTpzgk08+sS+PPfYY3//+9/nkk09wcbm936MUCA8Pd/j2uY+PDwkJCRQWFlJUVERqaqrT9vXtL65duXKFU6dOERYWBkBYWNh1l76UlZUREhLS7n/OFouFvn378vXXX7Njxw6mTZtmeFvXdu3pHvXCCy8wZ84cHnvsMUaOHMm6devs3+S6n127do3f//739vX/+q//4pNPPqFnz57079+/Ezu7c+bOncvWrVv59a9/jbu7u/1za09PT7p3797J3d052dnZPPnkk/Tv35+rV6+ydetWSktLee+99zq7tTvK3d39us+re/TogY+PT5f4HNuZampqSEpKIi0tjcjISNzd3Tl69CirV6++LlTS09OJi4ujtbWVOXPmOK2HvLw8fHx88PPzY8mSJfj6+pKQkADAwoULGTFiBPn5+SQnJ1NeXs769evZsGGD4fq/+93v+POf/8ywYcP485//zPLly2lra+P//J//Y7hGlwjN5ORkLl26xLJly7hw4QLDhg1j375913056H5z9OhRxo8fb19/4YUXAJgz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b8/OmzePvXv38tvf/pZ+/fr93blmsxmz2XxLzYmIiNxN2hWaNpuNrKwsdu7cSWlpKcHBwXeqLxERkbtOu0Jz7ty5bN26lV//+te4u7tz4cIFADw9PenevfsdaVBERORu0a7PNF9//XXq6uoYN24cAQEB9uWtt966U/2JiIjcNdr99qyIiEhXpXvPioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVEpFOVlpZiMpmora29rTpBQUGsW7fOKT3djEJTREQAuHTpEpmZmfTv3x+z2Yy/vz+TJ0+mrKyss1tzum3btmEymUhISGjXdrf1I9QiInL/SExMpLm5meLiYgYOHEh1dTX79++npqams1tzqj/84Q/87//9vxk7dmy7t9WZpoiIUFtby4EDB1i1ahXjx49nwIABjBw5kuzsbKZOnQpAWloacXFxDtu1tLTQu3dvNm3aBMC4cePIyspiwYIFeHt74+fnx8aNG2loaCA1NRV3d3cGDRpESUnJdT2UlZURGRmJxWJh9OjRnDx50uH5HTt2EBERgdlsJigoiIKCgnYfZ2trK9///vd58cUXGThwYLu3V2iKiNzn6uvrHZampqbr5litVqxWK7t27brh8wDp6ens27eP8+fP28f27t1LY2MjycnJ9rHi4mJ8fX05fPgwWVlZZGZmkpSURHR0NMePH2fSpEnMmjWLxsZGh/qLFi2ioKCAI0eO0KtXL+Lj42lpaQHg2LFjzJgxg5kzZ3LixAmWL19OTk4ORUVF7Xot8vLy6N27N88//3y7trOzdbC6ujoboEWLFi333VJXV+e0v5F1H2Oz/f72lrqPb9xnbm7uDff99ttv27y9vW0Wi8UWHR1ty87Otn366acOc8LDw22rVq2yr8fHx9tSUlLs60888YTt8ccft69//fXXth49ethmzZplHzt//rwNsJWXl9tsNpvtgw8+sAG2bdu22efU1NTYunfvbnvrrbdsNpvN9txzz9liY2Mdelm0aJEtPDzcvj5gwADb2rVrb/raHjhwwNa3b1/bpUuXbDabzTZnzhzbtGnTbjr/RnSmKSJyn6uqqqKurs6+ZGdn33BeYmIi586dY/fu3UyZMoXS0lKioqIczubS09MpLCwEoLq6mpKSEtLS0hzqREZG2h+7uLjg4+PDkCFD7GN+fn4AXLx4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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(connect(img1,0))" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Horizontal result:\n", + "[[1 1 1 1 1]\n", + " [0 0 0 0 0]\n", + " [2 2 2 2 2]\n", + " [0 0 0 0 0]\n", + " [3 3 3 3 3]]\n", + "Vertical result:\n", + "[[1 0 1 0 1]\n", + " [0 0 0 0 0]\n", + " [2 0 2 0 2]\n", + " [0 0 0 0 0]\n", + " [3 0 3 0 3]]\n", + "Both directions result:\n", + "[[1 1 1 1 1]\n", + " [0 0 0 0 0]\n", + " [2 2 2 2 2]\n", + " [0 0 0 0 0]\n", + " [3 3 3 3 3]]\n" + ] + } + ], + "source": [ + "def connect(img: Image, id: int) -> Image:\n", + " assert 0 <= id < 3\n", + " ret = Image.empty(img.x, img.y, img.w, img.h)\n", + "\n", + " if id == 0 or id == 2: # Horizontal\n", + " for i in range(img.h):\n", + " last = -1\n", + " lastc = -1\n", + " for j in range(img.w):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " ret.mask[i, last+1:j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = j\n", + " ret.mask[i, j] = img.mask[i, j]\n", + "\n", + " if id == 1 or id == 2: # Vertical\n", + " for j in range(img.w):\n", + " last = -1\n", + " lastc = -1\n", + " for i in range(img.h):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " ret.mask[last+1:i, j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = i\n", + " ret.mask[i, j] = img.mask[i, j]\n", + "\n", + " return ret\n", + "\n", + "# Test function\n", + "def test_connect():\n", + " # Test image\n", + " img = Image(0, 0, 5, 5, np.array([\n", + " [1, 0, 1, 0, 1],\n", + " [0, 0, 0, 0, 0],\n", + " [2, 0, 2, 0, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 0, 3, 0, 3]\n", + " ]))\n", + "\n", + " # Test horizontal connection\n", + " result_h = connect(img, 0)\n", + " print(\"Horizontal result:\")\n", + " print(result_h.mask)\n", + "\n", + " # Test vertical connection\n", + " result_v = connect(img, 1)\n", + " print(\"Vertical result:\")\n", + " print(result_v.mask)\n", + "\n", + " # Test both directions\n", + " result_both = connect(img, 2)\n", + " print(\"Both directions result:\")\n", + " print(result_both.mask)\n", + "\n", + "test_connect()" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Horizontal result:\n", + "[[1 1 1 1 1]\n", + " [0 0 0 0 0]\n", + " [2 2 2 2 2]\n", + " [0 0 0 0 0]\n", + " [3 3 3 3 3]]\n", + "Vertical result:\n", + "[[1 0 1 0 1]\n", + " [0 0 0 0 0]\n", + " [2 0 2 0 2]\n", + " [0 0 0 0 0]\n", + " [3 0 3 0 3]]\n", + "Both directions result:\n", + "[[1 1 1 1 1]\n", + " [0 0 0 0 0]\n", + " [2 2 2 2 2]\n", + " [0 0 0 0 0]\n", + " [3 3 3 3 3]]\n" + ] + } + ], + "source": [ + "def connect(img: Image, id: int) -> Image:\n", + " assert 0 <= id < 3\n", + " ret = Image.empty(img.x, img.y, img.w, img.h)\n", + "\n", + " if id == 0 or id == 2: # Horizontal\n", + " for i in range(img.h):\n", + " last = -1\n", + " lastc = -1\n", + " for j in range(img.w):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " ret.mask[i, last+1:j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = j\n", + " ret.mask[i, j] = img.mask[i, j]\n", + "\n", + " if id == 1 or id == 2: # Vertical\n", + " for j in range(img.w):\n", + " last = -1\n", + " lastc = -1\n", + " for i in range(img.h):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " ret.mask[last+1:i, j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = i\n", + " ret.mask[i, j] = img.mask[i, j]\n", + "\n", + " return ret\n", + "\n", + "# Test function\n", + "def test_connect():\n", + " # Test image\n", + " img = Image(0, 0, 5, 5, np.array([\n", + " [1, 0, 1, 0, 1],\n", + " [0, 0, 0, 0, 0],\n", + " [2, 0, 2, 0, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 0, 3, 0, 3]\n", + " ]))\n", + "\n", + " # Test horizontal connection\n", + " result_h = connect(img, 0)\n", + " print(\"Horizontal result:\")\n", + " print(result_h.mask)\n", + "\n", + " # Test vertical connection\n", + " result_v = connect(img, 1)\n", + " print(\"Vertical result:\")\n", + " print(result_v.mask)\n", + "\n", + " # Test both directions\n", + " result_both = connect(img, 2)\n", + " print(\"Both directions result:\")\n", + " print(result_both.mask)\n", + "\n", + "test_connect()" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Horizontal result:\n", + "[[0 1 0 1 0]\n", + " [0 0 0 0 0]\n", + " [0 2 0 2 0]\n", + " [0 0 0 0 0]\n", + " [0 3 0 3 0]]\n", + "Vertical result:\n", + "[[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "Both directions result:\n", + "[[0 1 0 1 0]\n", + " [0 0 0 0 0]\n", + " [0 2 0 2 0]\n", + " [0 0 0 0 0]\n", + " [0 3 0 3 0]]\n" + ] + } + ], + "source": [ + "def connect(img: Image, id: int) -> Image:\n", + " assert 0 <= id < 3\n", + " ret = Image.empty(img.x, img.y, img.w, img.h)\n", + "\n", + " if id == 0 or id == 2: # Horizontal\n", + " for i in range(img.h):\n", + " last = -1\n", + " lastc = -1\n", + " for j in range(img.w):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " for k in range(last + 1, j):\n", + " ret.mask[i, k] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = j\n", + "\n", + " if id == 1 or id == 2: # Vertical\n", + " for j in range(img.w):\n", + " last = -1\n", + " lastc = -1\n", + " for i in range(img.h):\n", + " if img.mask[i, j]:\n", + " if img.mask[i, j] == lastc:\n", + " for k in range(last + 1, i):\n", + " ret.mask[k, j] = lastc\n", + " lastc = img.mask[i, j]\n", + " last = i\n", + "\n", + " return ret\n", + "\n", + "# Test function\n", + "def test_connect():\n", + " # Test image\n", + " img = Image(0, 0, 5, 5, np.array([\n", + " [1, 0, 1, 0, 1],\n", + " [0, 0, 0, 0, 0],\n", + " [2, 0, 2, 0, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 0, 3, 0, 3]\n", + " ]))\n", + "\n", + " # Test horizontal connection\n", + " result_h = connect(img, 0)\n", + " print(\"Horizontal result:\")\n", + " print(result_h.mask)\n", + "\n", + " # Test vertical connection\n", + " result_v = connect(img, 1)\n", + " print(\"Vertical result:\")\n", + " print(result_v.mask)\n", + "\n", + " # Test both directions\n", + " result_both = connect(img, 2)\n", + " print(\"Both directions result:\")\n", + " print(result_both.mask)\n", + "\n", + "test_connect()" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "from function import extend2" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2rRp1NXV8d57791w3rJly3j++edvukERkbuFO3/lpP598PG+tX4aroDvI+7pSz5309+enTt3LsePH2fr1q3/cF5eXh719fXO5ezZsze7SxERkS51U2/Pzps3j927d/Pb3/6W/v37/8O5ZrMZs9l8U82JiIjcSToUmg6Hg9zcXLZv3055eTlhYWG3qy8REZE7TodCc+7cuWzZsoVf/epXeHt788knnwDg6+vL/ffff1saFBERuVN06DPNV199lfr6esaPH09wcLBzef31129XfyIiIneMDr89KyIi0l3p3rMiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERHpUuXl5ZhMJurq6m6pTmhoKGvXrnVLTzei0BQREQAuXrxITk4OAwYMwGw2ExQUxJQpU6ioqOjq1txu69atmEwmkpOTO7TdLf0ItYiI3DtSUlJoaWmhtLSUQYMGUVNTw969e6mtre3q1tzqT3/6E//rf/0vxo0b1+FtdaYpIiLU1dWxb98+Vq5cyYQJExg4cCCjRo0iLy+PadOmAZCZmUliYqLLdq2trfTp04eNGzcCMH78eHJzc1mwYAE9e/YkMDCQDRs20NjYSEZGBt7e3gwePJiysrJreqioqCAmJgaLxcKYMWM4fvy4y/Pbtm0jKioKs9lMaGgoJSUlHT7OtrY2vvnNb/L8888zaNCgDm+v0BQRucc1NDS4LM3NzdfMsVqtWK1WduzYcd3nAbKystizZw/nz593ju3evZumpibS0tKcY6WlpQQEBHDw4EFyc3PJyckhNTWVuLg4jhw5wuTJk5k1axZNTU0u9RctWkRJSQmHDh2id+/eJCUl0draCkBVVRUzZsxg5syZHDt2jGXLlpGfn4/dbu/Qa1FUVESfPn349re/3aHtnBydrL6+3gFo0aJFyz231NfXu+1vZP37OBwf39pS//71+ywsLLzuvt98801Hz549HRaLxREXF+fIy8tz/P73v3eZM3ToUMfKlSud60lJSY709HTn+uOPP+547LHHnOufffaZ48EHH3TMmjXLOXb+/HkH4KisrHQ4HA7Hb37zGwfg2Lp1q3NObW2t4/7773e8/vrrDofD4Xj22WcdCQkJLr0sWrTIMXToUOf6wIEDHWvWrLnha7tv3z5Hv379HBcvXnQ4HA7HnDlzHNOnT7/h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AqC9vd0dh9ch9913H4MHD2b48OEsXLiQb3zjG9c9877h9h3ZWVJSEk8++SRDhgwhPDycH/7wh1itVg4cONDhxkVE5M43dOhQGhsbnev+/v4kJydjs9mw2+1kZGS4bV9fzpLLly9z8uRJIiMjAYiMjLzm0peKigrCw8Px8PC46X22t7ff8DPc67npS07a2tr4xS9+QWNjo8sp9d9rbm52aaihoeFmdykiIrdJbW0tqampZGZmEhMTg7e3N4cPH2bVqlVMnz7dZW5WVhaJiYm0tbUxZ84ct/VQVFSEv78/gYGBLFmyhICAAJKTkwFYuHAhI0eOpLi4mLS0NCorK1m3bh3r1683XH/58uU8+uijPPTQQzQ3N/PWW2+xadMmXn31VcM1Ohyax44dY+zYsXz66adYrVa2b9/O0KFD/2GTzz//fEd3IyIinchqtTJ69GjWrFnDqVOnaG1tJSQkhOzsbBYvXuwyd9KkSQQHBxMVFUXfvn3d1sOKFSuYP38+1dXVDB8+nF27duHl5QVAbGwsb7zxBgUFBRQXFxMcHExRURHp6emG6zc2NvKv//qv/OUvf+H+++/n4YcfZvPmzS7f/P1nTA6Hw9GRg2ppaeHMmTPU19fz5ptv8m//9m+8++67NwzO651phoSEEFX+GB5W3VuhO/jg0fKubqHLOD7u6g6kMzRcAd9HPv9mpo+Pz63VamjA19fXLX8j265+xofj33NLX1929epV+vXrh81m4+mnn3Zb3btBh/+JeHl5MXjwYABGjBjBoUOHePnll/npT3963flms/kffugsIiJ3h/b2di5dukRJSQl+fn7Omx50J7d8qtfRD1FFROTudObMGcLCwujfvz92ux1Pz+73bmGHjjgvL48nnniCAQMGcOXKFbZs2UJ5eTlvv/327epPRETuEKGhoXTwE717TodC88KFC8yePZvz58/j6+tLTEwMb7/9dofupiAiInK36lBofnFDXhERke5I954VERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNT9bhwoInIX2J//N3w8b/7HlQEaPmvD1039yOd0pikiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(img1)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9Ke88MILFBQUcOzYMaKjo5k6dSqXLl3q6tbuqIaGBqKjo3n11Ve7upW75r333mP+/PkcOnSId999l5aWFqZMmUJDQ0NXt3ZHDRo0iJUrV1JZWcnRo0f56le/ysyZM/nwww+7urW75siRI7z++utERUV1dSv3raSkJH7zm99QUlLC6dOn2b17NxMmTKCmpqarW3OJZcuW8frrr/PKK6/wu9/9jm9961s888wz/OY3vzFco0eE5tq1a8nMzCQtLY3hw4fzox/9iIceeog33nijq1u7o5588km+973v3fC+rN3Vvn37SE1NJSIigujoaOx2O+fOnaOysrKrW7ujpk+fzlNPPUVISAihoaF8//vfx2q1cujQoa5u7a64fv06X//619m0aRO9e/fu6nbuS7W1tRw4cIBVq1YxceJEhgwZwujRo8nJyWHGjBkApKenk5CQ4LReS0sL/fr1Y/PmzQBMmDCB7OxsFi1aRO/evfH392fTpk00NDSQlpaGp6cnw4YNu+EnIeXl5URFRWGxWBg7diwnT550en3Hjh1ERERgNpsJCgqiuLi4U/u4ZcsWcnNzeeqppxg6dChZWVk89dRTnarT7UOzubmZyspKp99cfOCBB5g8eTIVFRVd2JncDXV1dQD06dOnizu5e1pbW9m+fTsNDQ2MGzeuq9u5K+bPn8/TTz99099W7enq6+udlqampg5zrFYrVquVXbt23fB1gIyMDPbt28fFixcdY3v37qWxsZGUlBTHWElJCX5+fhw+fJjs7GyysrJITk4mNjaWY8eOMWXKFObMmUNjY6NT/SVLllBcXMyRI0fo27cv06dPp6WlBYDKykpmzZrF7NmzOXHiBMuXLycvLw+73W74fWhqaurwY9wPPvgg77//vuEa3T40r1y5QmtrK/7+/k7j/v7+fPzxx13UldwNbW1tLFq0iLi4OB599NGubueOO3HiBFarFbPZzLe+9S127tzJ8OHDu7qtO2779u0cO3aMFStWdHUr96zAwEC8vb0dy43eK3d3d+x2OyUlJfj4+BAXF0dubi4ffPCBY05sbCxhYWFs2bLFMWaz2UhOTsZqtTrGoqOjWbZsGSEhIeTk5GCxWPDz8yMzM5OQkBDy8/Opqalxqg1QUFBAfHw8kZGRlJSUUF1dzc6dO4FPPzGcNGkSeXl5hIaGkpqayoIFC1izZo3h92Hq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+OrVq5w+fZrw8HAAwsPDKS8vd5pfXl5OaGgobm5uhrexevVqioqK2LdvH48//nine9QlJyIiQk1NDcnJyaSnpxMVFYWnpydHjx5l9erVzJw502luRkYGCQkJtLa2Mm/ePJf1UFhYiK+vL/7+/ixduhQ/Pz8SExMBWLx4MaNGjaKoqIiUlBQqKirYsGEDGzduNFx/1apV5Ofns23bNoKCgvj444+Bv38JygiFpoiIYLVaGTNmDOvWrePMmTO0tLQQGBhIZmYmubm5TnMnT55MQEAAERERDBgwwGU9rFy5koULF1JVVcWIESPYs2cPHh4eAMTExPDmm2+Sn59PUVERAQEBFBYWkpqaarj+a6+9RnNzM1/72tecxgsKCli+fLmhGqb29vZ2w1t0gfr6ery9vSG7EszGkl1E5J7WdB1eGUldXR1eXl63Veqzv5F140fi5W78Y8cb1vpbK94HKl3S1+ddv36dgQMHYrPZePbZZ11W936gI00RETGkra2NK1euUFxcjI+Pj+OmBz2JQlNERAw5d+4cwcHBDBo0CLvdjrt7z4uQnrfHIiJyS4KCgrjLZ/TuObrkRERExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQg3RFIROQe5D3ix7f/oxZN1+HASNc0JICONEVERAxTaIqIiBik0BQRETFIoSkiImLQbYXmypUrMZlMLFq0yEXtiIiI3LtuOTSPHDnC66+/TlRUlCv7ERERuWfdUmhev36dr3/962zatInevXu7uicREZF70i2F5vz583n66aeZPHnyF85tamqivr7eaREREbkfdfrmBtu3b+fYsWMcOXLE0PwVK1bw4osvdroxERGRe02njjTPnz/PwoUL+clPfoLFYjG0Tk5ODnV1dY7l/Pnzt9SoiIhIV+vUkWZlZSWXLl0iJibGMdba2sqvfvUrNmzYQFNTE25ubk7rmM1mzGaza7oVERHpQp0KzUmTJnHixAmnsbS0NB555BG+853vdAhMERGR7qRToenp6cmjjz7qNPbwww/j6+vbYVxERKS70R2BRESkS5WVlWEymaitrb2tOkFBQaxfv94lPd3MbYdmWVnZHW9SRETuvMuXL5OVlcXgwYMxm83079+fqVOnUl5e3tWtucSHH35IUlISQUFBmEymW8ou/Z6m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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(img2)" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "def extend2(img: Image, room: Image) -> Image:\n", + " ret = Image.empty(room.x, room.y, room.w, room.h)\n", + " done = np.zeros((room.h, room.w), dtype=int)\n", + " \n", + " d = Point(room.x - img.x, room.y - img.y)\n", + " donew = 10**6\n", + " for i in range(ret.h):\n", + " for j in range(ret.w):\n", + " x, y = j + d.x, i + d.y\n", + " if 0 <= x < img.w and 0 <= y < img.h:\n", + " ret.mask[i, j] = img.mask[y, x]\n", + " done[i, j] = donew\n", + "\n", + " piece_cnt = {}\n", + " bw, bh = 3, 3\n", + " for r in range(8):\n", + " rot = rigid(img, r)\n", + " for i in range(rot.h - bh + 1):\n", + " for j in range(rot.w - bw + 1):\n", + " mask = tuple(rot.mask[i:i+bh, j:j+bw].flatten())\n", + " piece_cnt[mask] = piece_cnt.get(mask, 0) + 1\n", + "\n", + " piece = [(count, list(p)) for p, count in piece_cnt.items()]\n", + "\n", + " return greedy_fill(ret, piece, done, bw, bh, donew)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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9Ke88MILFBQUcOzYMaKjo5k6dSqXLl3q6tbuqIaGBqKjo3n11Ve7upW75r333mP+/PkcOnSId999l5aWFqZMmUJDQ0NXt3ZHDRo0iJUrV1JZWcnRo0f56le/ysyZM/nwww+7urW75siRI7z++utERUV1dSv3raSkJH7zm99QUlLC6dOn2b17NxMmTKCmpqarW3OJZcuW8frrr/PKK6/wu9/9jm9961s888wz/OY3vzFco0eE5tq1a8nMzCQtLY3hw4fzox/9iIceeog33nijq1u7o5588km+973v3fC+rN3Vvn37SE1NJSIigujoaOx2O+fOnaOysrKrW7ujpk+fzlNPPUVISAihoaF8//vfx2q1cujQoa5u7a64fv06X//619m0aRO9e/fu6nbuS7W1tRw4cIBVq1YxceJEhgwZwujRo8nJyWHGjBkApKenk5CQ4LReS0sL/fr1Y/PmzQBMmDCB7OxsFi1aRO/evfH392fTpk00NDSQlpaGp6cnw4YNu+EnIeXl5URFRWGxWBg7diwnT550en3Hjh1ERERgNpsJCgqiuLi4U/u4ZcsWcnNzeeqppxg6dChZWVk89dRTnarT7UOzubmZyspKp99cfOCBB5g8eTIVFRVd2JncDXV1dQD06dOnizu5e1pbW9m+fTsNDQ2MGzeuq9u5K+bPn8/TTz99099W7enq6+udlqampg5zrFYrVquVXbt23fB1gIyMDPbt28fFixcdY3v37qWxsZGUlBTHWElJCX5+fhw+fJjs7GyysrJITk4mNjaWY8eOMWXKFObMmUNjY6NT/SVLllBcXMyRI0fo27cv06dPp6WlBYDKykpmzZrF7NmzOXHiBMuXLycvLw+73W74fWhqaurwY9wPPvgg77//vuEa3T40r1y5QmtrK/7+/k7j/v7+fPzxx13UldwNbW1tLFq0iLi4OB599NGubueOO3HiBFarFbPZzLe+9S127tzJ8OHDu7qtO2779u0cO3aMFStWdHUr96zAwEC8vb0dy43eK3d3d+x2OyUlJfj4+BAXF0dubi4ffPCBY05sbCxhYWFs2bLFMWaz2UhOTsZqtTrGoqOjWbZsGSEhIeTk5GCxWPDz8yMzM5OQkBDy8/Opqalxqg1QUFBAfHw8kZGRlJSUUF1dzc6dO4FPPzGcNGkSeXl5hIaGkpqayoIFC1izZo3h92Hq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+OrVq5w+fZrw8HAAwsPDKS8vd5pfXl5OaGgobm5uhrexevVqioqK2LdvH48//nine9QlJyIiQk1NDcnJyaSnpxMVFYWnpydHjx5l9erVzJw502luRkYGCQkJtLa2Mm/ePJf1UFhYiK+vL/7+/ixduhQ/Pz8SExMBWLx4MaNGjaKoqIiUlBQqKirYsGEDGzduNFx/1apV5Ofns23bNoKCgvj444+Bv38JygiFpoiIYLVaGTNmDOvWrePMmTO0tLQQGBhIZmYmubm5TnMnT55MQEAAERERDBgwwGU9rFy5koULF1JVVcWIESPYs2cPHh4eAMTExPDmm2+Sn59PUVERAQEBFBYWkpqaarj+a6+9RnNzM1/72tecxgsKCli+fLmhGqb29vZ2w1t0gfr6ery9vSG7EszGkl1E5J7WdB1eGUldXR1eXl63Veqzv5F140fi5W78Y8cb1vpbK94HKl3S1+ddv36dgQMHYrPZePbZZ11W936gI00RETGkra2NK1euUFxcjI+Pj+OmBz2JQlNERAw5d+4cwcHBDBo0CLvdjrt7z4uQnrfHIiJyS4KCgrjLZ/TuObrkRERExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQg3RFIROQe5D3ix7f/oxZN1+HASNc0JICONEVERAxTaIqIiBik0BQRETFIoSkiImLQbYXmypUrMZlMLFq0yEXtiIiI3LtuOTSPHDnC66+/TlRUlCv7ERERuWfdUmhev36dr3/962zatInevXu7uicREZF70i2F5vz583n66aeZPHnyF85tamqivr7eaREREbkfdfrmBtu3b+fYsWMcOXLE0PwVK1bw4osvdroxERGRe02njjTPnz/PwoUL+clPfoLFYjG0Tk5ODnV1dY7l/Pnzt9SoiIhIV+vUkWZlZSWXLl0iJibGMdba2sqvfvUrNmzYQFNTE25ubk7rmM1mzGaza7oVERHpQp0KzUmTJnHixAmnsbS0NB555BG+853vdAhMERGR7qRToenp6cmjjz7qNPbwww/j6+vbYVxERKS70R2BRESkS5WVlWEymaitrb2tOkFBQaxfv94lPd3MbYdmWVnZHW9SRETuvMuXL5OVlcXgwYMxm83079+fqVOnUl5e3tWtucSHH35IUlISQUFBmEymW8ou/Z6miIgAkJSURHNzMyUlJQwdOpTq6mr2799PTU1NV7fmEo2NjQwdOpTk5GS+/e1v31INfTwrIiLU1tZy4MABVq1axcSJExkyZAijR48mJyeHGTNmAJCenk5CQoLTei0tLfTr14/NmzcDMGHCBLKzs1m0aBG9e/fG39+fTZs20dDQQFpaGp6engwbNozS0tIOPZSXlxMVFYXFYmHs2LGcPHnS6fUdO3YQERGB2WwmKCiI4uLiTu3jqFGjWLNmDbNnz77lqzoUmiIi3dw/3pWtqampwxyr1YrVamXXrl03fB0gIyODffv2cfHiRcfY3r17aWxsJCUlxTFWUlKCn58fhw8fJjs7m6ysLJKTk4mNjeXYsWNMmTKFOXPm0NjY6FR/yZIlFBcXc+TIEfr27cv06dNpaWkBPr3kcdasWcyePZsTJ06wfPly8vLysNvtLniHjFNoioh0c4GBgXh7ezuWFStWdJjj7u6O3W6npKQEHx8f4uLiyM3N5YMPPnDMiY2NJSwsjC1btjjGbDYbycnJWK1Wx1h0dDTLli0jJCSEnJwcLBYLfn5+ZGZmEhISQn5+PjU1NU61AQoKCoiPjycyMpKSkhKqq6vZuXMnAGvXrmXSpEnk5eURGhpKamoqCxYsYM2aNa5+u/4phaaISDd3/vx5pzuz5eTk3HBeUlISFy5cYPfu3UybNo2ysjJiYmKcjuYyMjKw2WwAVFdXU1paSnp6ulOdz//6lZubG76+vkRGRjrG/P39Abh06ZLTeuPGjXM87tOnD2FhYZw6dQqAU6dOERcX5zQ/Li6OqqoqWltbjb4Vt02hKSLSzXl5eTkt/+x8nsViIT4+nry8PA4ePEhqaioFBQWO1+fOncvZs2epqKhg69atBAcHM378eKcavXr1cnpuMpmcxkwmEwBtbW2u2L27SqEpIiI3NXz4cBoaGhzPfX19SUxMxGazYbfbSUtLc9m2Dh065Hh89epVTp8+TXh4OADh4eEdLn0pLy8nNDT0rt6NTpeciIgINTU1JCcnk56eTlRUFJ6enhw9epTVq1czc+ZMp7kZGRkkJCTQ2trKvHnzXNZDYWEhvr6++Pv7s3TpUvz8/EhMTARg8eLFjBo1iqKiIlJSUqioqGDDhg1s3LjRcP3m5mZ+97vfOR7/5S9/4fjx41itVoYNG2aohkJTRESwWq2MGTOGdevWcebMGVpaWggMDCQzM5Pc3FynuZMnTyYgIICIiAgGDBjgsh5WrlzJwoULqaqqYsSIEezZswcPDw8AYmJiePPNN8nPz6eoqIiAgAAKCwtJTU01XP/ChQs89thjjuc/+MEP+MEPfsATTzxBWVmZoRqm9vb29s7s1O2qr6/H29sbsivBbP3iFURE7nVN1+GVkdTV1eHl5XVbpVz6N9KFfX3e9evXGThwIDabjWeffdZlde8HOtIUERFD2trauHLlCsXFxfj4+DhuetCTKDRFRMSQc+fOERwczKBBg7Db7bi797wI6Xl7LCIityQoKIi7fEbvnqNLTkRERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYdNdvo/fZLZjO/1s/l951X0Skq9TX1xP4Cq69xdwrI11XS1zmrofmtWvXAAgMDLzbmxYRuaOuXbv26c96Sbd110NzwIABnD9/Hk9PT0wm013ddn19PYGBgZw/f75HHeVqv7XfPUFX7nd7ezvXrl1z6Q8yy73profmAw88wKBBg+72Zp14eXn1qD8mn9F+9yza77tLR5g9g74IJCIiYpBCU0RExKAeFZpms5mCggLMZnNXt3JXab+13z1BT91vubtM7T39Z7hFRO4h9fX1Lj8/WldX1yPPb98JPepIU0RE5HYoNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiHSpsrIyTCYTtbW1t1UnKCiI9evXu6Snm1FoiogIAJcvXyYrK4vBgwdjNpvp378/U6dOpby8vKtbc5mf/exnPPLII1gsFiIjI3n77bc7tb5CU0REAEhKSuI3v/kNJSUlnD59mt27dzNhwgRqamq6ujWXOHjwIM899xzf/OY3+c1vfkNiYiKJiYmcPHnScA2FpoiIUFtby4EDB1i1ahUTJ05kyJAhjB49mpycHGbMmAFAeno6CQkJTuu1tLTQr18/Nm/eDMCECRPIzs5m0aJF9O7dG39/fzZt2kRDQwNpaWl4enoybNgwSktLO/RQXl5OVFQUFouFsWPHdgizHTt2EBERgdlsJigoiOLi4k7t48svv8y0adNYsmQJ4eHhFBUVERMTw4YNGwzXUGiKiHRz9fX1TktTU1OHOVarFavVyq5du274OkBGRgb79u3j4sWLjrG9e/fS2NhISkqKY6ykpAQ/Pz8OHz5MdnY2WVlZJCcnExsby7Fjx5gyZQpz5syhsbHRqf6SJUsoLi7myJEj9O3bl+nTp9PS0gJAZWUls2bNYvbs2Zw4cYLly5eTl5eH3W43/D5UVFQwefJkp7GpU6dSUVFhuAbtIiJyz6irq2sH7uhSUFBww22/9dZb7b179263WCztsbGx7Tk5Oe2//e1vneYMHz68fdWqVY7n06dPb09NTXU8f+KJJ9q//OUvO57/7W9/a3/44Yfb58yZ4xi7ePFiO9BeUVHR3t7e3v7f//3f7UD79u3bHXNqamraH3zwwfaf/vSn7e3t7e3PP/98e3x8vFMvS5YsaR8+fLjj+ZAhQ9rXrVt30/e2V69e7du2bXMae/XVV9v79et303X+kY40RUS6ufPnz1NXV+dYcnJybjgvKSmJCxcusHv3bqZNm0ZZWRkxMTFOR3MZGRnYbDYAqqurKS0tJT093alOVFSU47Gbmxu+vr5ERkY6xvz9/QG4dOmS03rjxo1zPO7Tpw9hYWGcOnUKgFOnThEXF+c0Py4ujqqqKlpbW42+FbdNoSki0s15eXk5Lf/s59MsFgvx8fHk5eVx8OBBUlNTKSgocLw+d+5czp49S0VFBVu3biU4OJjx48c71ejVq5fTc5PJ5DRmMpkAaGtrc8XuGda/f3+qq6udxqqrq+nfv7/hGgpNERG5qeHDh9PQ0OB47uvrS2JiIjabDbvdTlpamsu2dejQIcfjq1evcvr0acLDwwEIDw/vcOlLeXk5oaGhuLm5Gao/btw49u/f7zT27rvvOh3hfhF3wzNFRKTbqqmpITk5mfT0dKKiovD09OTo0aOsXr2amTNnOs3NyMggISGB1tZW5s2b57IeCgsL8fX1xd/fn6VLl+Ln50diYiIAixcvZtSoURQVFZGSkkJFRQUbNmxg48aNhusvXLiQJ554guLiYp5++mm2b9/O0aNH+fGPf2y4hkJTRESwWq2MGTOGdevWcebMGVpaWggMDCQzM5Pc3FynuZMnTyYgIICIiAgGDBjgsh5WrlzJwoULqaqqYsSIEezZswcPDw8AYmJiePPNN8nPz6eoqIiAgAAKCwtJTU01XD82NpZt27axbNkycnNzCQkJYdeuXTz66KOGa5ja29vbO7tjIiJyZ9TX1+Pt7e3SmnV1dXh5ebms3vXr1xk4cCA2m41nn33WZXXvBzrSFBERQ9ra2rhy5QrFxcX4+Pg4bnrQkyg0RUTEkHPnzhEcHMygQYOw2+24u/e8COl5eywiIrckKCiInn5GT5eciIiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRuYd4eHh06keRv0j//v0dvxQit0+/ciIico/55JNPaG5udkktDw8PLBaLS2qJQlNERMQwfTwrIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGPT/Ad9fN1DvPNBvAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(extend2(img2,img1))" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [], + "source": [ + "img = Image(0, 0, 4, 4, np.array([\n", + " [1, 1, 0, 0],\n", + " [1, 1, 0, 0],\n", + " [0, 0, 0, 0],\n", + " [0, 0, 0, 0]\n", + " ]))" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAGdCAYAAABwyyjqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIgUlEQVR4nO3df1xU953v8dcEZcZm+KGggIqCUQlQ0GLUCLHRRtQ0oESKmGxVIHA3rHK18XpvUQEL2/gjQc3WmLaumeGh6xobo1UbzGbd0BrE+itpNOFGom21VVG5Mig0QGDuH93MZlZtDjoK6vv5eJzHzvnO93zOZ842vD3z4xyT0+l0IiIiIl/rgc5uQERE5G6h0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAU+YqlS5diMpk6uw0R6aIUmtJp7HY7JpMJk8nE+++/f83zTqeT0NBQTCYTSUlJHa7/4osvsmPHDg90KiLyVwpN6XQWi4XNmzdfM/7rX/+aP/3pT5jN5puqezOhuWTJEv7yl7/c1P5E5N6n0JRO993vfpdf/OIXfPHFF27jmzdvZsSIEQQHB9/2HhobGwHo1q0bFovltu9PRO5OCk3pdM888wx1dXW8++67rrGWlhbefPNNnn322Wvmv/zyy8THxxMQEECPHj0YMWIEb775ptsck8lEY2MjZWVlrreAMzIygP/63PKTTz7h2WefpWfPnjz22GNuz33JZrNhMpl4/fXX3eq/+OKLmEwm3n77bU8dBhG5Cyg0pdOFhYUxZswY/vVf/9U1Vl5ejsPhYMaMGdfMf+WVV/jWt75FcXExL774It26dSMtLY1f/epXrjkbN27EbDYzduxYNm7cyMaNG/n7v/97tzppaWk0NTXx4osvkpOTc93eMjMzSUpK4oUXXuDMmTMAHDt2jB/96Ec899xzfPe73/XEIRCRu0S3zm5ABODZZ58lPz+fv/zlL/To0YN/+Zd/4fHHH6dv377XzD1x4gQ9evRwrc+dO5e4uDhWrVrFU089BcD3v/99nn/+eQYNGsT3v//96+5z2LBh1/0s9b9bv3490dHRPPfcc+zevZvZs2cTHBzMqlWrbvLVisjdSqEpXcL06dOZP38+u3fvZvLkyezevZt/+qd/uu7crwbm5cuXaWtrY+zYsW5nqkY8//zzhuYFBwfz6quv8swzzzB27Fg+/PBD3n33XXx9fTu0PxGjPv/8c1paWjxSy9vbW5/Te5BCU7qE3r17M2HCBDZv3kxTUxNtbW1873vfu+7c3bt384//+I98+OGHNDc3u8Y7+vvK8PBww3NnzJjBpk2b+NWvfsX/+B//gyeeeKJD+xIx6vPPP6fPN6xccbZ5pF5wcDC///3vFZweotCULuPZZ58lJyeH8+fP8+STT+Lv73/NnH379jFlyhS+/e1vs27dOkJCQujevTs2m83QW61f9dUz1q9TV1fH4cOHAfjkk09ob2/ngQf0lQDxvJaWFq442/jhN8Iwm27tf2PNznaWn/8DLS0tCk0P0X/10mU8/fTTPPDAAxw4cOC635oF2LZtGxaLhXfeeYesrCyefPJJJkyYcN25nryyz5w5c7hy5QrLli3j/fffZ82aNR6rLXI9ZtMDWExet7TcaujKtXSmKV2G1Wrltdde4w9/+APJycnXnePl5YXJZKKt7b/euvrDH/5w3YsYPPjgg9TX199yX2+++SZvvPEG//RP/0ReXh6/+93vWLJkCUlJSQwdOvSW64vI3UP/DJEuZfbs2RQVFd3wrdOnnnqKpqYmJk+ezE9/+lOKi4sZPXo0gwcPvmbuiBEj+Pd//3dWrVrFli1b+O1vf9vhfi5cuEBubi7jx49n7ty5AKxduxZfX18yMjJob2/vcE0RuXspNOWu8p3vfIcNGzZw/vx55s+fz7/+67+yYsUKnn766Wvmrlq1ihEjRrBkyRKeeeYZXnvttQ7vLzc3l+bmZtdFDgACAgL4+c9/TlVVFS+//PItvyYRuXuYnE6ns7ObEBGRv2poaMDPz4+iBwdhMXndUq3PnW38qPEUDodDP5HyEJ1pioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVEpFNVVFRgMplu+bKXYWFht/260ArN//Tqq68SFhaGxWJh9OjRHDx4sLNb6tJ+85vfkJycTN++fTGZTNe99qu4W7ZsGSNHjsTHx4c+ffqQkpLCp59+2tltdXmvvfYasbGx+Pr64uvry5gxYygvL+/stu5JFy9eJDc3lwEDBmA2mwkODmbSpElUVlZ2dmse0draSnFxMQ899BAWi4Vhw4axZ8+eDtVQaAJvvPEGL7zwAkVFRRw9epRhw4YxadIkLly40NmtdVmNjY0MGzaMV199tbNbuWv8+te/Zs6cORw4cIB3332X1tZWJk6cSGNjY2e31qX179+f5cuXc+TIEQ4fPsx3vvMdpk6dyscff9zZrd1zUlNT+eCDDygrK+PEiRPs3LmTcePGUVdX19mtecSSJUv42c9+xk9+8hM++eQTnn/+eZ5++mk++OAD40Wc4hw1apRzzpw5rvW2tjZn3759ncuWLevEru4egHP79u2d3cZd58KFC07A+etf/7qzW7nr9OzZ0/nP//zPnd3GbeFwOJyAs+jBQc5l1iG3tBQ9OMgJOB0Ox9fu9/Lly07AWVFRccM5mZmZzqeeesptrKWlxdm7d2/X/z8ef/xx59y5c53z5s1z+vv7O/v06eP8+c9/7rx69aozIyPDabVanQ899JDz7bffdtV47733nIBz9+7dzpiYGKfZbHaOHj3aeezYMbd9vfnmm86oqCint7e3c+DAgc6XX37Z7fmBAwc6V69efcP+Q0JCnGvXrnUbmzZtmvPv/u7v/uax+ar7/kyzpaWFI0eOuN2T8YEHHmDChAlUVVV1Ymdyr3M4HAD06tWrkzu5e7S1tbFlyxYaGxsZM2ZMZ7dz12hoaHBbmpubr5ljtVqxWq3s2LHjus8DZGdns2fPHs6dO+ca2717N01NTaSnp7vGysrKCAwM5ODBg+Tl5ZGbm0taWhrx8fEcPXqUiRMnMnPmTJqamtzqL1y4kNLSUg4dOkTv3r1JTk6mtbUVgCNHjjB9+nRmzJjBsWPHWLp0KQUFBdjtdsPHobm5+Zqbcffo0YP333/fcI37PjQvXbpEW1sbQUFBbuNBQUGcP3++k7qSe117ezvz588nISGBb37zm53dTpd37NgxrFYrZrOZ559/nu3btxMVFdXZbd01QkND8fPzcy3Lli27Zk63bt2w2+2UlZXh7+9PQkICixYt4qOPPnLNiY+PJyIigo0bN7rGbDYbaWlpWK1W19iwYcNYsmQJQ4YMIT8/H4vFQmBgIDk5OQwZMoTCwkLq6urcagMUFRWRmJhITEwMZWVl1NbWsn37duCvdy164oknKCgoYOjQoWRkZDB37lxeeuklw8dh0qRJrFq1ipqaGtrb23n33Xd566233P4R8HXu+9AU6Qxz5szh+PHjbNmypbNbuStERETw4Ycf8tvf/pbc3Fxmz57NJ5980tlt3TXOnDmDw+FwLfn5+dedl5qaytmzZ9m5cyeTJ0+moqKCuLg4t7O57OxsbDYbALW1tZSXl5OVleVWJzY21vXYy8uLgIAAYmJiXGNfnqT89++NfPXdg169ehEREUF1dTUA1dXVJCQkuM1PSEigpqbG7ab0f8srr7zCkCFDePjhh/H29mbu3LlkZmbywAPGo/C+D83AwEC8vLyora11G6+trSU4OLiTupJ72dy5c9m9ezfvvfce/fv37+x27gre3t4MHjyYESNGsGzZMoYNG8Yrr7zS2W3dNb785vGXi9lsvuFci8VCYmIiBQUF7N+/n4yMDIqKilzPz5o1i1OnTlFVVcWmTZsIDw9n7NixbjW6d+/utm4ymdzGvrw37Z2+iXvv3r3ZsWMHjY2N/PGPf+T//t//i9VqZdCgQYZr3Peh6e3tzYgRI9i7d69rrL29nb179+ozE/Eop9PJ3Llz2b59O//xH/9BeHh4Z7d012pvb7/h527iWVFRUW7f8A4ICCAlJQWbzYbdbiczM9Nj+zpw4IDr8eXLlzlx4gSRkZEAREZGXvPTl8rKSoYOHYqXV8fuO2qxWOjXrx9ffPEF27ZtY+rUqYa37dahPd2jXnjhBWbPns0jjzzCqFGjWLNmDY2NjR79H8O95urVq3z22Weu9d///vd8+OGH9OrViwEDBnRiZ13XnDlz2Lx5M7/85S/x8fFxfWbu5+dHjx49Orm7ris/P58nn3ySAQMGcOXKFTZv3kxFRQXvvPNOZ7d2T6mrqyMtLY2srCxiY2Px8fHh8OHDrFy58ppQyc7OJikpiba2NmbPnu2xHoqLiwkICCAoKIjFixcTGBhISkoKAAsWLGDkyJGUlJSQnp5OVVUVa9euZd26dYbr//a3v+XPf/4zw4cP589//jNLly6lvb2d//2//7fhGgpNID09nYsXL1JYWMj58+cZPnw4e/bsuebLQfJfDh8+zPjx413rL7zwAgCzZ8/u0LfZ7ievvfYaAOPGjXMbt9lsZGRk3PmG7hIXLlxg1qxZnDt3Dj8/P2JjY3nnnXdITEzs7NbuKVarldGjR7N69WpOnjxJa2sroaGh5OTksGjRIre5EyZMICQkhOjoaPr27euxHpYvX868efOoqalh+PDh7Nq1C29vbwDi4uLYunUrhYWFlJSUEBISQnFxcYf+2/n8889ZsmQJp06dwmq18t3vfpeNGzfi7+9vuIbJ6XQ6O/i6RETkNmloaMDPz4+iBwdhMXXsbcf/7nNnGz9qPIXD4cDX19dDHf71naZ+/fphs9mYNm2ax+reDXSmKSIihrS3t3Pp0iVKS0vx9/dnypQpnd3SHafQFBERQ06fPk14eDj9+/fHbrfTrdv9FyH33ysWEZGbEhYWxv3+id59/5MTERERoxSaIiIiBik0RUREDFJoioiIGKTQ/E/Nzc0sXbpUl+bqIB23jtMxuzk6btIV6OIG/+nLHxR7+kfA9zodt47TMbs598txuxsubnA/05mmiIiIQQpNERERg+74xQ3a29s5e/YsPj4+rnuqdQUNDQ1u/1eM0XHrOB2zm9OVj5vT6eTKlSv07du3Qzc0lrvPHQ/Ns2fPEhoaeqd3a1hX7q0r03HrOB2zm9OVj9uZM2d0Y/F73B0PTR8fn78++Ptfg7f1Tu9e7jc/GdHZHch9xPX3zQOa930APrf25Z3mKw0Q5+ehjgQ6ITRdb8l6W8Gs0BSRe0dX+shJbg+9+S4iImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiLSqSoqKjCZTNTX199SnbCwMNasWeORnm5EoSkiIgBcvHiR3NxcBgwYgNlsJjg4mEmTJlFZWdnZrXnMmjVriIiIoEePHoSGhvKDH/yAzz//3PD2d/zWYCIi0jWlpqbS0tJCWVkZgwYNora2lr1791JXV9fZrXnE5s2b+eEPf8jrr79OfHw8J06cICMjA5PJxKpVqwzV0JmmiIhQX1/Pvn37WLFiBePHj2fgwIGMGjWK/Px8pkyZAkBWVhZJSUlu27W2ttKnTx82bNgAwLhx48jLy2P+/Pn07NmToKAg1q9fT2NjI5mZmfj4+DB48GDKy8uv6aGyspLY2FgsFguPPvoox48fd3t+27ZtREdHYzabCQsLo7S0tEOvcf/+/SQkJPDss88SFhbGxIkTeeaZZzh48KDhGgpNEZF7XENDg9vS3Nx8zRyr1YrVamXHjh3XfR4gOzubPXv2cO7cOdfY7t27aWpqIj093TVWVlZGYGAgBw8eJC8vj9zcXNLS0oiPj+fo0aNMnDiRmTNn0tTU5FZ/4cKFlJaWcujQIXr37k1ycjKtra0AHDlyhOnTpzNjxgyOHTvG0qVLKSgowG63Gz4O8fHxHDlyxBWSp06d4u233+a73/2u4RoKTRGRe1xoaCh+fn6uZdmyZdfM6datG3a7nbKyMvz9/UlISGDRokV89NFHrjnx8fFERESwceNG15jNZiMtLQ2r1eoaGzZsGEuWLGHIkCHk5+djsVgIDAwkJyeHIUOGUFhYSF1dnVttgKKiIhITE4mJiaGsrIza2lq2b98OwKpVq3jiiScoKChg6NChZGRkMHfuXF566SXDx+HZZ5+luLiYxx57jO7du/PQQw8xbtw4Fi1aZLiGQlNE5B535swZHA6Ha8nPz7/uvNTUVM6ePcvOnTuZPHkyFRUVxMXFuZ3NZWdnY7PZAKitraW8vJysrCy3OrGxsa7HXl5eBAQEEBMT4xoLCgoC4MKFC27bjRkzxvW4V69eREREUF1dDUB1dTUJCQlu8xMSEqipqaGtrc3QcaioqODFF19k3bp1HD16lLfeeotf/epXlJSUGNoeFJoiIvc8X19ft8VsNt9wrsViITExkYKCAvbv309GRgZFRUWu52fNmsWpU6eoqqpi06ZNhIeHM3bsWLca3bt3d1s3mUxuYyaTCYD29nZPvDzDCgoKmDlzJtnZ2cTExPD000/z4osvsmzZMsO9KDRFROSGoqKiaGxsdK0HBASQkpKCzWbDbreTmZnpsX0dOHDA9fjy5cucOHGCyMhIACIjI6/56UtlZSVDhw7Fy8vLUP2mpiYeeMA99r7c1ul0Gqqhn5yIiAh1dXWkpaWRlZVFbGwsPj4+HD58mJUrVzJ16lS3udnZ2SQlJdHW1sbs2bM91kNxcTEBAQEEBQWxePFiAgMDSUlJAWDBggWMHDmSkpIS0tPTqaqqYu3ataxbt85w/eTkZFatWsW3vvUtRo8ezWeffUZBQQHJycmGg1ehKSIiWK1WRo8ezerVqzl58iStra2EhoaSk5NzzRdlJkyYQEhICNHR0fTt29djPSxfvpx58+ZRU1PD8OHD2bVrF97e3gDExcWxdetWCgsLKSkpISQkhOLiYjIyMgzXX7JkCSaTiSVLlvDnP//Z9Q3dH//4x4ZrmJxGz0k9pKGhAT8/P8g7Ambr128gcitejujsDuQ+4nA48PX1vaUaX/6N/OFRB2afW6vVfKWB5XF+Hunrq65evUq/fv2w2WxMmzbNY3XvBjrTFBERQ9rb27l06RKlpaX4+/u7LnpwP1FoioiIIadPnyY8PJz+/ftjt9vp1u3+i5D77xWLiMhNCQsLM/wt03uVfnIiIiJikEJTRETEIIWmiIiIQQpNERERg24qNF999VXCwsKwWCyMHj26Q/ciExERuVt1ODTfeOMNXnjhBYqKijh69CjDhg1j0qRJ11ytXkRE5F7T4dBctWoVOTk5ZGZmEhUVxU9/+lO+8Y1v8Prrr9+O/kRERLqMDoVmS0sLR44cYcKECf9V4IEHmDBhAlVVVdfdprm5+Zq7houIiNyNOhSaly5doq2tzXUD0S8FBQVx/vz5626zbNkytzuGh4aG3ny3IiIinei2XxEoPz+fF154wbXe0NCg4BQR+Rr52x/G13JrP3Bo+Lyd5R7qR/6qQ6EZGBiIl5cXtbW1buO1tbUEBwdfdxuz2fw37xIuIiJyt+jQP2O8vb0ZMWIEe/fudY21t7ezd+9exowZ4/HmREREupIOvz37wgsvMHv2bB555BFGjRrFmjVraGxsJDMz83b0JyIi0mV0ODTT09O5ePEihYWFnD9/nuHDh7Nnz55rvhwkIiJyr7mpLwLNnTuXuXPneroXERGRLk3XnhURETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUEZFOVVFRgclkor6+/pbqhIWFsWbNGo/0dCMKTRERAeDixYvk5uYyYMAAzGYzwcHBTJo0icrKys5uzSPGjRuHyWS6ZnnqqacM17jt99MUEZG7Q2pqKi0tLZSVlTFo0CBqa2vZu3cvdXV1nd2aR7z11lu0tLS41uvq6hg2bBhpaWmGa+hMU0REqK+vZ9++faxYsYLx48czcOBARo0aRX5+PlOmTAEgKyuLpKQkt+1aW1vp06cPGzZsAP56NpeXl8f8+fPp2bMnQUFBrF+/3nU3LB8fHwYPHkx5efk1PVRWVhIbG4vFYuHRRx/l+PHjbs9v27aN6OhozGYzYWFhlJaWdug19urVi+DgYNfy7rvv8o1vfEOhKSIi/6WhocFtaW5uvmaO1WrFarWyY8eO6z4PkJ2dzZ49ezh37pxrbPfu3TQ1NZGenu4aKysrIzAwkIMHD5KXl0dubi5paWnEx8dz9OhRJk6cyMyZM2lqanKrv3DhQkpLSzl06BC9e/cmOTmZ1tZWAI4cOcL06dOZMWMGx44dY+nSpRQUFGC322/6uGzYsIEZM2bw4IMPGt5GoSkico8LDQ3Fz8/PtSxbtuyaOd26dcNut1NWVoa/vz8JCQksWrSIjz76yDUnPj6eiIgINm7c6Bqz2WykpaVhtVpdY8OGDWPJkiUMGTKE/Px8LBYLgYGB5OTkMGTIEAoLC6mrq3OrDVBUVERiYiIxMTGUlZVRW1vL9u3bAVi1ahVPPPEEBQUFDB06lIyMDObOnctLL710U8fk4MGDHD9+nOzs7A5tp9AUEbnHnTlzBofD4Vry8/OvOy81NZWzZ8+yc+dOJk+eTEVFBXFxcW5nc9nZ2dhsNgBqa2spLy8nKyvLrU5sbKzrsZeXFwEBAcTExLjGvrz/8oULF9y2GzNmjOtxr169iIiIoLq6GoDq6moSEhLc5ickJFBTU0NbW5vRQ+GyYcMGYmJiGDVqVIe2U2iKiNzjfH193Raz2XzDuRaLhcTERAoKCti/fz8ZGRkUFRW5np81axanTp2iqqqKTZs2ER4eztixY91qdO/e3W3dZDK5jZlMJgDa29s98fI6rLGxkS1btvDcc891eFuFpoiI3FBUVBSNjY2u9YCAAFJSUrDZbNjtdjIzMz22rwMHDrgeX758mRMnThAZGQlAZGTkNT99qaysZOjQoXh5eXVoP7/4xS9obm7m+9//fod71E9ORESEuro60tLSyMrKIjY2Fh8fHw4fPszKlSuZOnWq29zs7GySkpJoa2tj9uzZHuuhuLiYgIAAgoKCWLx4MYGBgaSkpACwYMECRo4cSUlJCenp6VRVVbF27VrWrVvX4f1s2LCBlJQUAgICOrytQlNERLBarYwePZrVq1dz8uRJWltbCQ0NJScnh0WLFrnNnTBhAiEhIURHR9O3b1+P9bB8+XLmzZtHTU0Nw4cPZ9euXXh7ewMQFxfH1q1bKSwspKSkhJCQEIqLi8nIyOjQPj799FPef/99/u3f/u2mejQ5nU7nTW15kxoaGvDz84O8I2C2fv0GIrfi5YjO7kDuIw6HA19f31uq8eXfSEdBCL6WW/sEreHzdvxKznmkr6+6evUq/fr1w2azMW3aNI/VvRvoTFNERAxpb2/n0qVLlJaW4u/v77rowf1EoSkiIoacPn2a8PBw+vfvj91up1u3+y9C7r9XLCIiNyUsLIw7/Ilel6OfnIiIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpCsCiYh0QY61P8dpevCWajQ4G4FkzzQkgM40RUREDFNoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0REelUFRUVmEwm6uvrb6lOWFgYa9as8UhPN6LQFBERAC5evEhubi4DBgzAbDYTHBzMpEmTqKys7OzWPKa+vp45c+YQEhKC2Wxm6NChvP3224a3102oRUQEgNTUVFpaWigrK2PQoEHU1tayd+9e6urqOrs1j2hpaSExMZE+ffrw5ptv0q9fP/74xz/i7+9vuIbONEVEhPr6evbt28eKFSsYP348AwcOZNSoUeTn5zNlyhQAsrKySEpKctuutbWVPn36sGHDBgDGjRtHXl4e8+fPp2fPngQFBbF+/XoaGxvJzMzEx8eHwYMHU15efk0PlZWVxMbGYrFYePTRRzl+/Ljb89u2bSM6Ohqz2UxYWBilpaUdeo2vv/46/+///T927NhBQkICYWFhPP744wwbNsxwDYWmiMg9rqGhwW1pbm6+Zo7VasVqtbJjx47rPg+QnZ3Nnj17OHfunGts9+7dNDU1kZ6e7horKysjMDCQgwcPkpeXR25uLmlpacTHx3P06FEmTpzIzJkzaWpqcqu/cOFCSktLOXToEL179yY5OZnW1lYAjhw5wvTp05kxYwbHjh1j6dKlFBQUYLfbDR+HnTt3MmbMGObMmUNQUBDf/OY3efHFF2lrazNcQ6EpInKPCw0Nxc/Pz7UsW7bsmjndunXDbrdTVlaGv78/CQkJLFq0iI8++sg1Jz4+noiICDZu3Ogas9lspKWlYbVaXWPDhg1jyZIlDBkyhPz8fCwWC4GBgeTk5DBkyBAKCwupq6tzqw1QVFREYmIiMTExlJWVUVtby/bt2wFYtWoVTzzxBAUFBQwdOpSMjAzmzp3LSy+9ZPg4nDp1ijfffJO2tjbefvttCgoKKC0t5R//8R8N11Boiojc486cOYPD4XAt+fn5152XmprK2bNn2blzJ5MnT6aiooK4uDi3s7ns7GxsNhsAtbW1lJeXk5WV5VYnNjbW9djLy4uAgABiYmJcY0FBQQBcuHDBbbsxY8a4Hvfq1YuIiAiqq6sBqK6uJiEhwW1+QkICNTU1hs8U29vb6dOnDz//+c8ZMWIE6enpLF68mJ/+9KeGtgeFpojIPc/X19dtMZvNN5xrsVhITEykoKCA/fv3k5GRQVFRkev5WbNmcerUKaqqqti0aRPh4eGMHTvWrUb37t3d1k0mk9uYyWQC/hpid1JISAhDhw7Fy8vLNRYZGcn58+dpaWkxVEOhKSIiNxQVFUVjY6NrPSAggJSUFGw2G3a7nczMTI/t68CBA67Hly9f5sSJE0RGRgJ/Dbf//tOXysrKa0Lwb0lISOCzzz5zC+sTJ04QEhKCt7e3oRr6yYmIiFBXV0daWhpZWVnExsbi4+PD4cOHWblyJVOnTnWbm52dTVJSEm1tbcyePdtjPRQXFxMQEEBQUBCLFy8mMDCQlJQUABYsWMDIkSMpKSkhPT2dqqoq1q5dy7p16wzXz83NZe3atcybN4+8vDxqamp48cUX+Z//838arqHQFBERrFYro0ePZvXq1Zw8eZLW1lZCQ0PJyclh0aJFbnMnTJhASEgI0dHR9O3b12M9LF++nHnz5lFTU8Pw4cPZtWuX6wwwLi6OrVu3UlhYSElJCSEhIRQXF5ORkWG4fmhoKO+88w4/+MEPiI2NpV+/fsybN4//83/+j+EaJqfT6ezoC7sVDQ0N+Pn5Qd4RMFu/fgORW/FyRGd3IPcRh8OBr6/vLdX48m/k6Z678DU9eGu1nI0MuJzskb6+6urVq/Tr1w+bzca0adM8VvduoDNNERExpL29nUuXLlFaWoq/v7/rogf3E4WmiIgYcvr0acLDw+nfvz92u51u3e6/CLn/XrGIiNyUsLAw7vAnel2OfnIiIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBnU4NH/zm9+QnJxM3759MZlM7Nix4za0JSIi0vV0ODQbGxsZNmwYr7766u3oR0REpMvq8O80n3zySZ588snb0YuIiEiXdtsvbtDc3Exzc7NrvaGh4XbvUkRE5La47aG5bNkyfvSjH93u3YiI3FP+Y3Ud3/jGX26pRlNTE2R4ph/5q9v+7dn8/HwcDodrOXPmzO3epYiIyG1x2880zWYzZrP5du9GRETkttPvNEVERAzq8Jnm1atX+eyzz1zrv//97/nwww/p1asXAwYM8GhzIiIiXUmHQ/Pw4cOMHz/etf7CCy8AMHv2bOx2u8caExER6Wo6HJrjxo277++nJiIi9yd9pikiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUEZFOVVFRgclkor6+/pbqhIWFsWbNGo/0dCMKTRERAeDixYvk5uYyYMAAzGYzwcHBTJo0icrKys5uzSPsdjsmk8ltsVgsHapx2+9yIiIid4fU1FRaWlooKytj0KBB1NbWsnfvXurq6jq7NY/x9fXl008/da2bTKYOba8zTRERob6+nn379rFixQrGjx/PwIEDGTVqFPn5+UyZMgWArKwskpKS3LZrbW2lT58+bNiwAfjrpVbz8vKYP38+PXv2JCgoiPXr19PY2EhmZiY+Pj4MHjyY8vLya3qorKwkNjYWi8XCo48+yvHjx92e37ZtG9HR0ZjNZsLCwigtLe3w6zSZTAQHB7uWoKCgDm2v0BQRucc1NDS4Lc3NzdfMsVqtWK1WduzYcd3nAbKzs9mzZw/nzp1zje3evZumpibS09NdY2VlZQQGBnLw4EHy8vLIzc0lLS2N+Ph4jh49ysSJE5k5cyZNTU1u9RcuXEhpaSmHDh2id+/eJCcn09raCsCRI0eYPn06M2bM4NixYyxdupSCgoIO3yjk6tWrDBw4kNDQUKZOncrHH3/coe0VmiIi97jQ0FD8/Pxcy7Jly66Z061bN+x2O2VlZfj7+5OQkMCiRYv46KOPXHPi4+OJiIhg48aNrjGbzUZaWhpWq9U1NmzYMJYsWcKQIUPIz8/HYrEQGBhITk4OQ4YMobCwkLq6OrfaAEVFRSQmJhITE0NZWRm1tbVs374dgFWrVvHEE09QUFDA0KFDycjIYO7cubz00kuGj0NERASvv/46v/zlL9m0aRPt7e3Ex8fzpz/9yXANhaaIyD3uzJkzOBwO15Kfn3/deampqZw9e5adO3cyefJkKioqiIuLczuby87OxmazAVBbW0t5eTlZWVludWJjY12Pvby8CAgIICYmxjX25VuiFy5ccNtuzJgxrse9evUiIiKC6upqAKqrq0lISHCbn5CQQE1NDW1tbYaOw5gxY5g1axbDhw/n8ccf56233qJ379787Gc/M7Q9KDRFRO55vr6+bovZbL7hXIvFQmJiIgUFBezfv5+MjAyKiopcz8+aNYtTp05RVVXFpk2bCA8PZ+zYsW41unfv7rZuMpncxr788k17e7snXt5N6969O9/61rf47LPPDG+j0BQRkRuKioqisbHRtR4QEEBKSgo2mw273U5mZqbH9nXgwAHX48uXL3PixAkiIyMBiIyMvOanL5WVlQwdOhQvL6+b2l9bWxvHjh0jJCTE8Db6yYmIiFBXV0daWhpZWVnExsbi4+PD4cOHWblyJVOnTnWbm52dTVJSEm1tbcyePdtjPRQXFxMQEEBQUBCLFy8mMDCQlJQUABYsWMDIkSMpKSkhPT2dqqoq1q5dy7p16zpU/9FHH2Xw4MHU19fz0ksv8cc//pHs7GzDNRSaIiKC1Wpl9OjRrF69mpMnT9La2kpoaCg5OTksWrTIbe6ECRMICQkhOjqavn37eqyH5cuXM2/ePGpqahg+fDi7du3C29sbgLi4OLZu3UphYSElJSWEhIRQXFxMRkaG4fqXL18mJyeH8+fP07NnT0aMGMH+/fuJiooyXMPkdDqdHX1ht6KhoQE/Pz/IOwJm69dvIHIrXo7o7A7kPuJwOPD19b2lGl/+jbTb7XzjG9+4pVpNTU1kZGR4pK+vunr1Kv369cNmszFt2jSP1b0b6ExTREQMaW9v59KlS5SWluLv7++66MH9RKEpIiKGnD59mvDwcPr374/dbqdbt/svQu6/VywiIjclLCyMO/yJXpejn5yIiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNR5VwT6yYhO27WIiMjN0GX0RES6oKeHZeDrc2s1Gq5Ahke6kS/p7VkRERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIinaqiogKTyUR9ff0t1QkLC2PNmjUe6elGFJoiIgLAxYsXyc3NZcCAAZjNZoKDg5k0aRKVlZWd3ZrHbdmyBZPJREpKSoe20/00RUQEgNTUVFpaWigrK2PQoEHU1tayd+9e6urqOrs1j/rDH/7A//pf/4uxY8d2eFudaYqICPX19ezbt48VK1Ywfvx4Bg4cyKhRo8jPz2fKlCkAZGVlkZSU5LZda2srffr0YcOGDQCMGzeOvLw85s+fT8+ePQkKCmL9+vU0NjaSmZmJj48PgwcPpry8/JoeKisriY2NxWKx8Oijj3L8+HG357dt20Z0dDRms5mwsDBKS0s7/Drb2tr4u7/7O370ox8xaNCgDm+v0BQRucc1NDS4Lc3NzdfMsVqtWK1WduzYcd3nAbKzs9mzZw/nzp1zje3evZumpibS09NdY2VlZQQGBnLw4EHy8vLIzc0lLS2N+Ph4jh49ysSJE5k5cyZNTU1u9RcuXEhpaSmHDh2id+/eJCcn09raCsCRI0eYPn06M2bM4NixYyxdupSCggLsdnuHjkVxcTF9+vThueee69B2Ls47zOFwOAEtWrRouecWh8Phsb+Rjg9wOj+7tcXxwfX7LCoquu6+33zzTWfPnj2dFovFGR8f78zPz3f+7ne/c5sTFRXlXLFihWs9OTnZmZGR4Vp//PHHnY899phr/YsvvnA++OCDzpkzZ7rGzp075wScVVVVTqfT6XzvvfecgHPLli2uOXV1dc4ePXo433jjDafT6XQ+++yzzsTERLdeFi5c6IyKinKtDxw40Ll69eobHtt9+/Y5+/Xr57x48aLT6XQ6Z8+e7Zw6deoN51+PzjRFRO5xZ86cweFwuJb8/PzrzktNTeXs2bPs3LmTyZMnU1FRQVxcnNvZXHZ2NjabDYDa2lrKy8vJyspyqxMbG+t67OXlRUBAADExMa6xoKAgAC5cuOC23ZgxY1yPe/XqRUREBNXV1QBUV1eTkJDgNj8hIYGamhra2tq+9hhcuXKFmTNnsn79egIDA792/o3oi0AiIvc4X19ffH19Dc21WCwkJiaSmJhIQUEB2dnZFBUVkZGRAcCsWbP44Q9/SFVVFfv37yc8PPyaL9R0797dbd1kMrmNmUwmANrb22/hVXXMyZMn+cMf/kBycrJr7Mv9d+vWjU8//ZSHHnroa+soNEVE5IaioqLYsWOHaz0gIICUlBRsNhtVVVVkZmZ6bF8HDhxgwIABAFy+fJkTJ04QGRkJQGRk5DU/famsrGTo0KF4eXl9be2HH36YY8eOuY0tWbKEK1eu8MorrxAaGmqoR4WmiIhQV1dHWloaWVlZxMbG4uPjw+HDh1m5ciVTp051m5udnU1SUhJtbW3Mnj3bYz0UFxcTEBBAUFAQixcvJjAw0PU7ygULFjBy5EhKSkpIT0+nqqqKtWvXsm7dOkO1LRYL3/zmN93G/P39Aa4Z/1sUmiIigtVqZfTo0axevZqTJ0/S2tpKaGgoOTk5LFq0yG3uhAkTCAkJITo6mr59+3qsh+XLlzNv3jxqamoYPnw4u3btwtvbG4C4uDi2bt1KYWEhJSUlhISEUFxc7Hrb+E4xOZ1O553cYUNDA35+fndylyIid4TD4TD82eGNfPk30vEB+PrcWj8NV8DvW57p66uuXr1Kv379sNlsTJs2zWN17wY60xQREUPa29u5dOkSpaWl+Pv7uy56cD9RaIqIiCGnT58mPDyc/v37Y7fb6dbt/ouQ++8Vi4jITQkLC+MOf6LX5ejiBiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImJQh0Jz2bJljBw5Eh8fH/r06UNKSgqffvrp7epNRESkS+lQaP76179mzpw5HDhwgHfffZfW1lYmTpxIY2Pj7epPRESky+jQ7zT37Nnjtm632+nTpw9Hjhzh29/+tkcbExER6Wpu6eIGDocD+OvNQm+kubmZ5uZm13pDQ8Ot7FJERKTT3HRotre3M3/+fBISEv7mbVWWLVvGj370o5vdjYjIfSne8Rhebbd20ba2q18A73umIQFu4duzc+bM4fjx42zZsuVvzsvPz8fhcLiWM2fO3OwuRUREOtVN/TNm7ty57N69m9/85jf079//b841m82Yzeabak5ERKQr6VBoOp1O8vLy2L59OxUVFYSHh9+uvkRERLqcDoXmnDlz2Lx5M7/85S/x8fHh/PnzAPj5+dGjR4/b0qCIiEhX0aHPNF977TUcDgfjxo0jJCTEtbzxxhu3qz8REZEuo8Nvz4qIiNyvdO1ZERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIdKqKigpMJhP19fW3VCcsLIw1a9Z4pKcbUWiKiAgAFy9eJDc3lwEDBmA2mwkODmbSpElUVlZ2dmse8dZbb/HII4/g7+/Pgw8+yPDhw9m4cWOHatzazdpEROSekZqaSktLC2VlZQwaNIja2lr27t1LXV1dZ7fmEb169WLx4sU8/PDDeHt7s3v3bjIzM+nTpw+TJk0yVENnmiIiQn19Pfv27WPFihWMHz+egQMHMmrUKPLz85kyZQoAWVlZJCUluW3X2tpKnz592LBhAwDjxo0jLy+P+fPn07NnT4KCgli/fj2NjY1kZmbi4+PD4MGDKS8vv6aHyspKYmNjsVgsPProoxw/ftzt+W3bthEdHY3ZbCYsLIzS0tIOvcZx48bx9NNPExkZyUMPPcS8efOIjY3l/feN36hboSkico9raGhwW5qbm6+ZY7VasVqt7Nix47rPA2RnZ7Nnzx7OnTvnGtu9ezdNTU2kp6e7xsrKyggMDOTgwYPk5eWRm5tLWloa8fHxHD16lIkTJzJz5kyamprc6i9cuJDS0lIOHTpE7969SU5OprW1FYAjR44wffp0ZsyYwbFjx1i6dCkFBQXY7fabOiZOp5O9e/fy6aef8u1vf9vwdgpNEZF7XGhoKH5+fq5l2bJl18zp1q0bdrudsrIy/P39SUhIYNGiRXz00UeuOfHx8URERLh9Dmiz2UhLS8NqtbrGhg0bxpIlSxgyZAj5+flYLBYCAwPJyclhyJAhFBYWUldX51YboKioiMTERGJiYigrK6O2tpbt27cDsGrVKp544gkKCgoYOnQoGRkZzJ07l5deeqlDx8LhcGC1WvH29uapp57iJz/5CYmJiYa3V2iKiNzjzpw5g8PhcC35+fnXnZeamsrZs2fZuXMnkydPpqKigri4OLezuezsbGw2GwC1tbWUl5eTlZXlVic2Ntb12MvLi4CAAGJiYlxjQUFBAFy4cMFtuzFjxrge9+rVi4iICKqrqwGorq4mISHBbX5CQgI1NTW0tbUZPRT4+Pjw4YcfcujQIX784x/zwgsvUFFRYXh7haaIyD3O19fXbTGbzTeca7FYSExMpKCggP3795ORkUFRUZHr+VmzZnHq1CmqqqrYtGkT4eHhjB071q1G9+7d3dZNJpPbmMlkAqC9vd0TL69DHnjgAQYPHszw4cNZsGAB3/ve96575n3D7W9jbyIicpeLioqisbHRtR4QEEBKSgo2mw273U5mZqbH9nXgwAHX48uXL3PixAkiIyMBiIyMvOanL5WVlQwdOhQvL6+b3md7e/sNP8O9Hv3kREREqKurIy0tjaysLGJjY/Hx8eHw4cOsXLmSqVOnus3Nzs4mKSmJtrY2Zs+e7bEeiouLCQgIICgoiMWLFxMYGEhKSgoACxYsYOTIkZSUlJCenk5VVRVr165l3bp1husvW7aMRx55hIceeojm5mbefvttNm7cyGuvvWa4hkJTRESwWq2MHj2a1atXc/LkSVpbWwkNDSUnJ4dFixa5zZ0wYQIhISFER0fTt29fj/WwfPly5s2bR01NDcOHD2fXrl14e3sDEBcXx9atWyksLKSkpISQkBCKi4vJyMgwXL+xsZF/+Id/4E9/+hM9evTg4YcfZtOmTW7f/P06JqfT6ezoC7sVDQ0N+Pn53cldiojcEQ6HA19f31uq8eXfyOiKx/Cy3tp5TdvVL/h43Pse6eurrl69Sr9+/bDZbEybNs1jde8GOtMUERFD2tvbuXTpEqWlpfj7+7suenA/UWiKiIghp0+fJjw8nP79+2O32+nW7f6LkPvvFYuIyE0JCwvjDn+i1+XoJyciIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDNJl9EREuqD9BX/Bt9vN31wZoOGLNnRPKc/SmaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBGRTlVRUYHJZKK+vv6W6oSFhbFmzRqP9HQjCk0REQHg4sWL5ObmMmDAAMxmM8HBwUyaNInKysrObs0j1q9fz9ixY+nZsyc9e/ZkwoQJHDx4sEM1dD9NEREBIDU1lZaWFsrKyhg0aBC1tbXs3buXurq6zm7NIyoqKnjmmWeIj4/HYrGwYsUKJk6cyMcff0y/fv0M1dCZpoiIUF9fz759+1ixYgXjx49n4MCBjBo1ivz8fKZMmQJAVlYWSUlJbtu1trbSp08fNmzYAMC4cePIy8tj/vz59OzZk6CgINavX09jYyOZmZn4+PgwePBgysvLr+mhsrKS2NhYLBYLjz76KMePH3d7ftu2bURHR2M2mwkLC6O0tLRDr/Ff/uVf+Id/+AeGDx/Oww8/zD//8z/T3t7O3r17DddQaIqI3OMaGhrclubm5mvmWK1WrFYrO3bsuO7zANnZ2ezZs4dz5865xnbv3k1TUxPp6emusbKyMgIDAzl48CB5eXnk5uaSlpZGfHw8R48eZeLEicycOZOmpia3+gsXLqS0tJRDhw7Ru3dvkpOTaW1tBeDIkSNMnz6dGTNmcOzYMZYuXUpBQQF2u/2mj0tTUxOtra306tXL+EbOO8zhcDgBLVq0aLnnFofD4bG/kY6xI5zO8aNuaXGMHXHdPouKiq677zfffNPZs2dPp8ViccbHxzvz8/Odv/vd79zmREVFOVesWOFaT05OdmZkZLjWH3/8cedjjz3mWv/iiy+cDz74oHPmzJmusXPnzjkBZ1VVldPpdDrfe+89J+DcsmWLa05dXZ2zR48ezjfeeMPpdDqdzz77rDMxMdGtl4ULFzqjoqJc6wMHDnSuXr3a4JF2OnNzc52DBg1y/uUvfzG8jc40RUTucWfOnMHhcLiW/Pz8685LTU3l7Nmz7Ny5k8mTJ1NRUUFcXJzb2Vx2djY2mw2A2tpaysvLycrKcqsTGxvreuzl5UVAQAAxMTGusaCgIAAuXLjgtt2YMWNcj3v16kVERATV1dUAVFdXk5CQ4DY/ISGBmpoa2trajB4Kl+XLl7Nlyxa2b9+OxWIxvJ1CU0TkHufr6+u2mM3mG861WCwkJiZSUFDA/v37ycjIoKioyPX8rFmzOHXqFFVVVWzatInw8HDGjh3rVqN79+5u6yaTyW3MZDIB0N7e7omX12Evv/wyy5cv59/+7d/cAt4IhaaIiNxQVFQUjY2NrvWAgABSUlKw2WzY7XYyMzM9tq8DBw64Hl++fJkTJ04QGRkJQGRk5DU/famsrGTo0KF4eXkZ3sfKlSspKSlhz549PPLIIx3uUT85ERER6urqSEtLIysri9jYWHx8fDh8+DArV65k6tSpbnOzs7NJSkqira2N2bNne6yH4uJiAgICCAoKYvHixQQGBpKSkgLAggULGDlyJCUlJaSnp1NVVcXatWtZt26d4forVqygsLCQzZs3ExYWxvnz54H/+hKUEQpNERHBarUyevRoVq9ezcmTJ2ltbSU0NJScnBwWLVrkNnfChAmEhIQQHR1N3759PdbD8uXLmTdvHjU1NQwfPpxdu3bh7e0NQFxcHFu3bqWwsJCSkhJCQkIoLi4mIyPDcP3XXnuNlpYWvve977mNFxUVsXTpUkM1TE6n02l4jx7Q0NCAn5/fndyliMgd4XA48PX1vaUaX/6NdIwdgW834287XrfWF2347Tvikb6+6urVq/Tr1w+bzca0adM8VvduoDNNERExpL29nUuXLlFaWoq/v7/rogf3E4WmiIgYcvr0acLDw+nfvz92u51u3e6/CLn/XrGIiNyUsLAw7vAnel2OfnIiIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDOpQaL722mvExsa6rpQ/ZsyY6959W0RE5F7UodDs378/y5cv58iRIxw+fJjvfOc7TJ06lY8//vh29SciItJldOjiBsnJyW7rP/7xj3nttdc4cOAA0dHRHm1MRESkq7npKwK1tbXxi1/8gsbGRre7bf93zc3NNDc3u9YbGhpudpciIvcNv+E/B7Ox21XdUPNV2DfCMw0JcBNfBDp27BhWqxWz2czzzz/P9u3biYqKuuH8ZcuW4efn51pCQ0NvqWEREZHO0uHQjIiI4MMPP+S3v/0tubm5zJ49m08++eSG8/Pz83E4HK7lzJkzt9SwiIhIZ+nw27Pe3t4MHjwYgBEjRnDo0CFeeeUVfvazn113vtlsxmw231qXIiIiXcAt/06zvb3d7TNLERGRe1WHzjTz8/N58sknGTBgAFeuXGHz5s1UVFTwzjvv3K7+REREuowOheaFCxeYNWsW586dw8/Pj9jYWN555x0SExNvV38iIiJdRodCc8OGDberDxERkS5P154VERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUSkU1VUVGAymaivr7+lOmFhYaxZs8YjPd2IQlNERAC4ePEiubm5DBgwALPZTHBwMJMmTaKysrKzW/OIjz/+mNTUVMLCwjCZTDcVsDd9P00REbm3pKam0tLSQllZGYMGDaK2tpa9e/dSV1fX2a15RFNTE4MGDSItLY0f/OAHN1VDZ5oiIkJ9fT379u1jxYoVjB8/noEDBzJq1Cjy8/OZMmUKAFlZWSQlJblt19raSp8+fVxXjBs3bhx5eXnMnz+fnj17EhQUxPr162lsbCQzMxMfHx8GDx5MeXn5NT1UVlYSGxuLxWLh0Ucf5fjx427Pb9u2jejoaMxmM2FhYZSWlnboNY4cOZKXXnqJGTNm3PTdtxSaIiL3uIaGBrflenemslqtWK1WduzYccM7V2VnZ7Nnzx7OnTvnGtu9ezdNTU2kp6e7xsrKyggMDOTgwYPk5eWRm5tLWloa8fHxHD16lIkTJzJz5kyamprc6i9cuJDS0lIOHTpE7969SU5OprW1FYAjR44wffp0ZsyYwbFjx1i6dCkFBQXY7XYPHCHjFJoiIve40NBQ/Pz8XMuyZcuumdOtWzfsdjtlZWX4+/uTkJDAokWL+Oijj1xz4uPjiYiIYOPGja4xm81GWloaVqvVNTZs2DCWLFnCkCFDyM/Px2KxEBgYSE5ODkOGDKGwsJC6ujq32gBFRUUkJiYSExNDWVkZtbW1bN++HYBVq1bxxBNPUFBQwNChQ8nIyGDu3Lm89NJLnj5cf5NCU0TkHnfmzBkcDodryc/Pv+681NRUzp49y86dO5k8eTIVFRXExcW5nc1lZ2djs9kAqK2tpby8nKysLLc6sbGxrsdeXl4EBAQQExPjGgsKCgL+euesrxozZozrca9evYiIiKC6uhqA6upqEhIS3OYnJCRQU1NDW1ub0UNxyxSaIiL3OF9fX7flb32eZ7FYSExMpKCggP3795ORkUFRUZHr+VmzZnHq1CmqqqrYtGkT4eHhjB071q1G9+7d3dZNJpPbmMlkAqC9vd0TL++OUmiKiMgNRUVF0djY6FoPCAggJSUFm82G3W4nMzPTY/s6cOCA6/Hly5c5ceIEkZGRAERGRl7z05fKykqGDh2Kl5eXx3r4OvrJiYiIUFdXR1paGllZWcTGxuLj48Phw4dZuXIlU6dOdZubnZ1NUlISbW1tzJ4922M9FBcXExAQQFBQEIsXLyYwMJCUlBQAFixYwMiRIykpKSE9PZ2qqirWrl3LunXrDNdvaWnhk08+cT3+85//zIcffojVamXw4MGGaig0RUQEq9XK6NGjWb16NSdPnqS1tZXQ0FBycnJYtGiR29wJEyYQEhJCdHQ0ffv29VgPy5cvZ968edTU1DB8+HB27dqFt7c3AHFxcWzdupXCwkJKSkoICQmhuLiYjIwMw/XPnj3Lt771Ldf6yy+/zMsvv8zjjz9ORUWFoRomp9Pp7MiLulUNDQ34+fndyV2KiNwRDocDX1/fW6rh+huZdwTM1q/f4G9pvgo/GeGRvr7q6tWr9OvXD5vNxrRp0zxW926gM00RETGkvb2dS5cuUVpair+/v+uiB/cThaaIiBhy+vRpwsPD6d+/P3a7nW7d7r8Iuf9esYiI3JSwsDDu8Cd6XY5+ciIiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEoDt+Gb0vL8F05swZj151X0SkszQ0NBAaGurZS8z9ZITnaonH3PHQvHLlCgChoaF3etciIrfVlStXdOvDe9wdD82+ffty5swZfHx8MJlMd3r3N/TlvxR1BtwxOm4dp2N2c7rycXM6nVy5csWjN2SWrumOh+YDDzxA//797/RuDfP19e1y/0HeDXTcOk7H7OZ01eOmM8z7g74IJCIiYpBCU0RExCCF5n8ym80UFRVhNps7u5W7io5bx+mY3RwdN+kKTM77/TbcIiJdSENDg8c/H3U4HF3yc+C7kc40RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTRER6VQVFRWYTCbq6+tvqU5YWBhr1qzxSE83otAUEREALl68SG5uLgMGDMBsNhMcHMykSZOorKzs7NY85he/+AUPP/wwFouFmJgY3n777Q5tr9AUEREAUlNT+eCDDygrK+PEiRPs3LmTcePGUVdX19mtecT+/ft55plneO655/jggw9ISUkhJSWF48ePG66h0BQREerr69m3bx8rVqxg/PjxDBw4kFGjRpGfn8+UKVMAyMrKIikpyW271tZW+vTpw4YNGwAYN24ceXl5zJ8/n549exIUFMT69etpbGwkMzMTHx8fBg8eTHl5+TU9VFZWEhsbi8Vi4dFHH70mzLZt20Z0dDRms5mwsDBKS0s79BpfeeUVJk+ezMKFC4mMjKSkpIS4uDjWrl1ruIZCU0TkHtfQ0OC2NDc3XzPHarVitVrZsWPHdZ8HyM7OZs+ePZw7d841tnv3bpqamkhPT3eNlZWVERgYyMGDB8nLyyM3N5e0tDTi4+M5evQoEydOZObMmTQ1NbnVX7hwIaWlpRw6dIjevXuTnJxMa2srAEeOHGH69OnMmDGDY8eOsXTpUgoKCrDb7YaPQ1VVFRMmTHAbmzRpElVVVYZr4BQRkS7D4XA4gdu6FBUVXXffb775prNnz55Oi8XijI+Pd+bn5zt/97vfuc2JiopyrlixwrWenJzszMjIcK0//vjjzscee8y1/sUXXzgffPBB58yZM11j586dcwLOqqoqp9PpdL733ntOwLllyxbXnLq6OmePHj2cb7zxhtPpdDqfffZZZ2JiolsvCxcudEZFRbnWBw4c6Fy9evUNj2337t2dmzdvdht79dVXnX369LnhNv+dzjRFRO5xZ86cweFwuJb8/PzrzktNTeXs2bPs3LmTyZMnU1FRQVxcnNvZXHZ2NjabDYDa2lrKy8vJyspyqxMbG+t67OXlRUBAADExMa6xoKAgAC5cuOC23ZgxY1yPe/XqRUREBNXV1QBUV1eTkJDgNj8hIYGamhra2tqMHopbptAUEbnH+fr6ui1/6/ZqFouFxMRECgoK2L9/PxkZGRQVFbmenzVrFqdOnaKqqopNmzYRHh7O2LFj3Wp0797dbd1kMrmNmUwmANrb2z3x8gwLDg6mtrbWbay2tpbg4GDDNRSaIiJyQ1FRUTQ2NrrWAwICSElJwWazYbfbyczM9Ni+Dhw44Hp8+fJlTpw4QWRkJACRkZHX/PSlsrKSoUOH4uXlZaj+mDFj2Lt3r9vYu+++63aG+3W6GZ4pIiL3rLq6OtLS0sjKyiI2NhYfHx8OHz7MypUrmTp1qtvc7OxskpKSaGtrY/bs2R7robi4mICAAIKCgli8eDGBgYGkpKQAsGDBAkaOHElJSQnp6elUVVWxdu1a1q1bZ7j+vHnzePzxxyktLeWpp55iy5YtHD58mJ///OeGayg0RUQEq9XK6NGjWb16NSdPnqS1tZXQ0FBycnJYtGiR29wJEyYQEhJCdHQ0ffv29VgPy5cvZ968edTU1DB8+HB27dqFt7c3AHFxcWzdupXCwkJKSkoICQmhuLiYjIwMw/Xj4+PZvHkzS5YsYdGiRQwZMoQdO3bwzW9+03ANk9PpdHb0hYmIyO3R0NCAn5+fR2s6HA58fX09Vu/q1av069cPm83GtGnTPFb3bqAzTRERMaS9vZ1Lly5RWlqKv7+/66IH9xOFpoiIGHL69GnCw8Pp378/drudbt3uvwi5/16xiIjclLCwMO73T/T0kxMRERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiJdiLe3d4duivx1goODXXcKkVunu5yIiHQxn3/+OS0tLR6p5e3tjcVi8UgtUWiKiIgYprdnRUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYP+P+t/akQ3Sck/AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "(None, None)" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result = greedy_fill_black2(img, N=2)\n", + "display_matrix(img),display_matrix(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [], + "source": [ + "def stack_line(shapes: List[Image]) -> Image:\n", + " n = len(shapes)\n", + " if n == 0:\n", + " return Image() # badImg equivalent\n", + " elif n == 1:\n", + " return shapes[0]\n", + "\n", + " xs = [shape.x for shape in shapes]\n", + " ys = [shape.y for shape in shapes]\n", + " xs.sort()\n", + " ys.sort()\n", + "\n", + " xmin = float('inf')\n", + " ymin = float('inf')\n", + " for i in range(1, n):\n", + " xmin = min(xmin, xs[i] - xs[i-1])\n", + " ymin = min(ymin, ys[i] - ys[i-1])\n", + "\n", + " dx, dy = (0, 1) if xmin < ymin else (1, 0)\n", + "\n", + " order = [(shape.x * dx + shape.y * dy, i) for i, shape in enumerate(shapes)]\n", + " order.sort()\n", + "\n", + " out = shapes[order[0][1]]\n", + " for i in range(1, n):\n", + " out = my_stack(out, shapes[order[i][1]], dy)\n", + "\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [], + "source": [ + "def stack_line(shapes: List[Image]) -> Image:\n", + " if not shapes:\n", + " return Image() # badImg equivalent\n", + " if len(shapes) == 1:\n", + " return shapes[0]\n", + "\n", + " xs = sorted(shape.x for shape in shapes)\n", + " ys = sorted(shape.y for shape in shapes)\n", + " xmin = min(xs[i] - xs[i-1] for i in range(1, len(xs)))\n", + " ymin = min(ys[i] - ys[i-1] for i in range(1, len(ys)))\n", + "\n", + " dx, dy = (1, 0) if xmin < ymin else (0, 1)\n", + " order = sorted(enumerate(shapes), key=lambda x: x[1].x * dx + x[1].y * dy)\n", + "\n", + " out = shapes[order[0][0]]\n", + " for _, img in order[1:]:\n", + " out = my_stack(out, img, dy)\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + " imgs = [\n", + " Image(0, 0, 2, 2, np.full((2, 2), 1)),\n", + " Image(3, 0, 2, 2, np.full((2, 2), 2)),\n", + " Image(6, 0, 2, 2, np.full((2, 2), 3))\n", + " ]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6XZPPvkkdXV1vPnmm66x1tZWXnnlFZ566qnr5j///PPEx8cTEBDA/fffz6hRo3jllVfc5phMJpqamnA6na6PgNPT04H/+d7y97//PU899RR9+vTh61//uttzn7Lb7ZhMJl566SW3+s899xwmk4nXX3/dU2+DyB1p+PDhrj8qAQICAkhOTsZut+NwOMjIyPDYax0+fNj1+OrVq5w5c4aoqCgAoqKirrv0paKigoiICLy8vLr0Or/85S9paWnh7/7u77rco0JTup3NZmP8+PH8+7//u2usrKyMhoYG5s6de938n/zkJzzyyCMUFxfz3HPP0atXL1JTU3nttddcc7Zu3YrZbGbChAls3bqVrVu38g//8A9udVJTU2lubua5554jOzv7hr1lZGSQlJTEs88+S01NDQCnTp3iRz/6EU8//TRPPPGEJ94CkW5XV1fHN7/5TbZt28bbb7/NH//4R375y1+yZs0aZs2a5TY3KysLp9NJVVUVCxYs8FgPxcXFHDhwgNOnT5Oenk5gYCDJyckALFmyhAMHDlBSUsKZM2dwOp1s3LiR73//+11+nS1btpCcnExAQECXt9V1mnJHeOqpp8jLy+Ovf/0r999/P//2b//GY489xoABA66be+bMGe6//37X+sKFC4mLi2PdunWui5T/7u/+jn/8x39k6NChN/1rcsSIETf8LvWzNm/eTHR0NE8//TT79u1jwYIFBAcHs27dulvcW5E7j9VqZezYsaxfv56zZ8/S1tZGaGgo2dnZ5Ofnu82dMmUKISEhREdH3/D/0Vu1atUqFi1aRHV1NSNHjmTv3r14e3sDEBcXx44dOygsLKSkpISQkBCKi4tdnyAZ9e677/LWW2/xq1/96pZ6VGjKHWHOnDksXryYffv2MX36dPbt28e//uu/3nDu3wbm1atXaW9vZ8KECW5Hqkb84z/+o6F5wcHBvPDCCzz55JNMmDCBkydP8uabb+Lr69ul1xO5k5nNZlauXHnDM2s/q6mpiatXr97wO8Hy8vLrxt5///3rxjo7O12PJ06c6Fr/vDPlU1JSSElJuenzN3qdz4qMjHR77a5SaModoV+/fkyZMoXt27fT3NxMe3s73/nOd244d9++ffz4xz/m5MmTbteTdfX6yrCwMMNz586dy7Zt23jttdf4+7//eyZPntyl1xLpCTo6Orhy5QqlpaX4+/u7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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(stack_line(imgs))" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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2rRp1NXV8d57791w3rJly3j++edvukERkbuFO3/lpP598PG+tX4aroDvI+7pSz5309+enTt3LsePH2fr1q3/cF5eXh719fXO5ezZsze7SxERkS51U2/Pzps3j927d/Pb3/6W/v37/8O5ZrMZs9l8U82JiIjcSToUmg6Hg9zcXLZv3055eTlhYWG3qy8REZE7TodCc+7cuWzZsoVf/epXeHt788knnwDg6+vL/ffff1saFBERuVN06DPNV199lfr6esaPH09wcLBzef31129XfyIiIneMDr89KyIi0l3p3rMiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERHpUuXl5ZhMJurq6m6pTmhoKGvXrnVLTzei0BQREQAuXrxITk4OAwYMwGw2ExQUxJQpU6ioqOjq1txu69atmEwmkpOTO7TdLf0ItYiI3DtSUlJoaWmhtLSUQYMGUVNTw969e6mtre3q1tzqT3/6E//rf/0vxo0b1+FtdaYpIiLU1dWxb98+Vq5cyYQJExg4cCCjRo0iLy+PadOmAZCZmUliYqLLdq2trfTp04eNGzcCMH78eHJzc1mwYAE9e/YkMDCQDRs20NjYSEZGBt7e3gwePJiysrJreqioqCAmJgaLxcKYMWM4fvy4y/Pbtm0jKioKs9lMaGgoJSUlHT7OtrY2vvnNb/L8888zaNCgDm+v0BQRucc1NDS4LM3NzdfMsVqtWK1WduzYcd3nAbKystizZw/nz593ju3evZumpibS0tKcY6WlpQQEBHDw4EFyc3PJyckhNTWVuLg4jhw5wuTJk5k1axZNTU0u9RctWkRJSQmHDh2id+/eJCUl0draCkBVVRUzZsxg5syZHDt2jGXLlpGfn4/dbu/Qa1FUVESfPn349re/3aHtnBydrL6+3gFo0aJFyz231NfXu+1vZP37OBwf39pS//71+ywsLLzuvt98801Hz549HRaLxREXF+fIy8tz/P73v3eZM3ToUMfKlSud60lJSY709HTn+uOPP+547LHHnOufffaZ48EHH3TMmjXLOXb+/HkH4KisrHQ4HA7Hb37zGwfg2Lp1q3NObW2t4/7773e8/vrrDofD4Xj22WcdCQkJLr0sWrTIMXToUOf6wIEDHWvWrLnha7tv3z5Hv379HBcvXnQ4HA7HnDlzHNOnT7/h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AqC9vd0dh9ch9913H4MHD2b48OEsXLiQb3zjG9c9877h9h3ZWVJSEk8++SRDhgwhPDycH/7wh1itVg4cONDhxkVE5M43dOhQGhsbnev+/v4kJydjs9mw2+1kZGS4bV9fzpLLly9z8uRJIiMjAYiMjLzm0peKigrCw8Px8PC46X22t7ff8DPc67npS07a2tr4xS9+QWNjo8sp9d9rbm52aaihoeFmdykiIrdJbW0tqampZGZmEhMTg7e3N4cPH2bVqlVMnz7dZW5WVhaJiYm0tbUxZ84ct/VQVFSEv78/gYGBLFmyhICAAJKTkwFYuHAhI0eOpLi4mLS0NCorK1m3bh3r1683XH/58uU8+uijPPTQQzQ3N/PWW2+xadMmXn31VcM1Ohyax44dY+zYsXz66adYrVa2b9/O0KFD/2GTzz//fEd3IyIinchqtTJ69GjWrFnDqVOnaG1tJSQkhOzsbBYvXuwyd9KkSQQHBxMVFUXfvn3d1sOKFSuYP38+1dXVDB8+nF27duHl5QVAbGwsb7zxBgUFBRQXFxMcHExRURHp6emG6zc2NvKv//qv/OUvf+H+++/n4YcfZvPmzS7f/P1nTA6Hw9GRg2ppaeHMmTPU19fz5ptv8m//9m+8++67NwzO651phoSEEFX+GB5W3VuhO/jg0fKubqHLOD7u6g6kMzRcAd9HPv9mpo+Pz63VamjA19fXLX8j265+xofj33NLX1929epV+vXrh81m4+mnn3Zb3btBh/+JeHl5MXjwYABGjBjBoUOHePnll/npT3963flms/kffugsIiJ3h/b2di5dukRJSQl+fn7Omx50J7d8qtfRD1FFROTudObMGcLCwujfvz92ux1Pz+73bmGHjjgvL48nnniCAQMGcOXKFbZs2UJ5eTlvv/327epPRETuEKGhoXTwE717TodC88KFC8yePZvz58/j6+tLTEwMb7/9dofupiAiInK36lBofnFDXhERke5I954VERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNT9bhwoInIX2J//N3w8b/7HlQEaPmvD1039yOd0pikiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(img1)" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": {}, + "outputs": [], + "source": [ + "def smear(img: Image, id: int) -> Image:\n", + " assert 0 <= id < 15\n", + " directions = [\n", + " [(1,0)], [(-1,0)], [(0,1)], [(0,-1)],\n", + " [(1,0), (-1,0)], [(0,1), (0,-1)],\n", + " [(1,0), (-1,0), (0,1), (0,-1)],\n", + " [(1,1)], [(-1,-1)], [(1,-1)], [(-1,1)],\n", + " [(1,1), (-1,-1)], [(1,-1), (-1,1)],\n", + " [(1,1), (-1,-1), (1,-1), (-1,1)],\n", + " [(1,0), (-1,0), (0,1), (0,-1), (1,1), (-1,-1), (1,-1), (-1,1)]\n", + " ]\n", + "\n", + " ret = img.copy()\n", + " w = img.w\n", + "\n", + " for dx, dy in directions[id]:\n", + " di = dy * w + dx\n", + "\n", + " for i in range(ret.h):\n", + " step = 1 if i == 0 or i == ret.h - 1 else max(ret.w - 1, 1)\n", + " for j in range(0, ret.w, step):\n", + " if i - dy < 0 or j - dx < 0 or i - dy >= img.h or j - dx >= img.w:\n", + " steps = MAXSIDE\n", + " if dx == -1:\n", + " steps = min(steps, j + 1)\n", + " if dx == 1:\n", + " steps = min(steps, img.w - j)\n", + " if dy == -1:\n", + " steps = min(steps, i + 1)\n", + " if dy == 1:\n", + " steps = min(steps, img.h - i)\n", + "\n", + " ind = i * w + j\n", + " end_ind = ind + steps * di\n", + " c = 0\n", + " while ind != end_ind:\n", + " if img.mask[ind // w, ind % w]:\n", + " c = img.mask[ind // w, ind % w]\n", + " if c:\n", + " ret.mask[ind // w, ind % w] = c\n", + " ind += di\n", + "\n", + " return ret" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2, 2, 2, 2],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 4, 4, 4, 4]], dtype=int8)" + ] + }, + "execution_count": 159, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "smear(img_smear,6).mask" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2, 2, 2, 2],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 4, 4, 4, 4]], dtype=int8)" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_smear = Image(0, 0, 5, 5, np.array([\n", + " [1, 0, 0, 0, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 0, 0, 0, 4]\n", + " ]))\n", + "\n", + "smear(img_smear,6).mask" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [], + "source": [ + "img = Image(0, 0, 5, 5, np.array([\n", + " [1, 0, 0, 0, 2],\n", + " [0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0],\n", + " [0, 0, 0, 0, 0],\n", + " [3, 0, 0, 0, 4]\n", + " ]))\n", + "result = smear(img, 6) # All directions\n", + "expected = np.array([[1, 2, 2, 2, 2],\n", + "[3, 0, 0, 0, 4],\n", + "[3, 0, 0, 0, 4],\n", + "[3, 0, 0, 0, 4],\n", + "[3, 4, 4, 4, 4]])" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2, 2, 2, 2],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 4, 4, 4, 4]], dtype=int8)" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "result.mask" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.array_equal(result.mask, expected)" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": {}, + "outputs": [], + "source": [ + "def gravity(in_img: Image, d: int) -> List[Image]:\n", + " pieces = split_all(in_img)\n", + " room = hull0(in_img)\n", + " dx, dy = [(1, 0), (-1, 0), (0, 1), (0, -1)][d]\n", + "\n", + " ret = []\n", + " out = room.copy()\n", + " pieces.sort(key=lambda a: a.x * dx + a.y * dy, reverse=True)\n", + "\n", + " for p in pieces:\n", + " while True:\n", + " p.x += dx\n", + " p.y += dy\n", + " \n", + " if not is_valid_position(p, out):\n", + " p.x -= dx\n", + " p.y -= dy\n", + " break\n", + " \n", + " ret.append(p)\n", + " out = compose_id(out, p, 3)\n", + "\n", + " return ret\n", + "\n", + "def is_valid_position(piece: Image, out: Image) -> bool:\n", + " for i in range(piece.h):\n", + " for j in range(piece.w):\n", + " if piece.mask[i, j] != 0:\n", + " x, y = j + piece.x - out.x, i + piece.y - out.y\n", + " if x < 0 or y < 0 or x >= out.w or y >= out.h or out.mask[y, x] != 0:\n", + " return False\n", + " return True" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [], + "source": [ + "in_img = [[0, 0, 6, 0, 0],\n", + " [0, 1, 0, 2, 0],\n", + " [0, 1, 0, 2, 0],\n", + " [3, 0, 0, 0, 4],\n", + " [3, 0, 0, 0, 4]]\n", + "in_img = Image(0, 0, 5, 5,in_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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dXU1ZWVlZGRkONWJiYlxPPbw8MDPz4/o6GjHWEBAAACXL192Wm/s2LGOx7179yYiIoLTp08DcPr0aeLj453mx8fHU1VVRWtr6z99D65fv87s2bPZuHEj/v7+/3T+reiHQCIiDzhvb2+8vb0NzbVYLCQkJJCQkEB+fj6ZmZkUFhaSlpYGwJw5c/jOd75DZWUlBw4cIDQ0tMMPanr06OH03GQyOY2ZTCYA2tra7mCvOufs2bP88Y9/ZNq0aY6xz7fv6enJRx99xGOPPfZP6yg0RUTkloYOHcrOnTsdz/38/EhKSsJms1FZWUl6errLtnXw4EEGDhwIwLVr1zhz5gyRkZEAREZGdjj1paKigvDwcDw8PP5p7ccff5yTJ086jS1dupTr16/z+uuvExwcbKhHhaaIiFBTU0NKSgoZGRnExMTg5eXFkSNHWLVqFTNmzHCam5mZSWJiIq2trcydO9dlPRQVFeHn50dAQABLlizB39/fcR7lokWLGDlyJMXFxaSmplJZWcn69evZsGGDodoWi4UnnnjCaczX1xegw/g/otAUERGsViujR49m7dq1nD17lpaWFoKDg8nKyiIvL89p7qRJkwgKCiIqKop+/fq5rIcVK1awYMECqqqqGD58OLt376Znz54AxMbG8vbbb1NQUEBxcTFBQUEUFRU5PjbuKqb29vb2rtxgfX09Pj4+XbnJe8e/fuTuDtzjtQh3d+A27RNGubsFtzD96pC7W3CLuro6w98d3srnfyPrfgfeXnfWT/118HnSNX190Y0bN+jfvz82m40XXnjBZXXvBzrSFBERQ9ra2rh69SolJSX4+vo6LnrQnSg0RUTEkPPnzxMaGsqAAQOw2+14ena/COl+eywiIrclJCSELv5G756jixuIiIgY5LYjzajyL+Fh7V4Huiee6r4/iOmuuusPYto/dncHXevzH9zIg09HmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhB3etESRGR+0Rc3ZfwaL2zP9GtN/4GfOCahgTQkaaIiIhhCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERtyovL8dkMlFbW3tHdUJCQli3bp1LeroVhaaIiABw5coV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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(in_img)" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": {}, + "outputs": [ + { + "ename": "IndexError", + "evalue": "list index out of range", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[205], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m display_matrix(\u001b[43mgravity\u001b[49m\u001b[43m(\u001b[49m\u001b[43min_img\u001b[49m\u001b[43m,\u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m]\u001b[49m)\n", + "\u001b[0;31mIndexError\u001b[0m: list index out of range" + ] + } + ], + "source": [ + "display_matrix(gravity(in_img,2)[5])" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAGdCAYAAABwyyjqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABKa0lEQVR4nO3dfVhU97nu8e8EZCbJ8KKggIqCUQhS0GB8g9hoFTUJKA1FTFoVKJxdtnK08XhaVMBAG18S1LTGtHWbGS6t26SxWrXB7Bx3SQ1iVYyNpp5ItK22GlSOgEIDBOb8kZ3ZmartQkdQuT/Xta7O+s1vPetZk4Y7a2bWGpPD4XAgIiIi/9R9Xd2AiIjI3UKhKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSnyJcuWLcNkMnV1GyJyh1JoSpex2+2YTCZMJhPvvffeNc87HA5CQkIwmUwkJiZ2uP4LL7zAjh073NCpiMjnFJrS5SwWC1u2bLlm/N133+Uvf/kLZrP5pureTGguXbqUv/3tbze1PxG59yk0pcs9+eST/OIXv+Czzz5zGd+yZQsjRowgKCjotvfQ2NgIgKenJxaL5bbvT0TuTgpN6XLPPPMMtbW1vPPOO86xlpYW3nzzTZ599tlr5r/00kvExcXh7+/P/fffz4gRI3jzzTdd5phMJhobGyktLXW+BZyeng789+eWf/jDH3j22Wfp2bMnjz32mMtzX7DZbJhMJl577TWX+i+88AImk4m33nrLXS+DiNwFFJrS5UJDQxk7diz//u//7hwrKyujvr6emTNnXjP/5Zdf5pFHHqGoqIgXXngBT09PUlNT+fWvf+2cs2nTJsxmM+PGjWPTpk1s2rSJf/mXf3Gpk5qaSlNTEy+88ALZ2dnX7S0jI4PExESee+45zp49C8CxY8d4/vnn+fa3v82TTz7pjpdARO4Snl3dgAjAs88+S15eHn/729+4//77+fnPf87jjz9O3759r5l78uRJ7r//fuf6vHnziI2NZfXq1Tz11FMAfOtb3+I73/kOgwYN4lvf+tZ19zls2LDrfpb69zZs2EBUVBTf/va32b17N3PmzCEoKIjVq1ff5NGKyN1KoSl3hBkzZrBgwQJ2797N1KlT2b17Nz/60Y+uO/fLgXn58mXa2toYN26cy5mqEd/5zncMzQsKCuKVV17hmWeeYdy4cRw9epR33nkHHx+fDu1PxKhPP/2UlpYWt9Ty8vLS5/RupNCUO0Lv3r2ZNGkSW7Zsoampiba2Nr7xjW9cd+7u3bv5wQ9+wNGjR2lubnaOd/T6yrCwMMNzZ86cyebNm/n1r3/N//gf/4OJEyd2aF8iRn366af0ecDKFUebW+oFBQXxxz/+UcHpJgpNuWM8++yzZGdn88knn/DEE0/g5+d3zZx9+/Yxbdo0vvrVr7J+/XqCg4Pp0aMHNpvN0FutX/blM9Z/pra2lsOHDwPwhz/8gfb2du67T18JEPdraWnhiqON7z8Qitl0a/8fa3a0s+KTP9HS0qLQdBP9Wy93jK9//evcd999HDhw4LrfmgXYtm0bFouFt99+m8zMTJ544gkmTZp03bnuvLPP3LlzuXLlCsuXL+e9995j7dq1bqstcj1m031YTB63tNxq6Mq1dKYpdwyr1cqrr77Kn/70J5KSkq47x8PDA5PJRFvbf7919ac//em6NzF48MEHqauru+W+3nzzTV5//XV+9KMfkZuby+9//3uWLl1KYmIi4eHht1xfRO4e+s8QuaPMmTOHwsLCG751+tRTT9HU1MTUqVP5yU9+QlFREaNHj2bw4MHXzB0xYgT/5//8H1avXs3WrVv53e9+1+F+Lly4QE5ODhMmTGDevHkArFu3Dh8fH9LT02lvb+9wTRG5eyk05a7yta99jY0bN/LJJ5+wYMEC/v3f/52VK1fy9a9//Zq5q1evZsSIESxdupRnnnmGV199tcP7y8nJobm52XmTAwB/f39+9rOfUVlZyUsvvXTLxyQidw+Tw+FwdHUTIiLyuYaGBnx9fSl8cBAWk8ct1frU0cbzjaepr6/XJVJuojNNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIdKny8nJMJtMt3/YyNDT0tt8XutuE5iuvvEJoaCgWi4XRo0dz8ODBrm7ptvvtb39LUlISffv2xWQyXff+rPea5cuXM3LkSLy9venTpw/Jycl89NFHXd3Wbffqq68SExODj48PPj4+jB07lrKysq5uq9OtWLECk8nEggULurqVu9LFixfJyclhwIABmM1mgoKCmDJlChUVFV3dmlu0trZSVFTEQw89hMViYdiwYezZs6dDNbpFaL7++us899xzFBYWcuTIEYYNG8aUKVO4cOFCV7d2WzU2NjJs2DBeeeWVrm6l07z77rvMnTuXAwcO8M4779Da2srkyZNpbGzs6tZuq/79+7NixQqqqqo4fPgwX/va15g+fToffvhhV7fWaQ4dOsRPf/pTYmJiurqVu1ZKSgrvv/8+paWlnDx5kp07dzJ+/Hhqa2u7ujW3WLp0KT/96U/58Y9/zB/+8Ae+853v8PWvf53333/fcI1uEZqrV68mOzubjIwMhg4dyk9+8hMeeOABXnvtta5u7bZ64okn+MEPfnDd+7Leq/bs2UN6ejpRUVEMGzYMu93OmTNnqKqq6urWbqukpCSefPJJhgwZQnh4OD/84Q+xWq0cOHCgq1vrFFevXuWb3/wmGzZsoGfPnl3dzl2prq6Offv2sXLlSiZMmMDAgQMZNWoUeXl5TJs2DYDMzEwSExNdtmttbaVPnz5s3LgRgPHjx5Obm8uCBQvo2bMngYGBbNiwgcbGRjIyMvD29mbw4MHXfSekoqKCmJgYLBYLY8aM4fjx4y7Pb9u2jaioKMxmM6GhoZSUlHToGDdt2sTixYt58sknGTRoEDk5OTz55JMdqnPPh2ZLSwtVVVUuv7l43333MWnSJCorK7uwM+kM9fX1APTq1auLO+k8bW1tbN26lcbGRsaOHdvV7XSKuXPn8tRTT93wt1W7u4aGBpelubn5mjlWqxWr1cqOHTuu+zxAVlYWe/bs4fz5886x3bt309TURFpamnOstLSUgIAADh48SG5uLjk5OaSmphIXF8eRI0eYPHkys2bNoqmpyaX+okWLKCkp4dChQ/Tu3ZukpCRaW1sBqKqqYsaMGcycOZNjx46xbNky8vPzsdvthl+H5ubma36M+/777+e9994zXOOeD81Lly7R1tZGYGCgy3hgYCCffPJJF3UlnaG9vZ0FCxYQHx/PV77yla5u57Y7duwYVqsVs9nMd77zHbZv387QoUO7uq3bbuvWrRw5coTly5d3dSt3rJCQEHx9fZ3L9V4rT09P7HY7paWl+Pn5ER8fz+LFi/nggw+cc+Li4oiIiGDTpk3OMZvNRmpqKlar1Tk2bNgwli5dypAhQ8jLy8NisRAQEEB2djZDhgyhoKCA2tpal9oAhYWFJCQkEB0dTWlpKTU1NWzfvh34/B3DiRMnkp+fT3h4OOnp6cybN48XX3zR8OswZcoUVq9eTXV1Ne3t7bzzzjv88pe/dPmPgH/mng9N6b7mzp3L8ePH2bp1a1e30ikiIiI4evQov/vd78jJyWHOnDn84Q9/6Oq2bquzZ88yf/58fv7zn19zBiH/7ezZs9TX1zuXvLy8685LSUnh3Llz7Ny5k6lTp1JeXk5sbKzL2VxWVhY2mw2AmpoaysrKyMzMdKnz5c+VPTw88Pf3Jzo62jn2xUnM33+v5MvvjPTq1YuIiAhOnDgBwIkTJ4iPj3eZHx8fT3V1tcuP0v8jL7/8MkOGDOHhhx/Gy8uLefPmkZGRwX33GY/Cez40AwIC8PDwoKamxmW8pqaGoKCgLupKbrd58+axe/dufvOb39C/f/+ubqdTeHl5MXjwYEaMGMHy5csZNmwYL7/8cle3dVtVVVVx4cIFYmNj8fT0xNPTk3fffZcf/ehHeHp6Gv5jeq/74lvVXyxms/mGcy0WCwkJCeTn57N//37S09MpLCx0Pj979mxOnz5NZWUlmzdvJiwsjHHjxrnU6NGjh8u6yWRyGfvit2k7+0fce/fuzY4dO2hsbOTPf/4z//f//l+sViuDBg0yXOOeD00vLy9GjBjB3r17nWPt7e3s3bu323ze0504HA7mzZvH9u3b+c///E/CwsK6uqUu097efsPPpu4VEydO5NixYxw9etS5PProo3zzm9/k6NGjeHjc2u9RCgwdOtTl2+f+/v4kJydjs9mw2+1kZGS4bV9f/uLa5cuXOXnyJJGRkQBERkZec+lLRUUF4eHhHf7nbLFY6NevH5999hnbtm1j+vTphrf17NCe7lLPPfccc+bM4dFHH2XUqFGsXbvW+U2ue9nVq1f5+OOPnet//OMfOXr0KL169WLAgAFd2NntM3fuXLZs2cKvfvUrvL29nZ9b+/r6cv/993dxd7dPXl4eTzzxBAMGDODKlSts2bKF8vJy3n777a5u7bby9va+5vPqBx98EH9//27xObY71dbWkpqaSmZmJjExMXh7e3P48GFWrVp1TahkZWWRmJhIW1sbc+bMcVsPRUVF+Pv7ExgYyJIlSwgICCA5ORmAhQsXMnLkSIqLi0lLS6OyspJ169axfv16w/V/97vf8de//pXhw4fz17/+lWXLltHe3s7//t//23CNbhGaaWlpXLx4kYKCAj755BOGDx/Onj17rvly0L3m8OHDTJgwwbn+3HPPATBnzpwOfePsbvLqq68Cn3/t/ctsNhvp6emd31AnuXDhArNnz+b8+fP4+voSExPD22+/TUJCQle3JncJq9XK6NGjWbNmDadOnaK1tZWQkBCys7NZvHixy9xJkyYRHBxMVFQUffv2dVsPK1asYP78+VRXVzN8+HB27dqFl5cXALGxsbzxxhsUFBRQXFxMcHAwRUVFHfr3+tNPP2Xp0qWcPn0aq9XKk08+yaZNm/Dz8zNcw+RwOBwdPC4REblNGhoa8PX1pfDBQVhMt/b28qeONp5vPE19fT0+Pj5u6vDzd7H69euHzWbj6aefdlvdu0G3ONMUEZFb197ezqVLlygpKcHPz89504PuRKEpIiKGnDlzhrCwMPr374/dbsfTs/tFSPc7YhERuSmhoaF090/07vlLTkRERNxFoSkiImKQQlNERMQghaaIiIhB3So0m5ubWbZs2T1/a7G/p+PWcXcH3fW4pXN1q5sbfHHRsLsv9L3T6bh13N3BvXLcd8PNDbqzbnWmKSIicisUmiIiIgZ1+s0N2tvbOXfuHN7e3s7fVOssDQ0NLv/bXei4ddzdQVcet8Ph4MqVK/Tt27dDP2gsd59OD81z584REhLS2bt10dX77yo67u5Fx935zp49221+9Ly76vTQ9Pb2/vzBv7wLXtbO3r10hR+P6OoOukz9uO577N1Jw2dthFQe/e+/b27QvO998L61L+80X2mAWF83dSTQBaHpfEvWywpmhabc23w8b+3bj3J36eyPnKTz6c13ERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRkS5VXl6OyWSirq7uluqEhoaydu1at/R0IwpNEREB4OLFi+Tk5DBgwADMZjNBQUFMmTKFioqKrm7NbdauXUtERAT3338/ISEhfPe73+XTTz81vH2n/zSYiIjcmVJSUmhpaaG0tJRBgwZRU1PD3r17qa2t7erW3GLLli18//vf57XXXiMuLo6TJ0+Snp6OyWRi9erVhmroTFNERKirq2Pfvn2sXLmSCRMmMHDgQEaNGkVeXh7Tpk0DIDMzk8TERJftWltb6dOnDxs3bgRg/Pjx5ObmsmDBAnr27ElgYCAbNmygsbGRjIwMvL29GTx4MGVlZdf0UFFRQUxMDBaLhTFjxnD8+HGX57dt20ZUVBRms5nQ0FBKSko6dIz79+8nPj6eZ599ltDQUCZPnswzzzzDwYMHDddQaIqI3OMaGhpclubm5mvmWK1WrFYrO3bsuO7zAFlZWezZs4fz5887x3bv3k1TUxNpaWnOsdLSUgICAjh48CC5ubnk5OSQmppKXFwcR44cYfLkycyaNYumpiaX+osWLaKkpIRDhw7Ru3dvkpKSaG1tBaCqqooZM2Ywc+ZMjh07xrJly8jPz8dutxt+HeLi4qiqqnKG5OnTp3nrrbd48sknDddQaIqI3ONCQkLw9fV1LsuXL79mjqenJ3a7ndLSUvz8/IiPj2fx4sV88MEHzjlxcXFERESwadMm55jNZiM1NRWr1eocGzZsGEuXLmXIkCHk5eVhsVgICAggOzubIUOGUFBQQG1trUttgMLCQhISEoiOjqa0tJSamhq2b98OwOrVq5k4cSL5+fmEh4eTnp7OvHnzePHFFw2/Ds8++yxFRUU89thj9OjRg4ceeojx48ezePFiwzUUmiIi97izZ89SX1/vXPLy8q47LyUlhXPnzrFz506mTp1KeXk5sbGxLmdzWVlZ2Gw2AGpqaigrKyMzM9OlTkxMjPOxh4cH/v7+REdHO8cCAwMBuHDhgst2Y8eOdT7u1asXERERnDhxAoATJ04QHx/vMj8+Pp7q6mra2toMvQ7l5eW88MILrF+/niNHjvDLX/6SX//61xQXFxvaHhSaIiL3PB8fH5fFbDbfcK7FYiEhIYH8/Hz2799Peno6hYWFzudnz57N6dOnqaysZPPmzYSFhTFu3DiXGj169HBZN5lMLmMmkwmA9vZ2dxyeYfn5+cyaNYusrCyio6P5+te/zgsvvMDy5csN96LQFBGRGxo6dCiNjY3OdX9/f5KTk7HZbNjtdjIyMty2rwMHDjgfX758mZMnTxIZGQlAZGTkNZe+VFRUEB4ejoeHh6H6TU1N3Hefa+x9sa3D4TBUQ5eciIgItbW1pKamkpmZSUxMDN7e3hw+fJhVq1Yxffp0l7lZWVkkJibS1tbGnDlz3NZDUVER/v7+BAYGsmTJEgICAkhOTgZg4cKFjBw5kuLiYtLS0qisrGTdunWsX7/ecP2kpCRWr17NI488wujRo/n444/Jz88nKSnJcPAqNEVEBKvVyujRo1mzZg2nTp2itbWVkJAQsrOzr/mizKRJkwgODiYqKoq+ffu6rYcVK1Ywf/58qqurGT58OLt27cLLywuA2NhY3njjDQoKCiguLiY4OJiioiLS09MN11+6dCkmk4mlS5fy17/+1fkN3R/+8IeGa5gcRs9J3aShoQFfX1/IrQKz9Z9vIHe/lyK6uoMu45gwqqtbkE7Q8FkbvvuqqK+vx8fH59Zq/dffyO8fqcfsfWu1mq80sCLW1y19fdnVq1fp168fNpuNp59+2m117wY39ZnmK6+8QmhoKBaLhdGjR3fowlAREbk7tbe3c+HCBYqLi/Hz83Pe9KA76XBovv766zz33HMUFhZy5MgRhg0bxpQpU6756rCIiNxbzpw5Q2BgIFu2bOG1117D07P7fcLX4dBcvXo12dnZZGRkMHToUH7yk5/wwAMP8Nprr92O/kRE5A4RGhqKw+Hg7NmzTJw4savb6RIdCs2WlhaqqqqYNGnSfxe47z4mTZpEZWXldbdpbm6+5hZOIiIid6MOhealS5doa2tz3s3hC4GBgXzyySfX3Wb58uUut28KCQm5+W5FRES60G2/uUFeXp7L7ZvOnj17u3cpIiJyW3ToU9yAgAA8PDyoqalxGa+pqSEoKOi625jN5n94yyYREZG7RYfONL28vBgxYgR79+51jrW3t7N3716XG+2KiIjcizr8feHnnnuOOXPm8OijjzJq1CjWrl3r/HFRERGRe1mHQzMtLY2LFy9SUFDAJ598wvDhw9mzZ881Xw4SERG519zUlanz5s1j3rx57u5FRETkjqafBhMRETGo+90DSUTkLpC3/WF8LLd2XtPwaTsr3NSPfE5nmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRES6VHl5OSaTibq6uluqExoaytq1a93S040oNEVEBICLFy+Sk5PDgAEDMJvNBAUFMWXKFCoqKrq6NbcYP348JpPpmuWpp54yXEO/pykiIgCkpKTQ0tJCaWkpgwYNoqamhr1791JbW9vVrbnFL3/5S1paWpzrtbW1DBs2jNTUVMM1dKYpIiLU1dWxb98+Vq5cyYQJExg4cCCjRo0iLy+PadOmAZCZmUliYqLLdq2trfTp04eNGzcCn5/N5ebmsmDBAnr27ElgYCAbNmygsbGRjIwMvL29GTx4MGVlZdf0UFFRQUxMDBaLhTFjxnD8+HGX57dt20ZUVBRms5nQ0FBKSko6dIy9evUiKCjIubzzzjs88MADCk0REflvDQ0NLktzc/M1c6xWK1arlR07dlz3eYCsrCz27NnD+fPnnWO7d++mqamJtLQ051hpaSkBAQEcPHiQ3NxccnJySE1NJS4ujiNHjjB58mRmzZpFU1OTS/1FixZRUlLCoUOH6N27N0lJSbS2tgJQVVXFjBkzmDlzJseOHWPZsmXk5+djt9tv+nXZuHEjM2fO5MEHHzS8jUJTROQeFxISgq+vr3NZvnz5NXM8PT2x2+2Ulpbi5+dHfHw8ixcv5oMPPnDOiYuLIyIigk2bNjnHbDYbqampWK1W59iwYcNYunQpQ4YMIS8vD4vFQkBAANnZ2QwZMoSCggJqa2tdagMUFhaSkJBAdHQ0paWl1NTUsH37dgBWr17NxIkTyc/PJzw8nPT0dObNm8eLL754U6/JwYMHOX78OFlZWR3aTqEpInKPO3v2LPX19c4lLy/vuvNSUlI4d+4cO3fuZOrUqZSXlxMbG+tyNpeVlYXNZgOgpqaGsrIyMjMzXerExMQ4H3t4eODv7090dLRzLDAwEIALFy64bDd27Fjn4169ehEREcGJEycAOHHiBPHx8S7z4+Pjqa6upq2tzehL4bRx40aio6MZNWpUh7ZTaIqI3ON8fHxcFrPZfMO5FouFhIQE8vPz2b9/P+np6RQWFjqfnz17NqdPn6ayspLNmzcTFhbGuHHjXGr06NHDZd1kMrmMmUwmANrb291xeB3W2NjI1q1b+fa3v93hbRWaIiJyQ0OHDqWxsdG57u/vT3JyMjabDbvdTkZGhtv2deDAAefjy5cvc/LkSSIjIwGIjIy85tKXiooKwsPD8fDw6NB+fvGLX9Dc3My3vvWtDveoS05ERITa2lpSU1PJzMwkJiYGb29vDh8+zKpVq5g+fbrL3KysLBITE2lra2POnDlu66GoqAh/f38CAwNZsmQJAQEBJCcnA7Bw4UJGjhxJcXExaWlpVFZWsm7dOtavX9/h/WzcuJHk5GT8/f07vK1CU0REsFqtjB49mjVr1nDq1ClaW1sJCQkhOzubxYsXu8ydNGkSwcHBREVF0bdvX7f1sGLFCubPn091dTXDhw9n165deHl5ARAbG8sbb7xBQUEBxcXFBAcHU1RURHp6eof28dFHH/Hee+/xH//xHzfVo8nhcDhuasub1NDQgK+vL+RWgdn6zzeQu99LEV3dQZdxTOjYlwzk7tTwWRu++6qor6/Hx8fn1mr919/I+vxgfCy39glaw6ft+Bafd0tfX3b16lX69euHzWbj6aefdlvdu4HONEVExJD29nYuXbpESUkJfn5+zpsedCcKTRERMeTMmTOEhYXRv39/7HY7np7dL0K63xGLiMhNCQ0NpZM/0bvj6JITERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYN0RyARkTtQ/bqf4TA9eEs1GhyNQJJ7GhJAZ5oiIiKGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNTh0Pztb39LUlISffv2xWQysWPHjtvQloiIyJ2nw6HZ2NjIsGHDeOWVV25HPyIiInesDv/KyRNPPMETTzxxO3oRERG5o932zzSbm5tpaGhwWURERL5QXl6OyWSirq7uluqEhoaydu1at/R0I7c9NJcvX46vr69zCQkJud27FBGRm3Dx4kVycnIYMGAAZrOZoKAgpkyZQkVFRVe35jZ1dXXMnTuX4OBgzGYz4eHhvPXWW4a3v+0/Qp2Xl8dzzz3nXG9oaFBwiojcgVJSUmhpaaG0tJRBgwZRU1PD3r17qa2t7erW3KKlpYWEhAT69OnDm2++Sb9+/fjzn/+Mn5+f4Rq3/UzTbDbj4+PjsoiIyJ2lrq6Offv2sXLlSiZMmMDAgQMZNWoUeXl5TJs2DYDMzEwSExNdtmttbaVPnz5s3LgRgPHjx5Obm8uCBQvo2bMngYGBbNiwgcbGRjIyMvD29mbw4MGUlZVd00NFRQUxMTFYLBbGjBnD8ePHXZ7ftm0bUVFRmM1mQkNDKSkp6dAxvvbaa/y///f/2LFjB/Hx8YSGhvL4448zbNgwwzV0naaIyD3u779X0tzcfM0cq9WK1Wplx44d130eICsriz179nD+/Hnn2O7du2lqaiItLc05VlpaSkBAAAcPHiQ3N5ecnBxSU1OJi4vjyJEjTJ48mVmzZtHU1ORSf9GiRZSUlHDo0CF69+5NUlISra2tAFRVVTFjxgxmzpzJsWPHWLZsGfn5+djtdsOvw86dOxk7dixz584lMDCQr3zlK7zwwgu0tbUZrtHh0Lx69SpHjx7l6NGjAPzxj3/k6NGjnDlzpqOlRESkE4SEhLh8t2T58uXXzPH09MRut1NaWoqfnx/x8fEsXryYDz74wDknLi6OiIgINm3a5Byz2WykpqZitVqdY8OGDWPp0qUMGTKEvLw8LBYLAQEBZGdnM2TIEAoKCqitrXWpDVBYWEhCQgLR0dGUlpZSU1PD9u3bAVi9ejUTJ04kPz+f8PBw0tPTmTdvHi+++KLh1+H06dO8+eabtLW18dZbb5Gfn09JSQk/+MEPDNfocGgePnyYRx55hEceeQSA5557jkceeYSCgoKOlhIRkU5w9uxZ6uvrnUteXt5156WkpHDu3Dl27tzJ1KlTKS8vJzY21uVsLisrC5vNBkBNTQ1lZWVkZma61ImJiXE+9vDwwN/fn+joaOdYYGAgABcuXHDZbuzYsc7HvXr1IiIighMnTgBw4sQJ4uPjXebHx8dTXV1t+Eyxvb2dPn368LOf/YwRI0aQlpbGkiVL+MlPfmJoe7iJ0Bw/fjwOh+OapSOnyCIi0nn+/nslZrP5hnMtFgsJCQnk5+ezf/9+0tPTKSwsdD4/e/ZsTp8+TWVlJZs3byYsLIxx48a51OjRo4fLuslkchkzmUzA5yHWmYKDgwkPD8fDw8M5FhkZySeffEJLS4uhGvpMU0REbmjo0KE0NjY61/39/UlOTsZms2G328nIyHDbvg4cOOB8fPnyZU6ePElkZCTwebj9/aUvFRUV14TgPxIfH8/HH3/sEtYnT54kODgYLy8vQzVu+yUnIiJy56utrSU1NZXMzExiYmLw9vbm8OHDrFq1iunTp7vMzcrKIjExkba2NubMmeO2HoqKivD39ycwMJAlS5YQEBBAcnIyAAsXLmTkyJEUFxeTlpZGZWUl69atY/369Ybr5+TksG7dOubPn09ubi7V1dW88MIL/M//+T8N11BoiogIVquV0aNHs2bNGk6dOkVrayshISFkZ2ezePFil7mTJk0iODiYqKgo+vbt67YeVqxYwfz586murmb48OHs2rXLeQYYGxvLG2+8QUFBAcXFxQQHB1NUVER6errh+iEhIbz99tt897vfJSYmhn79+jF//ny+973vGa5hcjgcjo4e2K1oaGjA19cXcqvAbP3nG8jd76WIru6gyzgmjOrqFqQTNHzWhu++Kurr62/5WvQv/kae6bkLH9ODt1bL0ciAy0lu6evLrl69Sr9+/bDZbDz99NNuq3s30JmmiIgY0t7ezqVLlygpKcHPz89504PuRKEpIiKGnDlzhrCwMPr374/dbsfTs/tFSPc7YhERuSmhoaF08id6dxxdciIiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikO4IJCJyB/rPNbU88MDfbqlGU1MTpLunH/mczjRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQV13ycmPR3TZrkU6i+k3B7u6BRFxI51pioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIi0qXKy8sxmUzU1dXdUp3Q0FDWrl3rlp5uRKEpIiIAXLx4kZycHAYMGIDZbCYoKIgpU6ZQUVHR1a25hd1ux2QyuSwWi6VDNfR7miIiAkBKSgotLS2UlpYyaNAgampq2Lt3L7W1tV3dmtv4+Pjw0UcfOddNJlOHtteZpoiIUFdXx759+1i5ciUTJkxg4MCBjBo1iry8PKZNmwZAZmYmiYmJLtu1trbSp08fNm7cCMD48ePJzc1lwYIF9OzZk8DAQDZs2EBjYyMZGRl4e3szePBgysrKrumhoqKCmJgYLBYLY8aM4fjx4y7Pb9u2jaioKMxmM6GhoZSUlHT4OE0mE0FBQc4lMDCwQ9srNEVE7nENDQ0uS3Nz8zVzrFYrVquVHTt2XPd5gKysLPbs2cP58+edY7t376apqYm0tDTnWGlpKQEBARw8eJDc3FxycnJITU0lLi6OI0eOMHnyZGbNmkVTU5NL/UWLFlFSUsKhQ4fo3bs3SUlJtLa2AlBVVcWMGTOYOXMmx44dY9myZeTn52O32zv0Wly9epWBAwcSEhLC9OnT+fDDDzu0vUJTROQeFxISgq+vr3NZvnz5NXM8PT2x2+2Ulpbi5+dHfHw8ixcv5oMPPnDOiYuLIyIigk2bNjnHbDYbqampWK1W59iwYcNYunQpQ4YMIS8vD4vFQkBAANnZ2QwZMoSCggJqa2tdagMUFhaSkJBAdHQ0paWl1NTUsH37dgBWr17NxIkTyc/PJzw8nPT0dObNm8eLL75o+HWIiIjgtdde41e/+hWbN2+mvb2duLg4/vKXvxiuodAUEbnHnT17lvr6eueSl5d33XkpKSmcO3eOnTt3MnXqVMrLy4mNjXU5m8vKysJmswFQU1NDWVkZmZmZLnViYmKcjz08PPD39yc6Oto59sVbohcuXHDZbuzYsc7HvXr1IiIighMnTgBw4sQJ4uPjXebHx8dTXV1NW1uboddh7NixzJ49m+HDh/P444/zy1/+kt69e/PTn/7U0Pag0BQRuef5+Pi4LGaz+YZzLRYLCQkJ5Ofns3//ftLT0yksLHQ+P3v2bE6fPk1lZSWbN28mLCyMcePGudTo0aOHy7rJZHIZ++LLN+3t7e44vJvWo0cPHnnkET7++GPD2yg0RUTkhoYOHUpjY6Nz3d/fn+TkZGw2G3a7nYyMDLft68CBA87Hly9f5uTJk0RGRgIQGRl5zaUvFRUVhIeH4+HhcVP7a2tr49ixYwQHBxveRpeciIgItbW1pKamkpmZSUxMDN7e3hw+fJhVq1Yxffp0l7lZWVkkJibS1tbGnDlz3NZDUVER/v7+BAYGsmTJEgICAkhOTgZg4cKFjBw5kuLiYtLS0qisrGTdunWsX7++Q/XHjBnD4MGDqaur48UXX+TPf/4zWVlZhmsoNEVEBKvVyujRo1mzZg2nTp2itbWVkJAQsrOzWbx4scvcSZMmERwcTFRUFH379nVbDytWrGD+/PlUV1czfPhwdu3ahZeXFwCxsbG88cYbFBQUUFxcTHBwMEVFRaSnpxuuf/nyZbKzs/nkk0/o2bMnI0aMYP/+/QwdOtRwDZPD4XB09MBuRUNDA76+vp25SxGRTlFfX4+Pj88t1fjib6TdbueBBx64pVpNTU2kp6e7pa8vu3r1Kv369cNms/H000+7re7dQGeaIiJiSHt7O5cuXaKkpAQ/Pz/nTQ+6E4WmiIgYcubMGcLCwujfvz92ux1Pz+4XId3viEVE5KaEhobSyZ/o3XF0yYmIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExqEOhuXz5ckaOHIm3tzd9+vQhOTmZjz766Hb1JiIickfpUGi+++67zJ07lwMHDvDOO+/Q2trK5MmTXe6ALyIicq/q0M0N9uzZ47Jut9vp06cPVVVVfPWrX3VrYyIiIneaW7ojUH19PfD5L2zfSHNzM83Nzc71hoaGW9mliIhIl7npXzlpb29n2rRp1NXV8d57791w3rJly3j++edvukERkbuFO3/lpP598PG+tX4aroDvI+7pSz5309+enTt3LsePH2fr1q3/cF5eXh719fXO5ezZsze7SxERkS51U2/Pzps3j927d/Pb3/6W/v37/8O5ZrMZs9l8U82JiIjcSToUmg6Hg9zcXLZv3055eTlhYWG3qy8REZE7TodCc+7cuWzZsoVf/epXeHt788knnwDg6+vL/ffff1saFBERuVN06DPNV199lfr6esaPH09wcLBzef31129XfyIiIneMDr89KyIi0l3p3rMiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERHpUuXl5ZhMJurq6m6pTmhoKGvXrnVLTzei0BQREQAuXrxITk4OAwYMwGw2ExQUxJQpU6ioqOjq1txu69atmEwmkpOTO7TdLf0ItYiI3DtSUlJoaWmhtLSUQYMGUVNTw969e6mtre3q1tzqT3/6E//rf/0vxo0b1+FtdaYpIiLU1dWxb98+Vq5cyYQJExg4cCCjRo0iLy+PadOmAZCZmUliYqLLdq2trfTp04eNGzcCMH78eHJzc1mwYAE9e/YkMDCQDRs20NjYSEZGBt7e3gwePJiysrJreqioqCAmJgaLxcKYMWM4fvy4y/Pbtm0jKioKs9lMaGgoJSUlHT7OtrY2vvnNb/L8888zaNCgDm+v0BQRucc1NDS4LM3NzdfMsVqtWK1WduzYcd3nAbKystizZw/nz593ju3evZumpibS0tKcY6WlpQQEBHDw4EFyc3PJyckhNTWVuLg4jhw5wuTJk5k1axZNTU0u9RctWkRJSQmHDh2id+/eJCUl0draCkBVVRUzZsxg5syZHDt2jGXLlpGfn4/dbu/Qa1FUVESfPn349re/3aHtnBydrL6+3gFo0aJFyz231NfXu+1vZP37OBwf39pS//71+ywsLLzuvt98801Hz549HRaLxREXF+fIy8tz/P73v3eZM3ToUMfKlSud60lJSY709HTn+uOPP+547LHHnOufffaZ48EHH3TMmjXLOXb+/HkH4KisrHQ4HA7Hb37zGwfg2Lp1q3NObW2t4/7773e8/vrrDofD4Xj22WcdCQkJLr0sWrTIMXToUOf6wIEDHWvWrLnha7tv3z5Hv379HBcvXnQ4HA7HnDlzHNOnT7/h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AqC9vd0dh9ch9913H4MHD2b48OEsXLiQb3zjG9c9877h9h3ZWVJSEk8++SRDhgwhPDycH/7wh1itVg4cONDhxkVE5M43dOhQGhsbnev+/v4kJydjs9mw2+1kZGS4bV9fzpLLly9z8uRJIiMjAYiMjLzm0peKigrCw8Px8PC46X22t7ff8DPc67npS07a2tr4xS9+QWNjo8sp9d9rbm52aaihoeFmdykiIrdJbW0tqampZGZmEhMTg7e3N4cPH2bVqlVMnz7dZW5WVhaJiYm0tbUxZ84ct/VQVFSEv78/gYGBLFmyhICAAJKTkwFYuHAhI0eOpLi4mLS0NCorK1m3bh3r1683XH/58uU8+uijPPTQQzQ3N/PWW2+xadMmXn31VcM1Ohyax44dY+zYsXz66adYrVa2b9/O0KFD/2GTzz//fEd3IyIinchqtTJ69GjWrFnDqVOnaG1tJSQkhOzsbBYvXuwyd9KkSQQHBxMVFUXfvn3d1sOKFSuYP38+1dXVDB8+nF27duHl5QVAbGwsb7zxBgUFBRQXFxMcHExRURHp6emG6zc2NvKv//qv/OUvf+H+++/n4YcfZvPmzS7f/P1nTA6Hw9GRg2ppaeHMmTPU19fz5ptv8m//9m+8++67NwzO651phoSEEFX+GB5W3VuhO/jg0fKubqHLOD7u6g6kMzRcAd9HPv9mpo+Pz63VamjA19fXLX8j265+xofj33NLX1929epV+vXrh81m4+mnn3Zb3btBh/+JeHl5MXjwYABGjBjBoUOHePnll/npT3963flms/kffugsIiJ3h/b2di5dukRJSQl+fn7Omx50J7d8qtfRD1FFROTudObMGcLCwujfvz92ux1Pz+73bmGHjjgvL48nnniCAQMGcOXKFbZs2UJ5eTlvv/327epPRETuEKGhoXTwE717TodC88KFC8yePZvz58/j6+tLTEwMb7/9dofupiAiInK36lBofnFDXhERke5I954VERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGNT9bhwoInIX2J//N3w8b/7HlQEaPmvD1039yOd0pikiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(img1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "Image pickUnique(vImage_ imgs, int id) {\n", + " assert(id == 0);\n", + "\n", + " int n = imgs.size();\n", + " if (!n) return badImg;\n", + "\n", + " //Pick the one with the unique color\n", + " vector mask(n);\n", + " vector cnt(10);\n", + " for (int i = 0; i < n; i++) {\n", + " mask[i] = core::colMask(imgs[i]);\n", + " for (int c = 0; c < 10; c++) {\n", + " if (mask[i]>>c&1) cnt[c]++;\n", + " }\n", + " }\n", + " int reti = -1;\n", + " for (int i = 0; i < n; i++) {\n", + " for (int c = 0; c < 10; c++) {\n", + " if (mask[i]>>c&1) {\n", + "\tif (cnt[c] == 1) {\n", + "\t if (reti == -1) reti = i;\n", + "\t else return badImg;\n", + "\t}\n", + " }\n", + " }\n", + " }\n", + " if (reti == -1) return badImg;\n", + " return imgs[reti];\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 278, + "metadata": {}, + "outputs": [], + "source": [ + "def pick_unique(imgs: List[Image], id: int=0) -> Image:\n", + " if not imgs:\n", + " return Image() # badImg equivalent\n", + "\n", + " masks = [img.col_mask() for img in imgs]\n", + " cnt = [sum((mask >> c& 1) for mask in masks) for c in range(10)]\n", + " print(cnt,masks)\n", + "# reti = -1\n", + " reti = []\n", + " for i, mask in enumerate(masks):\n", + " unique_colors = [c for c in range(10) if (mask >> c) & 1 and cnt[c] == 1]\n", + " if len(unique_colors) == 1:\n", + " reti.append(imgs[i])\n", + " print(reti)\n", + "\n", + " return imgs[0] if len(reti)!=0 else Image() # badImg equivalent\n" + ] + }, + { + "cell_type": "code", + "execution_count": 279, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 0, 2, 1, 1, 0, 0, 0, 0, 0] [4, 4, 24]\n", + "[]\n" + ] + } + ], + "source": [ + "imgs = [\n", + " Image(0, 0, 2, 2, np.full((2, 2), 2)),\n", + " Image(0, 0, 2, 2, np.full((2, 2), 2)),\n", + " Image(0, 0, 2, 2, np.array([[3, 3], [3, 4]]))\n", + "]\n", + "result = pick_unique(imgs, 0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 265, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAGdCAYAAABwyyjqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABENElEQVR4nO3de1xV953v/9cOyN5JNhcFBVR0YwSCFDQYb1AnegQ1CSiRIiZTFQicU6ZytPF4piAXA514C2qnxnbqMXvvh04mtTE6aoMzOf4OZwzieEtGbZlKtK22GlSOgEIDBPj90cme7qLNQrf39/PxWI+s9V3f9VnftR6Et4u911qmnp6eHkREROQrPXavByAiIvKgUGiKiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoivyRFStWYDKZ7vUwROQ+pdCUe8bhcGAymTCZTHz00Ue91vf09BAWFobJZCIlJaXP9d944w127drlgZGKiPyBQlPuOYvFwjvvvNOr/f/+3//Lb3/7W8xm8y3VvZXQLC4u5ve///0t7U9EHn4KTbnnXnjhBX7605/yxRdfuLW/8847jB07lpCQkDs+htbWVgC8vb2xWCx3fH8i8mBSaMo99/LLL9PY2MiHH37oauvo6OC9997jlVde6dX/zTffJCEhgcDAQB5//HHGjh3Le++959bHZDLR2tqK0+l0/Qk4KysL+M/PLX/xi1/wyiuv0L9/f77+9a+7rfuS3W7HZDLx9ttvu9V/4403MJlMfPDBB546DSLyAFBoyj1ns9mYNGkS//AP/+Bqq6qqorm5mXnz5vXq//3vf59nnnmG8vJy3njjDby9vcnIyOBnP/uZq8/WrVsxm81MnjyZrVu3snXrVv7bf/tvbnUyMjJoa2vjjTfeIC8v74Zjy87OJiUlhddee43z588DcPLkSV5//XVeffVVXnjhBU+cAhF5QHjf6wGIALzyyisUFhby+9//nscff5y///u/57nnnmPw4MG9+p4+fZrHH3/ctbxo0SLi4+NZt24dL774IgDf/OY3+da3vsWIESP45je/ecN9jh49+oafpf6pzZs3ExMTw6uvvsrevXtZuHAhISEhrFu37haPVkQeVApNuS/MnTuXJUuWsHfvXmbOnMnevXv527/92xv2/ePAvHr1Kl1dXUyePNntStWIb33rW4b6hYSE8NZbb/Hyyy8zefJkPvnkEz788EP8/Pz6tD8Roz7//HM6Ojo8UsvHx0ef03uQQlPuCwMHDiQpKYl33nmHtrY2urq6+MY3vnHDvnv37uV73/sen3zyCe3t7a72vt5fGR4ebrjvvHnz2LZtGz/72c/4r//1vzJt2rQ+7UvEqM8//5xBT1i51tPlkXohISH86le/UnB6iEJT7huvvPIKeXl5fPbZZzz//PMEBAT06nPgwAFmzZrFX/zFX7Bp0yZCQ0Pp168fdrvd0J9a/9gfX7F+lcbGRo4ePQrAL37xC7q7u3nsMX0lQDyvo6ODaz1dfPcJG2bT7f2Mtfd0s+qzX9PR0aHQ9BD9Xy/3jZdeeonHHnuMQ4cO3fBbswA7duzAYrHwT//0T+Tk5PD888+TlJR0w76efLLPt7/9ba5du8bKlSv56KOP2LBhg8dqi9yI2fQYFpPXbU23G7rSm6405b5htVr54Q9/yK9//WtSU1Nv2MfLywuTyURX13/+6erXv/71DR9i8OSTT9LU1HTb43rvvff4yU9+wt/+7d9SUFDAv/3bv1FcXExKSgqRkZG3XV9EHhz6Z4jcVxYuXEhZWdlN/3T64osv0tbWxsyZM/nRj35EeXk5EyZMYOTIkb36jh07lv/9v/8369at49133+Vf//Vf+zyeS5cukZ+fz9SpU1m0aBEAGzduxM/Pj6ysLLq7u/tcU0QeXApNeaD8l//yX9iyZQufffYZS5Ys4R/+4R9YvXo1L730Uq++69atY+zYsRQXF/Pyyy/zwx/+sM/7y8/Pp7293fWQA4DAwEB+/OMfU1tby5tvvnnbxyQiDw5TT09Pz70ehIiI/EFLSwv+/v6UPTkCi8nrtmp93tPF661naW5u1i1SHqIrTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiNxT1dXVmEym237spc1mu+PPhVZoPgDeeustbDYbFouFCRMmcPjw4Xs9JHnI/Mu//AupqakMHjwYk8l0w2f5ysPv8uXL5OfnM2zYMMxmMyEhIcyYMYOampp7PTSP6OzspLy8nKeeegqLxcLo0aPZt29fn2ooNO9zP/nJT3jttdcoKyvj+PHjjB49mhkzZnDp0qV7PTR5iLS2tjJ69Gjeeuutez0UuYfS09P5+OOPcTqdnD59mt27dzNlyhQaGxvv9dA8ori4mL/7u7/jBz/4Ab/4xS/41re+xUsvvcTHH39suIZC8z63bt068vLyyM7OZtSoUfzoRz/iiSee4O23377XQ5OHyPPPP8/3vve9Gz7DVx4NTU1NHDhwgNWrVzN16lSGDx/O+PHjKSwsZNasWQDk5OSQkpLitl1nZyeDBg1iy5YtAEyZMoWCggKWLFlC//79CQ4OZvPmzbS2tpKdnY2vry8jR46kqqqq1xhqamqIi4vDYrEwceJETp065bZ+x44dxMTEYDabsdlsVFZW9ukYt27dSlFRES+88AIjRowgPz+fF154oU91FJr3sY6ODo4dO+b2vsjHHnuMpKQkamtr7+HIRORB0tLS4ja1t7f36mO1WrFarezateuG6wFyc3PZt28fFy9edLXt3buXtrY2MjMzXW1Op5OgoCAOHz5MQUEB+fn5ZGRkkJCQwPHjx5k+fTrz58+nra3Nrf6yZcuorKzkyJEjDBw4kNTUVDo7OwE4duwYc+fOZd68eZw8eZIVK1ZQUlKCw+EwfB7a29t7vYz78ccf56OPPjJcQ6F5H7ty5QpdXV0EBwe7tQcHB/PZZ5/do1GJyIMmLCwMf39/17Ry5cpefby9vXE4HDidTgICAkhMTKSoqIgTJ064+iQkJBAVFcXWrVtdbXa7nYyMDKxWq6tt9OjRFBcXExERQWFhIRaLhaCgIPLy8oiIiKC0tJTGxka32gBlZWUkJycTGxuL0+mkoaGBnTt3An/4q9u0adMoKSkhMjKSrKwsFi1axNq1aw2fhxkzZrBu3Trq6+vp7u7mww8/5P3333f7R8BXUWiKiDzkzp8/T3Nzs2sqLCy8Yb/09HQuXLjA7t27mTlzJtXV1cTHx7tdzeXm5mK32wFoaGigqqqKnJwctzpxcXGueS8vLwIDA4mNjXW1fXkh8KffzZg0aZJrfsCAAURFRVFXVwdAXV0diYmJbv0TExOpr693eyn9n/P973+fiIgInn76aXx8fFi0aBHZ2dk89pjxKFRo3seCgoLw8vKioaHBrb2hoYGQkJB7NCoRedD4+fm5TWaz+aZ9LRYLycnJlJSUcPDgQbKysigrK3OtX7BgAWfPnqW2tpZt27YRHh7O5MmT3Wr069fPbdlkMrm1fflu2rv9EveBAweya9cuWltb+c1vfsO///u/Y7VaGTFihOEaCs37mI+PD2PHjmX//v2utu7ubvbv3+/2LzIRkTtl1KhRtLa2upYDAwNJS0vDbrfjcDjIzs722L4OHTrkmr969SqnT58mOjoagOjo6F63vtTU1BAZGYmXV9/eO2qxWBgyZAhffPEFO3bsYPbs2Ya39e7TnuSue+2111i4cCHPPvss48ePZ8OGDa5voYl4yvXr1/n0009dy7/61a/45JNPGDBgAMOGDbuHI5O7pbGxkYyMDHJycoiLi8PX15ejR4+yZs2aXqGSm5tLSkoKXV1dLFy40GNjKC8vJzAwkODgYJYvX05QUBBpaWkALF26lHHjxlFRUUFmZia1tbVs3LiRTZs2Ga7/r//6r/zud79jzJgx/O53v2PFihV0d3fzP//n/zRcQ6F5n8vMzOTy5cuUlpby2WefMWbMGPbt29fry0Eit+Po0aNMnTrVtfzaa68BsHDhwj59O1EeXFarlQkTJrB+/XrOnDlDZ2cnYWFh5OXlUVRU5NY3KSmJ0NBQYmJiGDx4sMfGsGrVKhYvXkx9fT1jxoxhz549+Pj4ABAfH8/27dspLS2loqKC0NBQysvLycrKMlz/888/p7i4mLNnz2K1WnnhhRfYunUrAQEBhmuYenp6evp4XCIicoe0tLTg7+9P2ZMjsJj69mfHP/V5Txevt56lubkZPz8/D43wD3+ZGDJkCHa7nTlz5nis7oNAV5oiImJId3c3V65cobKykoCAANdDDx4lCk0RETHk3LlzhIeHM3ToUBwOB97ej16EPHpHLCIit8Rms/Gof6KnW05EREQMUmiKiIgYpNAUERExSKEpIiJikELzAdDe3s6KFStu+roeEU/Rz5rIn6fQfAC0t7fz+uuv6xeZ3HH6WRP58xSaIiIiBik0RUREDLrrDzfo7u7mwoUL+Pr6ut6pJn9eS0uL239F7hT9rN2anp4erl27xuDBg/v0QmN58Nz10Lxw4QJhYWF3e7cPBZ03uVv0s3Zrzp8/z9ChQ+/1MOQOuuuh6evrC8D5SWPw8769J/iLiNwPWr7oIqz2E9fvN09oP/Ax+N7em0nar7VAvL+HRiRwD0Lzyz/J+nl7KTRF5KGij5wefvrju4iIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIiIGKTRFREQMUmiKiMg9VV1djclkoqmp6bbq2Gw2NmzY4JEx3YxCU0REALh8+TL5+fkMGzYMs9lMSEgIM2bMoKam5l4PzWM2bNhAVFQUjz/+OGFhYXznO9/h888/N7z9XX81mIiI3J/S09Pp6OjA6XQyYsQIGhoa2L9/P42Njfd6aB7xzjvv8N3vfpe3336bhIQETp8+TVZWFiaTiXXr1hmqoStNERGhqamJAwcOsHr1aqZOncrw4cMZP348hYWFzJo1C4CcnBxSUlLctuvs7GTQoEFs2bIFgClTplBQUMCSJUvo378/wcHBbN68mdbWVrKzs/H19WXkyJFUVVX1GkNNTQ1xcXFYLBYmTpzIqVOn3Nbv2LGDmJgYzGYzNpuNysrKPh3jwYMHSUxM5JVXXsFmszF9+nRefvllDh8+bLiGQlNE5CHX0tLiNrW3t/fqY7VasVqt7Nq164brAXJzc9m3bx8XL150te3du5e2tjYyMzNdbU6nk6CgIA4fPkxBQQH5+flkZGSQkJDA8ePHmT59OvPnz6etrc2t/rJly6isrOTIkSMMHDiQ1NRUOjs7ATh27Bhz585l3rx5nDx5khUrVlBSUoLD4TB8HhISEjh27JgrJM+ePcsHH3zACy+8YLiGQlNE5CEXFhaGv7+/a1q5cmWvPt7e3jgcDpxOJwEBASQmJlJUVMSJEydcfRISEoiKimLr1q2uNrvdTkZGBlar1dU2evRoiouLiYiIoLCwEIvFQlBQEHl5eURERFBaWkpjY6NbbYCysjKSk5OJjY3F6XTS0NDAzp07AVi3bh3Tpk2jpKSEyMhIsrKyWLRoEWvXrjV8Hl555RXKy8v5+te/Tr9+/XjqqaeYMmUKRUVFhmsoNEVEHnLnz5+nubnZNRUWFt6wX3p6OhcuXGD37t3MnDmT6upq4uPj3a7mcnNzsdvtADQ0NFBVVUVOTo5bnbi4ONe8l5cXgYGBxMbGutqCg4MBuHTpktt2kyZNcs0PGDCAqKgo6urqAKirqyMxMdGtf2JiIvX19XR1dRk6D9XV1bzxxhts2rSJ48eP8/777/Ozn/2MiooKQ9uDQlNE5KHn5+fnNpnN5pv2tVgsJCcnU1JSwsGDB8nKyqKsrMy1fsGCBZw9e5ba2lq2bdtGeHg4kydPdqvRr18/t2WTyeTWZjKZAOju7vbE4RlWUlLC/Pnzyc3NJTY2lpdeeok33niDlStXGh6LQlNERG5q1KhRtLa2upYDAwNJS0vDbrfjcDjIzs722L4OHTrkmr969SqnT58mOjoagOjo6F63vtTU1BAZGYmXl5eh+m1tbTz2mHvsfbltT0+PoRq65URERGhsbCQjI4OcnBzi4uLw9fXl6NGjrFmzhtmzZ7v1zc3NJSUlha6uLhYuXOixMZSXlxMYGEhwcDDLly8nKCiItLQ0AJYuXcq4ceOoqKggMzOT2tpaNm7cyKZNmwzXT01NZd26dTzzzDNMmDCBTz/9lJKSElJTUw0Hr0JTRESwWq1MmDCB9evXc+bMGTo7OwkLCyMvL6/XF2WSkpIIDQ0lJiaGwYMHe2wMq1atYvHixdTX1zNmzBj27NmDj48PAPHx8Wzfvp3S0lIqKioIDQ2lvLycrKwsw/WLi4sxmUwUFxfzu9/9zvUN3b/5m78xXMPUY/Sa1ENaWlrw9/enefJY/LyNJbuIyP2s5Ysu/A8co7m5GT8/v9ur9R+/I797vBmz7+3Var/Wwqp4f4+M649dv36dIUOGYLfbmTNnjsfqPgh0pSkiIoZ0d3dz5coVKisrCQgIcD304FGi0BQREUPOnTtHeHg4Q4cOxeFw4O396EXIo3fEIiJyS2w2m+FvmT6sdMuJiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEF6IpCIyH2ocOfT+Flu77qm5fNuVnloPPIHutIUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIick9VV1djMploamq6rTo2m40NGzZ4ZEw3o9AUEREALl++TH5+PsOGDcNsNhMSEsKMGTOoqam510PziClTpmAymXpNL774ouEaep+miIgAkJ6eTkdHB06nkxEjRtDQ0MD+/ftpbGy810PziPfff5+Ojg7XcmNjI6NHjyYjI8NwDV1piogITU1NHDhwgNWrVzN16lSGDx/O+PHjKSwsZNasWQDk5OSQkpLitl1nZyeDBg1iy5YtwB+u5goKCliyZAn9+/cnODiYzZs309raSnZ2Nr6+vowcOZKqqqpeY6ipqSEuLg6LxcLEiRM5deqU2/odO3YQExOD2WzGZrNRWVnZp2McMGAAISEhrunDDz/kiSeeUGiKiMh/amlpcZva29t79bFarVitVnbt2nXD9QC5ubns27ePixcvutr27t1LW1sbmZmZrjan00lQUBCHDx+moKCA/Px8MjIySEhI4Pjx40yfPp358+fT1tbmVn/ZsmVUVlZy5MgRBg4cSGpqKp2dnQAcO3aMuXPnMm/ePE6ePMmKFSsoKSnB4XDc8nnZsmUL8+bN48knnzS8jUJTROQhFxYWhr+/v2tauXJlrz7e3t44HA6cTicBAQEkJiZSVFTEiRMnXH0SEhKIiopi69atrja73U5GRgZWq9XVNnr0aIqLi4mIiKCwsBCLxUJQUBB5eXlERERQWlpKY2OjW22AsrIykpOTiY2Nxel00tDQwM6dOwFYt24d06ZNo6SkhMjISLKysli0aBFr1669pXNy+PBhTp06RW5ubp+2U2iKiDzkzp8/T3Nzs2sqLCy8Yb/09HQuXLjA7t27mTlzJtXV1cTHx7tdzeXm5mK32wFoaGigqqqKnJwctzpxcXGueS8vLwIDA4mNjXW1BQcHA3Dp0iW37SZNmuSaHzBgAFFRUdTV1QFQV1dHYmKiW//ExETq6+vp6uoyeipctmzZQmxsLOPHj+/TdgpNEZGHnJ+fn9tkNptv2tdisZCcnExJSQkHDx4kKyuLsrIy1/oFCxZw9uxZamtr2bZtG+Hh4UyePNmtRr9+/dyWTSaTW5vJZAKgu7vbE4fXZ62trbz77ru8+uqrfd5WoSkiIjc1atQoWltbXcuBgYGkpaVht9txOBxkZ2d7bF+HDh1yzV+9epXTp08THR0NQHR0dK9bX2pqaoiMjMTLy6tP+/npT39Ke3s73/zmN/s8Rt1yIiIiNDY2kpGRQU5ODnFxcfj6+nL06FHWrFnD7Nmz3frm5uaSkpJCV1cXCxcu9NgYysvLCQwMJDg4mOXLlxMUFERaWhoAS5cuZdy4cVRUVJCZmUltbS0bN25k06ZNfd7Pli1bSEtLIzAwsM/bKjRFRASr1cqECRNYv349Z86cobOzk7CwMPLy8igqKnLrm5SURGhoKDExMQwePNhjY1i1ahWLFy+mvr6eMWPGsGfPHnx8fACIj49n+/btlJaWUlFRQWhoKOXl5WRlZfVpH7/85S/56KOP+Od//udbGqOpp6en55a2vEUtLS34+/vTPHksft59u6QWEbkftXzRhf+BYzQ3N+Pn53d7tb78HVkSip/l9j5Ba/m8G/+Kix4Z1x+7fv06Q4YMwW63M2fOHI/VfRDoSlNERAzp7u7mypUrVFZWEhAQ4HrowaNEoSkiIoacO3eO8PBwhg4disPhwNv70YuQR++IRUTklthsNu7yJ3r3Hd1yIiIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgbdUmi+9dZb2Gw2LBYLEyZM4PDhw54el4iIyH2nz6H5k5/8hNdee42ysjKOHz/O6NGjmTFjRq9XvIiIiDxs+hya69atIy8vj+zsbEaNGsWPfvQjnnjiCd5+++07MT4REZH7Rp9Cs6Ojg2PHjpGUlPSfBR57jKSkJGpra2+4TXt7Oy0tLW6TiIjIg6hPTwS6cuUKXV1drrdufyk4OJh///d/v+E2K1eu5PXXX7/1EYqIPIKaN/6YHtOTt1WjpacVSPXMgAS4C9+eLSwspLm52TWdP3/+Tu9SRETkjujTlWZQUBBeXl40NDS4tTc0NBASEnLDbcxmM2az+dZHKCIicp/o05Wmj48PY8eOZf/+/a627u5u9u/fz6RJkzw+OBERkftJn99y8tprr7Fw4UKeffZZxo8fz4YNG2htbSU7O/tOjE9EROS+0efQzMzM5PLly5SWlvLZZ58xZswY9u3b1+vLQSIiIg+bW3qf5qJFi1i0aJGnxyIiInJf07NnRUREDFJoioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVE5J6qrq7GZDLR1NR0W3VsNhsbNmzwyJhuRqEpIiIAXL58mfz8fIYNG4bZbCYkJIQZM2ZQU1Nzr4fmMU1NTXz7298mNDQUs9lMZGQkH3zwgeHtb+kxeiIi8vBJT0+no6MDp9PJiBEjaGhoYP/+/TQ2Nt7roXlER0cHycnJDBo0iPfee48hQ4bwm9/8hoCAAMM1dKUpIiI0NTVx4MABVq9ezdSpUxk+fDjjx4+nsLCQWbNmAZCTk0NKSorbdp2dnQwaNIgtW7YAMGXKFAoKCliyZAn9+/cnODiYzZs3u96G5evry8iRI6mqquo1hpqaGuLi4rBYLEycOJFTp065rd+xYwcxMTGYzWZsNhuVlZV9Osa3336b//f//h+7du0iMTERm83Gc889x+jRow3XUGiKiDzkWlpa3Kb29vZefaxWK1arlV27dt1wPUBubi779u3j4sWLrra9e/fS1tZGZmamq83pdBIUFMThw4cpKCggPz+fjIwMEhISOH78ONOnT2f+/Pm0tbW51V+2bBmVlZUcOXKEgQMHkpqaSmdnJwDHjh1j7ty5zJs3j5MnT7JixQpKSkpwOByGz8Pu3buZNGkS3/72twkODuZrX/sab7zxBl1dXYZrKDRFRB5yYWFh+Pv7u6aVK1f26uPt7Y3D4cDpdBIQEEBiYiJFRUWcOHHC1SchIYGoqCi2bt3qarPb7WRkZGC1Wl1to0ePpri4mIiICAoLC7FYLAQFBZGXl0dERASlpaU0Nja61QYoKysjOTmZ2NhYnE4nDQ0N7Ny5E4B169Yxbdo0SkpKiIyMJCsri0WLFrF27VrD5+Hs2bO89957dHV18cEHH1BSUkJlZSXf+973DNdQaIqIPOTOnz9Pc3OzayosLLxhv/T0dC5cuMDu3buZOXMm1dXVxMfHu13N5ebmYrfbAWhoaKCqqoqcnBy3OnFxca55Ly8vAgMDiY2NdbV9+f7lS5cuuW03adIk1/yAAQOIioqirq4OgLq6OhITE936JyYmUl9fb/hKsbu7m0GDBvHjH/+YsWPHkpmZyfLly/nRj35kaHtQaIqIPPT8/PzcJrPZfNO+FouF5ORkSkpKOHjwIFlZWZSVlbnWL1iwgLNnz1JbW8u2bdsIDw9n8uTJbjX69evntmwymdzaTCYT8IcQu5tCQ0OJjIzEy8vL1RYdHc1nn31GR0eHoRoKTRERualRo0bR2trqWg4MDCQtLQ273Y7D4SA7O9tj+zp06JBr/urVq5w+fZro6GjgD+H2p7e+1NTU9ArBPycxMZFPP/3ULaxPnz5NaGgoPj4+hmrolhMREaGxsZGMjAxycnKIi4vD19eXo0ePsmbNGmbPnu3WNzc3l5SUFLq6uli4cKHHxlBeXk5gYCDBwcEsX76coKAg0tLSAFi6dCnjxo2joqKCzMxMamtr2bhxI5s2bTJcPz8/n40bN7J48WIKCgqor6/njTfe4L//9/9uuIZCU0REsFqtTJgwgfXr13PmzBk6OzsJCwsjLy+PoqIit75JSUmEhoYSExPD4MGDPTaGVatWsXjxYurr6xkzZgx79uxxXQHGx8ezfft2SktLqaioIDQ0lPLycrKysgzXDwsL45/+6Z/4zne+Q1xcHEOGDGHx4sX89V//teEapp6enp6+HtjtaGlpwd/fn+bJY/HzNnZJLSJyP2v5ogv/A8dobm7Gz8/v9mr9x+/Ic/334Gd68vZq9bQy7GqqR8b1x65fv86QIUOw2+3MmTPHY3UfBLrSFBERQ7q7u7ly5QqVlZUEBAS4HnrwKFFoioiIIefOnSM8PJyhQ4ficDjw9n70IuTRO2IREbklNpuNu/yJ3n1Ht5yIiIgYpNAUERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKQnAomI3If+v/WNPPHE72+rRltbG2R5ZjzyB7rSFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiInJPVVdXYzKZaGpquq06NpuNDRs2eGRMN6PQFBERAC5fvkx+fj7Dhg3DbDYTEhLCjBkzqKmpuddD8wiHw4HJZHKbLBZLn2rofZoiIgJAeno6HR0dOJ1ORowYQUNDA/v376exsfFeD81j/Pz8+OUvf+laNplMfdpeV5oiIkJTUxMHDhxg9erVTJ06leHDhzN+/HgKCwuZNWsWADk5OaSkpLht19nZyaBBg9iyZQsAU6ZMoaCggCVLltC/f3+Cg4PZvHkzra2tZGdn4+vry8iRI6mqquo1hpqaGuLi4rBYLEycOJFTp065rd+xYwcxMTGYzWZsNhuVlZV9Pk6TyURISIhrCg4O7tP2Ck0RkYdcS0uL29Te3t6rj9VqxWq1smvXrhuuB8jNzWXfvn1cvHjR1bZ3717a2trIzMx0tTmdToKCgjh8+DAFBQXk5+eTkZFBQkICx48fZ/r06cyfP5+2tja3+suWLaOyspIjR44wcOBAUlNT6ezsBODYsWPMnTuXefPmcfLkSVasWEFJSQkOh6NP5+L69esMHz6csLAwZs+ezc9//vM+ba/QFBF5yIWFheHv7++aVq5c2auPt7c3DocDp9NJQEAAiYmJFBUVceLECVefhIQEoqKi2Lp1q6vNbreTkZGB1Wp1tY0ePZri4mIiIiIoLCzEYrEQFBREXl4eERERlJaW0tjY6FYboKysjOTkZGJjY3E6nTQ0NLBz504A1q1bx7Rp0ygpKSEyMpKsrCwWLVrE2rVrDZ+HqKgo3n77bf7xH/+Rbdu20d3dTUJCAr/97W8N11Boiog85M6fP09zc7NrKiwsvGG/9PR0Lly4wO7du5k5cybV1dXEx8e7Xc3l5uZit9sBaGhooKqqipycHLc6cXFxrnkvLy8CAwOJjY11tX35J9FLly65bTdp0iTX/IABA4iKiqKurg6Auro6EhMT3fonJiZSX19PV1eXofMwadIkFixYwJgxY3juued4//33GThwIH/3d39naHtQaIqIPPT8/PzcJrPZfNO+FouF5ORkSkpKOHjwIFlZWZSVlbnWL1iwgLNnz1JbW8u2bdsIDw9n8uTJbjX69evntmwymdzavvzyTXd3tycO75b169ePZ555hk8//dTwNgpNERG5qVGjRtHa2upaDgwMJC0tDbvdjsPhIDs722P7OnTokGv+6tWrnD59mujoaACio6N73fpSU1NDZGQkXl5et7S/rq4uTp48SWhoqOFtdMuJiIjQ2NhIRkYGOTk5xMXF4evry9GjR1mzZg2zZ89265ubm0tKSgpdXV0sXLjQY2MoLy8nMDCQ4OBgli9fTlBQEGlpaQAsXbqUcePGUVFRQWZmJrW1tWzcuJFNmzb1qf7EiRMZOXIkTU1NrF27lt/85jfk5uYarqHQFBERrFYrEyZMYP369Zw5c4bOzk7CwsLIy8ujqKjIrW9SUhKhoaHExMQwePBgj41h1apVLF68mPr6esaMGcOePXvw8fEBID4+nu3bt1NaWkpFRQWhoaGUl5eTlZVluP7Vq1fJy8vjs88+o3///owdO5aDBw8yatQowzVMPT09PX09sNvR0tKCv78/zZPH4ud9a5fUIiL3k5YvuvA/cIzm5mb8/Pxur9Z//I50OBw88cQTt1Wrra2NrKwsj4zrj12/fp0hQ4Zgt9uZM2eOx+o+CHSlKSIihnR3d3PlyhUqKysJCAhwPfTgUaLQFBERQ86dO0d4eDhDhw7F4XDg7f3oRcijd8QiInJLbDYbd/kTvfuObjkRERExSKEpIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGKTQFBERMUihKSIiYpAeoycich96aXQWfr63V6PlGmR5ZDTyJV1pioiIGKTQFBERMUihKSIiYpBCU0RExCCFpoiIiEEKTREREYMUmiIiIgYpNEVERAxSaIqIiBik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mD17tlvf3NxcUlJS6OrqYuHChR4bQ3l5OYGBgQQHB7N8+XKCgoJIS0sDYOnSpYwbN46KigoyMzOpra1l48aNbNq0yXD9xYsX89xzz1FZWcmLL77Iu+++y9GjR/nxj39suIZCU0REsFqtTJgwgfXr13PmzBk6OzsJCwsjLy+PoqIit75JSUmEhoYSExPD4MGDPTaGVatWsXjxYurr6xkzZgx79uzBx8cHgPj4eLZv305paSkVFRWEhoZSXl5OVlaW4foJCQm88847FBcXU1RUREREBLt27eJrX/ua4Rqmnp6enr4emIiI3BktLS34+/t7tGZzczN+fn4eq3f9+nWGDBmC3W5nzpw5Hqv7INCVpoiIGNLd3c2VK1eorKwkICDA9dCDR4lCU0REDDl37hzh4eEMHToUh8OBt/ejFyGP3hGLiMgtsdlsPOqf6OmWExEREYMUmiIiIgYpNEVERAxSaIqIiBik0BQRETFIoSkiImKQQlNERMQghaaIiIhBCk0RERGDFJoiIvcRHx+fPr0U+auEhIS43hQit09vORERuc98/vnndHR0eKSWj48PFovFI7VEoSkiImKY/jwrIiJikEJTRETEIIWmiIiIQQpNERERgxSaIiIiBik0RUREDFJoioiIGPT/A9nosGCqfJPPAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(imgs[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 266, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_2/dkcbrj250b92qy9nbwfndqt80000gn/T/ipykernel_55251/3062621385.py:26: UserWarning: Attempting to set identical left == right == -0.5 results in singular transformations; automatically expanding.\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n", + "/var/folders/_2/dkcbrj250b92qy9nbwfndqt80000gn/T/ipykernel_55251/3062621385.py:26: UserWarning: Attempting to set identical bottom == top == -0.5 results in singular transformations; automatically expanding.\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "metadata": {}, + "outputs": [], + "source": [ + "img = Image(0, 0, 3, 3, np.array([\n", + "[1, 1, 1],\n", + "[1, 2, 1],\n", + "[1, 1, 1]\n", + "]))\n", + "room = Image(0, 0, 5, 5)\n", + "result = extend2(img, room)" + ] + }, + { + "cell_type": "code", + "execution_count": 226, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_2/dkcbrj250b92qy9nbwfndqt80000gn/T/ipykernel_55251/3062621385.py:26: UserWarning: Attempting to set identical left == right == -0.5 results in singular transformations; automatically expanding.\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n", + "/var/folders/_2/dkcbrj250b92qy9nbwfndqt80000gn/T/ipykernel_55251/3062621385.py:26: UserWarning: Attempting to set identical bottom == top == -0.5 results in singular transformations; automatically expanding.\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display_matrix(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 276, + "metadata": {}, + "outputs": [], + "source": [ + "def extend2(img: Image, room: Image) -> Image:\n", + " ret = Image.empty(room.x, room.y, room.w, room.h)\n", + " done = np.zeros((room.h, room.w), dtype=int)\n", + "\n", + " d = Point(room.x - img.x, room.y - img.y)\n", + " donew = 10**6\n", + " for i in range(ret.h):\n", + " for j in range(ret.w):\n", + " x, y = j - d.x, i - d.y # Corrected: subtract d instead of add\n", + " if 0 <= x < img.w and 0 <= y < img.h:\n", + " ret.mask[i, j] = img.mask[y, x]\n", + " done[i, j] = donew\n", + "\n", + " piece_cnt = {}\n", + " bw, bh = 3, 3\n", + " for r in range(8):\n", + " rot = rigid(img, r)\n", + " for i in range(rot.h - bh + 1):\n", + " for j in range(rot.w - bw + 1):\n", + " mask = []\n", + " for y in range(bh):\n", + " for x in range(bw):\n", + " mask.append(rot.mask[i+y, j+x])\n", + " mask = tuple(mask) # Make it hashable\n", + " piece_cnt[mask] = piece_cnt.get(mask, 0) + 1\n", + "\n", + " piece = [(count, list(p)) for p, count in piece_cnt.items()]\n", + "\n", + " return greedy_fill(ret, piece, done, bw, bh, donew)" + ] + }, + { + "cell_type": "code", + "execution_count": 272, + "metadata": {}, + "outputs": [], + "source": [ + "def extend2(img: Image, room: Image) -> Image:\n", + " ret = Image.empty(room.x, room.y, room.w, room.h)\n", + " done = np.zeros((room.h, room.w), dtype=int)\n", + "\n", + " d = Point(room.x - img.x, room.y - img.y)\n", + " donew = 10**6\n", + " for i in range(ret.h):\n", + " for j in range(ret.w):\n", + " x, y = j + d.x, i + d.y\n", + " if 0 <= x < img.w and 0 <= y < img.h:\n", + " ret.mask[i, j] = img.mask[y, x]\n", + " done[i, j] = donew\n", + "\n", + " piece_cnt = {}\n", + " bw, bh = 3, 3\n", + " for r in range(8):\n", + " rot = rigid(img, r)\n", + " for i in range(rot.h - bh + 1):\n", + " for j in range(rot.w - bw + 1):\n", + " mask = []\n", + " for y in range(bh):\n", + " for x in range(bw):\n", + " mask.append(rot.mask[i+y, j+x])\n", + " mask = tuple(mask) # Make it hashable\n", + " piece_cnt[mask] = piece_cnt.get(mask, 0) + 1\n", + "\n", + " piece = []\n", + " for p, c in piece_cnt.items():\n", + " piece.append((c, list(p)))\n", + "\n", + " return greedy_fill(ret, piece, done, bw, bh, donew)" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/_2/dkcbrj250b92qy9nbwfndqt80000gn/T/ipykernel_55251/3062621385.py:26: UserWarning: Attempting to set identical left == right == -0.5 results in singular transformations; automatically expanding.\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n", + "/var/folders/_2/dkcbrj250b92qy9nbwfndqt80000gn/T/ipykernel_55251/3062621385.py:26: UserWarning: Attempting to set identical bottom == top == -0.5 results in singular transformations; automatically expanding.\n", + " cax = ax.matshow(matrix.mask, cmap=cmap, norm=norm)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "img = Image(0, 0, 3, 3, np.array([\n", + "[1, 1, 1],\n", + "[1, 2, 1],\n", + "[1, 1, 1]\n", + "]))\n", + "room = Image(0, 0, 5, 5)\n", + "result = extend2(img, room)\n", + "display_matrix(result)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cv", + "language": "python", + "name": "cv" + }, + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/arclang/README.md b/src/arclang/README.md new file mode 100644 index 0000000..b76d474 --- /dev/null +++ b/src/arclang/README.md @@ -0,0 +1,75 @@ +# Functions 1 + +## C++ to Python Port Checklist + +- [x] Col / col +- [x] Pos / pos +- [x] Square / square +- [x] Line / line +- [x] getPos / get_pos +- [x] getSize / get_size +- [x] hull / hull +- [x] toOrigin / to_origin +- [x] getW / get_w +- [x] getH / get_h +- [x] hull0 / hull0 +- [x] getSize0 / get_size0 +- [x] Move / move +- [x] filterCol / filter_col +- [x] broadcast / broadcast +- [x] colShape / col_shape +- [x] compress / compress +- [x] embedSlow / (Not ported, but embed function exists) +- [x] embed / embed +- [x] compose / compose +- [x] outerProductIS / outer_product_is +- [x] outerProductSI / outer_product_si +- [x] Fill / fill +- [x] interior / interior +- [x] border / border +- [x] alignx / align_x +- [x] aligny / align_y +- [x] align / align +- [x] align (matching version) / align_images +- [x] replaceCols / replace_cols +- [x] center / center +- [x] transform / transform +- [x] mirrorHeuristic / mirror_heuristic +- [x] rigid / rigid +- [x] invert / invert +- [x] interior2 / interior2 +- [x] count / count +- [x] myStack / my_stack +- [x] wrap / wrap +- [x] smear / smear +- [x] extend / extend +- [x] pickMax / pick_max +- [x] maxCriterion / max_criterion +- [x] cut / cut +- [x] splitCols / split_cols +- [x] compose (for vector of Images) / compose_list +- [x] getRegular / get_regular +- [x] cutPickMax / cut_pick_max +- [x] regularCutPickMax / regular_cut_pick_max +- [x] splitPickMax / split_pick_max +- [x] cutCompose / cut_compose +- [x] regularCutCompose / regular_cut_compose +- [x] splitCompose / split_compose +- [x] cutIndex / cut_index +- [x] pickMaxes / pick_maxes +- [x] pickNotMaxes / pick_not_maxes +- [x] cutPickMaxes / cut_pick_maxes +- [x] splitPickMaxes / split_pick_maxes +- [x] heuristicCut / heuristic_cut +- [x] repeat / repeat +- [x] mirror / mirror +- [x] majCol / maj_col + +Additional Python functions not in C++: +- [x] get_alternating +- [x] get_constant +- [x] get_repeating + + +# Functions 2 + diff --git a/src/arclang/__main__.py b/src/arclang/__main__.py index d13a699..91b68f8 100644 --- a/src/arclang/__main__.py +++ b/src/arclang/__main__.py @@ -1,4 +1,5 @@ """Command-line interface.""" + import click diff --git a/src/arclang/constants.py b/src/arclang/constants.py new file mode 100644 index 0000000..5be3903 --- /dev/null +++ b/src/arclang/constants.py @@ -0,0 +1,3 @@ +MAXSIDE = 100 +MAXAREA = 40 * 40 +MAXPIXELS = 40 * 40 * 5 \ No newline at end of file diff --git a/src/arclang/function.py b/src/arclang/function.py index d803976..0227b22 100644 --- a/src/arclang/function.py +++ b/src/arclang/function.py @@ -1,56 +1,77 @@ -import numpy as np -import matplotlib.pyplot as plt from collections import namedtuple -from typing import List, Tuple, Callable +from typing import Callable +from typing import List +from typing import Tuple + +import matplotlib.pyplot as plt +import numpy as np + +from arclang.constants import MAXAREA +from arclang.constants import MAXPIXELS +from arclang.constants import MAXSIDE +from arclang.image import Image +from arclang.image import Point -from arclang.image import Image, Point def col(id: int) -> Image: assert 0 <= id < 10 return Image.full(Point(0, 0), Point(1, 1), id) + def pos(dx: int, dy: int) -> Image: return Image.full(Point(dx, dy), Point(1, 1)) + def square(id: int) -> Image: assert id >= 1 return Image.full(Point(0, 0), Point(id, id)) + def line(orient: int, id: int) -> Image: assert id >= 1 w, h = (id, 1) if orient == 0 else (1, id) return Image.full(Point(0, 0), Point(w, h)) + def get_pos(img: Image) -> Image: return Image.full(Point(img.x, img.y), Point(1, 1), img.majority_col()) + def get_size(img: Image) -> Image: return Image.full(Point(0, 0), Point(img.w, img.h), img.majority_col()) + def hull(img: Image) -> Image: return Image.full(Point(img.x, img.y), Point(img.w, img.h), img.majority_col()) + def to_origin(img: Image) -> Image: img.x, img.y = 0, 0 return img + def get_w(img: Image, id: int) -> Image: return Image.full(Point(0, 0), Point(img.w, img.w if id else 1), img.majority_col()) + def get_h(img: Image, id: int) -> Image: return Image.full(Point(0, 0), Point(img.h if id else 1, img.h), img.majority_col()) + def hull0(img: Image) -> Image: return Image.full(Point(img.x, img.y), Point(img.w, img.h), 0) + def get_size0(img: Image) -> Image: return Image.full(Point(0, 0), Point(img.w, img.h), 0) + def move(img: Image, p: Image) -> Image: img.x += p.x img.y += p.y return img + def filter_col(img: Image, palette: Image) -> Image: ret = img.copy() pal_mask = palette.col_mask() @@ -60,6 +81,7 @@ def filter_col(img: Image, palette: Image) -> Image: ret[i, j] = 0 return ret + def filter_col_id(img: Image, id: int) -> Image: assert 0 <= id < 10 if id == 0: @@ -68,18 +90,19 @@ def filter_col_id(img: Image, id: int) -> Image: return filter_col(img, col(id)) -def broadcast(col: 'Image', shape: 'Image', include0: int = 1) -> 'Image': +def broadcast(col: "Image", shape: "Image", include0: int = 1) -> "Image": if col.w * col.h == 0 or shape.w * shape.h == 0: return Image() # badImg equivalent ret = Image(shape.x, shape.y, shape.w, shape.h) - + for i in range(shape.h): for j in range(shape.w): ret[i, j] = col[i % col.h, j % col.w] return ret + def col_shape(col: Image, shape: Image) -> Image: if shape.w * shape.h == 0 or col.w * col.h == 0: return Image() # bad image @@ -91,15 +114,19 @@ def col_shape(col: Image, shape: Image) -> Image: ret[i, j] = 0 return ret + def col_shape_id(shape: Image, id: int) -> Image: assert 0 <= id < 10 ret = shape.copy() ret.mask = np.where(ret.mask != 0, id, 0) return ret + def compress(img: Image, bg: Image = None) -> Image: if bg is None: - bg = Image.full(Point(0, 0), Point(1, 1), 0) # Use a full image with 0 as background + bg = Image.full( + Point(0, 0), Point(1, 1), 0 + ) # Use a full image with 0 as background bg_mask = bg.col_mask() @@ -119,6 +146,7 @@ def compress(img: Image, bg: Image = None) -> Image: ret[i - ymi, j - xmi] = img[i, j] return ret + def embed(img: Image, shape: Image) -> Image: ret = Image(shape.x, shape.y, shape.w, shape.h) dx, dy = shape.x - img.x, shape.y - img.y @@ -127,10 +155,13 @@ def embed(img: Image, shape: Image) -> Image: ret_mask = ret.mask.reshape(ret.h, ret.w) img_mask = img.mask.reshape(img.h, img.w) - ret_mask[sy:ey, sx:ex] = img_mask[sy+dy:ey+dy, sx+dx:ex+dx] + ret_mask[sy:ey, sx:ex] = img_mask[sy + dy : ey + dy, sx + dx : ex + dx] return ret -def compose(a: Image, b: Image, f: Callable[[int, int], int], overlap_only: int) -> Image: + +def compose( + a: Image, b: Image, f: Callable[[int, int], int], overlap_only: int +) -> Image: if overlap_only == 1: ret_x = max(a.x, b.x) ret_y = max(a.y, b.y) @@ -168,6 +199,7 @@ def compose(a: Image, b: Image, f: Callable[[int, int], int], overlap_only: int) return ret + def compose_id(a: Image, b: Image, id: int = 0) -> Image: if id == 0: return compose(a, b, lambda x, y: y if y else x, 0) @@ -182,23 +214,28 @@ def compose_id(a: Image, b: Image, id: int = 0) -> Image: else: assert 0 <= id < 5 return Image() # bad image - + + def compose_list(imgs: List[Image], overlap_only: int) -> Image: if not imgs: return Image() result = imgs[0] for img in imgs[1:]: - result = compose_id(result, img,overlap_only) + result = compose_id(result, img, overlap_only) return result -def compose_list_f(imgs: List[Image], f: Callable[[int, int], int], overlap_only: int) -> Image: + +def compose_list_f( + imgs: List[Image], f: Callable[[int, int], int], overlap_only: int +) -> Image: if not imgs: return Image() result = imgs[0] for img in imgs[1:]: - result = compose(result, img,f,overlap_only) + result = compose(result, img, f, overlap_only) return result + def outer_product_is(a: Image, b: Image) -> Image: if a.w * b.w > 100 or a.h * b.h > 100 or a.w * b.w * a.h * b.h > 1600: return Image() # bad image @@ -209,9 +246,10 @@ def outer_product_is(a: Image, b: Image) -> Image: for j in range(a.w): for k in range(b.h): for l in range(b.w): - ret[i*b.h + k, j*b.w + l] = a[i, j] * (1 if b[k, l] else 0) + ret[i * b.h + k, j * b.w + l] = a[i, j] * (1 if b[k, l] else 0) return ret + def outer_product_si(a: Image, b: Image) -> Image: if a.w * b.w > 100 or a.h * b.h > 100 or a.w * b.w * a.h * b.h > 1600: return Image() # bad image @@ -222,9 +260,10 @@ def outer_product_si(a: Image, b: Image) -> Image: for j in range(a.w): for k in range(b.h): for l in range(b.w): - ret[i*b.h + k, j*b.w + l] = (1 if a[i, j] > 0 else 0) * b[k, l] + ret[i * b.h + k, j * b.w + l] = (1 if a[i, j] > 0 else 0) * b[k, l] return ret + def fill(a: Image) -> Image: # Create an image filled with the majority color of 'a' ret = Image.full(Point(a.x, a.y), Point(a.w, a.h), a.majority_col()) @@ -233,10 +272,10 @@ def fill(a: Image) -> Image: # Identify the border pixels and add them to the queue for i in range(a.h): for j in range(a.w): - if (i == 0 or j == 0 or i == a.h-1 or j == a.w-1) and not a[i, j]: + if (i == 0 or j == 0 or i == a.h - 1 or j == a.w - 1) and not a[i, j]: q.append((i, j)) ret[i, j] = 0 - + # Perform BFS to fill the area while q: r, c = q.pop(0) @@ -247,19 +286,21 @@ def fill(a: Image) -> Image: ret[nr, nc] = 0 return ret + def interior(a: Image) -> Image: return compose(fill(a), a, lambda x, y: 0 if y else x, 0) + def border(a: Image) -> Image: ret = Image(a.x, a.y, a.w, a.h) q = [] for i in range(a.h): for j in range(a.w): - if i == 0 or j == 0 or i == a.h-1 or j == a.w-1: + if i == 0 or j == 0 or i == a.h - 1 or j == a.w - 1: if not a[i, j]: q.append((i, j)) ret[i, j] = 1 - + while q: r, c = q.pop() for dr in [-1, 0, 1]: @@ -269,10 +310,11 @@ def border(a: Image) -> Image: ret[nr, nc] = 1 if not a[nr, nc]: q.append((nr, nc)) - + ret.mask = ret.mask * a.mask return ret + def align_x(a: Image, b: Image, id: int) -> Image: assert 0 <= id < 5 ret = a.copy() @@ -288,6 +330,7 @@ def align_x(a: Image, b: Image, id: int) -> Image: ret.x = b.x + b.w return ret + def align_y(a: Image, b: Image, id: int) -> Image: assert 0 <= id < 5 ret = a.copy() @@ -303,6 +346,7 @@ def align_y(a: Image, b: Image, id: int) -> Image: ret.y = b.y + b.h return ret + def align(a: Image, b: Image, idx: int, idy: int) -> Image: assert 0 <= idx < 6 and 0 <= idy < 6 ret = a.copy() @@ -329,6 +373,7 @@ def align(a: Image, b: Image, idx: int, idy: int) -> Image: ret.y = b.y + b.h return ret + def align_images(a: Image, b: Image) -> Image: ret = a.copy() match_size = 0 @@ -345,18 +390,26 @@ def align_images(a: Image, b: Image) -> Image: return Image() # bad image return ret + def replace_cols(base: Image, cols: Image) -> Image: ret = base.copy() done = Image.empty(base.x, base.y, base.w, base.h) dx, dy = base.x - cols.x, base.y - cols.y def dfs(r: int, c: int, acol: int) -> List[Tuple[int, int]]: - if r < 0 or r >= base.h or c < 0 or c >= base.w or base[r, c] != acol or done[r, c]: + if ( + r < 0 + or r >= base.h + or c < 0 + or c >= base.w + or base[r, c] != acol + or done[r, c] + ): return [] path = [(r, c)] done[r, c] = 1 - for nr in [r-1, r, r+1]: - for nc in [c-1, c, c+1]: + for nr in [r - 1, r, r + 1]: + for nc in [c - 1, c, c + 1]: path.extend(dfs(nr, nc, acol)) return path @@ -374,19 +427,19 @@ def dfs(r: int, c: int, acol: int) -> List[Tuple[int, int]]: return ret + def center(img: Image) -> Image: sz_x = (img.w + 1) % 2 + 1 sz_y = (img.h + 1) % 2 + 1 center_x = img.x + (img.w - sz_x) // 2 center_y = img.y + (img.h - sz_y) // 2 - + center_img = Image(center_x, center_y, sz_x, sz_y) for i in range(sz_y): for j in range(sz_x): center_img[i, j] = img[center_y - img.y + i, center_x - img.x + j] - - return center_img + return center_img def transform(img: Image, A00: int, A01: int, A10: int, A11: int) -> Image: @@ -402,10 +455,15 @@ def t(p: Point) -> Point: ny = A10 * x + A11 * y return Point((nx - off_x) // 2, (ny - off_y) // 2) - corners = [t(Point(0, 0)), t(Point(img.w-1, 0)), t(Point(0, img.h-1)), t(Point(img.w-1, img.h-1))] + corners = [ + t(Point(0, 0)), + t(Point(img.w - 1, 0)), + t(Point(0, img.h - 1)), + t(Point(img.w - 1, img.h - 1)), + ] a = Point(min(c.x for c in corners), min(c.y for c in corners)) b = Point(max(c.x for c in corners), max(c.y for c in corners)) - + ret = Image.empty(img.x, img.y, b.x - a.x + 1, b.y - a.y + 1) for i in range(img.h): for j in range(img.w): @@ -414,6 +472,7 @@ def t(p: Point) -> Point: ret[go.y, go.x] = img[i, j] return ret + def mirror_heuristic(img: Image) -> bool: cnt = sumx = sumy = 0 for i in range(img.h): @@ -424,6 +483,7 @@ def mirror_heuristic(img: Image) -> bool: sumy += i return abs(sumx * 2 - (img.w - 1) * cnt) < abs(sumy * 2 - (img.h - 1) * cnt) + def rigid(img: Image, id: int) -> Image: if id == 0: return img.copy() @@ -446,14 +506,14 @@ def rigid(img: Image, id: int) -> Image: else: assert 0 <= id < 9 return Image() # bad image - + def invert(img: Image) -> Image: if img.w * img.h == 0: return img mask = img.col_mask() col = 1 - while col < 10 and not (mask & (1 << np.int64(col))): + while col < 10 and not (mask & (1 << np.int64(col))): col += 1 if col == 10: col = 1 @@ -462,6 +522,7 @@ def invert(img: Image) -> Image: ret.mask = np.where(ret.mask != 0, 0, col) return ret + def maj_col(img: Image) -> Image: return col(img.majority_col()) @@ -469,27 +530,36 @@ def maj_col(img: Image) -> Image: def interior2(a: Image) -> Image: return compose_id(a, invert(border(a)), 2) + def count(img: Image, id: int, out_type: int) -> Image: assert 0 <= id < 7 and 0 <= out_type < 3 - if id == 0: num = img.count() - elif id == 1: num = img.count_cols() - elif id == 2: num = img.count_components() - elif id == 3: num = img.w - elif id == 4: num = img.h - elif id == 5: num = max(img.w, img.h) - elif id == 6: num = min(img.w, img.h) + if id == 0: + num = img.count() + elif id == 1: + num = img.count_cols() + elif id == 2: + num = img.count_components() + elif id == 3: + num = img.w + elif id == 4: + num = img.h + elif id == 5: + num = max(img.w, img.h) + elif id == 6: + num = min(img.w, img.h) if out_type == 0: - sz = Point(num, num) - elif (out_type == 1): + sz = Point(num, num) + elif out_type == 1: sz = Point(num, 1) - elif (out_type == 2): + elif out_type == 2: sz = Point(1, num) if max(sz.x, sz.y) > 100 or sz.x * sz.y > 1600: return Image() # bad image return Image.full(Point(0, 0), sz, img.majority_col()) + def wrap(line: Image, area: Image) -> Image: if line.w * line.h == 0 or area.w * area.h == 0: return Image() # bad image @@ -505,73 +575,155 @@ def wrap(line: Image, area: Image) -> Image: ans[y, x] = line[i, j] return ans + def smear(base: Image, room: Image, id: int) -> Image: assert 0 <= id < 7 mask = [1, 2, 4, 8, 3, 12, 15][id] d = Point(room.x - base.x, room.y - base.y) ret = embed(base, hull(room)) - + def smear_direction(range_i, range_j, condition): for i in range_i: c = 0 for j in range_j: - if not room[i, j]: c = 0 - elif base.safe(i + d.y, j + d.x): c = base[i + d.y, j + d.x] - if c and condition(i, j): ret[i, j] = c + if not room[i, j]: + c = 0 + elif base.safe(i + d.y, j + d.x): + c = base[i + d.y, j + d.x] + if c and condition(i, j): + ret[i, j] = c + + if mask & 1: + smear_direction(range(ret.h), range(ret.w), lambda i, j: True) + if mask & 2: + smear_direction(range(ret.h), range(ret.w - 1, -1, -1), lambda i, j: True) + if mask & 4: + smear_direction(range(ret.w), range(ret.h), lambda i, j: True) + if mask & 8: + smear_direction(range(ret.w), range(ret.h - 1, -1, -1), lambda i, j: True) - if mask & 1: smear_direction(range(ret.h), range(ret.w), lambda i, j: True) - if mask & 2: smear_direction(range(ret.h), range(ret.w - 1, -1, -1), lambda i, j: True) - if mask & 4: smear_direction(range(ret.w), range(ret.h), lambda i, j: True) - if mask & 8: smear_direction(range(ret.w), range(ret.h - 1, -1, -1), lambda i, j: True) - return ret + +def smear_each(img: Image, id: int) -> Image: + assert 0 <= id < 15 + directions = [ + [(1, 0)], + [(-1, 0)], + [(0, 1)], + [(0, -1)], + [(1, 0), (-1, 0)], + [(0, 1), (0, -1)], + [(1, 0), (-1, 0), (0, 1), (0, -1)], + [(1, 1)], + [(-1, -1)], + [(1, -1)], + [(-1, 1)], + [(1, 1), (-1, -1)], + [(1, -1), (-1, 1)], + [(1, 1), (-1, -1), (1, -1), (-1, 1)], + [(1, 0), (-1, 0), (0, 1), (0, -1), (1, 1), (-1, -1), (1, -1), (-1, 1)], + ] + + ret = img.copy() + w = img.w + + for dx, dy in directions[id]: + di = dy * w + dx + + for i in range(ret.h): + step = 1 if i == 0 or i == ret.h - 1 else max(ret.w - 1, 1) + for j in range(0, ret.w, step): + if i - dy < 0 or j - dx < 0 or i - dy >= img.h or j - dx >= img.w: + steps = MAXSIDE + if dx == -1: + steps = min(steps, j + 1) + if dx == 1: + steps = min(steps, img.w - j) + if dy == -1: + steps = min(steps, i + 1) + if dy == 1: + steps = min(steps, img.h - i) + + ind = i * w + j + end_ind = ind + steps * di + c = 0 + while ind != end_ind: + if img.mask[ind // w, ind % w]: + c = img.mask[ind // w, ind % w] + if c: + ret.mask[ind // w, ind % w] = c + ind += di + + return ret + + def extend(img: Image, room: Image) -> Image: if img.w * img.h == 0: return Image() # bad image ret = room.copy() for i in range(ret.h): for j in range(ret.w): - x = max(0, min(j+room.x - img.x, img.w - 1)) + x = max(0, min(j + room.x - img.x, img.w - 1)) y = max(0, min(i + room.y - img.y, img.h - 1)) ret[i, j] = img[y, x] return ret + def pick_max(v: List[Image], f: Callable[[Image], int]) -> Image: if not v: return Image() # bad image return max(v, key=f) + def max_criterion(img: Image, id: int) -> int: assert 0 <= id < 14 - if id == 0: return img.count() - elif id == 1: return -img.count() - elif id == 2: return img.w * img.h - elif id == 3: return -img.w * img.h - elif id == 4: return img.count_cols() - elif id == 5: return -img.y - elif id == 6: return img.y - elif id == 7: return img.count_components() + if id == 0: + return img.count() + elif id == 1: + return -img.count() + elif id == 2: + return img.w * img.h + elif id == 3: + return -img.w * img.h + elif id == 4: + return img.count_cols() + elif id == 5: + return -img.y + elif id == 6: + return img.y + elif id == 7: + return img.count_components() elif id in (8, 9): comp = compress(img) return (comp.w * comp.h - comp.count()) * (-1 if id == 9 else 1) elif id in (10, 11): return img.count_interior() * (-1 if id == 11 else 1) - elif id == 12: return -img.x - elif id == 13: return img.x + elif id == 12: + return -img.x + elif id == 13: + return img.x + def cut(img: Image, a: Image) -> List[Image]: ret = [] done = Image.empty(img.x, img.y, img.w, img.h) d = Point(img.x - a.x, img.y - a.y) - + def dfs(r: int, c: int, toadd: Image): - if r < 0 or r >= img.h or c < 0 or c >= img.w or a.safe(r + d.y, c + d.x) or done[r, c]: + if ( + r < 0 + or r >= img.h + or c < 0 + or c >= img.w + or a.safe(r + d.y, c + d.x) + or done[r, c] + ): return toadd[r, c] = img[r, c] + 1 done[r, c] = 1 - for nr in (r-1, r, r+1): - for nc in (c-1, c, c+1): + for nr in (r - 1, r, r + 1): + for nc in (c - 1, c, c + 1): dfs(nr, nc, toadd) for i in range(img.h): @@ -584,16 +736,18 @@ def dfs(r: int, c: int, toadd: Image): ret.append(toadd) return ret + def split_cols(img: Image, include0: int = 0) -> List[Image]: ret = [] mask = img.col_mask() for c in range(int(not include0), 10): - if mask & (1 << np.int64(c)): + if mask & (1 << np.int64(c)): s = img.copy() s.mask = np.where(s.mask == c, c, 0) ret.append(s) return ret + def get_regular_1d(col: List[int]) -> None: colw = len(col) for w in range(1, colw): @@ -607,6 +761,7 @@ def get_regular_1d(col: List[int]) -> None: return col[:] = [0] * colw + def get_regular(img: Image) -> Image: # Look for regular grid division in single color ret = img.copy() @@ -629,43 +784,51 @@ def get_regular(img: Image) -> Image: return ret + def cut_pick_max(a: Image, b: Image, id: int) -> Image: return pick_max(cut(a, b), lambda img: max_criterion(img, id)) + def regular_cut_pick_max(a: Image, id: int) -> Image: b = get_regular(a) return cut_pick_max(a, b, id) + def split_pick_max(a: Image, id: int, include0: int = 0) -> Image: return pick_max(split_cols(a, include0), lambda img: max_criterion(img, id)) + def cut_compose(a: Image, b: Image, id: int) -> Image: v = cut(a, b) return compose_list([to_origin(img) for img in v], id) + def regular_cut_compose(a: Image, id: int) -> Image: b = get_regular(a) return cut_compose(a, b, id) + def split_compose(a: Image, id: int, include0: int = 0) -> Image: v = split_cols(a, include0) return compose_list([to_origin(compress(img)) for img in v], id) + def cut_index(a: Image, b: Image, ind: int) -> Image: v = cut(a, b) return v[ind] if 0 <= ind < len(v) else Image() + def get_alternating(img: Image) -> Image: ret = img.copy() w, h = img.w, img.h def is_alternating(arr): - return all(arr[i] != arr[i+1] for i in range(len(arr)-1)) + return all(arr[i] != arr[i + 1] for i in range(len(arr) - 1)) # Check rows and columns rows = [is_alternating([img[i, j] for j in range(w)]) for i in range(h)] cols = [is_alternating([img[i, j] for i in range(h)]) for j in range(w)] - + # Combine results for i in range(h): for j in range(w): @@ -673,6 +836,7 @@ def is_alternating(arr): return ret + def get_constant(img: Image) -> Image: ret = img.copy() w, h = img.w, img.h @@ -683,7 +847,7 @@ def is_constant(arr): # Check rows and columns rows = [is_constant([img[i, j] for j in range(w)]) for i in range(h)] cols = [is_constant([img[i, j] for i in range(h)]) for j in range(w)] - + # Combine results for i in range(h): for j in range(w): @@ -691,6 +855,7 @@ def is_constant(arr): return ret + def get_repeating(img: Image, min_repetitions: int = 2) -> Image: ret = img.copy() w, h = img.w, img.h @@ -707,7 +872,7 @@ def is_repeating(arr): # Check rows and columns rows = [is_repeating([img[i, j] for j in range(w)]) for i in range(h)] cols = [is_repeating([img[i, j] for i in range(h)]) for j in range(w)] - + # Combine results for i in range(h): for j in range(w): @@ -715,34 +880,43 @@ def is_repeating(arr): return ret -def pick_maxes(v: List[Image], f: Callable[[Image], int], invert: int = 0) -> List[Image]: + +def pick_maxes( + v: List[Image], f: Callable[[Image], int], invert: int = 0 +) -> List[Image]: if not v: return [] scores = [f(img) for img in v] max_score = max(scores) return [img for img, score in zip(v, scores) if (score == max_score) ^ invert] + def pick_not_maxes(v: List[Image], id: int) -> List[Image]: return pick_maxes(v, lambda img: max_criterion(img, id), 1) + def cut_pick_maxes(a: Image, b: Image, id: int) -> Image: return compose_list(pick_maxes(cut(a, b), lambda img: max_criterion(img, id)), 0) + def split_pick_maxes(a: Image, id: int) -> Image: - return compose_list(pick_maxes(split_cols(a), lambda img: max_criterion(img, id)), 0) + return compose_list( + pick_maxes(split_cols(a), lambda img: max_criterion(img, id)), 0 + ) + def heuristic_cut(img: Image) -> Image: ret = img.majority_col(include0=1) ret_score = -1 mask = img.col_mask() done = Image.empty(img.x, img.y, img.w, img.h) - + def edgy(r: int, c: int, col: int): if r < 0 or r >= img.h or c < 0 or c >= img.w or img[r, c] != col or done[r, c]: return done[r, c] = 1 - for nr in (r-1, r, r+1): - for nc in (c-1, c, c+1): + for nr in (r - 1, r, r + 1): + for nc in (c - 1, c, c + 1): edgy(nr, nc, col) for col in range(10): @@ -753,17 +927,25 @@ def edgy(r: int, c: int, col: int): for i in range(img.h): for j in range(img.w): if img[i, j] == col: - if i == 0: top = True - if j == 0: left = True - if i == img.h - 1: bot = True - if j == img.w - 1: right = True - if (i in (0, img.h - 1) or j in (0, img.w - 1)) and img[i, j] == col and not done[i, j]: + if i == 0: + top = True + if j == 0: + left = True + if i == img.h - 1: + bot = True + if j == img.w - 1: + right = True + if ( + (i in (0, img.h - 1) or j in (0, img.w - 1)) + and img[i, j] == col + and not done[i, j] + ): edgy(i, j, col) - + if not ((top and bot) or (left and right)): continue - score = float('inf') + score = float("inf") components = 0 no_contained = True for i in range(img.h): @@ -784,7 +966,7 @@ def edgy(r: int, c: int, col: int): continue cnt += 1 done[r, c] = 1 - stack.extend([(r-1, c), (r+1, c), (r, c-1), (r, c+1)]) + stack.extend([(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]) components += 1 score = min(score, cnt) if contained: @@ -795,8 +977,6 @@ def edgy(r: int, c: int, col: int): return filter_col_id(img, ret) - - def my_stack(a: Image, b: Image, orient: int) -> Image: assert 0 <= orient <= 3 b.x, b.y = a.x, a.y @@ -830,6 +1010,7 @@ def wrap(line: Image, area: Image) -> Image: ans[y, x] = line[i, j] return ans + def repeat(a: Image, b: Image, pad: int = 0) -> Image: if a.w * a.h <= 0 or b.w * b.h <= 0: return Image() # bad image @@ -846,6 +1027,7 @@ def repeat(a: Image, b: Image, pad: int = 0) -> Image: ai = (ai + 1) % H return ret + def mirror(a: Image, b: Image, pad: int = 0) -> Image: if a.w * a.h <= 0 or b.w * b.h <= 0: return Image() # bad image @@ -870,4 +1052,598 @@ def mirror(a: Image, b: Image, pad: int = 0) -> Image: ret[i, j] = a[y, x] aj = (aj + 1) % W2 ai = (ai + 1) % H2 - return ret \ No newline at end of file + return ret + + +def split_all(img: Image) -> List[Image]: + ret = [] + done = Image.empty(img.x, img.y, img.w, img.h) + + def dfs(r: int, c: int, col: int, toadd: Image): + if r < 0 or r >= img.h or c < 0 or c >= img.w or img[r, c] != col or done[r, c]: + return + toadd[r, c] = img[r, c] + 1 + done[r, c] = 1 + for d in range(4): + nr = r + (d == 0) - (d == 1) + nc = c + (d == 2) - (d == 3) + dfs(nr, nc, col, toadd) + + for i in range(img.h): + for j in range(img.w): + if not done[i, j]: + toadd = Image.empty(img.x, img.y, img.w, img.h) + dfs(i, j, img[i, j], toadd) + toadd = compress(toadd) + toadd.mask = np.maximum(toadd.mask - 1, 0) + if toadd.count() > 0: + ret.append(toadd) + + return ret + + +from collections import deque +from typing import Callable +from typing import List +from typing import Tuple + +import numpy as np + + +def split_all(img: Image) -> List[Image]: + ret = [] + done = Image.empty(img.x, img.y, img.w, img.h) + + def dfs(r: int, c: int, col: int, toadd: Image): + if r < 0 or r >= img.h or c < 0 or c >= img.w or img[r, c] != col or done[r, c]: + return + toadd[r, c] = img[r, c] + 1 + done[r, c] = 1 + for d in range(4): + nr = r + (d == 0) - (d == 1) + nc = c + (d == 2) - (d == 3) + dfs(nr, nc, col, toadd) + + for i in range(img.h): + for j in range(img.w): + if not done[i, j]: + toadd = Image.empty(img.x, img.y, img.w, img.h) + dfs(i, j, img[i, j], toadd) + toadd = compress(toadd) + toadd.mask = np.maximum(toadd.mask - 1, 0) + if toadd.count() > 0: + ret.append(toadd) + + return ret + + +def erase_col(img: Image, col: int) -> Image: + ret = img.copy() + ret.mask[ret.mask == col] = 0 + return ret + + +def inside_marked(in_img: Image) -> List[Image]: + ret = [] + for i in range(in_img.h - 1): + for j in range(in_img.w - 1): + for h in range(1, in_img.h - i - 1): + for w in range(1, in_img.w - j - 1): + col = in_img[i, j] + if col == 0: + continue + ok = True + for k in range(4): + x, y = j + (k % 2) * w, i + (k // 2) * h + for d in range(4): + if (d != 3 - k) == (in_img[y + d // 2, x + d % 2] != col): + ok = False + break + if not ok: + break + if ok: + inside = invert(Image.full(Point(j + 1, i + 1), Point(w, h))) + ret.append(compose_id(inside, in_img, 3)) + return ret + + +def make_border(img: Image, bcol: int = 1) -> Image: + ret = hull0(img) + for i in range(ret.h): + for j in range(ret.w): + if img[i, j] == 0: + ok = False + for ni in [i - 1, i, i + 1]: + for nj in [j - 1, j, j + 1]: + if img.safe(ni, nj): + ok = True + break + if ok: + break + if ok: + ret[i, j] = bcol + return ret + + +def make_border2(img: Image, usemaj: int = 1) -> Image: + bcol = img.majority_col() if usemaj else 1 + rsz = Point(img.w + 2, img.h + 2) + if max(rsz.x, rsz.y) > MAXSIDE or rsz.x * rsz.y > MAXAREA: + return Image() # badImg equivalent + ret = Image.full(Point(img.x - 1, img.y - 1), rsz, bcol) + ret.mask[1:-1, 1:-1] = img.mask + return ret + + +def make_border2_with_bord(img: Image, bord: Image) -> Image: + bcol = bord.majority_col() + rsz = Point(img.w + 2 * bord.w, img.h + 2 * bord.h) + if max(rsz.x, rsz.y) > MAXSIDE or rsz.x * rsz.y > MAXAREA: + return Image() # badImg equivalent + ret = Image.full(Point(img.x - bord.w, img.y - bord.h), rsz, bcol) + ret.mask[bord.h : -bord.h, bord.w : -bord.w] = img.mask + return ret + + +def compress2(img: Image) -> Image: + row = np.any(img.mask != 0, axis=1) + col = np.any(img.mask != 0, axis=0) + rows = np.where(row)[0] + cols = np.where(col)[0] + ret = Image(img.x, img.y, len(cols), len(rows)) + ret.mask = img.mask[np.ix_(rows, cols)] + return ret + + +def compress3(img: Image) -> Image: + if img.w * img.h <= 0: + return Image() # badImg equivalent + + row = np.zeros(img.h, dtype=bool) + col = np.zeros(img.w, dtype=bool) + row[0] = col[0] = True + + for i in range(1, img.h): + for j in range(img.w): + if img.mask[i, j] != img.mask[i - 1, j]: + row[i] = True + break + + for j in range(1, img.w): + for i in range(img.h): + if img.mask[i, j] != img.mask[i, j - 1]: + col[j] = True + break + + rows = np.where(row)[0] + cols = np.where(col)[0] + + ret = Image(img.x, img.y, len(cols), len(rows), img.mask[np.ix_(rows, cols)]) + + return ret + + +def greedy_fill( + ret: Image, + piece: List[Tuple[int, List[int]]], + done: np.ndarray, + bw: int, + bh: int, + donew: int, +) -> Image: + piece.sort(reverse=True) + dw, dh = ret.w - bw + 1, ret.h - bh + 1 + if dw < 1 or dh < 1: + return Image() # badImg equivalent + + dones = np.full((dh, dw), -1, dtype=int) + pq = [] + + def recalc(i: int, j: int): + cnt = np.sum(done[i : i + bh, j : j + bw]) + if cnt != dones[i, j]: + dones[i, j] = cnt + heapq.heappush(pq, (-cnt, j, i)) + + for i in range(dh): + for j in range(dw): + recalc(i, j) + + while pq: + ds, j, i = heapq.heappop(pq) + ds = -ds + if ds != dones[i, j]: + continue + found = False + for cnt, mask in piece: + mask = np.array(mask).reshape(bh, bw) + if np.all( + (done[i : i + bh, j : j + bw] == 0) + | (ret.mask[i : i + bh, j : j + bw] == mask) + ): + done[i : i + bh, j : j + bw] = np.where( + done[i : i + bh, j : j + bw] == 0, + donew, + done[i : i + bh, j : j + bw], + ) + ret.mask[i : i + bh, j : j + bw] = np.where( + done[i : i + bh, j : j + bw] == donew, + mask, + ret.mask[i : i + bh, j : j + bw], + ) + donew = max(1, donew - 1) + for y in range(max(i - bh + 1, 0), min(i + bh, dh)): + for x in range(max(j - bw + 1, 0), min(j + bw, dw)): + recalc(y, x) + found = True + break + if not found: + return Image() # badImg equivalent + return ret + + +def greedy_fill_black(img: Image, N: int = 3) -> Image: + ret = Image.empty(img.x, img.y, img.w, img.h) + done = np.zeros((img.h, img.w), dtype=int) + donew = 10**6 + + ret.mask[img.mask != 0] = img.mask[img.mask != 0] + done[img.mask != 0] = donew + + piece_cnt = {} + bw, bh = N, N + for r in range(8): + rot = rigid(img, r) + for i in range(rot.h - bh + 1): + for j in range(rot.w - bw + 1): + mask = rot.mask[i : i + bh, j : j + bw].flatten() + if np.all(mask): + piece_cnt[tuple(mask)] = piece_cnt.get(tuple(mask), 0) + 1 + + piece = [(c, list(p)) for p, c in piece_cnt.items()] + return greedy_fill(ret, piece, done, bw, bh, donew) + + +def greedy_fill_black2(img: Image, N: int = 3) -> Image: + filled = greedy_fill_black(img, N) + return compose_id(filled, img, 4) + + +def extend2(img: Image, room: Image) -> Image: + ret = Image.empty(room.x, room.y, room.w, room.h) + done = np.zeros((room.h, room.w), dtype=int) + + d = Point(room.x - img.x, room.y - img.y) + donew = 10**6 + for i in range(ret.h): + for j in range(ret.w): + x, y = j + d.x, i + d.y + if 0 <= x < img.w and 0 <= y < img.h: + ret.mask[i, j] = img.mask[y, x] + done[i, j] = donew + + piece_cnt = {} + bw, bh = 3, 3 + for r in range(8): + rot = rigid(img, r) + for i in range(rot.h - bh + 1): + for j in range(rot.w - bw + 1): + mask = tuple(rot.mask[i : i + bh, j : j + bw].flatten()) + piece_cnt[mask] = piece_cnt.get(mask, 0) + 1 + + piece = [(count, list(p)) for p, count in piece_cnt.items()] + + return greedy_fill(ret, piece, done, bw, bh, donew) + + +def connect(img: Image, id: int) -> Image: + assert 0 <= id < 3 + ret = Image.empty(img.x, img.y, img.w, img.h) + + if id == 0 or id == 2: # Horizontal + for i in range(img.h): + last = -1 + lastc = -1 + for j in range(img.w): + if img.mask[i, j]: + if img.mask[i, j] == lastc: + ret.mask[i, last + 1 : j] = lastc + lastc = img.mask[i, j] + last = j + ret.mask[i, j] = img.mask[i, j] + + if id == 1 or id == 2: # Vertical + for j in range(img.w): + last = -1 + lastc = -1 + for i in range(img.h): + if img.mask[i, j]: + if img.mask[i, j] == lastc: + ret.mask[last + 1 : i, j] = lastc + lastc = img.mask[i, j] + last = i + ret.mask[i, j] = img.mask[i, j] + + return ret + + +def replace_template( + in_img: Image, need: Image, marked: Image, overlapping: int = 0, rigids: int = 0 +) -> Image: + if marked.w != need.w or marked.h != need.h: + return Image() # badImg equivalent + if need.w * need.h <= 0: + return in_img + + rots = 8 if rigids else 1 + needr = [rigid(need, r) for r in range(rots)] + markedr = [rigid(marked, r) for r in range(rots)] + + ret = in_img.copy() + for r in range(rots): + need, marked = needr[r], markedr[r] + for i in range(ret.h - need.h + 1): + for j in range(ret.w - need.w + 1): + if np.all( + (in_img if overlapping else ret).mask[ + i : i + need.h, j : j + need.w + ] + == need.mask + ): + if overlapping == 2: + surrounding = np.pad(need.mask, 1, mode="edge") + if np.any( + surrounding[surrounding != 0] + == in_img.mask[ + i - 1 : i + need.h + 1, j - 1 : j + need.w + 1 + ][surrounding != 0] + ): + continue + ret.mask[i : i + need.h, j : j + need.w] = marked.mask + return ret + + +def swap_template(in_img: Image, a: Image, b: Image, rigids: int = 0) -> Image: + if a.w != b.w or a.h != b.h: + return Image() # badImg equivalent + if a.w * a.h <= 0: + return in_img + + rots = 8 if rigids else 1 + ar = [rigid(a, r) for r in range(rots)] + br = [rigid(b, r) for r in range(rots)] + + done = Image.empty(in_img.x, in_img.y, in_img.w, in_img.h) + ret = in_img.copy() + + for k in [0, 1]: + for r in range(rots): + need, to = (ar[r], br[r]) if k == 0 else (br[r], ar[r]) + for i in range(ret.h - need.h + 1): + for j in range(ret.w - need.w + 1): + if np.all( + done.mask[i : i + need.h, j : j + need.w] == 0 + ) and np.all(ret.mask[i : i + need.h, j : j + need.w] == need.mask): + ret.mask[i : i + need.h, j : j + need.w] = to.mask + done.mask[i : i + need.h, j : j + need.w] = 1 + return ret + + +import heapq +from typing import List +from typing import Tuple + +import numpy as np + + +def spread_cols(img: Image, skipmaj: int = 0) -> Image: + skipcol = img.majority_col() if skipmaj else -1 + done = Image.empty(img.x, img.y, img.w, img.h) + ret = img.copy() + q = deque() + + for i in range(img.h): + for j in range(img.w): + if img[i, j] and img[i, j] != skipcol: + q.append((j, i, img[i, j])) + done[i, j] = 1 + + while q: + j, i, c = q.popleft() + for d in range(4): + ni, nj = i + (d == 0) - (d == 1), j + (d == 2) - (d == 3) + if 0 <= ni < img.h and 0 <= nj < img.w and not done[ni, nj]: + ret[ni, nj] = c + done[ni, nj] = 1 + q.append((nj, ni, c)) + + return ret + + +def split_columns(img: Image) -> List[Image]: + if img.w * img.h <= 0: + return [] + return [Image(j, 0, 1, img.h, img.mask[:, j].reshape(-1, 1)) for j in range(img.w)] + + +def split_rows(img: Image) -> List[Image]: + if img.w * img.h <= 0: + return [] + return [Image(0, i, img.w, 1, img.mask[i, :].reshape(1, -1)) for i in range(img.h)] + + +def half(img: Image, id: int) -> Image: + assert 0 <= id < 4 + if id == 0: + return img.sub_image(Point(0, 0), Point(img.w // 2, img.h)) + elif id == 1: + return img.sub_image(Point(img.w - img.w // 2, 0), Point(img.w // 2, img.h)) + elif id == 2: + return img.sub_image(Point(0, 0), Point(img.w, img.h // 2)) + elif id == 3: + return img.sub_image(Point(0, img.h - img.h // 2), Point(img.w, img.h // 2)) + + +def mirror2(a: Image, line: Image) -> Image: + if line.w > line.h: + ret = rigid(a, 5) + ret.x = a.x + ret.y = line.y * 2 + line.h - a.y - a.h + else: + ret = rigid(a, 4) + ret.y = a.y + ret.x = line.x * 2 + line.w - a.x - a.w + return ret + + +def gravity(in_img: Image, d: int) -> List[Image]: + pieces = split_all(in_img) + room = hull0(in_img) + dx, dy = [(1, 0), (-1, 0), (0, 1), (0, -1)][d] + + ret = [] + out = room.copy() + pieces.sort(key=lambda a: a.x * dx + a.y * dy, reverse=True) + + for p in pieces: + while True: + p.x += dx + p.y += dy + + if not is_valid_position(p, out): + p.x -= dx + p.y -= dy + break + + ret.append(p) + out = compose_id(out, p, 3) + + return ret + + +def is_valid_position(piece: Image, out: Image) -> bool: + for i in range(piece.h): + for j in range(piece.w): + if piece.mask[i, j] != 0: + x, y = j + piece.x - out.x, i + piece.y - out.y + if x < 0 or y < 0 or x >= out.w or y >= out.h or out.mask[y, x] != 0: + return False + return True + + +def my_stack_l(lens: List[Image], id: int) -> Image: + if not lens: + return Image() # badImg equivalent + order = sorted(enumerate(lens), key=lambda x: x[1].w * x[1].h) + out = lens[order[0][0]] + for _, img in order[1:]: + out = my_stack(out, img, id) + return out + + +def stack_line_v(shapes: List[Image]) -> Image: + if not shapes: + return Image() # badImg equivalent + if len(shapes) == 1: + return shapes[0] + + xs = sorted(shape.x for shape in shapes) + ys = sorted(shape.y for shape in shapes) + xmin = min(xs[i] - xs[i - 1] for i in range(1, len(xs))) + ymin = min(ys[i] - ys[i - 1] for i in range(1, len(ys))) + + dx, dy = (1, 0) if xmin < ymin else (0, 1) + order = sorted(enumerate(shapes), key=lambda x: x[1].x * dx + x[1].y * dy) + + out = shapes[order[0][0]] + for _, img in order[1:]: + out = my_stack(out, img, dy) + return out + + +def stack_line(shapes: List[Image]) -> Image: + n = len(shapes) + if n == 0: + return Image() # badImg equivalent + elif n == 1: + return shapes[0] + + xs = [shape.x for shape in shapes] + ys = [shape.y for shape in shapes] + xs.sort() + ys.sort() + + xmin = float("inf") + ymin = float("inf") + for i in range(1, n): + xmin = min(xmin, xs[i] - xs[i - 1]) + ymin = min(ymin, ys[i] - ys[i - 1]) + + dx, dy = (0, 1) if xmin < ymin else (1, 0) + + order = [(shape.x * dx + shape.y * dy, i) for i, shape in enumerate(shapes)] + order.sort() + + out = shapes[order[0][1]] + for i in range(1, n): + out = my_stack(out, shapes[order[i][1]], dy) + + return out + + +def compose_growing_slow(imgs: List[Image]) -> Image: + if not imgs: + return Image() # badImg equivalent + order = sorted(enumerate(imgs), key=lambda x: x[1].count(), reverse=True) + return compose_list(imgs, 0) + + +def compose_growing(imgs: List[Image]) -> Image: + if not imgs: + return Image() # badImg equivalent + if len(imgs) == 1: + return imgs[0] + + minx = min(img.x for img in imgs) + miny = min(img.y for img in imgs) + maxx = max(img.x + img.w for img in imgs) + maxy = max(img.y + img.h for img in imgs) + + rsz = Point(maxx - minx, maxy - miny) + if ( + max(rsz.x, rsz.y) > MAXSIDE + or rsz.x * rsz.y > MAXAREA + or rsz.x <= 0 + or rsz.y <= 0 + ): + return Image() # badImg equivalent + + order = sorted(enumerate(imgs), key=lambda x: x[1].count(), reverse=True) + ret = Image.empty(minx, miny, rsz.x, rsz.y) + + for _, img in order: + dx, dy = img.x - ret.x, img.y - ret.y + ret.mask[dy : dy + img.h, dx : dx + img.w] = np.where( + img.mask != 0, img.mask, ret.mask[dy : dy + img.h, dx : dx + img.w] + ) + + return ret + + +def pick_unique(imgs: List[Image]) -> Image: + if not imgs: + return Image() # badImg equivalent + + masks = [img.col_mask() for img in imgs] + cnt = [sum((mask >> c) & 1 for mask in masks) for c in range(10)] + + reti = -1 + for i, mask in enumerate(masks): + unique_colors = [c for c in range(10) if (mask >> c) & 1 and cnt[c] == 1] + if len(unique_colors) == 1: + if reti == -1: + reti = i + else: + return Image() # badImg equivalent + + return imgs[reti] if reti != -1 else Image() # badImg equivalent diff --git a/src/arclang/image.py b/src/arclang/image.py index 1319848..5e9a2db 100644 --- a/src/arclang/image.py +++ b/src/arclang/image.py @@ -1,13 +1,14 @@ -import numpy as np -from functools import reduce from collections import namedtuple -from typing import List, Tuple, Union +from functools import reduce +from typing import List +from typing import Tuple +from typing import Union + +import numpy as np -MAXSIDE = 100 -MAXAREA = 40 * 40 -MAXPIXELS = 40 * 40 * 5 -Point = namedtuple('Point', ['x', 'y']) +Point = namedtuple("Point", ["x", "y"]) + class Image: def __init__(self, x=0, y=0, w=0, h=0, mask=None): @@ -34,7 +35,13 @@ def safe(self, i, j): return self.mask[i, j] def __eq__(self, other): - return np.array_equal(self.mask, other.mask) and self.x == other.x and self.y == other.y and self.w == other.w and self.h == other.h + return ( + np.array_equal(self.mask, other.mask) + and self.x == other.x + and self.y == other.y + and self.w == other.w + and self.h == other.h + ) def __ne__(self, other): return not self.__eq__(other) @@ -43,50 +50,48 @@ def __lt__(self, other): if (self.w, self.h) != (other.w, other.h): return (self.w, self.h) < (other.w, other.h) return self.mask.flatten().tolist() < other.mask.flatten().tolist() - - def copy(self) -> 'Image': + + def copy(self) -> "Image": return Image(self.x, self.y, self.w, self.h, self.mask.copy()) - - + def col_mask(self) -> int: mask = 0 for i in range(self.h): for j in range(self.w): mask |= 1 << self[i, j] return mask - + def count_cols(self, include0: int = 0) -> int: mask = self.col_mask() if not include0: mask &= ~1 - return bin(mask).count('1') - + return bin(mask).count("1") + def count(self) -> int: return np.sum(self.mask > 0) - + @staticmethod - def full(p: Point, sz: Point, filling: int = 1) -> 'Image': + def full(p: Point, sz: Point, filling: int = 1) -> "Image": img = Image(p.x, p.y, sz.x, sz.y) img.mask.fill(filling) return img - + @staticmethod - def full_i(p: Point, sz: Point, filling: int = 1) -> 'Image': + def full_i(p: Point, sz: Point, filling: int = 1) -> "Image": img = Image(p.x, p.y, sz.x, sz.y) img.mask.fill(filling) return img @staticmethod - def empty_p(p: Point, sz: Point) -> 'Image': + def empty_p(p: Point, sz: Point) -> "Image": return Image.full(p, sz, 0) - + @staticmethod - def empty(x: int, y: int, w: int, h: int) -> 'Image': + def empty(x: int, y: int, w: int, h: int) -> "Image": return Image(x, y, w, h, np.zeros((h, w), dtype=np.int8)) - @staticmethod - def is_rectangle(img: 'Image') -> bool: + def is_rectangle(img: "Image") -> bool: return img.count() == img.w * img.h def count_components_dfs(self, r: int, c: int): @@ -117,13 +122,20 @@ def majority_col(self, include0: int = 0) -> int: return 0 # Return 0 if all colors were excluded or the image is empty return int(unique[np.argmax(counts)]) - def sub_image(self, p: Point, sz: Point) -> 'Image': - assert p.x >= 0 and p.y >= 0 and p.x + sz.x <= self.w and p.y + sz.y <= self.h and sz.x >= 0 and sz.y >= 0 + def sub_image(self, p: Point, sz: Point) -> "Image": + assert ( + p.x >= 0 + and p.y >= 0 + and p.x + sz.x <= self.w + and p.y + sz.y <= self.h + and sz.x >= 0 + and sz.y >= 0 + ) ret = Image(p.x + self.x, p.y + self.y, sz.x, sz.y) - ret.mask = self.mask[p.y:p.y+sz.y, p.x:p.x+sz.x].copy() + ret.mask = self.mask[p.y : p.y + sz.y, p.x : p.x + sz.x].copy() return ret - def split_cols(self, include0: int = 0) -> List[Tuple['Image', int]]: + def split_cols(self, include0: int = 0) -> List[Tuple["Image", int]]: ret = [] mask = self.col_mask() for c in range(int(not include0), 10): @@ -145,14 +157,15 @@ def hash_image(self): return r @staticmethod - def empty_p2(p: Union[Point, int], sz: Union[Point, int], h: int = None) -> 'Image': + def empty_p2(p: Union[Point, int], sz: Union[Point, int], h: int = None) -> "Image": if isinstance(p, Point) and isinstance(sz, Point): return Image(p.x, p.y, sz.x, sz.y) elif isinstance(p, int) and isinstance(sz, int) and h is not None: return Image(p, sz, sz, h) else: raise ValueError("Invalid arguments for Image.empty") - + + class Piece: def __init__(self, imgs=None, node_prob=0.0, keepi=0, knowi=0): if imgs is None: @@ -162,9 +175,11 @@ def __init__(self, imgs=None, node_prob=0.0, keepi=0, knowi=0): self.keepi = keepi self.knowi = knowi + def check_all(v, f): return all(f(it) for it in v) + def all_equal(v, f): needed = f(v[0]) return all(f(it) == needed for it in v) diff --git a/src/arclang/utils.py b/src/arclang/utils.py index 12edee8..c092ff9 100644 --- a/src/arclang/utils.py +++ b/src/arclang/utils.py @@ -1,8 +1,13 @@ import json -import numpy as np + import matplotlib.pyplot as plt -from arclang.image import Image, Piece -from matplotlib.colors import ListedColormap, BoundaryNorm +import numpy as np +from matplotlib.colors import BoundaryNorm +from matplotlib.colors import ListedColormap + +from arclang.image import Image +from arclang.image import Piece + def display_matrices(matrices_dict): matrix_input = matrices_dict["input"].mask @@ -51,6 +56,7 @@ def display_matrices(matrices_dict): plt.show() + def display_matrix(matrix): colors = [ "#000000", # black @@ -123,12 +129,13 @@ def read_json(file): data = json.load(f) return data + def json_to_images(data): images = [] for dataset in data: - for item in dataset['train']: - input_image = Image(mask=item['input']) - output_image = Image(mask=item['output']) + for item in dataset["train"]: + input_image = Image(mask=item["input"]) + output_image = Image(mask=item["output"]) images.append((input_image, output_image)) return images @@ -154,20 +161,20 @@ def analyze_matrix_sizes(images): fig, axes = plt.subplots(3, 1, figsize=(10, 15)) - axes[0].hist(input_flat_sizes, bins=20, color='blue', alpha=0.7) - axes[0].set_title('Distribution of Input Matrix Sizes') - axes[0].set_xlabel('Size') - axes[0].set_ylabel('Frequency') + axes[0].hist(input_flat_sizes, bins=20, color="blue", alpha=0.7) + axes[0].set_title("Distribution of Input Matrix Sizes") + axes[0].set_xlabel("Size") + axes[0].set_ylabel("Frequency") - axes[1].hist(output_flat_sizes, bins=20, color='green', alpha=0.7) - axes[1].set_title('Distribution of Output Matrix Sizes') - axes[1].set_xlabel('Size') - axes[1].set_ylabel('Frequency') + axes[1].hist(output_flat_sizes, bins=20, color="green", alpha=0.7) + axes[1].set_title("Distribution of Output Matrix Sizes") + axes[1].set_xlabel("Size") + axes[1].set_ylabel("Frequency") - axes[2].hist(delta_flat_sizes, bins=20, color='red', alpha=0.7) - axes[2].set_title('Delta between Output and Input Matrix Sizes') - axes[2].set_xlabel('Delta Size') - axes[2].set_ylabel('Frequency') + axes[2].hist(delta_flat_sizes, bins=20, color="red", alpha=0.7) + axes[2].set_title("Delta between Output and Input Matrix Sizes") + axes[2].set_xlabel("Delta Size") + axes[2].set_ylabel("Frequency") plt.tight_layout() plt.show() diff --git a/src/arclang/visualize.py b/src/arclang/visualize.py index b12a618..e5f5359 100644 --- a/src/arclang/visualize.py +++ b/src/arclang/visualize.py @@ -1,9 +1,15 @@ -import numpy as np -import matplotlib.pyplot as plt from collections import namedtuple -from typing import List, Tuple, Union, Callable +from typing import Callable +from typing import List +from typing import Tuple +from typing import Union + +import matplotlib.pyplot as plt +import numpy as np + +from arclang.image import Image +from arclang.image import Point -from arclang.image import Image, Point Point = namedtuple("Point", ["x", "y"]) @@ -74,7 +80,9 @@ def visualize_count(img: Image, result: Image): def visualize_cut(img: Image, mask: Image, result: List[Image]): n_results = len(result) if result else 0 - fig, visualize_axs = plt.subplots(1, 3 + n_results, figsize=(5 * (3 + n_results), 5)) + fig, visualize_axs = plt.subplots( + 1, 3 + n_results, figsize=(5 * (3 + n_results), 5) + ) axs[0].imshow(img.mask, cmap="viridis") axs[0].set_title(f"Input ({img.w}x{img.h})") @@ -250,32 +258,43 @@ def visualize_split_cols(img: Image, result: List[Image]): plt.show() -def visualize_transformation(original: Image, transformed: Image, - title: str = "Image Transformation", - original_title: str = "Original", - transformed_title: str = "Transformed"): +def visualize_transformation( + original: Image, + transformed: Image, + title: str = "Image Transformation", + original_title: str = "Original", + transformed_title: str = "Transformed", +): fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6)) - + # Display original image - ax1.imshow(original.mask, cmap='viridis') + ax1.imshow(original.mask, cmap="viridis") ax1.set_title(f"{original_title} ({original.w}x{original.h})") - ax1.axis('off') - + ax1.axis("off") + # Create a full-size array for the transformed image - full_size = np.zeros((max(original.h, transformed.y + transformed.h) - min(0, transformed.y), - max(original.w, transformed.x + transformed.w) - min(0, transformed.x))) - + full_size = np.zeros( + ( + max(original.h, transformed.y + transformed.h) - min(0, transformed.y), + max(original.w, transformed.x + transformed.w) - min(0, transformed.x), + ) + ) + # Calculate the offset for the transformed image - y_start, x_start = transformed.y - min(0, transformed.y), transformed.x - min(0, transformed.x) - + y_start, x_start = transformed.y - min(0, transformed.y), transformed.x - min( + 0, transformed.x + ) + # Place the transformed image in the full-size array - full_size[y_start:y_start+transformed.h, x_start:x_start+transformed.w] = transformed.mask - + full_size[y_start : y_start + transformed.h, x_start : x_start + transformed.w] = ( + transformed.mask + ) + # Display transformed image - ax2.imshow(full_size, cmap='viridis') + ax2.imshow(full_size, cmap="viridis") ax2.set_title(f"{transformed_title} ({transformed.w}x{transformed.h})") - ax2.axis('off') - + ax2.axis("off") + plt.suptitle(title) plt.tight_layout() - plt.show() \ No newline at end of file + plt.show() diff --git a/tests/__init__.py b/tests/__init__.py index c9bf727..1068425 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,2 +1 @@ """Test suite for the arclang package.""" - diff --git a/tests/test_image.py b/tests/test_image.py index 68f1799..39a1129 100644 --- a/tests/test_image.py +++ b/tests/test_image.py @@ -1,7 +1,11 @@ import unittest -import unittest + import numpy as np -from arclang.image import Image, Piece, Point # Assuming your classes are in 'image_module.py' + +from arclang.image import Image # Assuming your classes are in 'image_module.py' +from arclang.image import Piece +from arclang.image import Point + class TestImageAdditional(unittest.TestCase): def test_hash_image(self): @@ -45,16 +49,27 @@ def test_majority_col(self): def test_sub_image(self): img = Image(0, 0, 3, 3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]) sub_img = img.sub_image(Point(1, 1), Point(2, 2)) - self.assertTrue(np.array_equal(sub_img.mask, np.array([[5, 6], [8, 9]], dtype=np.int8))) + self.assertTrue( + np.array_equal(sub_img.mask, np.array([[5, 6], [8, 9]], dtype=np.int8)) + ) def test_split_cols(self): img = Image(0, 0, 2, 2, [[1, 2], [0, 1]]) split_result = img.split_cols() self.assertEqual(len(split_result), 2) - self.assertTrue(np.array_equal(split_result[0][0].mask, np.array([[1, 0], [0, 1]], dtype=np.int8))) + self.assertTrue( + np.array_equal( + split_result[0][0].mask, np.array([[1, 0], [0, 1]], dtype=np.int8) + ) + ) self.assertEqual(split_result[0][1], 1) - self.assertTrue(np.array_equal(split_result[1][0].mask, np.array([[0, 1], [0, 0]], dtype=np.int8))) + self.assertTrue( + np.array_equal( + split_result[1][0].mask, np.array([[0, 1], [0, 0]], dtype=np.int8) + ) + ) self.assertEqual(split_result[1][1], 2) -if __name__ == '__main__': - unittest.main() \ No newline at end of file + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_image_compreehensive.py b/tests/test_image_compreehensive.py index eea2511..c8398e3 100644 --- a/tests/test_image_compreehensive.py +++ b/tests/test_image_compreehensive.py @@ -1,7 +1,11 @@ import unittest + import numpy as np + from arclang.function import * -from arclang.image import Image, Point +from arclang.image import Image +from arclang.image import Point + # Import the new display_matrix_term function from arclang.utils import display_matrix_term @@ -40,5 +44,6 @@ def test_broadcast(self): # ... (other test methods) -if __name__ == '__main__': - unittest.main() \ No newline at end of file + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_image_func.py b/tests/test_image_func.py index 746c666..39cc8fe 100644 --- a/tests/test_image_func.py +++ b/tests/test_image_func.py @@ -1,7 +1,11 @@ import unittest + import numpy as np + from arclang.function import * -from arclang.image import Image, Point +from arclang.image import Image +from arclang.image import Point + class TestImageFunctions(unittest.TestCase): @@ -144,12 +148,14 @@ def test_col_shape_id(self): self.assertTrue(np.array_equal(result.mask, expected)) def test_compress(self): - img = Image(1, 1, 4, 4, [[0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0]]) + img = Image( + 1, 1, 4, 4, [[0, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 0]] + ) compressed = compress(img) self.assertEqual(compressed.x, 1 + 1) # new x = original x + xmi self.assertEqual(compressed.y, 1 + 0) # new y = original y + ymi - self.assertEqual(compressed.w, 2) # new width - self.assertEqual(compressed.h, 3) # new height + self.assertEqual(compressed.w, 2) # new width + self.assertEqual(compressed.h, 3) # new height expected = np.array([[1, 0], [1, 1], [0, 1]]) self.assertTrue(np.array_equal(compressed.mask, expected)) @@ -178,24 +184,14 @@ def test_outer_product_is(self): a = Image(0, 0, 2, 2, [[1, 2], [3, 4]]) b = Image(0, 0, 2, 2, [[1, 0], [1, 1]]) result = outer_product_is(a, b) - expected = np.array([ - [1, 0, 2, 0], - [1, 1, 2, 2], - [3, 0, 4, 0], - [3, 3, 4, 4] - ]) + expected = np.array([[1, 0, 2, 0], [1, 1, 2, 2], [3, 0, 4, 0], [3, 3, 4, 4]]) self.assertTrue(np.array_equal(result.mask, expected)) def test_outer_product_si(self): a = Image(0, 0, 2, 2, [[1, 2], [0, 4]]) b = Image(0, 0, 2, 2, [[5, 6], [7, 8]]) result = outer_product_si(a, b) - expected = np.array([ - [5, 6, 5, 6], - [7, 8, 7, 8], - [0, 0, 5, 6], - [0, 0, 7, 8] - ]) + expected = np.array([[5, 6, 5, 6], [7, 8, 7, 8], [0, 0, 5, 6], [0, 0, 7, 8]]) self.assertTrue(np.array_equal(result.mask, expected)) def test_fill(self): @@ -243,14 +239,20 @@ def test_align_images(self): self.assertEqual(result.y, 2) def test_center(self): - # Create a 5x5 image with a distinct pattern - img = Image(0, 0, 5, 5, [ - [0, 0, 0, 0, 0], - [0, 1, 1, 1, 0], - [0, 1, 2, 1, 0], - [0, 1, 1, 1, 0], - [0, 0, 0, 0, 0] - ]) + # Create a 5x5 image with a distinct pattern + img = Image( + 0, + 0, + 5, + 5, + [ + [0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 2, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0], + ], + ) result = center(img) @@ -264,12 +266,9 @@ def test_center(self): self.assertEqual(result.y, img.y + 2) # Centered vertically # Test with an even-sized image - img_even = Image(1, 1, 4, 4, [ - [1, 1, 2, 2], - [1, 1, 2, 2], - [3, 3, 4, 4], - [3, 3, 4, 4] - ]) + img_even = Image( + 1, 1, 4, 4, [[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]] + ) result_even = center(img_even) @@ -366,19 +365,14 @@ def test_extend(self): img = Image(0, 0, 2, 2, [[1, 2], [3, 4]]) room = Image(-1, -1, 4, 4) result = extend(img, room) - expected = np.array([ - [1, 1, 2, 2], - [1, 1, 2, 2], - [3, 3, 4, 4], - [3, 3, 4, 4] - ]) + expected = np.array([[1, 1, 2, 2], [1, 1, 2, 2], [3, 3, 4, 4], [3, 3, 4, 4]]) self.assertTrue(np.array_equal(result.mask, expected)) def test_pick_max(self): imgs = [ Image(0, 0, 2, 2, [[1, 1], [1, 1]]), Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]), - Image(0, 0, 1, 1, [[1]]) + Image(0, 0, 1, 1, [[1]]), ] result = pick_max(imgs, lambda img: img.w * img.h) self.assertEqual(result.w, 3) @@ -403,41 +397,47 @@ def test_split_cols(self): self.assertTrue(all(piece.count_cols() == 1 for piece in result)) def test_get_regular(self): - img = Image(0, 0, 4, 4, [ - [1, 0, 1, 0], - [0, 1, 0, 1], - [1, 0, 1, 0], - [0, 1, 0, 1] - ]) + img = Image( + 0, 0, 4, 4, [[1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1]] + ) result = get_regular(img) - expected = np.zeros((4,4)) + expected = np.zeros((4, 4)) self.assertTrue(np.array_equal(result.mask, expected)) def test_cut_pick_max(self): - img = Image(0,0,5,5,[ - [1, 1, 1, 0, 0], - [1, 2, 2, 0, 0], - [1, 2, 2, 3, 3], - [0, 0, 3, 3, 3], - [0, 0, 3, 3, 3] - ]) - mask = Image(0,0,5,5,[ - [0, 0, 0, 0, 0], - [0, 1, 1, 0, 0], - [0, 1, 1, 2, 2], - [0, 0, 2, 2, 2], - [0, 0, 2, 2, 2] - ]) + img = Image( + 0, + 0, + 5, + 5, + [ + [1, 1, 1, 0, 0], + [1, 2, 2, 0, 0], + [1, 2, 2, 3, 3], + [0, 0, 3, 3, 3], + [0, 0, 3, 3, 3], + ], + ) + mask = Image( + 0, + 0, + 5, + 5, + [ + [0, 0, 0, 0, 0], + [0, 1, 1, 0, 0], + [0, 1, 1, 2, 2], + [0, 0, 2, 2, 2], + [0, 0, 2, 2, 2], + ], + ) result = cut_pick_max(img, mask, 0) # Pick largest piece self.assertEqual(result.count(), 5) def test_regular_cut_pick_max(self): - img = Image(0, 0, 4, 4, [ - [1, 0, 1, 0], - [0, 1, 0, 1], - [1, 0, 1, 0], - [0, 1, 0, 1] - ]) + img = Image( + 0, 0, 4, 4, [[1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1]] + ) result = regular_cut_pick_max(img, 0) # Pick largest piece self.assertEqual(result.count(), 8) @@ -447,12 +447,9 @@ def test_split_pick_max(self): self.assertEqual(result.count(), 4) def test_regular_cut_compose(self): - img = Image(0, 0, 4, 4, [ - [1, 0, 1, 0], - [0, 1, 0, 1], - [1, 0, 1, 0], - [0, 1, 0, 1] - ]) + img = Image( + 0, 0, 4, 4, [[1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1]] + ) result = regular_cut_compose(img, 0) self.assertEqual(result.count(), 8) @@ -471,7 +468,7 @@ def test_pick_maxes(self): imgs = [ Image(0, 0, 2, 2, [[1, 1], [1, 1]]), Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]), - Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]) + Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]), ] result = pick_maxes(imgs, lambda img: img.w * img.h) self.assertEqual(len(result), 2) @@ -481,7 +478,7 @@ def test_pick_not_maxes(self): imgs = [ Image(0, 0, 2, 2, [[1, 1], [1, 1]]), Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]), - Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]) + Image(0, 0, 3, 3, [[1, 1, 1], [1, 1, 1], [1, 1, 1]]), ] result = pick_not_maxes(imgs, 0) # Use area as criterion self.assertEqual(len(result), 1) @@ -508,24 +505,14 @@ def test_repeat(self): a = Image(0, 0, 2, 2, [[1, 2], [3, 4]]) b = Image(0, 0, 4, 4) result = repeat(a, b) - expected = np.array([ - [1, 2, 1, 2], - [3, 4, 3, 4], - [1, 2, 1, 2], - [3, 4, 3, 4] - ]) + expected = np.array([[1, 2, 1, 2], [3, 4, 3, 4], [1, 2, 1, 2], [3, 4, 3, 4]]) self.assertTrue(np.array_equal(result.mask, expected)) def test_mirror(self): a = Image(0, 0, 2, 2, [[1, 2], [3, 4]]) b = Image(0, 0, 4, 4) result = mirror(a, b) - expected = np.array([ - [1, 2, 2, 1], - [3, 4, 4, 3], - [3, 4, 4, 3], - [1, 2, 2, 1] - ]) + expected = np.array([[1, 2, 2, 1], [3, 4, 4, 3], [3, 4, 4, 3], [1, 2, 2, 1]]) self.assertTrue(np.array_equal(result.mask, expected)) def test_maj_col(self): @@ -539,24 +526,28 @@ def test_repeat_with_pad(self): a = Image(0, 0, 2, 2, [[1, 2], [3, 4]]) b = Image(0, 0, 5, 5) result = repeat(a, b, pad=1) - expected = np.array([ - [1, 2, 0, 1, 2], - [3, 4, 0, 3, 4], - [0, 0, 0, 0, 0], - [1, 2, 0, 1, 2], - [3, 4, 0, 3, 4] - ]) + expected = np.array( + [ + [1, 2, 0, 1, 2], + [3, 4, 0, 3, 4], + [0, 0, 0, 0, 0], + [1, 2, 0, 1, 2], + [3, 4, 0, 3, 4], + ] + ) self.assertTrue(np.array_equal(result.mask, expected)) def test_mirror_with_pad(self): a = Image(0, 0, 2, 2, [[1, 2], [3, 4]]) b = Image(0, 0, 5, 5) result = mirror(a, b, pad=1) - expected = np.array([ - [1, 2, 0, 2, 1], - [3, 4, 0, 4, 3], - [0, 0, 0, 0, 0], - [3, 4, 0, 4, 3], - [1, 2, 0, 2, 1] - ]) + expected = np.array( + [ + [1, 2, 0, 2, 1], + [3, 4, 0, 4, 3], + [0, 0, 0, 0, 0], + [3, 4, 0, 4, 3], + [1, 2, 0, 2, 1], + ] + ) self.assertTrue(np.array_equal(result.mask, expected)) diff --git a/tests/test_image_func1.py b/tests/test_image_func1.py new file mode 100644 index 0000000..bc7ca84 --- /dev/null +++ b/tests/test_image_func1.py @@ -0,0 +1,167 @@ +import numpy as np +from typing import List, Tuple +import unittest + +# Assuming the Image class and all ported functions are imported here +from arclang.function import * + +class TestImageFunctions(unittest.TestCase): + def setUp(self): + # Create some test images + self.img1 = Image(0, 0, 5, 5, np.array([ + [1, 1, 0, 2, 2], + [1, 1, 0, 2, 2], + [0, 0, 0, 0, 0], + [3, 3, 0, 4, 4], + [3, 3, 0, 4, 4] + ])) + self.img2 = Image(0, 0, 5, 5, np.array([ + [1, 1, 1, 1, 1], + [1, 2, 2, 2, 1], + [1, 2, 3, 2, 1], + [1, 2, 2, 2, 1], + [1, 1, 1, 1, 1] + ])) + self.img3 = Image(0, 0, 5, 5, np.array([ + [1, 0, 1, 0, 1], + [0, 0, 0, 0, 0], + [2, 0, 2, 0, 2], + [0, 0, 0, 0, 0], + [3, 0, 3, 0, 3] + ])) + + def test_split_all(self): + result = split_all(self.img1) + self.assertEqual(len(result), 4) + self.assertTrue(all(isinstance(img, Image) for img in result)) + + def test_erase_col(self): + result = erase_col(self.img2, 2) + expected = Image(0, 0, 5, 5, np.array([ + [1, 1, 1, 1, 1], + [1, 0, 0, 0, 1], + [1, 0, 3, 0, 1], + [1, 0, 0, 0, 1], + [1, 1, 1, 1, 1] + ])) + self.assertTrue(np.array_equal(result.mask, expected.mask)) + + def test_inside_marked(self): + result = inside_marked(self.img2) + self.assertGreater(len(result), 0) + self.assertTrue(all(isinstance(img, Image) for img in result)) + + def test_make_border(self): + result = make_border(self.img1) + self.assertEqual(result.w, 5) + self.assertEqual(result.h, 5) + self.assertTrue(np.any(result.mask == 1)) + + def test_make_border2(self): + result = make_border2(self.img1) + self.assertEqual(result.w, 7) + self.assertEqual(result.h, 7) + + def test_compress2(self): + result = compress2(self.img1) + self.assertEqual(result.w, 4) + self.assertEqual(result.h, 4) + + + def test_greedy_fill(self): + pieces = [(1, [1, 1, 1, 1])] + done = np.zeros((5, 5), dtype=int) + result = greedy_fill(self.img1, pieces, done, 2, 2, 1000) + self.assertIsNotNone(result) + + def test_greedy_fill_black(self): + result = greedy_fill_black(self.img1) + self.assertIsNotNone(result) + + def test_greedy_fill_black2(self): + result = greedy_fill_black2(self.img1) + self.assertIsNotNone(result) + + def test_extend2(self): + room = Image(0, 0, 7, 7) + result = extend2(self.img1, room) + self.assertEqual(result.w, 7) + self.assertEqual(result.h, 7) + + def test_connect(self): + result = connect(self.img3, 0) + self.assertTrue(np.any(result.mask != 0)) + + def test_replace_template(self): + template = Image(0, 0, 2, 2, np.array([[1, 1], [1, 1]])) + marked = Image(0, 0, 2, 2, np.array([[2, 2], [2, 2]])) + result = replace_template(self.img1, template, marked) + self.assertTrue(np.any(result.mask == 2)) + + def test_swap_template(self): + a = Image(0, 0, 2, 2, np.array([[1, 1], [1, 1]])) + b = Image(0, 0, 2, 2, np.array([[2, 2], [2, 2]])) + result = swap_template(self.img1, a, b) + self.assertTrue(np.any(result.mask == 2)) + + def test_spread_cols(self): + result = spread_cols(self.img1) + self.assertTrue(np.all(result.mask != 0)) + + def test_split_columns(self): + result = split_columns(self.img1) + self.assertEqual(len(result), 5) + self.assertTrue(all(img.w == 1 for img in result)) + + def test_split_rows(self): + result = split_rows(self.img1) + self.assertEqual(len(result), 5) + self.assertTrue(all(img.h == 1 for img in result)) + + def test_half(self): + result = half(self.img1, 0) + self.assertEqual(result.w, 2) + self.assertEqual(result.h, 5) + + def test_smear_each(self): + result = smear_each(self.img1, 0) + self.assertTrue(np.any(result.mask != self.img1.mask)) + + def test_mirror2(self): + line = Image(0, 0, 5, 1) + result = mirror2(self.img1, line) + self.assertEqual(result.h, 5) + self.assertEqual(result.w, 5) + + def test_gravity(self): + result = gravity(self.img1, 0) + self.assertGreater(len(result), 0) + self.assertTrue(all(isinstance(img, Image) for img in result)) + + def test_my_stack(self): + lens = [self.img1, self.img2] + result = my_stack_l(lens, 0) + self.assertIsNotNone(result) + + def test_stack_line(self): + shapes = [self.img1, self.img2] + result = stack_line(shapes) + self.assertIsNotNone(result) + + def test_compose_growing_slow(self): + imgs = [self.img1, self.img2] + result = compose_growing_slow(imgs) + self.assertIsNotNone(result) + + def test_compose_growing(self): + imgs = [self.img1, self.img2] + result = compose_growing(imgs) + self.assertIsNotNone(result) + + def test_pick_unique(self): + imgs = [self.img1, self.img2] + result = pick_unique(imgs, 0) + self.assertIsNotNone(result) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/test_image_func2.py b/tests/test_image_func2.py new file mode 100644 index 0000000..5f5ffa4 --- /dev/null +++ b/tests/test_image_func2.py @@ -0,0 +1,327 @@ +import numpy as np +import unittest +from typing import List, Tuple +from arclang.function import * + +class TestImageFunctions2(unittest.TestCase): + def setUp(self): + self.img1 = Image(0, 0, 5, 5, np.array([ + [1, 1, 0, 2, 2], + [1, 1, 0, 2, 2], + [0, 0, 0, 0, 0], + [3, 3, 0, 4, 4], + [3, 3, 0, 4, 4] + ])) + self.img2 = Image(0, 0, 5, 5, np.array([ + [1, 1, 1, 1, 1], + [1, 2, 2, 2, 1], + [1, 2, 3, 2, 1], + [1, 2, 2, 2, 1], + [1, 1, 1, 1, 1] + ])) + + def test_swap_template(self): + in_img = Image(0, 0, 5, 5, np.array([ + [1, 1, 1, 1, 1], + [1, 2, 2, 2, 1], + [1, 2, 2, 2, 1], + [1, 2, 2, 2, 1], + [1, 1, 1, 1, 1] + ])) + a = Image(0, 0, 3, 3, np.full((3, 3), 2)) + b = Image(0, 0, 3, 3, np.full((3, 3), 3)) + result = swap_template(in_img, a, b) + expected = np.array([ + [1, 1, 1, 1, 1], + [1, 3, 3, 3, 1], + [1, 3, 3, 3, 1], + [1, 3, 3, 3, 1], + [1, 1, 1, 1, 1] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_spread_cols(self): + img = Image(0, 0, 5, 5, np.array([ + [1, 0, 2, 0, 3], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0] + ])) + result = spread_cols(img) + expected = np.array([ + [1, 1, 2, 2, 3], + [1, 1, 2, 2, 3], + [1, 1, 2, 2, 3], + [1, 1, 2, 2, 3], + [1, 1, 2, 2, 3] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_split_columns(self): + result = split_columns(self.img1) + self.assertEqual(len(result), 5) + for i, col in enumerate(result): + self.assertEqual(col.w, 1) + self.assertEqual(col.h, 5) + self.assertTrue(np.array_equal(col.mask, self.img1.mask[:, i:i+1])) + + def test_split_rows(self): + result = split_rows(self.img1) + self.assertEqual(len(result), 5) + for i, row in enumerate(result): + self.assertEqual(row.w, 5) + self.assertEqual(row.h, 1) + self.assertTrue(np.array_equal(row.mask, self.img1.mask[i:i+1, :])) + + def test_half(self): + for i in range(4): + result = half(self.img1, i) + if i < 2: # Vertical split + self.assertEqual(result.w, 2) + self.assertEqual(result.h, 5) + else: # Horizontal split + self.assertEqual(result.w, 5) + self.assertEqual(result.h, 2) + if i % 2 == 0: # Left or top half + self.assertEqual(result.x, 0) + self.assertEqual(result.y, 0) + else: # Right or bottom half + self.assertEqual(result.x, 3 if i == 1 else 0) + self.assertEqual(result.y, 3 if i == 3 else 0) + + def test_smear(self): + img = Image(0, 0, 5, 5, np.array([ + [1, 0, 0, 0, 2], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [3, 0, 0, 0, 4] + ])) + result = smear_each(img, 6) # All directions + expected = np.array([[1, 2, 2, 2, 2], + [3, 0, 0, 0, 4], + [3, 0, 0, 0, 4], + [3, 0, 0, 0, 4], + [3, 4, 4, 4, 4]]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_mirror2(self): + img = Image(0, 0, 3, 3, np.array([ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9] + ])) + line = Image(0, 0, 3, 1) # Horizontal line + result = mirror2(img, line) + expected = np.array([ + [7, 8, 9], + [4, 5, 6], + [1, 2, 3] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + self.assertEqual(result.y, -2) # Mirrored upwards + + def test_gravity(self): + img = Image(0, 0, 5, 5, np.array([ + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [2, 0, 0, 0, 3], + [0, 0, 0, 0, 0], + [0, 4, 0, 5, 0] + ])) + result = gravity(img, 2) # Downwards + self.assertEqual(len(result), 5) # 5 components + bottom_row = np.zeros(5) + for component in result: + y = component.y + component.h - 1 + x = component.x + bottom_row[x] = component.mask[-1, 0] + self.assertTrue(np.array_equal(bottom_row, [2, 4, 1, 5, 3])) + + def test_my_stack(self): + imgs = [ + Image(0, 0, 2, 2, np.full((2, 2), 1)), + Image(0, 0, 3, 3, np.full((3, 3), 2)), + Image(0, 0, 4, 4, np.full((4, 4), 3)) + ] + result = my_stack_l(imgs, 0) # Horizontal stacking + self.assertEqual(result.w, 9) + self.assertEqual(result.h, 4) + self.assertTrue(np.all(result.mask[:2, :2] == 1)) + self.assertTrue(np.all(result.mask[:4, 5:] == 3)) + + def test_stack_line(self): + imgs = [ + Image(0, 0, 2, 2, np.full((2, 2), 1)), + Image(3, 0, 2, 2, np.full((2, 2), 2)), + Image(6, 0, 2, 2, np.full((2, 2), 3)) + ] + result = stack_line(imgs) + self.assertEqual(result.w, 6) + self.assertEqual(result.h, 2) + + + def test_stack_line_v(self): + imgs = [ + Image(0, 0, 2, 2, np.full((2, 2), 1)), + Image(3, 0, 2, 2, np.full((2, 2), 2)), + Image(6, 0, 2, 2, np.full((2, 2), 3)) + ] + result = stack_line_v(imgs) + self.assertEqual(result.w, 2) + self.assertEqual(result.h, 6) + + def test_compose_growing_slow(self): + imgs = [ + Image(0, 0, 3, 3, np.full((3, 3), 1)), + Image(1, 1, 3, 3, np.full((3, 3), 2)), + Image(2, 2, 3, 3, np.full((3, 3), 3)) + ] + result = compose_growing_slow(imgs) + expected = np.array([ + [1, 1, 1, 0, 0], + [1, 2, 2, 2, 0], + [1, 2, 3, 3, 3], + [0, 2, 3, 3, 3], + [0, 0, 3, 3, 3] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_compose_growing(self): + imgs = [ + Image(0, 0, 3, 3, np.full((3, 3), 1)), + Image(1, 1, 3, 3, np.full((3, 3), 2)), + Image(2, 2, 3, 3, np.full((3, 3), 3)) + ] + result = compose_growing(imgs) + expected = np.array([ + [1, 1, 1, 0, 0], + [1, 2, 2, 2, 0], + [1, 2, 3, 3, 3], + [0, 2, 3, 3, 3], + [0, 0, 3, 3, 3] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_pick_unique(self): + imgs = [ + Image(0, 0, 2, 2, np.full((2, 2), 1)), + Image(0, 0, 2, 2, np.full((2, 2), 2)), + Image(0, 0, 2, 2, np.array([[3, 3], [3, 4]])) + ] + result = pick_unique(imgs, 0) + self.assertTrue(np.array_equal(result.mask, np.array([[3, 3], [3, 4]]))) + + def test_greedy_fill(self): + ret = Image(0, 0, 4, 4, np.zeros((4, 4), dtype=int)) + pieces = [(2, [1, 1, 1, 1])] + done = np.zeros((4, 4), dtype=int) + donew = 1000 + result = greedy_fill(ret, pieces, done, 2, 2, donew) + expected = np.array([ + [1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_greedy_fill_black(self): + img = Image(0, 0, 4, 4, np.array([ + [1, 1, 0, 0], + [1, 1, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0] + ])) + result = greedy_fill_black(img, N=2) + expected = np.array([ + [1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_greedy_fill_black2(self): + img = Image(0, 0, 4, 4, np.array([ + [1, 1, 0, 0], + [1, 1, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0] + ])) + result = greedy_fill_black2(img, N=2) + expected = np.array([ + [0, 0, 1, 1], + [0, 0, 1, 1], + [1, 1, 1, 1], + [1, 1, 1, 1] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_extend2(self): + img = Image(0, 0, 3, 3, np.array([ + [1, 1, 1], + [1, 2, 1], + [1, 1, 1] + ])) + room = Image(0, 0, 5, 5) + result = extend2(img, room) + expected = np.array([ + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 2, 1, 1], + [1, 1, 1, 1, 1], + [1, 1, 1, 1, 1] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_connect(self): + img = Image(0, 0, 5, 5, np.array([ + [1, 0, 1, 0, 1], + [0, 0, 0, 0, 0], + [2, 0, 2, 0, 2], + [0, 0, 0, 0, 0], + [3, 0, 3, 0, 3] + ])) + result = connect(img, 0) # Horizontal + expected = np.array([ + [1, 1, 1, 1, 1], + [0, 0, 0, 0, 0], + [2, 2, 2, 2, 2], + [0, 0, 0, 0, 0], + [3, 3, 3, 3, 3] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + def test_replace_template(self): + in_img = Image(0, 0, 5, 5, np.array([ + [1, 1, 1, 1, 1], + [1, 2, 2, 2, 1], + [1, 2, 2, 2, 1], + [1, 2, 2, 2, 1], + [1, 1, 1, 1, 1] + ])) + need = Image(0, 0, 3, 3, np.array([ + [2, 2, 2], + [2, 2, 2], + [2, 2, 2] + ])) + marked = Image(0, 0, 3, 3, np.array([ + [3, 3, 3], + [3, 3, 3], + [3, 3, 3] + ])) + result = replace_template(in_img, need, marked) + expected = np.array([ + [1, 1, 1, 1, 1], + [1, 3, 3, 3, 1], + [1, 3, 3, 3, 1], + [1, 3, 3, 3, 1], + [1, 1, 1, 1, 1] + ]) + self.assertTrue(np.array_equal(result.mask, expected)) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_main.py b/tests/test_main.py index 5a51893..021d628 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,4 +1,5 @@ """Test cases for the __main__ module.""" + import pytest from click.testing import CliRunner