Not everything done
This commit is contained in:
commit
2773df212e
16 changed files with 8761 additions and 0 deletions
217
aoc7.ipynb
Normal file
217
aoc7.ipynb
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
{
|
||||
"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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue