summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--solutions/input/14-test16
-rw-r--r--solutions/py/d14.py55
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))