15 "cell_type": "markdown",
27 "outputs_hidden": false
35 " 'Al => ThRnFAr',\n",
42 " 'Ca => SiRnFYFAr',\n",
43 " 'Ca => SiRnMgAr',\n",
49 " 'H => CRnFYFYFAr',\n",
50 " 'H => CRnFYMgAr',\n",
51 " 'H => CRnMgYFAr',\n",
53 " 'H => NRnFYFAr',\n",
62 " 'O => CRnFYFAr',\n",
78 " 'CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl']"
83 "output_type": "execute_result"
87 "pi19 = [l.strip() for l in open('advent19.txt').readlines()]\n",
97 "outputs_hidden": false
105 " ['Al', 'ThRnFAr'],\n",
108 " ['B', 'TiRnFAr'],\n",
109 " ['Ca', 'CaCa'],\n",
111 " ['Ca', 'PRnFAr'],\n",
112 " ['Ca', 'SiRnFYFAr'],\n",
113 " ['Ca', 'SiRnMgAr'],\n",
114 " ['Ca', 'SiTh'],\n",
118 " ['H', 'CRnAlAr'],\n",
119 " ['H', 'CRnFYFYFAr'],\n",
120 " ['H', 'CRnFYMgAr'],\n",
121 " ['H', 'CRnMgYFAr'],\n",
123 " ['H', 'NRnFYFAr'],\n",
124 " ['H', 'NRnMgAr'],\n",
127 " ['H', 'ORnFAr'],\n",
129 " ['Mg', 'TiMg'],\n",
130 " ['N', 'CRnFAr'],\n",
132 " ['O', 'CRnFYFAr'],\n",
133 " ['O', 'CRnMgAr'],\n",
135 " ['O', 'NRnFAr'],\n",
139 " ['P', 'SiRnFAr'],\n",
140 " ['Si', 'CaSi'],\n",
141 " ['Th', 'ThCa'],\n",
143 " ['Ti', 'TiTi'],\n",
149 "execution_count": 3,
151 "output_type": "execute_result"
155 "rules = [r.split(' => ') for r in pi19 if '=>' in r]\n",
161 "execution_count": 4,
165 "outputs_hidden": false
172 "'CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl'"
175 "execution_count": 4,
177 "output_type": "execute_result"
187 "execution_count": 5,
191 "outputs_hidden": false
201 "execution_count": 5,
203 "output_type": "execute_result"
207 "transformed = set([])\n",
213 "execution_count": 7,
217 "outputs_hidden": false
222 "transformed = set([])\n",
224 " for m in re.finditer(r[0], base):\n",
225 " t = base[:m.start(0)] + r[1] + base[m.end(0):]\n",
226 " # print(t, m.start(0), m.end(0))\n",
227 " transformed.update([t])"
232 "execution_count": 8,
236 "outputs_hidden": false
246 "execution_count": 8,
248 "output_type": "execute_result"
256 "cell_type": "markdown",
264 "execution_count": 9,
270 "def reductions(rule, molecule):\n",
271 " return [molecule[:m.start(0)] + rule[0] + molecule[m.end(0):]\n",
272 " for m in re.finditer(rule[1], molecule)]"
277 "execution_count": 14,
281 "outputs_hidden": false
286 "#This is infeasible\n",
288 "# agenda = [(base, 0)]\n",
289 "# closed_set = set()\n",
291 "# while agenda[0][0] != 'e':\n",
292 "# # print(len(agenda), len(agenda[0][0]))\n",
293 "# current_m, current_c = agenda[0]\n",
294 "# if current_m in closed_set:\n",
295 "# agenda = agenda[1:]\n",
297 "# closed_set.update(current_m)\n",
298 "# new_molecules = [(reduced, current_c + 1) for r in rules for reduced in reductions(r, current_m)]\n",
299 "# agenda = agenda[1:] + new_molecules\n",
305 "execution_count": 15,
309 "outputs_hidden": false
319 "execution_count": 15,
321 "output_type": "execute_result"
325 "agenda = [(base, 0)]\n",
327 "while agenda[0][0] != 'e':\n",
328 " # print(len(agenda), len(agenda[0][0]))\n",
329 " current_m, current_c = agenda[0]\n",
330 " new_molecules = [(reduced, current_c + 1) \n",
331 " for r in rules \n",
332 " for reduced in reductions(r, current_m)]\n",
333 " agenda = new_molecules + agenda[1:]\n",
339 "execution_count": 11,
343 "outputs_hidden": false
349 "output_type": "stream",
351 "317 ms ± 18.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
358 "agenda = [(base, 0)]\n",
360 "while agenda[0][0] != 'e':\n",
361 " # print(len(agenda), len(agenda[0][0]))\n",
362 " current_m, current_c = agenda[0]\n",
363 " new_molecules = [(reduced, current_c + 1) for r in rules for reduced in reductions(r, current_m)]\n",
364 " agenda = sorted(agenda[1:] + new_molecules,\n",
365 " key=lambda m: len(m[0]))\n",
371 "execution_count": 12,
375 "outputs_hidden": false
381 "output_type": "stream",
383 "53.5 ms ± 1.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
390 "agenda = [(base, 0)]\n",
392 "while agenda[0][0] != 'e':\n",
393 " # print(len(agenda), len(agenda[0][0]))\n",
394 " current_m, current_c = agenda[0]\n",
395 " new_molecules = [(reduced, current_c + 1) \n",
396 " for r in rules \n",
397 " for reduced in reductions(r, current_m)]\n",
398 " agenda = new_molecules + agenda[1:]\n",
404 "execution_count": null,
414 "display_name": "Python 3 (ipykernel)",
415 "language": "python",
423 "file_extension": ".py",
424 "mimetype": "text/x-python",
426 "nbconvert_exporter": "python",
427 "pygments_lexer": "ipython3",