AdventOfCode/Python/2022/19/main.py

71 lines
2.4 KiB
Python
Raw Normal View History

2023-12-12 12:16:55 -08:00
import functools
input = open("input", 'r')
# input = open("sample", 'r')
data = []
total = 0
for line in input:
line = line.strip()
parts = line.split(".")
orecost = int(parts[0].split("costs ")[1][0])
claycost = int(parts[1].split("costs ")[1][0])
obsCostX = parts[2].split("costs ")[1]
obsCost = [int(obsCostX[0]), int(obsCostX.split("and ")[1].split(" ")[0])]
geoCostX = parts[3].split("costs ")[1]
geoCost = [int(geoCostX[0]), int(geoCostX.split("and ")[1].split(" ")[0])]
data.append([orecost, claycost, obsCost, geoCost])
@functools.cache
def maximize_geodes(i, resources, robots, time):
# Previous rounds resources
resources = (resources[0] + robots[0], resources[1] + robots[1], resources[2] + robots[2], resources[3] + robots[3])
if time >= 24:
return resources[3]
paths = [0 for i in range(5)]
if data[i][0] <= resources[0]:
# Buy Orebot
tempRobot = (robots[0] + 1, robots[1], robots[2], robots[3])
tempResources = (resources[0] - data[i][0], resources[1], resources[2], resources[3])
paths[0] = maximize_geodes(i, tempResources, tempRobot, time+1)
if data[i][1] <= resources[0]:
# Buy Claybot
tempRobot = (robots[0], robots[1]+1, robots[2], robots[3])
tempResources = (resources[0] - data[i][1], resources[1], resources[2], resources[3])
paths[1] = maximize_geodes(i, tempResources, tempRobot, time+1)
if data[i][2][0] <= resources[0] and data[i][2][1] <= resources[1]:
# Buy ObsBot
tempRobot = (robots[0], robots[1], robots[2]+1, robots[3])
tempResources = (resources[0] - data[i][2][0], resources[1]-data[i][2][1], resources[2], resources[3])
paths[1] = maximize_geodes(i, tempResources, tempRobot, time+1)
if data[i][3][0] <= resources[0] and data[i][3][1] <= resources[2]:
# Buy GeodeBot
tempRobot = (robots[0], robots[1], robots[2], robots[3]+1)
tempResources = (resources[0] - data[i][3][0], resources[1], resources[2]-data[i][3][1], resources[3])
paths[1] = maximize_geodes(i, tempResources, tempRobot, time+1)
# Do Nothing
paths[4] = maximize_geodes(i, resources, robots, time+1)
return max(paths)
ql = [0 for _ in data]
dp = [[] for minute in range(24)]
for i, bp in enumerate(data):
bpNum = i + 1
print(bpNum)
ql[i] = bpNum * maximize_geodes(i, (0,0,0,0), (1,0,0,0), 2)
print(ql)
print(sum(ql))