@@ -153,18 +153,23 @@ def run(self, inputValue=None):
153
153
154
154
items = [s [5 :] for s in save if s .startswith ("take" )]
155
155
156
+ tooHeavy = [] # Store all sets of items that are too heavy (can't be a subset of the answer)
157
+
156
158
vm = VM (memory )
157
159
vm .run ("\n " .join (save [:- 1 ])+ "\n " )
158
160
vm .run ("\n " .join (["drop " + item for item in items ])+ "\n " )
159
161
160
162
# Bruteforces the pressure floor by trying all item combinations
161
163
for i in range (1 , 2 ** len (items )- 1 ):
162
164
pick = [int (i ) for i in "{:08b}" .format (i )]
163
- picked = [item for i , item in enumerate (items ) if pick [i ]]
164
- # print("Trying items: {}".format(picked))
165
+ pickedItems = [item for i , item in enumerate (items ) if pick [i ]]
166
+ # print("Trying items: {}".format(pickedItems))
167
+
168
+ # Check against the invalid subsets, faster than doing it in-game
169
+ if any ([set (s ).issubset (set (pickedItems )) for s in tooHeavy ]): continue
165
170
166
171
# Pick up all selected items
167
- vm .run ("\n " .join (["take " + item for item in picked ])+ "\n " )
172
+ vm .run ("\n " .join (["take " + item for item in pickedItems ])+ "\n " )
168
173
169
174
# Activate floor
170
175
vm .run (save [- 1 ]+ "\n " )
@@ -175,9 +180,11 @@ def run(self, inputValue=None):
175
180
# print(output)
176
181
print ("Part 1: {}" .format (output [- 43 :- 37 ]))
177
182
break
183
+ elif output .find ("lighter" ) != - 1 : # Too heavy, add as invalid subset
184
+ tooHeavy .append (pickedItems )
178
185
179
186
# Drop all items that were picked up
180
- vm .run ("\n " .join (["drop " + item for item in picked ])+ "\n " )
187
+ vm .run ("\n " .join (["drop " + item for item in pickedItems ])+ "\n " )
181
188
vm .output = []
182
189
183
190
AOCUtils .printTimeTaken ()
0 commit comments