示例#1
0
        public string Answer()
        {
            ReactionPerProduct = File.ReadAllLines("D14.txt").Select(s => Reaction.FromString(s)).ToDictionary(r => r.Product.ReactantName);

            foreach (var r in ReactionPerProduct.Keys)
            {
                Storage[r] = 0;
            }

            var fuel = Maths.LongBinarySearch(0, (long)1e12, numFuel => {
                OreRequired = 0;
                ProduceReactantOrder(new ReactantOrder("FUEL", numFuel));
                return(OreRequired > 1e12);
            });

            return(fuel.ToString());
        }
示例#2
0
        public static void Main(string[] args)
        {
            var reactions    = File.ReadAllText("input.txt").Split('\n').ToList().ConvertAll(a => Reaction.FromString(a));
            var fuelReaction = reactions.Where(a => a.Output.Item2 == "FUEL").First();

            //Console.WriteLine(string.Join("\n", reactions));
            Console.WriteLine("\n\nFUEL reaction: " + fuelReaction);

            var oreUsed  = (long)0;
            var fuelMade = (long)0;


            var neededReactions = new List <Reaction>()
            {
                fuelReaction
            };
            var running = true;

            var excess = new Dictionary <string, int>();

            while (oreUsed < 1000000000000)
            {
                while (running)
                {
                    var newReactions = new List <Reaction>();
                    foreach (var r in neededReactions)
                    {
                        foreach (var i in r.Inputs)
                        {
                            if (i.Item2 == "ORE")
                            {
                                oreUsed += i.Item1;

                                continue;
                            }
                            var quantityNeeded = i.Item1;

                            if (excess.ContainsKey(i.Item2))
                            {
                                quantityNeeded -= excess[i.Item2];
                                excess[i.Item2] = 0;
                            }

                            stillNeeded :;
                            if (quantityNeeded < 0)
                            {
                                if (excess.ContainsKey(i.Item2))
                                {
                                    excess[i.Item2] = -quantityNeeded;
                                }
                                else
                                {
                                    excess.Add(i.Item2, -quantityNeeded);
                                }
                                goto notNeeded;
                            }
                            if (quantityNeeded == 0)
                            {
                                goto notNeeded;
                            }
                            var r2 = reactions.Where(a => a.Output.Item2 == i.Item2).First();
                            newReactions.Add(r2);

                            quantityNeeded -= r2.Output.Item1;
                            if (quantityNeeded != 0)
                            {
                                goto stillNeeded;
                            }
                            notNeeded :;
                        }
                    }

                    neededReactions = newReactions;

                    running = neededReactions.Count > 0;

                    a :;
                    foreach (var e in excess)
                    {
                        if (e.Value == 0)
                        {
                            excess.Remove(e.Key); goto a;
                        }
                    }

                    //Console.WriteLine("\n\n\nOre Used: " + oreUsed + "\nNew list of needed reactions:\n" + string.Join("\n", neededReactions) + "\n\n" + "Excess: " + string.Join(", ", excess));
                    //Console.ReadLine();
                }

                neededReactions = new List <Reaction>()
                {
                    fuelReaction
                };
                fuelMade++;
                running       = true;
                Console.Title = string.Format("{0:n0}", oreUsed) + " : " + string.Format("{0:n0}", (fuelMade - 1));
            }

            Console.WriteLine(oreUsed + " : " + (fuelMade - 1));

            Console.Read();
        }