+ (map parse-reaction input)))
+
+(defn reduce-reaction [graph producing consuming]
+ (let [[inputs moles] (graph producing)
+ in-chems (keys inputs)
+ replace-term (fn [chem]
+ (if (or (= chem consuming)
+ (neg? (second (graph chem))))
+ {chem (inputs chem)}
+ (let [ch-req (inputs chem)
+ [ch-in ch-mo] (graph chem)
+ conversion (int (Math/ceil (/ ch-req ch-mo)))]
+ (assoc (mmap (partial * conversion) ch-in)
+ chem (- ch-req (* ch-mo conversion))))))
+ check-reduced (fn [[ch ct]] (and (not= ch consuming) (pos? ct)))
+ reduced-inputs (reduce (partial merge-with +)
+ (map replace-term in-chems))
+ new-graph (assoc graph producing [reduced-inputs moles])]
+ (if (some check-reduced reduced-inputs)
+ (recur new-graph producing consuming)
+ new-graph)))