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()); }
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(); }