diff options
Diffstat (limited to '2022/day19.py')
| -rwxr-xr-x | 2022/day19.py | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/2022/day19.py b/2022/day19.py new file mode 100755 index 0000000..4d5da52 --- /dev/null +++ b/2022/day19.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 + +# import numpy as np +from functools import reduce +from re import findall +from copy import deepcopy +import sys + +# filename = "in/day19.ref" +filename = "in/day19.pzl" +data = open(filename).read() +lines = [line for line in data.rstrip('\n').split('\n')] + +bps = list() + +for line in lines: + a = line.split(' ') + b = dict() + b['num'] = int(a[1].strip(':')) + b['ore_cost_ore'] = int(a[6]) + b['cly_cost_ore'] = int(a[12]) + b['obs_cost_ore'] = int(a[18]) + b['obs_cost_cly'] = int(a[21]) + b['geo_cost_ore'] = int(a[27]) + b['geo_cost_obs'] = int(a[30]) + bps.append(b) +# print(bps) + + +def solve(time, end_time, bp, s): + m = 0 + needed_r_ore = max(bp['ore_cost_ore'], + bp['cly_cost_ore'], + bp['obs_cost_ore'], + bp['geo_cost_ore'] + ) + needed_r_cly = bp['obs_cost_cly'] + needed_r_obs = bp['geo_cost_obs'] + + r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo = s + + # if time == 10: + # print([len(i) for i in best_s]) + + if geo < best_geo[time]: + return 0 + best_geo[time] = geo + + if s in best_s[time]: + return 0 + best_s[time].add(s) + + if time == end_time: + return geo + + + # build none + r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo = s + if True: + ore += r_ore + cly += r_cly + obs += r_obs + geo += r_geo + sc = r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo + m = max(m, solve(time+1, end_time, bp, sc)) + + # build ore robot + r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo = s + if ore >= bp['ore_cost_ore'] and r_ore < needed_r_ore: + ore -= bp['ore_cost_ore'] + + ore += r_ore + cly += r_cly + obs += r_obs + geo += r_geo + r_ore += 1 + + sc = r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo + m = max(m, solve(time+1, end_time, bp, sc)) + + # build cly robot + r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo = s + if ore >= bp['cly_cost_ore'] and r_cly < needed_r_cly: + ore -= bp['cly_cost_ore'] + + ore += r_ore + cly += r_cly + obs += r_obs + geo += r_geo + r_cly += 1 + + sc = r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo + m = max(m, solve(time+1, end_time, bp, sc)) + + # build obs robot + r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo = s + if ore >= bp['obs_cost_ore'] and cly >= bp['obs_cost_cly'] and r_obs < needed_r_obs: + ore -= bp['obs_cost_ore'] + cly -= bp['obs_cost_cly'] + + ore += r_ore + cly += r_cly + obs += r_obs + geo += r_geo + r_obs += 1 + + sc = r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo + m = max(m, solve(time+1, end_time, bp, sc)) + + # build geo robot + r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo = s + if ore >= bp['geo_cost_ore'] and obs >= bp['geo_cost_obs'] : + ore -= bp['geo_cost_ore'] + obs -= bp['geo_cost_obs'] + + ore += r_ore + cly += r_cly + obs += r_obs + geo += r_geo + r_geo += 1 + + sc = r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo + m = max(m, solve(time+1, end_time, bp, sc)) + + return m + + +r_ore = 1 +r_cly = 0 +r_obs = 0 +r_geo = 0 +ore = 0 +cly = 0 +obs = 0 +geo = 0 +s = r_ore, r_cly, r_obs, r_geo, ore, cly, obs, geo + + +res1 = 0 +end_time = 24 +for num,bp in enumerate(bps): + best_s = [set() for i in range(end_time + 1)] + best_geo = [0 for i in range(end_time + 1)] + res = solve(0, end_time, bp, s) + # print(res) + res1 += (num+1) * res + +res2 = 1 +end_time = 32 +for bp in bps[:3]: + best_s = [set() for i in range(end_time + 1)] + best_geo = [0 for i in range(end_time + 1)] + res = solve(0, end_time, bp, s) + # print(res) + res2 *= res + +print('res1:', res1) +print('res2:', res2) + |
