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);
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #3
0
        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);
        }