Untitled
unknown
python
2 years ago
3.4 kB
1
Indexable
from pathlib import Path import hupper from string import ascii_lowercase, ascii_uppercase, punctuation from dataclasses import dataclass # input files main_input = Path(__file__).parent / "input.txt" # result of this file is XXX test_input = Path(__file__).parent / "test_input.txt" # result of this file is 33 # helper variables unwanted_chars = ascii_lowercase + ascii_uppercase + punctuation @dataclass class State(object): # All types are tuple: ore, clay, obsidian, geode ore_price: tuple clay_price: tuple obs_price: tuple geo_price: tuple mats: tuple = (0, 0, 0, 0) # initial state of material robs: tuple = (1, 0, 0, 0) # initial state of robots def get_geodes(self): minutes = 24 minute = 1 while minute != minutes+1: print(f"{minute} MINUTE") robs = self.robs mats = self.mats cur_rob = 3 # current robot build_robots = [] for rob_price in (self.geo_price, self.obs_price, self.clay_price, self.ore_price): # buy robot if I can (but only if I don't have enough robots, or do not build more robots than needed to build another robot) new_mats = [] if all( # All current mats are higher (or same) then robot prices mat >= price for mat, price in zip(mats, rob_price) ): # I can afford robot print(f"I can afford robot {cur_rob}") build_robots.append(cur_rob) for p, m in zip(rob_price, mats): print("p, m", p, m) if p <= m: m = m-p new_mats.append(m) new_mats = tuple(new_mats) print("new_mats", new_mats) self.mats = new_mats cur_rob -= 1 # All robots continue to gather material self.mats = tuple(m+r for m, r in zip(self.mats, self.robs)) print("mats", self.mats) # and increase the number of robots print(f"a tady checkuju {build_robots}") if build_robots: print("jsem zde") self.robs = tuple(r+(1 if i in build_robots else 0) for i, r in enumerate(robs)) print("robs", self.robs) minute += 1 if minute == 10: break answer = 0 states = set() # read the initial file with open(test_input, "r") as file: while line := file.readline(): for char in unwanted_chars: line = line.replace(char, "") line_list = [int(x) for x in line.split()] ( blueprint, ore_rob, clay_rob, obsidian_rob_ore, obsidian_rob_clay, geode_rob_ore, geode_rob_obs, ) = line_list state = State( ore_price=(ore_rob, 0, 0, 0), clay_price=(clay_rob, 0, 0, 0), obs_price=(obsidian_rob_ore, obsidian_rob_clay, 0, 0), geo_price=(geode_rob_ore, 0, geode_rob_obs, 0), ) state.get_geodes() #print("XXXXXXXXXXx", state.mats) #print(states) break def reload_runner(): reloader = hupper.start_reloader("puzzle_by_time.reload_runner") if __name__ == "__main__": reload_runner()
Editor is loading...