コード例 #1
0
ファイル: Day14.cs プロジェクト: stames/aoc
        public Nanofactory(List <string> reactionList)
        {
            foreach (var l in reactionList)
            {
                List <InputOutputChemical> reactionInputs = new List <InputOutputChemical>();

                var equationSides     = l.Split("=>");
                var outputChemicalStr = equationSides.Last().Trim().Split(' ').Last();
                int outputChemicalAmt = int.Parse(equationSides.Last().Trim().Split(' ').First());

                var outputProduction = new InputOutputChemical {
                    Amount = outputChemicalAmt, Chemical = outputChemicalStr
                };

                var inputChemicals = equationSides.First().Split(',');
                foreach (var c in inputChemicals)
                {
                    var inputChemStr = c.Trim().Split(' ').Last();
                    int inputChemAmt = int.Parse(c.Trim().Split(' ').First());

                    reactionInputs.Add(new InputOutputChemical {
                        Amount = inputChemAmt, Chemical = inputChemStr
                    });
                }

                Reactions.Add(outputProduction.Chemical, new Reaction {
                    Output = outputProduction, RequiredInputs = reactionInputs
                });
            }
        }
コード例 #2
0
ファイル: Day14.cs プロジェクト: stames/aoc
        public void RunFactory(InputOutputChemical request)
        {
            if (request.Chemical.Equals("ORE"))
            {
                OreCount += request.Amount;
                return;
            }

            // if we have extra
            if (ExtraMaterials.ContainsKey(request.Chemical))
            {
                if (ExtraMaterials[request.Chemical] < request.Amount)
                {
                    request.Amount -= ExtraMaterials[request.Chemical];
                    ExtraMaterials[request.Chemical] = 0;
                }
                else
                {
                    ExtraMaterials[request.Chemical] -= request.Amount;
                    return;
                }
            }

            var reaction = Reactions[request.Chemical];

            // how many times we need to run the reaction
            var reactionCount = (int)Math.Ceiling(request.Amount / (double)reaction.Output.Amount);

            // go through each input for the reaction that's needed
            // to create this amount of output
            foreach (var p in reaction.RequiredInputs)
            {
                RunFactory(new InputOutputChemical {
                    Amount = p.Amount * reactionCount, Chemical = p.Chemical
                });
            }

            // if the reaction creates more output than was in the request,
            // store it for another potential use
            if (reaction.Output.Amount * reactionCount > request.Amount)
            {
                if (ExtraMaterials.ContainsKey(reaction.Output.Chemical))
                {
                    ExtraMaterials[reaction.Output.Chemical] += (reaction.Output.Amount * reactionCount) - request.Amount;
                }
                else
                {
                    ExtraMaterials.Add(reaction.Output.Chemical, (reaction.Output.Amount * reactionCount) - request.Amount);
                }
            }
        }