X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent22.ipynb;fp=advent22.ipynb;h=874ce4d9e457fb5bed4943867288e895ca5935e7;hb=8e419e5f33129fae84965a39e6f3f4338e15f6d9;hp=f08ab26105f2b12fac8caf66463dc4fe71c35dfc;hpb=2b7dc1356209b2a6c81145be47e20aa1480ad080;p=advent-of-code-15.git diff --git a/advent22.ipynb b/advent22.ipynb index f08ab26..874ce4d 100644 --- a/advent22.ipynb +++ b/advent22.ipynb @@ -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 }, @@ -116,7 +116,7 @@ " 'spent': 53}" ] }, - "execution_count": 155, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -127,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 156, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -144,7 +144,7 @@ " 'spent': 0}" ] }, - "execution_count": 156, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 157, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -183,7 +183,7 @@ " 'spent': 286}" ] }, - "execution_count": 157, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -195,9 +195,9 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 37, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -212,6 +212,8 @@ " 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" @@ -219,7 +221,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 57, "metadata": { "collapsed": false }, @@ -254,7 +256,7 @@ " {'mana': 101}]}]" ] }, - "execution_count": 98, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } @@ -265,7 +267,7 @@ }, { "cell_type": "code", - "execution_count": 158, + "execution_count": 58, "metadata": { "collapsed": false }, @@ -293,7 +295,7 @@ " 'spent': 286}" ] }, - "execution_count": 158, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } @@ -306,7 +308,7 @@ }, { "cell_type": "code", - "execution_count": 159, + "execution_count": 59, "metadata": { "collapsed": false }, @@ -318,7 +320,7 @@ " {'boss_hp': -2, 'cost': 73, 'name': 'Drain', 'pc_hp': 2}]" ] }, - "execution_count": 159, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -329,7 +331,54 @@ }, { "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 }, @@ -344,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 13, "metadata": { "collapsed": true }, @@ -364,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 160, + "execution_count": 44, "metadata": { "collapsed": false }, @@ -391,7 +440,7 @@ " 'spent': 286}" ] }, - "execution_count": 160, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -402,7 +451,7 @@ }, { "cell_type": "code", - "execution_count": 161, + "execution_count": 45, "metadata": { "collapsed": false }, @@ -424,7 +473,7 @@ " 'spent': 173}" ] }, - "execution_count": 161, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -438,7 +487,7 @@ }, { "cell_type": "code", - "execution_count": 162, + "execution_count": 46, "metadata": { "collapsed": false }, @@ -456,7 +505,7 @@ " 'spent': 226}" ] }, - "execution_count": 162, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -470,7 +519,7 @@ }, { "cell_type": "code", - "execution_count": 163, + "execution_count": 47, "metadata": { "collapsed": false }, @@ -488,7 +537,7 @@ " 'spent': 229}" ] }, - "execution_count": 163, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -502,7 +551,7 @@ }, { "cell_type": "code", - "execution_count": 164, + "execution_count": 48, "metadata": { "collapsed": false }, @@ -521,7 +570,7 @@ " 'spent': 342}" ] }, - "execution_count": 164, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -535,7 +584,7 @@ }, { "cell_type": "code", - "execution_count": 165, + "execution_count": 49, "metadata": { "collapsed": false }, @@ -553,7 +602,7 @@ " 'spent': 415}" ] }, - "execution_count": 165, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -567,7 +616,7 @@ }, { "cell_type": "code", - "execution_count": 166, + "execution_count": 50, "metadata": { "collapsed": false }, @@ -590,7 +639,7 @@ " 'spent': 588}" ] }, - "execution_count": 166, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -604,7 +653,7 @@ }, { "cell_type": "code", - "execution_count": 167, + "execution_count": 51, "metadata": { "collapsed": false }, @@ -622,7 +671,7 @@ " 'spent': 641}" ] }, - "execution_count": 167, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -636,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -654,7 +703,7 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 23, "metadata": { "collapsed": false }, @@ -666,7 +715,7 @@ }, { "cell_type": "code", - "execution_count": 186, + "execution_count": 30, "metadata": { "collapsed": false }, @@ -692,7 +741,7 @@ " 'spent': 1269}" ] }, - "execution_count": 186, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -728,6 +777,111 @@ "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": {}, @@ -737,7 +891,7 @@ }, { "cell_type": "code", - "execution_count": 182, + "execution_count": 25, "metadata": { "collapsed": true }, @@ -751,7 +905,7 @@ }, { "cell_type": "code", - "execution_count": 185, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -777,7 +931,7 @@ " 'spent': 1309}" ] }, - "execution_count": 185, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -814,6 +968,28 @@ "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,