Skip to content

Commit 1b07635

Browse files
2022: Add day 14.
1 parent 44cd8c6 commit 1b07635

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

2022/advent_of_code_2022.ipynb

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,109 @@
10121012
"divider_packet_idx = [pairs.index(packet)+1 for packet in divider_packets]\n",
10131013
"reduce(mul, divider_packet_idx)"
10141014
]
1015+
},
1016+
{
1017+
"attachments": {},
1018+
"cell_type": "markdown",
1019+
"metadata": {},
1020+
"source": [
1021+
"## Day 14: Regolith Reservoir\n",
1022+
"\n",
1023+
"How many units of sand come to rest before sand starts flowing into the abyss below?"
1024+
]
1025+
},
1026+
{
1027+
"cell_type": "code",
1028+
"execution_count": null,
1029+
"metadata": {},
1030+
"outputs": [],
1031+
"source": [
1032+
"from re import split\n",
1033+
"\n",
1034+
"def get_rock(lines):\n",
1035+
" rock = set()\n",
1036+
" for line in lines:\n",
1037+
" numbers = split(r'\\D+', line)\n",
1038+
" for i in range(0, len(numbers)-2, 2):\n",
1039+
" x1 = int(numbers[i:i+1][0])\n",
1040+
" y1 = int(numbers[i+1:i+2][0])\n",
1041+
" x2 = int(numbers[i+2:i+3][0])\n",
1042+
" y2 = int(numbers[i+3:i+4][0])\n",
1043+
" start_x, end_x = min(x1, x2), max(x1, x2)\n",
1044+
" start_y, end_y = min(y1, y2), max(y1, y2)\n",
1045+
" for x in range(start_x, end_x+1):\n",
1046+
" for y in range(start_y, end_y+1):\n",
1047+
" rock.add((x,y))\n",
1048+
" return rock\n",
1049+
"\n",
1050+
"def get_ground_level(rocks):\n",
1051+
" return max([rock[1] for rock in rocks])\n",
1052+
"\n",
1053+
"def move_grain(grain, blocked):\n",
1054+
" y = grain[1]+1\n",
1055+
" down = (grain[0], y)\n",
1056+
" if down not in blocked:\n",
1057+
" return down\n",
1058+
" diagonal_left = (grain[0]-1, y)\n",
1059+
" if diagonal_left not in blocked:\n",
1060+
" return diagonal_left\n",
1061+
" diagonal_right = (grain[0]+1, y)\n",
1062+
" if diagonal_right not in blocked:\n",
1063+
" return diagonal_right\n",
1064+
" return None\n",
1065+
"\n",
1066+
"lines = open('14_input.txt', 'r').readlines()\n",
1067+
"lines = [line.strip() for line in lines]\n",
1068+
"\n",
1069+
"rocks = get_rock(lines)\n",
1070+
"ground_level = get_ground_level(rocks)\n",
1071+
"\n",
1072+
"resting_sand = set()\n",
1073+
"grain = (500, 0)\n",
1074+
"\n",
1075+
"while grain[1] <= ground_level:\n",
1076+
" moved_grain = move_grain(grain, rocks.union(resting_sand))\n",
1077+
" if moved_grain is None:\n",
1078+
" resting_sand.add(grain)\n",
1079+
" grain = (500, 0)\n",
1080+
" else:\n",
1081+
" grain = moved_grain\n",
1082+
"\n",
1083+
"len(resting_sand)"
1084+
]
1085+
},
1086+
{
1087+
"attachments": {},
1088+
"cell_type": "markdown",
1089+
"metadata": {},
1090+
"source": [
1091+
"How many units of sand come to rest?"
1092+
]
1093+
},
1094+
{
1095+
"cell_type": "code",
1096+
"execution_count": null,
1097+
"metadata": {},
1098+
"outputs": [],
1099+
"source": [
1100+
"rocks_and_sand = get_rock(lines)\n",
1101+
"num_rocks = len(rocks_and_sand)\n",
1102+
"ground_level = get_ground_level(rocks) + 2\n",
1103+
"\n",
1104+
"grain = (500, 0)\n",
1105+
"while True:\n",
1106+
" moved_grain = move_grain(grain, rocks_and_sand)\n",
1107+
" if moved_grain is None and grain == (500, 0):\n",
1108+
" rocks_and_sand.add(grain)\n",
1109+
" break\n",
1110+
" if moved_grain is None or moved_grain[1] == ground_level:\n",
1111+
" rocks_and_sand.add(grain)\n",
1112+
" grain = (500, 0)\n",
1113+
" else:\n",
1114+
" grain = moved_grain\n",
1115+
"\n",
1116+
"len(rocks_and_sand) - num_rocks"
1117+
]
10151118
}
10161119
],
10171120
"metadata": {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy