217 lines
5.8 KiB
Text
217 lines
5.8 KiB
Text
{
|
|
"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
|
|
}
|