15 "cell_type": "markdown",
32 " 'Al => ThRnFAr',\n",
39 " 'Ca => SiRnFYFAr',\n",
40 " 'Ca => SiRnMgAr',\n",
46 " 'H => CRnFYFYFAr',\n",
47 " 'H => CRnFYMgAr',\n",
48 " 'H => CRnMgYFAr',\n",
50 " 'H => NRnFYFAr',\n",
59 " 'O => CRnFYFAr',\n",
75 " 'CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl']"
80 "output_type": "execute_result"
84 "pi19 = [l.strip() for l in open('advent19.txt').readlines()]\n",
99 " ['Al', 'ThRnFAr'],\n",
102 " ['B', 'TiRnFAr'],\n",
103 " ['Ca', 'CaCa'],\n",
105 " ['Ca', 'PRnFAr'],\n",
106 " ['Ca', 'SiRnFYFAr'],\n",
107 " ['Ca', 'SiRnMgAr'],\n",
108 " ['Ca', 'SiTh'],\n",
112 " ['H', 'CRnAlAr'],\n",
113 " ['H', 'CRnFYFYFAr'],\n",
114 " ['H', 'CRnFYMgAr'],\n",
115 " ['H', 'CRnMgYFAr'],\n",
117 " ['H', 'NRnFYFAr'],\n",
118 " ['H', 'NRnMgAr'],\n",
121 " ['H', 'ORnFAr'],\n",
123 " ['Mg', 'TiMg'],\n",
124 " ['N', 'CRnFAr'],\n",
126 " ['O', 'CRnFYFAr'],\n",
127 " ['O', 'CRnMgAr'],\n",
129 " ['O', 'NRnFAr'],\n",
133 " ['P', 'SiRnFAr'],\n",
134 " ['Si', 'CaSi'],\n",
135 " ['Th', 'ThCa'],\n",
137 " ['Ti', 'TiTi'],\n",
143 "execution_count": 2,
145 "output_type": "execute_result"
149 "rules = [r.split(' => ') for r in pi19 if '=>' in r]\n",
155 "execution_count": 8,
163 "'CRnSiRnCaPTiMgYCaPTiRnFArSiThFArCaSiThSiThPBCaCaSiRnSiRnTiTiMgArPBCaPMgYPTiRnFArFArCaSiRnBPMgArPRnCaPTiRnFArCaSiThCaCaFArPBCaCaPTiTiRnFArCaSiRnSiAlYSiThRnFArArCaSiRnBFArCaCaSiRnSiThCaCaCaFYCaPTiBCaSiThCaSiThPMgArSiRnCaPBFYCaCaFArCaCaCaCaSiThCaSiRnPRnFArPBSiThPRnFArSiRnMgArCaFYFArCaSiRnSiAlArTiTiTiTiTiTiTiRnPMgArPTiTiTiBSiRnSiAlArTiTiRnPMgArCaFYBPBPTiRnSiRnMgArSiThCaFArCaSiThFArPRnFArCaSiRnTiBSiThSiRnSiAlYCaFArPRnFArSiThCaFArCaCaSiThCaCaCaSiRnPRnCaFArFYPMgArCaPBCaPBSiRnFYPBCaFArCaSiAl'"
166 "execution_count": 8,
168 "output_type": "execute_result"
178 "execution_count": 5,
189 "execution_count": 5,
191 "output_type": "execute_result"
195 "transformed = set([])\n",
201 "execution_count": 18,
207 "transformed = set([])\n",
209 " for m in re.finditer(r[0], target):\n",
210 " t = base[:m.start(0)] + r[1] + base[m.end(0):]\n",
211 " # print(t, m.start(0), m.end(0))\n",
212 " transformed.update([t])"
217 "execution_count": 19,
228 "execution_count": 19,
230 "output_type": "execute_result"
238 "cell_type": "markdown",
246 "execution_count": 48,
252 "def reductions(rule, molecule):\n",
253 " return [molecule[:m.start(0)] + rule[0] + molecule[m.end(0):]\n",
254 " for m in re.finditer(rule[1], molecule)]"
259 "execution_count": 76,
265 "#This is infeasible\n",
267 "#agenda = [(base, 0)]\n",
268 "#closed_set = set()\n",
270 "#while agenda[0][0] != 'e':\n",
271 "# # print(len(agenda), len(agenda[0][0]))\n",
272 "# current_m, current_c = agenda[0]\n",
273 "# if current_m in closed_set:\n",
274 "# agenda = agenda[1:]\n",
276 "# closed_set.update(current_m)\n",
277 "# new_molecules = [(reduced, current_c + 1) for r in rules for reduced in reductions(r, current_m)]\n",
278 "# agenda = agenda[1:] + new_molecules\n",
284 "execution_count": 75,
295 "execution_count": 75,
297 "output_type": "execute_result"
301 "agenda = [(base, 0)]\n",
303 "while agenda[0][0] != 'e':\n",
304 " # print(len(agenda), len(agenda[0][0]))\n",
305 " current_m, current_c = agenda[0]\n",
306 " new_molecules = [(reduced, current_c + 1) \n",
307 " for r in rules \n",
308 " for reduced in reductions(r, current_m)]\n",
309 " agenda = new_molecules + agenda[1:]\n",
315 "execution_count": 73,
322 "output_type": "stream",
324 "1 loops, best of 3: 281 ms per loop\n"
331 "agenda = [(base, 0)]\n",
333 "while agenda[0][0] != 'e':\n",
334 " # print(len(agenda), len(agenda[0][0]))\n",
335 " current_m, current_c = agenda[0]\n",
336 " new_molecules = [(reduced, current_c + 1) for r in rules for reduced in reductions(r, current_m)]\n",
337 " agenda = sorted(agenda[1:] + new_molecules,\n",
338 " key=lambda m: len(m[0]))\n",
344 "execution_count": 74,
351 "output_type": "stream",
353 "10 loops, best of 3: 44.4 ms per loop\n"
360 "agenda = [(base, 0)]\n",
362 "while agenda[0][0] != 'e':\n",
363 " # print(len(agenda), len(agenda[0][0]))\n",
364 " current_m, current_c = agenda[0]\n",
365 " new_molecules = [(reduced, current_c + 1) \n",
366 " for r in rules \n",
367 " for reduced in reductions(r, current_m)]\n",
368 " agenda = new_molecules + agenda[1:]\n",
374 "execution_count": null,
384 "display_name": "Python 3",
385 "language": "python",
393 "file_extension": ".py",
394 "mimetype": "text/x-python",
396 "nbconvert_exporter": "python",
397 "pygments_lexer": "ipython3",