day19.py (1844B)
1 def affordable(mv, bp, s): 2 if mv == 1: # ore robit 3 return s[4] >= bp[0] 4 elif mv == 2: # clay robot 5 return s[4] >= bp[1] 6 elif mv == 3: # obsidian robot 7 return (s[4] >= bp[2] and s[5] >= bp[3]) 8 elif mv == 4: # geo robot 9 return (s[4] >= bp[4] and s[6] >= bp[5]) 10 else: 11 assert(mv == 0) 12 return True 13 14 def perform(mvs, bp, special): 15 s = [1, 0, 0, 0, 0, 0, 0, 0] 16 i = 0 17 rmin = [9999999999]*4 18 for mv in mvs: 19 if not affordable(mv, bp, s): 20 return i 21 else: 22 s[4] += s[0] 23 s[5] += s[1] 24 s[6] += s[2] 25 s[7] += s[3] 26 if mv == 1: 27 s[0] += 1 28 s[4] -= bp[0] 29 elif mv == 2: 30 s[1] += 1 31 s[4] -= bp[1] 32 elif mv == 3: 33 s[2] += 1 34 s[4] -= bp[2] 35 s[5] -= bp[3] 36 elif mv == 4: 37 s[3] += 1 38 s[4] -= bp[4] 39 s[6] -= bp[5] 40 else: 41 assert(mv == 0) 42 if i >= special: 43 if i == special: 44 special_state = s.copy() 45 if rmin[0] > s[4]: 46 rmin[0] = s[4] 47 if rmin[1] > s[5]: 48 rmin[1] = s[5] 49 if rmin[2] > s[6]: 50 rmin[2] = s[6] 51 if rmin[3] > s[7]: 52 rmin[3] = s[7] 53 i += 1 54 return (special_state, [special_state[4+i] - rmin[i] for i in range(len(rmin))]) 55 56 def parse_line(line): 57 sl = line.split() 58 return (int(sl[6]), int(sl[12]), int(sl[18]), int(sl[21]), int(sl[27]),int(sl[30])) 59 60 bps = [] 61 f = open("../day19/einput") 62 for line in f.readlines(): 63 if len(line) > 1: 64 bps.append(parse_line(line)) 65 66 print(bps) 67 68 print(perform([0,0,2,0,0,2], bps[0], 4))