コード例 #1
0
ファイル: Program.cs プロジェクト: evanc5/advent-of-code-2019
        private static void Part1()
        {
            Stopwatch sw = Stopwatch.StartNew();

            Refinery refinery = new Refinery();

            refinery.Unrefine(new KeyValuePair <string, int>("FUEL", 1));

            Console.WriteLine($"Part 1: {refinery.GetOre()}");

            sw.Stop();
            Debug.WriteLine(sw.Elapsed);
        }
コード例 #2
0
ファイル: Solver.cs プロジェクト: ClxS/Advent-of-Code-2019
        public long Solve(Data inputData)
        {
            var refinery = Refinery.Create(inputData.ReactionRecipes);

            var oreRequiredForOne = refinery.GetOreRequirement(Product.Get("FUEL")).Count;

            if (inputData.OreBudget <= 0)
            {
                return(oreRequiredForOne);
            }

            var minGuess = (long)(inputData.OreBudget / (decimal)oreRequiredForOne);
            var hitMin   = false;

            // Increase by an assumed difference until we get just over, then move backwards until we're in range.
            while (true)
            {
                var count = refinery.GetOreRequirement(Product.Get("FUEL"), minGuess).Count;
                if (count > inputData.OreBudget)
                {
                    minGuess--;
                    hitMin = true;
                }
                else if (count < inputData.OreBudget)
                {
                    if (hitMin)
                    {
                        break;
                    }

                    minGuess += (long)Math.Ceiling((inputData.OreBudget - count) / (decimal)oreRequiredForOne);
                }
                else if (count == inputData.OreBudget)
                {
                    break;
                }
            }

            return(minGuess);
        }