import Cocoa
import Foundation
struct Location {
let id: Int
let type: String // such as restaurants, pubs, museums, monuments
let name: String
let rating: Int // from 1 to 5
}
struct City {
let id: Int
let name: String
let description: String
let latitude: Double
let longitude: Double
let keywords: [String]
let locations: [Location]
}
let belarusianCities: [City] = [
City(id: 1, name: "Minsk", description: "Capital city of Belarus", latitude:
53.9045, longitude: 27.5615, keywords: ["capital", "urban", "culture"], locations:
[
Location(id: 1, type: "Restaurant", name: "Central Perk", rating: 4),
Location(id: 2, type: "Park", name: "Dreamland Park", rating: 5),
]),
City(id: 2, name: "Brest", description: "City in southwest Belarus",
latitude: 52.0976, longitude: 23.7341, keywords: ["border", "history", "culture"],
locations: [
Location(id: 1, type: "Theater", name: "Fantasy Theater", rating: 5),
Location(id: 2, type: "Café", name: "Wonderland Café", rating: 4),
]),
City(id: 3, name: "Grodno", description: "City in western Belarus",
latitude: 53.6884, longitude: 23.8258, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Pub", name: "Magic Brew", rating: 4),
Location(id: 2, type: "Garden", name: "Enchanted Garden", rating: 3),
]),
City(id: 4, name: "Mogilev", description: "City in eastern Belarus", latitude:
53.9023, longitude: 30.3346, keywords: ["industrial", "cultural", "architecture"],
locations: [
Location(id: 1, type: "Theater", name: "Grand Theater", rating: 4),
Location(id: 2, type: "Park", name: "City Park", rating: 3),
]),
City(id: 5, name: "Vitebsk", description: "City in northern Belarus",
latitude: 55.1904, longitude: 30.2046, keywords: ["cultural", "historical",
"architecture"], locations: [
Location(id: 1, type: "Restaurant", name: "Riverside Grill", rating: 5),
Location(id: 2, type: "Museum", name: "History Museum", rating: 4),
]),
City(id: 5, name: "Vitebsk", description: "City in northern Belarus", latitude:
55.1904, longitude: 30.2046, keywords: ["cultural", "historical", "architecture"],
locations: [
Location(id: 1, type: "Café", name: "Artisan Café", rating: 4),
Location(id: 2, type: "Park", name: "City Park", rating: 3),
]),
City(id: 6, name: "Gomel", description: "City in southeastern Belarus",
latitude: 52.4345, longitude: 31.0128, keywords: ["industrial", "cultural",
"parks"], locations: [
Location(id: 1, type: "Theater", name: "Sunset Theater", rating: 5),
Location(id: 2, type: "Garden", name: "Green Oasis", rating: 4),
]),
City(id: 7, name: "Molodechno", description: "City in northwestern
Belarus", latitude: 54.3128, longitude: 26.8607, keywords: ["historic", "cultural",
"nature"], locations: [
Location(id: 1, type: "Pub", name: "Rustic Tavern", rating: 4),
Location(id: 2, type: "Lake", name: "Serene Lake", rating: 3),
]),
City(id: 8, name: "Orsha", description: "City in northeastern Belarus",
latitude: 54.5131, longitude: 30.4173, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Museum", name: "Ancient Art Museum", rating: 5),
Location(id: 2, type: "Restaurant", name: "Renaissance Eatery", rating:
5),
]),
City(id: 9, name: "Novopolotsk", description: "City in northern Belarus",
latitude: 55.5291, longitude: 28.6166, keywords: ["industrial", "modern", "urban"],
locations: [
Location(id: 1, type: "Shopping Mall", name: "Metropolis Mall", rating:
4),
Location(id: 2, type: "Bowling Alley", name: "Strikes & Spares",
rating: 3),
]),
City(id: 10, name: "Bobruisk", description: "City in eastern Belarus",
latitude: 53.1599, longitude: 29.2333, keywords: ["industrial", "historical",
"urban"], locations: [
Location(id: 1, type: "Amusement Park", name: "Thrill Zone", rating:
5),
Location(id: 2, type: "Coffee Shop", name: "Brewed Perfection", rating:
4),
]),
City(id: 11, name: "Baranovichi", description: "City in western Belarus",
latitude: 53.1333, longitude: 26.0139, keywords: ["industrial", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Gym", name: "Fitness Fusion", rating: 4),
Location(id: 2, type: "Library", name: "Book Haven", rating: 3),
]),
City(id: 12, name: "Pinsk", description: "City in southern Belarus",
latitude: 52.1273, longitude: 26.091, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Historic Site", name: "Heritage Square", rating:
5),
Location(id: 2, type: "Market", name: "Local Bazaar", rating: 4),
]),
City(id: 13, name: "Lida", description: "City in western Belarus",
latitude: 53.8885, longitude: 25.2906, keywords: ["historical", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Theater", name: "Classic Theater", rating: 4),
Location(id: 2, type: "Café", name: "Cozy Corner Café", rating: 3),
]),
City(id: 14, name: "Slonim", description: "City in western Belarus",
latitude: 53.0862, longitude: 25.3206, keywords: ["historic", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Garden", name: "Secret Garden", rating: 5),
Location(id: 2, type: "Restaurant", name: "Rustic Retreat", rating: 4),
]),
City(id: 15, name: "Polotsk", description: "City in northern Belarus",
latitude: 55.4853, longitude: 28.7736, keywords: ["historic", "cultural",
"architecture"], locations: [
Location(id: 1, type: "Museum", name: "Ancient Artifacts Museum",
rating: 5),
Location(id: 2, type: "Park", name: "Riverfront Park", rating: 4),
]),
City(id: 16, name: "Luninets", description: "Town in southeastern Belarus",
latitude: 52.2268, longitude: 26.8138, keywords: ["rural", "historic", "nature"],
locations: [
Location(id: 1, type: "Lake", name: "Tranquil Lake", rating: 4),
Location(id: 2, type: "Hiking Trail", name: "Scenic Trail", rating: 3),
]),
City(id: 17, name: "Zhlobin", description: "City in southeastern Belarus",
latitude: 52.8884, longitude: 30.034, keywords: ["industrial", "modern", "urban"],
locations: [
Location(id: 1, type: "Shopping Center", name: "MegaMart", rating: 4),
Location(id: 2, type: "Sports Complex", name: "FitZone", rating: 3),
]),
City(id: 18, name: "Svetlogorsk", description: "Town in southeastern
Belarus", latitude: 52.6263, longitude: 29.7301, keywords: ["coastal", "nature",
"resort"], locations: [
Location(id: 1, type: "Beach", name: "Sunny Shores Beach", rating: 5),
Location(id: 2, type: "Aquarium", name: "Marine World", rating: 4),
]),
City(id: 19, name: "Salihorsk", description: "City in central Belarus",
latitude: 52.7932, longitude: 27.5424, keywords: ["industrial", "mining",
"modern"], locations: [
Location(id: 1, type: "Shopping Mall", name: "Diamond Plaza", rating:
4),
Location(id: 2, type: "Nightclub", name: "Neon Nights", rating: 3),
]),
City(id: 20, name: "Staropolatsk", description: "City in northern Belarus",
latitude: 54.5291, longitude: 29.6166, keywords: ["imagined", "old", "idk"],
locations: [
Location(id: 1, type: "Observatory", name: "Stargazer Observatory",
rating: 5),
Location(id: 2, type: "Bookstore", name: "Wise Words Bookstore",
rating: 4),
]),
]
func findCityByName(_ city: String, _ cities: [City]) -> [City]{
let results = [Link]{$[Link](city)};
return results;
}
print("Found by name:");
let findingCities = findCityByName("N", belarusianCities);
[Link]{print($[Link])};
func findCityByKeyword(_ keyword: String, _ cities: [City]) -> [City]{
let results = [Link]{$[Link](keyword)};
return results;
}
print("Found by keyword:");
let findingCities2 = findCityByKeyword("industrial", belarusianCities);
[Link]{print($[Link])};
func calculateDistance(_ latitudeA : Double, _ longitudeA : Double,_ latitudeB :
Double,_ longitudeB : Double) -> Double {
let earthRadius: Double = 6371 // Earth's radius in kilometers
let sourceLatitudeRadians = latitudeA * .pi / 180
let destinationLatitudeRadians = latitudeB * .pi / 180
let latitudeDifferenceRadians = (latitudeB - latitudeA) * .pi / 180
let longitudeDifferenceRadians = (longitudeB - longitudeA) * .pi / 180
let a = sin(latitudeDifferenceRadians / 2) * sin(latitudeDifferenceRadians / 2)
+
cos(sourceLatitudeRadians) * cos(destinationLatitudeRadians) *
sin(longitudeDifferenceRadians / 2) * sin(longitudeDifferenceRadians /
2)
let c = 2 * atan2(sqrt(a), sqrt(1 - a))
let distance = earthRadius * c
return distance
}
let city1 = belarusianCities[2];
let city2 = belarusianCities[0];
print("Distance between \([Link]) and \([Link]) is \
(calculateDistance([Link], [Link], [Link],
[Link]))");
func findClosetFarthest(latitudeA : Double, longitudeA : Double, _ cities: [City])
-> (City, City){
var farthestCity = cities[0]
var closestCity = cities[0]
var farthest = calculateDistance([Link], [Link],
latitudeA, longitudeA);
var closest = calculateDistance([Link], [Link],
latitudeA, longitudeA);
for city in cities{
if(calculateDistance(latitudeA, longitudeA, [Link], [Link])
> farthest){
farthest = calculateDistance(latitudeA, longitudeA, [Link],
[Link]);
farthestCity = city;
}
if(calculateDistance(latitudeA, longitudeA, [Link], [Link])
< closest){
closest = calculateDistance(latitudeA, longitudeA, [Link],
[Link]);
closestCity = city;
}
}
return (closestCity, farthestCity);
}
let (closestCity, farthestCity) = findClosetFarthest(latitudeA: 53.6884,
longitudeA: 23.8258, belarusianCities);
print("Closest city is \([Link]). Farthest is \([Link])");
func citiesWithFiveStarRestaurants(_ cities: [City]) -> [City] {
return [Link] { city in
[Link](where: { $[Link] == "Restaurant" && $[Link] ==
5 })
}
}
print("Cities with 5-raiting resataurant:");
let citiesRest = citiesWithFiveStarRestaurants(belarusianCities);
[Link]{print($[Link])};
func relatedLocationsSortedByRating(_ city: City) -> [Location] {
return [Link](by: { $[Link] > $[Link] })
}
print("Locations in city \([Link]):");
let citiesLocations = relatedLocationsSortedByRating(city2);
[Link]{print($[Link])};
func displayCitiesWithFiveStarLocations(cities: [City]) {
for city in cities {
let fiveStarLocations = [Link] { $[Link] == 5 }
print("\([Link]) has \([Link]) location(s) with a 5-
star rating:")
for location in fiveStarLocations {
print("- \([Link])")
}
print()
}
}
print("Cities with 5-raiting locations:");
displayCitiesWithFiveStarLocations(cities: belarusianCities);