diff options
| -rw-r--r-- | solutions/input/14-test1 | 6 | ||||
| -rw-r--r-- | solutions/py/d14.py | 55 |
2 files changed, 40 insertions, 21 deletions
diff --git a/solutions/input/14-test1 b/solutions/input/14-test1 deleted file mode 100644 index 65ad5cc..0000000 --- a/solutions/input/14-test1 +++ /dev/null @@ -1,6 +0,0 @@ -10 ORE => 10 A -1 ORE => 1 B -7 A, 1 B => 1 C -7 A, 1 C => 1 D -7 A, 1 D => 1 E -7 A, 1 E => 1 FUEL diff --git a/solutions/py/d14.py b/solutions/py/d14.py index dc40da6..1d628a4 100644 --- a/solutions/py/d14.py +++ b/solutions/py/d14.py @@ -6,33 +6,33 @@ class Chem(object): self.created = created self.amount = 0 - self.wants = 0 self.left_over = 0 self.producers = {} def add_producer(self, producer, amount): self.producers[producer] = amount - def queue(self, amount): - self.wants = amount - for producer, amount in self.producers.items(): - #TODO - pass - - def produce(self, amount): + def produce(self, to_create): if self.name == "ORE": - self.amount += amount + self.amount += to_create return - - productions = math.ceil(amount / self.created) + if self.left_over > 0: + if self.left_over < to_create: + to_create -= self.left_over + self.left_over = 0 + else: + self.left_over -= to_create + to_create = 0 + productions = math.ceil(to_create / self.created) self.amount += productions * self.created + self.left_over += productions * self.created - to_create for producer, amount in self.producers.items(): producer.produce(productions * amount) def __repr__(self): return str((self.name, self.amount)) -def pt1(input): +def read_chems(input): chems = {"ORE": Chem("ORE", 1)} for line in input: output = line.strip().split(" => ")[1] @@ -44,9 +44,34 @@ def pt1(input): for i in inputs.split(", "): chems[output.split(" ")[1]] \ .add_producer(chems[i.split(" ")[1]], int(i.split(" ")[0])) + return chems - chems["FUEL"].produce(1) - return chems["ORE"] +def pt1(input, amount=1): + chems = read_chems(input) + chems["FUEL"].produce(amount) + return chems["ORE"].amount def pt2(input): - return + low, high = 0, int(1e9) + target = 1000000000000 + prev_guess = 0 + while low != high: + guess = (low+high) // 2 + if guess == prev_guess: + break + prev_guess = guess + chems = read_chems(input) + chems["FUEL"].produce(guess) + if chems["ORE"].amount == target: + break + elif chems["ORE"].amount > target: + high = guess + else: + low = guess + #print(low, guess, high) + return guess + +if __name__ == "__main__": + input = open("../input/14", "r").readlines() + print(pt1(input)) + print(pt2(input)) |
