|
1012 | 1012 | "divider_packet_idx = [pairs.index(packet)+1 for packet in divider_packets]\n",
|
1013 | 1013 | "reduce(mul, divider_packet_idx)"
|
1014 | 1014 | ]
|
| 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 | + ] |
1015 | 1118 | }
|
1016 | 1119 | ],
|
1017 | 1120 | "metadata": {
|
|
0 commit comments