private void MakeResource(Resource resource, long desiredQuantity) { if (resource.Name == "ORE") { AddManufactured(resource.Name, desiredQuantity); return; } ResourceReaction reaction = _reactionMap[resource.Name]; long surplusQuatity = surplusStore.Take(resource.Name); long quantityToManufacture = desiredQuantity - surplusQuatity; long multiple = (long)Math.Ceiling((double)quantityToManufacture / (double)reaction.outputResource.Count); foreach (var input in reaction.inputResources) { long resourceCount = multiple * input.Count; if (!surplusStore.TryTake(input.Name, resourceCount)) { MakeResource(input, resourceCount); } } long produced = reaction.outputResource.Count * multiple; long surplusCount = produced - quantityToManufacture; surplusStore.Add(resource.Name, surplusCount); AddManufactured(resource.Name, quantityToManufacture); }
public void ParseInput() { List <string> lines = _input.Split("\n").ToList(); foreach (var line in lines) { ResourceReaction reaction = new ResourceReaction(line); Resources[reaction.outputResource.Name] = reaction; } }
public void ShouldParseOutputForReactionCorrectly(int lineNumber, string resourceName, int resourceCount) { // Arrange string firstLine = File.ReadAllLines(@"Inputs\Day14Example1Input.txt")[lineNumber]; string expectedName = resourceName; int expectedCount = resourceCount; // Act ResourceReaction reaction = new ResourceReaction(firstLine); string actualName = reaction.outputResource.Name; int actualCount = reaction.outputResource.Count; // Assert Assert.Equal(expectedName, actualName); Assert.Equal(expectedCount, actualCount); }