{ "cells": [ { "cell_type": "markdown", "id": "34af346b-bcec-4d44-b3d9-4f3fa2caeb14", "metadata": {}, "source": [ "#### Part 1" ] }, { "cell_type": "code", "execution_count": 121, "id": "45e4c72c-1ce9-4012-9937-ac0f0d4db3c6", "metadata": {}, "outputs": [], "source": [ "from dataclasses import dataclass, field\n", "from queue import SimpleQueue" ] }, { "cell_type": "code", "execution_count": 122, "id": "a54cd000-15b6-4257-abe5-000df7ed59c5", "metadata": {}, "outputs": [], "source": [ "@dataclass\n", "class File:\n", " name: str\n", " size: int\n", "\n", "\n", "@dataclass\n", "class Dir:\n", " name: str\n", " files: list[File] = field(default_factory=list)\n", " subdirs: 'list[Dir]' = field(default_factory=list)\n", " parent: 'Dir' = None\n", " _cached_size: int = None\n", " _cached_path: str = None\n", " \n", " @property\n", " def size(self) -> int:\n", " if self._cached_size is None:\n", " self._cached_size = 0\n", " for file in self.files:\n", " self._cached_size += file.size\n", " for subdir in self.subdirs:\n", " self._cached_size += subdir.size\n", " return self._cached_size\n", " \n", " @property\n", " def path(self) -> str:\n", " if self._cached_path is None:\n", " if self.parent is None:\n", " self._cached_path = self.name\n", " else:\n", " self._cached_path = f\"{self.parent.path}{self.name}/\"\n", " self._cached_path = self._cached_path.replace(\"//\", \"/\")\n", " return self._cached_path" ] }, { "cell_type": "code", "execution_count": 123, "id": "6303fecb-3618-493d-b6fb-e9c1858af90e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('/', 44795677, 1, 8)" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with open(\"aoc7_input.txt\", \"r\") as f:\n", " root = Dir(name=\"/\")\n", " next(f)\n", " pwd = root\n", " for line in f:\n", " match line.strip().split():\n", " case [\"$\", \"cd\", \"..\"]:\n", " pwd = pwd.parent\n", " case [\"$\", \"cd\", cd]:\n", " for subdir in pwd.subdirs:\n", " if subdir.name == cd:\n", " pwd = subdir\n", " break\n", " else:\n", " raise AttributeError(f\"Folder '{cd}' not found in current dir!\")\n", " case [\"$\", \"ls\"]:\n", " ...\n", " case [\"dir\", dirname]:\n", " pwd.subdirs.append(Dir(name=dirname, parent=pwd))\n", " case [filesize, filename]:\n", " pwd.files.append(File(name=filename, size=int(filesize)))\n", "\n", "root.name, root.size, len(root.files), len(root.subdirs)" ] }, { "cell_type": "code", "execution_count": 124, "id": "8ed82a45-dd7c-4a8f-b087-bc741148da47", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1391690" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "traversible, traversed, requested = SimpleQueue(), set(), []\n", "traversible.put(root)\n", "\n", "while not traversible.empty():\n", " dir: Dir = traversible.get()\n", " if dir.path in traversed:\n", " continue\n", " if dir.size <= 100000:\n", " requested.append(dir)\n", " for subdir in dir.subdirs:\n", " traversible.put(subdir)\n", " traversed.add(dir.path)\n", "\n", "cumm_sum = sum(map(lambda x: x.size, requested))\n", "cumm_sum" ] }, { "cell_type": "markdown", "id": "a61f8782-d7f6-4908-b5b0-e7aacfec455b", "metadata": {}, "source": [ "#### Part 2" ] }, { "cell_type": "code", "execution_count": 133, "id": "22bbbeea-0e73-4d05-8637-09cbc6112a7b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "179 dirs\n" ] }, { "data": { "text/plain": [ "('dqbnbl', '/hmw/tsrqvpbq/dqbnbl/', 5469168)" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "traversible, flat_file_list = SimpleQueue(), []\n", "traversible.put(root)\n", "\n", "while not traversible.empty():\n", " dir: Dir = traversible.get()\n", " flat_file_list.append(dir)\n", " for subdir in dir.subdirs:\n", " traversible.put(subdir)\n", " traversed.add(dir.path)\n", "\n", "print(len(flat_file_list), \"dirs\")\n", "\n", "space_left = 70000000 - root.size\n", "flat_file_list.sort(key=lambda x: space_left - x.size, reverse=True)\n", "big_enough = filter(lambda x: space_left + x.size > 30000000, flat_file_list)\n", "needed_dir = next(big_enough)\n", "needed_dir.name, needed_dir.path, needed_dir.size" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.7" } }, "nbformat": 4, "nbformat_minor": 5 }