From dac3ccfcb2b4fd16db0c9b53948142147000da4f Mon Sep 17 00:00:00 2001 From: Dazbo Date: Sat, 2 Dec 2023 07:03:03 +0000 Subject: [PATCH] 2023d02 done --- .../Dazbo's_Advent_of_Code_2023.ipynb | 459 ++++++++++-------- src/AoC_2023/d02/input/input.txt | Bin 0 -> 10720 bytes 2 files changed, 257 insertions(+), 202 deletions(-) create mode 100644 src/AoC_2023/d02/input/input.txt diff --git a/src/AoC_2023/Dazbo's_Advent_of_Code_2023.ipynb b/src/AoC_2023/Dazbo's_Advent_of_Code_2023.ipynb index 11b91b0e..34cf95f1 100644 --- a/src/AoC_2023/Dazbo's_Advent_of_Code_2023.ipynb +++ b/src/AoC_2023/Dazbo's_Advent_of_Code_2023.ipynb @@ -47,118 +47,19 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "id": "9Dgeww1rMrkQ", "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: jupyterlab-lsp in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (5.0.0)\n", - "Requirement already satisfied: colorama in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (0.4.6)\n", - "Requirement already satisfied: python-dotenv in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (0.21.0)\n", - "Requirement already satisfied: ipykernel in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (6.25.0)\n", - "Requirement already satisfied: jupyter-lsp>=2.0.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab-lsp) (2.2.0)\n", - "Requirement already satisfied: jupyterlab<5.0.0a0,>=4.0.6 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab-lsp) (4.0.7)\n", - "Requirement already satisfied: comm>=0.1.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (0.1.2)\n", - "Requirement already satisfied: debugpy>=1.6.5 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (1.6.7)\n", - "Requirement already satisfied: ipython>=7.23.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (8.15.0)\n", - "Requirement already satisfied: jupyter-client>=6.1.12 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (7.4.9)\n", - "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (5.3.0)\n", - "Requirement already satisfied: matplotlib-inline>=0.1 in c:\\users\\djl\\appdata\\roaming\\python\\python311\\site-packages (from ipykernel) (0.1.6)\n", - "Requirement already satisfied: nest-asyncio in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (1.5.6)\n", - "Requirement already satisfied: packaging in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (23.1)\n", - "Requirement already satisfied: psutil in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (5.9.0)\n", - "Requirement already satisfied: pyzmq>=20 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (25.1.1)\n", - "Requirement already satisfied: tornado>=6.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (6.3.3)\n", - "Requirement already satisfied: traitlets>=5.4.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipykernel) (5.7.1)\n", - "Requirement already satisfied: backcall in c:\\users\\djl\\appdata\\roaming\\python\\python311\\site-packages (from ipython>=7.23.1->ipykernel) (0.2.0)\n", - "Requirement already satisfied: decorator in c:\\users\\djl\\appdata\\roaming\\python\\python311\\site-packages (from ipython>=7.23.1->ipykernel) (5.1.1)\n", - "Requirement already satisfied: jedi>=0.16 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.18.1)\n", - "Requirement already satisfied: pickleshare in c:\\users\\djl\\appdata\\roaming\\python\\python311\\site-packages (from ipython>=7.23.1->ipykernel) (0.7.5)\n", - "Requirement already satisfied: prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (3.0.36)\n", - "Requirement already satisfied: pygments>=2.4.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (2.15.1)\n", - "Requirement already satisfied: stack-data in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from ipython>=7.23.1->ipykernel) (0.2.0)\n", - "Requirement already satisfied: entrypoints in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-client>=6.1.12->ipykernel) (0.4)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-client>=6.1.12->ipykernel) (2.8.2)\n", - "Requirement already satisfied: platformdirs>=2.5 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (3.10.0)\n", - "Requirement already satisfied: pywin32>=300 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (305.1)\n", - "Requirement already satisfied: jupyter-server>=1.1.2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.10.0)\n", - "Requirement already satisfied: async-lru>=1.0.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2.0.4)\n", - "Requirement already satisfied: jinja2>=3.0.3 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (3.1.2)\n", - "Requirement already satisfied: jupyterlab-server<3,>=2.19.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2.22.0)\n", - "Requirement already satisfied: notebook-shim>=0.2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (0.2.2)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.0 in c:\\users\\djl\\appdata\\roaming\\python\\python311\\site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel) (0.8.3)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jinja2>=3.0.3->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2.1.1)\n", - "Requirement already satisfied: anyio>=3.1.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (3.5.0)\n", - "Requirement already satisfied: argon2-cffi in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (21.3.0)\n", - "Requirement already satisfied: jupyter-events>=0.6.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.6.3)\n", - "Requirement already satisfied: jupyter-server-terminals in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.4.4)\n", - "Requirement already satisfied: nbconvert>=6.4.4 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (6.5.4)\n", - "Requirement already satisfied: nbformat>=5.3.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (5.9.2)\n", - "Requirement already satisfied: overrides in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (7.4.0)\n", - "Requirement already satisfied: prometheus-client in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.14.1)\n", - "Requirement already satisfied: pywinpty in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.0.10)\n", - "Requirement already satisfied: send2trash>=1.8.2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.8.2)\n", - "Requirement already satisfied: terminado>=0.8.3 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.17.1)\n", - "Requirement already satisfied: websocket-client in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.58.0)\n", - "Requirement already satisfied: babel>=2.10 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2.11.0)\n", - "Requirement already satisfied: json5>=0.9.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (0.9.6)\n", - "Requirement already satisfied: jsonschema>=4.17.3 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (4.17.3)\n", - "Requirement already satisfied: requests>=2.28 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2.31.0)\n", - "Requirement already satisfied: wcwidth in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from prompt-toolkit!=3.0.37,<3.1.0,>=3.0.30->ipython>=7.23.1->ipykernel) (0.2.5)\n", - "Requirement already satisfied: six>=1.5 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel) (1.16.0)\n", - "Requirement already satisfied: executing in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (0.8.3)\n", - "Requirement already satisfied: asttokens in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (2.0.5)\n", - "Requirement already satisfied: pure-eval in c:\\users\\djl\\appdata\\roaming\\python\\python311\\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (0.2.2)\n", - "Requirement already satisfied: idna>=2.8 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from anyio>=3.1.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (3.4)\n", - "Requirement already satisfied: sniffio>=1.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from anyio>=3.1.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.2.0)\n", - "Requirement already satisfied: pytz>=2015.7 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from babel>=2.10->jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2023.3.post1)\n", - "Requirement already satisfied: attrs>=17.4.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema>=4.17.3->jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (23.1.0)\n", - "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema>=4.17.3->jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (0.18.0)\n", - "Requirement already satisfied: python-json-logger>=2.0.4 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.0.7)\n", - "Requirement already satisfied: pyyaml>=5.3 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (6.0)\n", - "Requirement already satisfied: rfc3339-validator in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.1.4)\n", - "Requirement already satisfied: rfc3986-validator>=0.1.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.1.1)\n", - "Requirement already satisfied: lxml in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (4.9.3)\n", - "Requirement already satisfied: beautifulsoup4 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (4.12.2)\n", - "Requirement already satisfied: bleach in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (4.1.0)\n", - "Requirement already satisfied: defusedxml in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.7.1)\n", - "Requirement already satisfied: jupyterlab-pygments in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.1.2)\n", - "Requirement already satisfied: mistune<2,>=0.8.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.8.4)\n", - "Requirement already satisfied: nbclient>=0.5.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.5.13)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.5.0)\n", - "Requirement already satisfied: tinycss2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.2.1)\n", - "Requirement already satisfied: fastjsonschema in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from nbformat>=5.3.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.16.2)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from requests>=2.28->jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2.0.4)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from requests>=2.28->jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (1.26.16)\n", - "Requirement already satisfied: certifi>=2017.4.17 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from requests>=2.28->jupyterlab-server<3,>=2.19.0->jupyterlab<5.0.0a0,>=4.0.6->jupyterlab-lsp) (2023.7.22)\n", - "Requirement already satisfied: argon2-cffi-bindings in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from argon2-cffi->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (21.2.0)\n", - "Requirement already satisfied: fqdn in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.5.1)\n", - "Requirement already satisfied: isoduration in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (20.11.0)\n", - "Requirement already satisfied: jsonpointer>1.13 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.1)\n", - "Requirement already satisfied: uri-template in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.3.0)\n", - "Requirement already satisfied: webcolors>=1.11 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.13)\n", - "Requirement already satisfied: cffi>=1.0.1 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from argon2-cffi-bindings->argon2-cffi->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.15.1)\n", - "Requirement already satisfied: soupsieve>1.2 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from beautifulsoup4->nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.5)\n", - "Requirement already satisfied: webencodings in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from bleach->nbconvert>=6.4.4->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (0.5.1)\n", - "Requirement already satisfied: pycparser in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.21)\n", - "Requirement already satisfied: arrow>=0.15.0 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from isoduration->jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (1.3.0)\n", - "Requirement already satisfied: types-python-dateutil>=2.8.10 in f:\\users\\darren\\anaconda3\\envs\\ana-aoc\\lib\\site-packages (from arrow>=0.15.0->isoduration->jsonschema[format-nongpl]>=3.2.0->jupyter-events>=0.6.0->jupyter-server>=1.1.2->jupyter-lsp>=2.0.0->jupyterlab-lsp) (2.8.19.14)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - } - ], + "outputs": [], "source": [ "%pip install jupyterlab-lsp colorama python-dotenv ipykernel " ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "id": "p5Ki_HvOJUWk", "tags": [] @@ -208,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "id": "SwzjfUFCKhXe", "tags": [] @@ -304,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -364,27 +265,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m18:21:18.733:__main__ - INF: Using .env at F:\\Users\\Darren\\localdev\\Python\\Advent-of-Code\\.env\u001b[39m\n" - ] - }, - { - "data": { - "text/plain": [ - "True" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "def get_envs_from_file() -> bool:\n", " \"\"\" Look for .env files, read variables from it, and store as environment variables \"\"\"\n", @@ -406,20 +289,12 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "id": "kSem0cT_LApT", "tags": [] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m18:21:18.743:__main__ - INF: Session cookie retrieved: 53616c...598658\u001b[39m\n" - ] - } - ], + "outputs": [], "source": [ "if os.getenv('AOC_SESSION_COOKIE'):\n", " logger.info('Session cookie retrieved: %s...%s', os.environ['AOC_SESSION_COOKIE'][0:6], os.environ['AOC_SESSION_COOKIE'][-6:])\n", @@ -454,7 +329,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": { "id": "VK27bcGiK0_M", "tags": [] @@ -503,7 +378,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "id": "lwP0r3BAaxjt", "tags": [] @@ -565,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "id": "Y6nbd6WMryWi", "tags": [] @@ -593,7 +468,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": { "id": "A8sU4Ez_bBKl", "tags": [] @@ -769,7 +644,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": { "id": "DT5FSYliC9wp", "tags": [] @@ -871,7 +746,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": { "id": "sbdA-geUNqAF", "tags": [] @@ -909,25 +784,12 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": { "id": "6VoMC3MaJ1I9", "tags": [] }, - "outputs": [ - { - "data": { - "text/markdown": [ - "#### See [Day 1](https://adventofcode.com/2023/day/1)." - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "DAY = 1\n", "day_link = f\"#### See [Day {DAY}](https://adventofcode.com/{YEAR}/day/{DAY}).\"\n", @@ -936,35 +798,12 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "id": "aNvM0hOF0tBR", "tags": [] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m18:27:56.107:aoc2023 - INF: Session cookie retrieved: 53616c...598658\u001b[39m\n", - "\u001b[31m18:27:56.683:aoc2023 - ERR: Unable to retrieve input data.\n", - "HTTP response: 400\n", - "Bad Request: Puzzle inputs differ by user. Please log in to get your puzzle input.\u001b[39m\n" - ] - }, - { - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: 'F:\\\\Users\\\\Darren\\\\localdev\\\\Python\\\\Advent-of-Code\\\\src\\\\AoC_2023\\\\d01\\\\input\\\\input.txt'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mf:\\Users\\Darren\\localdev\\Python\\Advent-of-Code\\src\\AoC_2023\\Dazbo's_Advent_of_Code_2023.ipynb Cell 28\u001b[0m line \u001b[0;36m1\n\u001b[0;32m 12\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mValueError\u001b[39;00m \u001b[39mas\u001b[39;00m e:\n\u001b[0;32m 13\u001b[0m logger\u001b[39m.\u001b[39merror(e)\n\u001b[1;32m---> 15\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mopen\u001b[39m(locations\u001b[39m.\u001b[39minput_file, mode\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mrt\u001b[39m\u001b[39m\"\u001b[39m) \u001b[39mas\u001b[39;00m f:\n\u001b[0;32m 16\u001b[0m input_data \u001b[39m=\u001b[39m f\u001b[39m.\u001b[39mread()\u001b[39m.\u001b[39msplitlines()\n\u001b[0;32m 18\u001b[0m logger\u001b[39m.\u001b[39minfo(\u001b[39m\"\u001b[39m\u001b[39mInput data:\u001b[39m\u001b[39m\\n\u001b[39;00m\u001b[39m%s\u001b[39;00m\u001b[39m\"\u001b[39m, top_and_tail(input_data))\n", - "File \u001b[1;32mf:\\Users\\Darren\\anaconda3\\envs\\ana-aoc\\Lib\\site-packages\\IPython\\core\\interactiveshell.py:286\u001b[0m, in \u001b[0;36m_modified_open\u001b[1;34m(file, *args, **kwargs)\u001b[0m\n\u001b[0;32m 279\u001b[0m \u001b[39mif\u001b[39;00m file \u001b[39min\u001b[39;00m {\u001b[39m0\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m2\u001b[39m}:\n\u001b[0;32m 280\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[0;32m 281\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mIPython won\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt let you open fd=\u001b[39m\u001b[39m{\u001b[39;00mfile\u001b[39m}\u001b[39;00m\u001b[39m by default \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 282\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mas it is likely to crash IPython. If you know what you are doing, \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 283\u001b[0m \u001b[39m\"\u001b[39m\u001b[39myou can use builtins\u001b[39m\u001b[39m'\u001b[39m\u001b[39m open.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 284\u001b[0m )\n\u001b[1;32m--> 286\u001b[0m \u001b[39mreturn\u001b[39;00m io_open(file, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n", - "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'F:\\\\Users\\\\Darren\\\\localdev\\\\Python\\\\Advent-of-Code\\\\src\\\\AoC_2023\\\\d01\\\\input\\\\input.txt'" - ] - } - ], + "outputs": [], "source": [ "d_name = \"d\" + str(DAY).zfill(2) # e.g. d01\n", "script_name = \"aoc\" + str(YEAR) + d_name # e.g. aoc2017d01\n", @@ -1010,7 +849,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1028,7 +867,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "id": "rhWomZ6ewNi-", "tags": [] @@ -1076,28 +915,12 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "id": "uw4xFe7R7jf0", "tags": [] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[32m18:09:29.992:aoc2023 - INF: Part 1 soln=55208\u001b[39m\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: total: 0 ns\n", - "Wall time: 2 ms\n" - ] - } - ], + "outputs": [], "source": [ "%%time\n", "sample_inputs = [[\"1abc2\", \"pqr3stu8vwx\", \"a1b2c3d4e5f\", \"treb7uchetabcdef\"]]\n", @@ -1163,7 +986,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Day 2: title" + "## Day 2: Cube Conundrum" ] }, { @@ -1210,6 +1033,238 @@ "source": [ "### Day 2 Part 1\n", "\n", + "In each game, we have a bag containing some number of red, green and blue cubes. The bag is samples several times per game. Our input data shows these random samples for each game. E.g.\n", + "\n", + "```\n", + "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green\n", + "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue\n", + "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red\n", + "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red\n", + "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green\n", + "```\n", + "\n", + "**Determine which games would have been possible if the bag had been loaded with only 12 red cubes, 13 green cubes, and 14 blue cubes. What is the sum of the IDs of those games?**\n", + "\n", + "**My solution:**\n", + "\n", + "- I create a CubeSample class to store each sample, i.e. the number of r, g, b cubes.\n", + "- I create a Game class to store the game ID and all the samples for that game.\n", + "- I parse the input with regex. There's probably a much neater way to do it, but my approach was:\n", + " - Split the game line into the game part, and the samples part. Retrieving the game ID is trivial.\n", + " - For the samples, use three separate regex patterns to determine number of r, g, b.\n", + "- Now I simply loop through each game. \n", + " - For each game, I loop through the samples. If any sample has more r, g, b than we're allowed, then this game is impossible.\n", + " - Build up a list of the games that are possible. Then sum up the IDs with a comprehension." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "@dataclass\n", + "class CubeSample:\n", + " \"\"\" A sample contains a number of red, blue, and green cubes \"\"\"\n", + " red: int=0\n", + " blue: int=0\n", + " green: int=0\n", + "\n", + "@dataclass\n", + "class Game:\n", + " \"\"\" A game has an ID, and a random number of samples \"\"\"\n", + " id: int\n", + " samples: list[CubeSample]\n", + "\n", + "def parse_input(data) -> list[Game]:\n", + " game_pattern = re.compile(r\"Game\\s+(\\d+)\")\n", + " red_pattern = re.compile(r\"(\\d+)\\s*red\")\n", + " blue_pattern = re.compile(r\"(\\d+)\\s*blue\")\n", + " green_pattern = re.compile(r\"(\\d+)\\s*green\")\n", + " \n", + " games = []\n", + " for line in data:\n", + " game_part, _, samples_part = line.partition(\":\")\n", + " game_id = int(game_pattern.findall(game_part)[0])\n", + " samples = samples_part.split(\";\")\n", + " \n", + " cube_samples = []\n", + " for sample in samples:\n", + " red_match = red_pattern.search(sample)\n", + " red = int(red_match.group(1)) if red_match else 0\n", + " blue_match = blue_pattern.search(sample)\n", + " blue = int(blue_match.group(1)) if blue_match else 0\n", + " green_match = green_pattern.search(sample)\n", + " green = int(green_match.group(1)) if green_match else 0\n", + " \n", + " cube_samples.append(CubeSample(red, blue, green))\n", + " \n", + " games.append(Game(game_id, cube_samples))\n", + " \n", + " return games\n", + " \n", + "def solve_part1(games: list[Game]):\n", + " \"\"\" Return the sum of the IDs for games that are possible. \"\"\"\n", + " \n", + " allowed_red = 12\n", + " allowed_green = 13\n", + " allowed_blue = 14\n", + " \n", + " possible_games = []\n", + " for game in games:\n", + " possible = True\n", + " for game_sample in game.samples:\n", + " if (game_sample.red > allowed_red\n", + " or game_sample.green > allowed_green\n", + " or game_sample.blue > allowed_blue):\n", + " possible = False\n", + " \n", + " if possible:\n", + " possible_games.append(game)\n", + " \n", + " return sum(game.id for game in possible_games) \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "sample_inputs = [[\"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green\",\n", + " \"Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue\",\n", + " \"Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red\",\n", + " \"Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red\",\n", + " \"Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green\"]\n", + " ]\n", + "sample_answers = [8]\n", + "\n", + "for curr_input, curr_ans in zip(sample_inputs, sample_answers):\n", + " sample_games = parse_input(curr_input)\n", + " validate(solve_part1(sample_games), curr_ans) # test with sample data\n", + "\n", + "games = parse_input(input_data)\n", + "soln = solve_part1(games)\n", + "logger.info(f\"Part 1 soln={soln}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Day 2 Part 2\n", + "\n", + "**For each game, find the minimum set of cubes that must have been present. What is the sum of the power of these sets?**\n", + "\n", + "Here, we need to look at all the samples for a given game, and determine the largest number of cubes shown of each colour, across the samples.\n", + "\n", + "**My solution:**\n", + "\n", + "Fortunately, since we already have our list of Games, this is now trivial to do. Simply iterate through the games, and for each game, iterate over all the samples. For each sample, determine if the number of any of r, g, b is greater than the biggest number of which we've found so far.\n", + "\n", + "Then, multiply the r, g, b to get the `power` of the game. Then sum up all the powers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def solve_part2(games: list[Game]):\n", + " \"\"\" Return the sum of the powers of all the games \"\"\"\n", + " game_powers = []\n", + " for game in games:\n", + " max_blue = max_green = max_red = 0\n", + " for game_sample in game.samples:\n", + " max_blue = max(max_blue, game_sample.blue)\n", + " max_green = max(max_green, game_sample.green)\n", + " max_red = max(max_red, game_sample.red)\n", + " \n", + " # We're told that power = product of r, g, b \n", + " game_powers.append(max_blue*max_green*max_red)\n", + " \n", + " return sum(game_powers) \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "sample_inputs = [[\"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green\",\n", + " \"Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue\",\n", + " \"Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red\",\n", + " \"Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red\",\n", + " \"Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green\"]\n", + " ]\n", + "sample_answers = [2286]\n", + "\n", + "for curr_input, curr_ans in zip(sample_inputs, sample_answers):\n", + " sample_games = parse_input(curr_input)\n", + " validate(solve_part2(sample_games), curr_ans) # test with sample data\n", + "\n", + "soln = solve_part2(games)\n", + "logger.info(f\"Part 2 soln={soln}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Day 3: title" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DAY = \"3\" # replace with actual number (without leading digit)\n", + "logger.setLevel(logging.DEBUG)\n", + "day_link = f\"#### See [Day {DAY}](https://adventofcode.com/{YEAR}/day/{DAY}).\"\n", + "display(Markdown(day_link))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "d_name = \"d\" + str(DAY).zfill(2) # e.g. d01\n", + "script_name = \"aoc\" + str(YEAR) + d_name # e.g. aoc2017d01\n", + "locations = get_locations(d_name)\n", + "\n", + "# SETUP LOGGING\n", + "logger.setLevel(logging.DEBUG)\n", + "# td.setup_file_logging(logger, locations.output_dir)\n", + "\n", + "# Retrieve input and store in local file\n", + "try:\n", + " write_puzzle_input_file(YEAR, DAY, locations)\n", + "except ValueError as e:\n", + " logger.error(e)\n", + "\n", + "with open(locations.input_file, mode=\"rt\") as f:\n", + " input_data = f.read().splitlines()\n", + "\n", + "logger.info(\"Input data:\\n%s\", top_and_tail(input_data))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Day 3 Part 1\n", + "\n", "Overview..." ] }, @@ -1244,7 +1299,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Day 2 Part 2\n", + "### Day 3 Part 2\n", "\n", "Overview..." ] diff --git a/src/AoC_2023/d02/input/input.txt b/src/AoC_2023/d02/input/input.txt new file mode 100644 index 0000000000000000000000000000000000000000..3eef4068a6353f33fc796a86bcc52f85f388697e GIT binary patch literal 10720 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