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