Esempio n. 1
0
        public void TestDetermineMovePosition()
        {
            var initPositions = new IntCsvLineParser().ReadData("test.txt").OrderBy(x => x).ToList();
            var result        = DetermineMovePosition(initPositions);

            Assert.AreEqual(2, result);
        }
Esempio n. 2
0
        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)));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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));
        }