public static Reaction Parse(string line) { var inOutChunks = line .Split("=>", 2, StringSplitOptions.RemoveEmptyEntries); var(inputText, outuptText) = (inOutChunks[0], inOutChunks[1]); return(new Reaction(ParseInputs(inputText), Chemical.Parse(outuptText))); Chemical[] ParseInputs(string text) { return(( from chemical in text.Split(',') select Chemical.Parse(chemical) ).ToArray()); } }
public long Take(Chemical chemical) { long available = availableChemicals[chemical.Name]; if (available >= chemical.Quantity) { availableChemicals[chemical.Name] = available - chemical.Quantity; return(chemical.Name == "ORE" ? chemical.Quantity : 0); } else { if (chemical.Name == "ORE") { throw new OutOfOreException(); } long missing = chemical.Quantity - availableChemicals[chemical.Name]; long oreCount = Produce(new Chemical(missing, chemical.Name)); availableChemicals[chemical.Name] -= chemical.Quantity; return(oreCount); } long Produce(Chemical chemical) { var reaction = reactions[chemical.Name]; var reactionCount = reaction.Output.CountFor(chemical.Quantity); var oreCount = ( from chem in reaction.Inputs select Take(chem.Times(reactionCount)) ).Sum(); var produced = reaction.Output.Quantity * reactionCount; availableChemicals[chemical.Name] += produced; return(oreCount); } }
private Reaction(Chemical[] inputs, Chemical output) { (Inputs, Output) = (inputs, output); }
public long Take(string chemical) { return(Take(Chemical.Parse(chemical))); }
public void Insert(Chemical chemical) { availableChemicals[chemical.Name] += chemical.Quantity; }
public void Insert(string chemical) { Insert(Chemical.Parse(chemical)); }