#!/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)