コード例 #1
0
        public string Solve(string input)
        {
            var coordinates = input.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
                              .Select((w, index) => new Coordinate(w))
                              .ToList();

            var maxY = coordinates.Select(w => w.Y).Max();
            var maxX = coordinates.Select(w => w.X).Max();

            // Init coordinate arrays
            var coordinateDistance = new CoordinateDistanceData[maxX][];

            for (var i = 0; i < maxX; i++)
            {
                coordinateDistance[i] = new CoordinateDistanceData[maxY];
            }

            for (var x = 0; x < maxX; x++)
            {
                for (var y = 0; y < maxY; y++)
                {
                    coordinateDistance[x][y] =
                        new CoordinateDistanceData(new Coordinate(x, y));
                }
            }

            // Calculate all distance and their sum
            foreach (var coordinate in coordinates)
            {
                for (var x = 0; x < maxX; x++)
                {
                    for (var y = 0; y < maxY; y++)
                    {
                        var item = coordinateDistance[x][y];
                        item.TrySetData(coordinate);
                    }
                }
            }

            var maxDistance = 10000;
            var count       = 0L;

            for (var x = 0; x < maxX; x++)
            {
                for (var y = 0; y < maxY; y++)
                {
                    var item = coordinateDistance[x][y].Count;
                    if (item < maxDistance)
                    {
                        count++;
                    }
                }
            }

            return(count.ToString());
        }
コード例 #2
0
        public string Solve(string input)
        {
            var coordinates = input.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
                              .Select((w, index) => new Coordinate(w, index))
                              .ToList();

            var maxY = coordinates.Select(w => w.Y).Max();
            var maxX = coordinates.Select(w => w.X).Max();

            // Init coordinate arrays
            var coordinateDistance = new CoordinateDistanceData[maxX][];

            for (var i = 0; i < maxX; i++)
            {
                coordinateDistance[i] = new CoordinateDistanceData[maxY];
            }

            for (var x = 0; x < maxX; x++)
            {
                for (var y = 0; y < maxY; y++)
                {
                    coordinateDistance[x][y] = new CoordinateDistanceData(new Coordinate(x, y));
                }
            }

            // Calculate all distance
            foreach (var coordinate in coordinates)
            {
                for (var x = 0; x < maxX; x++)
                {
                    for (var y = 0; y < maxY; y++)
                    {
                        var item = coordinateDistance[x][y];
                        item.TrySetData(coordinate);
                    }
                }
            }

            // Calculate nearest data
            for (var x = 0; x < maxX; x++)
            {
                for (var y = 0; y < maxY; y++)
                {
                    coordinateDistance[x][y].CalculateNearestData();
                }
            }

            // amount of area per coordinate
            var dictionary = new Dictionary <Coordinate, int>();

            for (var x = 0; x < maxX; x++)
            {
                for (var y = 0; y < maxY; y++)
                {
                    var nearestCoordinate = coordinateDistance[x][y].NearestData?.Coordinate;
                    if (nearestCoordinate == null)
                    {
                        continue;
                    }

                    if (dictionary.ContainsKey(nearestCoordinate))
                    {
                        dictionary[nearestCoordinate]++;
                    }
                    else
                    {
                        dictionary.Add(nearestCoordinate, 1);
                    }
                }
            }

            // Remove all coordinates at edges
            for (var x = 0; x < maxX; x++)
            {
                var item = coordinateDistance[x][0].NearestData?.Coordinate;
                if (item != null)
                {
                    dictionary.Remove(item);
                }
            }

            for (var x = 0; x < maxX; x++)
            {
                var item = coordinateDistance[x][maxY - 1].NearestData?.Coordinate;
                if (item != null)
                {
                    dictionary.Remove(item);
                }
            }

            for (var y = 0; y < maxY; y++)
            {
                var item = coordinateDistance[0][y].NearestData?.Coordinate;
                if (item != null)
                {
                    dictionary.Remove(item);
                }
            }

            for (var y = 0; y < maxY; y++)
            {
                var item = coordinateDistance[maxX - 1][y].NearestData?.Coordinate;
                if (item != null)
                {
                    dictionary.Remove(item);
                }
            }

            var answer = dictionary.Select(w => w.Value).Max();

            return(answer.ToString());
        }