aocc22

Advent of Code 2022
git clone git://www.tkruger.se/aocc22.git
Log | Files | Refs | README

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))