Day 23
[advent-of-code-15.git] / advent22.ipynb
index f08ab26105f2b12fac8caf66463dc4fe71c35dfc..874ce4d9e457fb5bed4943867288e895ca5935e7 100644 (file)
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": 1,
    "metadata": {
     "collapsed": true
    },
@@ -13,7 +13,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": 2,
    "metadata": {
     "collapsed": false
    },
@@ -48,7 +48,7 @@
        "   {'mana': 101}]}]"
       ]
      },
-     "execution_count": 7,
+     "execution_count": 2,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -65,7 +65,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 153,
+   "execution_count": 3,
    "metadata": {
     "collapsed": false
    },
@@ -77,7 +77,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 154,
+   "execution_count": 4,
    "metadata": {
     "collapsed": true
    },
@@ -99,7 +99,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 155,
+   "execution_count": 5,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 53}"
       ]
      },
-     "execution_count": 155,
+     "execution_count": 5,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 156,
+   "execution_count": 6,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 0}"
       ]
      },
-     "execution_count": 156,
+     "execution_count": 6,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 157,
+   "execution_count": 7,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 286}"
       ]
      },
-     "execution_count": 157,
+     "execution_count": 7,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 97,
+   "execution_count": 37,
    "metadata": {
-    "collapsed": true
+    "collapsed": false
    },
    "outputs": [],
    "source": [
     "                for status in state['ongoing']:\n",
     "                    if s in status[0]:\n",
     "                        add_this_spell = False\n",
+    "        if spell['name'] == 'Magic missile' and state['cast'] and state['cast'][-1] == 'Drain':\n",
+    "            add_this_spell = False\n",
     "        if add_this_spell:\n",
     "            valid_spells += [spell]\n",
     "    return valid_spells"
   },
   {
    "cell_type": "code",
-   "execution_count": 98,
+   "execution_count": 57,
    "metadata": {
     "collapsed": false
    },
        "   {'mana': 101}]}]"
       ]
      },
-     "execution_count": 98,
+     "execution_count": 57,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 158,
+   "execution_count": 58,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 286}"
       ]
      },
-     "execution_count": 158,
+     "execution_count": 58,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 159,
+   "execution_count": 59,
    "metadata": {
     "collapsed": false
    },
        " {'boss_hp': -2, 'cost': 73, 'name': 'Drain', 'pc_hp': 2}]"
       ]
      },
-     "execution_count": 159,
+     "execution_count": 59,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 48,
+   "execution_count": 60,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[{'boss_hp': -2, 'cost': 73, 'name': 'Drain', 'pc_hp': 2}]"
+      ]
+     },
+     "execution_count": 60,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "s4 = cast_spell(spells[1], s3)\n",
+    "valid_spells(spells, s4)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 61,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[{'boss_hp': -4, 'cost': 53, 'name': 'Magic missile'},\n",
+       " {'boss_hp': -2, 'cost': 73, 'name': 'Drain', 'pc_hp': 2}]"
+      ]
+     },
+     "execution_count": 61,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "s4 = cast_spell(spells[0], s3)\n",
+    "valid_spells(spells, s4)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 67,
+   "execution_count": 13,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 160,
+   "execution_count": 44,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 286}"
       ]
      },
-     "execution_count": 160,
+     "execution_count": 44,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 161,
+   "execution_count": 45,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 173}"
       ]
      },
-     "execution_count": 161,
+     "execution_count": 45,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 162,
+   "execution_count": 46,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 226}"
       ]
      },
-     "execution_count": 162,
+     "execution_count": 46,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 163,
+   "execution_count": 47,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 229}"
       ]
      },
-     "execution_count": 163,
+     "execution_count": 47,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 164,
+   "execution_count": 48,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 342}"
       ]
      },
-     "execution_count": 164,
+     "execution_count": 48,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 165,
+   "execution_count": 49,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 415}"
       ]
      },
-     "execution_count": 165,
+     "execution_count": 49,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 166,
+   "execution_count": 50,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 588}"
       ]
      },
-     "execution_count": 166,
+     "execution_count": 50,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 167,
+   "execution_count": 51,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 641}"
       ]
      },
-     "execution_count": 167,
+     "execution_count": 51,
      "metadata": {},
      "output_type": "execute_result"
     }
   },
   {
    "cell_type": "code",
-   "execution_count": 90,
+   "execution_count": 22,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 125,
+   "execution_count": 23,
    "metadata": {
     "collapsed": false
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 186,
+   "execution_count": 30,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 1269}"
       ]
      },
-     "execution_count": 186,
+     "execution_count": 30,
      "metadata": {},
      "output_type": "execute_result"
     }
     "current_state"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(1587, 2908)"
+      ]
+     },
+     "execution_count": 31,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(agenda), len(closed)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 65,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "{'armour': 0,\n",
+       " 'boss_damage': 9,\n",
+       " 'boss_hp': 0,\n",
+       " 'cast': ['Poison',\n",
+       "  'Recharge',\n",
+       "  'Shield',\n",
+       "  'Poison',\n",
+       "  'Drain',\n",
+       "  'Recharge',\n",
+       "  'Poison',\n",
+       "  'Magic missile',\n",
+       "  'Magic missile'],\n",
+       " 'mana': 241,\n",
+       " 'ongoing': [[{'boss_hp': -3}, {'boss_hp': -3}]],\n",
+       " 'pc_hp': 1,\n",
+       " 'spent': 1269}"
+      ]
+     },
+     "execution_count": 65,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "agenda = [initial_state]\n",
+    "closed = []\n",
+    "while agenda:\n",
+    "        current_state = agenda[0]\n",
+    "        new_states = []\n",
+    "            # print(current_state)\n",
+    "        if victory(current_state):\n",
+    "                # return current_state\n",
+    "                break\n",
+    "        for spell in valid_spells(spells, current_state):\n",
+    "                s2 = cast_spell(spell, current_state)\n",
+    "                if victory(s2):\n",
+    "                    new_states += [s2]\n",
+    "                else:\n",
+    "                    s3 = boss_turn(s2)\n",
+    "                    if victory(s3):\n",
+    "                        new_states += [s3]\n",
+    "                    if not finished(s3):\n",
+    "                        new_states += [apply_ongoing(s3)]\n",
+    "        # print(new_states)\n",
+    "        states_to_add = [s for s in new_states \n",
+    "                         if len(s['cast']) <= 50]\n",
+    "        agenda = sorted(states_to_add + agenda[1:], key=lambda s: s['spent'])\n",
+    "        # agenda = new_states + agenda[1:]\n",
+    "current_state"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 66,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(165616, 0)"
+      ]
+     },
+     "execution_count": 66,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(agenda), len(closed)"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
   },
   {
    "cell_type": "code",
-   "execution_count": 182,
+   "execution_count": 25,
    "metadata": {
     "collapsed": true
    },
   },
   {
    "cell_type": "code",
-   "execution_count": 185,
+   "execution_count": 32,
    "metadata": {
     "collapsed": false
    },
        " 'spent': 1309}"
       ]
      },
-     "execution_count": 185,
+     "execution_count": 32,
      "metadata": {},
      "output_type": "execute_result"
     }
     "current_state"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(872, 2354)"
+      ]
+     },
+     "execution_count": 33,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(agenda), len(closed)"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,