public void TestDetermineMovePosition() { var initPositions = new IntCsvLineParser().ReadData("test.txt").OrderBy(x => x).ToList(); var result = DetermineMovePosition(initPositions); Assert.AreEqual(2, result); }
static long First(string inputFile) { var initPositions = new IntCsvLineParser().ReadData(inputFile).OrderBy(x => x).ToList(); var position = DetermineMovePosition(initPositions); return(initPositions.Aggregate(0L, (sum, p) => sum += Math.Abs(p - position))); }
static long Second(string inputFile) { var initPositions = new IntCsvLineParser().ReadData(inputFile); var positions = initPositions.GroupBy(v => v).ToDictionary(v => v.Key, v => v.Count()); var fs = positions.Select(d => GetWeightFunction(d.Value, d.Key)).ToList(); var minPos = positions.Keys.Min(); var maxPos = positions.Keys.Max(); var minimumResultFound = long.MaxValue; var foundMinimalPosition = minPos; for (int p = minPos + 1; p < maxPos; p++) { Console.WriteLine($"Start calculation pos {p}"); var result = fs.Aggregate(0L, (sum, f) => sum += f(p)); if (result < minimumResultFound) { Console.WriteLine($"!!! Lower solution found: {result}"); minimumResultFound = result; foundMinimalPosition = p; } } return(minimumResultFound); }
private static long Simulate(string inputFile, int days) { var initVector = new IntCsvLineParser().ReadData(inputFile); var oldCounts = initVector.GroupBy(v => v).ToDictionary(v => v.Key, v => v.LongCount()); for (int i = 0; i < days; i++) { Dictionary <int, long> newCounts = new Dictionary <int, long>(8); for (int g = 1; g <= NewchildCycleTime; g++) { if (oldCounts.ContainsKey(g)) { newCounts.Add(g - 1, oldCounts[g]); } } if (oldCounts.ContainsKey(0)) { if (newCounts.ContainsKey(FishCycleTime - 1)) { newCounts[FishCycleTime - 1] += oldCounts[0]; } else { newCounts.Add(FishCycleTime - 1, oldCounts[0]); } newCounts.Add(NewchildCycleTime, oldCounts[0]); } Console.WriteLine($"{i + 1}:"); foreach (var item in newCounts) { Console.WriteLine($"\t{item.Key}:{item.Value}"); } oldCounts = newCounts; } return(oldCounts.Sum(f => f.Value)); }