diff --git a/2021/07/Program.cs b/2021/07/Program.cs index 9b4ccaf..950726f 100644 --- a/2021/07/Program.cs +++ b/2021/07/Program.cs @@ -40,35 +40,35 @@ static void Part2(List initialCrabPositions) { - // Using the median average is wrong here - // Mean average works for the example data, but not for my input - // Need to change how I work out the optimal horizontal position + // Calculate optimal position + // Loop through all possible positions and work out the total fuel consumption + int minPosition = initialCrabPositions.Min(); + int maxPosition = initialCrabPositions.Max(); + Dictionary possiblePositions = new Dictionary(); - double mean = initialCrabPositions.Average(); + for (int i = minPosition; i <= maxPosition; i++) + { + possiblePositions.Add(i,CalculateTotalFuelConsumption(initialCrabPositions, i)); + } - int meanAverage = Convert.ToInt32(mean); - - // int medianAverage = initialCrabPositions.OrderBy(x=>x).Skip(initialCrabPositions.Count()/2).First(); - - // int modalAverage = initialCrabPositions.GroupBy(n=> n). - // OrderByDescending(g=> g.Count()). - // Select(g => g.Key).FirstOrDefault(); - - Console.WriteLine($"Mean average: {meanAverage}"); - // Console.WriteLine($"Median average: {medianAverage}"); - // Console.WriteLine($"Modal average: {modalAverage}"); + // Find lowest fuel consumption + var lowestFuelConsumptionPosition = possiblePositions.OrderBy(kvp => kvp.Value).First(); + Console.WriteLine($"Position: {lowestFuelConsumptionPosition.Key} Fuel consumption: {lowestFuelConsumptionPosition.Value}"); + } + public static int CalculateTotalFuelConsumption(List initialCrabPositions, int targetPosition) + { int totalFuelConsumption = 0; foreach (int position in initialCrabPositions) { // Find the difference - int difference = Math.Abs(position - meanAverage); + int difference = Math.Abs(position - targetPosition); totalFuelConsumption += Convert.ToInt32(GetTriangularNumber(difference)); } - Console.WriteLine($"Total fuel consumption: {totalFuelConsumption}"); + return totalFuelConsumption; } public static double GetTriangularNumber(int n)