|
1207 | 1207 | "sensor = get_first_possible_sensor_position(sensors, beacons)\n",
|
1208 | 1208 | "get_tuning_freqency(sensor)"
|
1209 | 1209 | ]
|
| 1210 | + }, |
| 1211 | + { |
| 1212 | + "attachments": {}, |
| 1213 | + "cell_type": "markdown", |
| 1214 | + "metadata": {}, |
| 1215 | + "source": [ |
| 1216 | + "## Day 16: Proboscidea Volcanium\n", |
| 1217 | + "\n", |
| 1218 | + "What is the most pressure you can release?" |
| 1219 | + ] |
| 1220 | + }, |
| 1221 | + { |
| 1222 | + "cell_type": "code", |
| 1223 | + "execution_count": null, |
| 1224 | + "metadata": {}, |
| 1225 | + "outputs": [], |
| 1226 | + "source": [ |
| 1227 | + "from collections import namedtuple\n", |
| 1228 | + "\n", |
| 1229 | + "def get_flow_rate_and_neighbors_per_valve(lines):\n", |
| 1230 | + " flow_rates = {}\n", |
| 1231 | + " neighbors = {}\n", |
| 1232 | + " for line in lines:\n", |
| 1233 | + " line = line.replace('=', ' ').replace(';', '').replace(',', '').split()\n", |
| 1234 | + " valve = line[1]\n", |
| 1235 | + " flow_rates[valve] = int(line[5])\n", |
| 1236 | + " neighbors[valve] = line[10:]\n", |
| 1237 | + " return flow_rates, neighbors\n", |
| 1238 | + "\n", |
| 1239 | + "def get_released_pressure_for_next_minute(state):\n", |
| 1240 | + " return state.released_pressure + sum([flow_rates[valve] for valve in state.opened_valves])\n", |
| 1241 | + "\n", |
| 1242 | + "def is_valve_openable(flow_rates, state, valve):\n", |
| 1243 | + " return valve not in state.opened_valves and flow_rates[valve] > 0\n", |
| 1244 | + "\n", |
| 1245 | + "max_minutes = 30\n", |
| 1246 | + "State = namedtuple('State', 'minute opened_valves current_valve released_pressure')\n", |
| 1247 | + "\n", |
| 1248 | + "lines = open('16_input.txt', 'r').readlines()\n", |
| 1249 | + "lines = [line.strip() for line in lines]\n", |
| 1250 | + "\n", |
| 1251 | + "flow_rates, neighbors = get_flow_rate_and_neighbors_per_valve(lines)\n", |
| 1252 | + "\n", |
| 1253 | + "states_to_visit = [State(0, [], 'AA', 0)]\n", |
| 1254 | + "visited_states = set()\n", |
| 1255 | + "max_released_pressure = 0\n", |
| 1256 | + "\n", |
| 1257 | + "while states_to_visit:\n", |
| 1258 | + " state = states_to_visit.pop(0)\n", |
| 1259 | + " if state.minute == max_minutes:\n", |
| 1260 | + " max_released_pressure = max(state.released_pressure, max_released_pressure)\n", |
| 1261 | + " continue\n", |
| 1262 | + " if (tuple(state.opened_valves), state.current_valve) in visited_states:\n", |
| 1263 | + " continue\n", |
| 1264 | + " \n", |
| 1265 | + " next_minute = state.minute + 1\n", |
| 1266 | + " released_pressure = get_released_pressure_for_next_minute(state)\n", |
| 1267 | + " visited_states.add((tuple(state.opened_valves), state.current_valve))\n", |
| 1268 | + "\n", |
| 1269 | + " if is_valve_openable(flow_rates, state, state.current_valve):\n", |
| 1270 | + " states_to_visit.append(State(next_minute, state.opened_valves+[state.current_valve], state.current_valve, released_pressure))\n", |
| 1271 | + "\n", |
| 1272 | + " for neighbor in neighbors[state.current_valve]:\n", |
| 1273 | + " states_to_visit.append(State(next_minute, state.opened_valves, neighbor, released_pressure))\n", |
| 1274 | + "\n", |
| 1275 | + "max_released_pressure" |
| 1276 | + ] |
| 1277 | + }, |
| 1278 | + { |
| 1279 | + "attachments": {}, |
| 1280 | + "cell_type": "markdown", |
| 1281 | + "metadata": {}, |
| 1282 | + "source": [ |
| 1283 | + "With you and an elephant working together for 26 minutes, what is the most pressure you could release?" |
| 1284 | + ] |
| 1285 | + }, |
| 1286 | + { |
| 1287 | + "cell_type": "code", |
| 1288 | + "execution_count": null, |
| 1289 | + "metadata": {}, |
| 1290 | + "outputs": [], |
| 1291 | + "source": [ |
| 1292 | + "#TODO" |
| 1293 | + ] |
1210 | 1294 | }
|
1211 | 1295 | ],
|
1212 | 1296 | "metadata": {
|
|
0 commit comments