Пример #1
0
Файл: Run.cs Проект: zawupf/aoc
        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());
            }
        }
Пример #2
0
Файл: Run.cs Проект: zawupf/aoc
        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);
            }
        }
Пример #3
0
Файл: Run.cs Проект: zawupf/aoc
 private Reaction(Chemical[] inputs, Chemical output)
 {
     (Inputs, Output) = (inputs, output);
 }
Пример #4
0
Файл: Run.cs Проект: zawupf/aoc
 public long Take(string chemical)
 {
     return(Take(Chemical.Parse(chemical)));
 }
Пример #5
0
Файл: Run.cs Проект: zawupf/aoc
 public void Insert(Chemical chemical)
 {
     availableChemicals[chemical.Name] += chemical.Quantity;
 }
Пример #6
0
Файл: Run.cs Проект: zawupf/aoc
 public void Insert(string chemical)
 {
     Insert(Chemical.Parse(chemical));
 }