Advertisement
Alexxik

Untitled

Sep 16th, 2023 (edited)
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.12 KB | None | 0 0
  1. // MARK: - LINE REFLECTION
  2.  
  3. // Идея решения:
  4. // 1) Убираем наложенные точки
  5. // 2) Убираем одинаковые X
  6. // 2) Ищем правильную медиану - для иксов
  7. // 3) Пробегаемся по множеству точек изначальных и для каждой ищем отраженную помещаяя (с помощью медианы) ее в новое множество
  8. // 4) Сравниваем изначальное множестов и полученное
  9.  
  10. func isReflected(_ points: [[Int]]) -> Bool {
  11.     var set = Set<[Int]>()
  12.     var setX = Set<Int>()
  13.  
  14.     // 1) Убираем наложенные точки
  15.     for point in points {
  16.         set.insert(point)
  17.         setX.insert(point[0])
  18.     }
  19.  
  20.     // Надо отсортировать массив иксов
  21.     var arrayX = Array(setX).sorted()
  22.  
  23.     // 2) Ищем медиану для иксов
  24.     // Если четное кол-во, то берем среднее между двумя центральными элементами (  [-2, -1, 1, 2] -> (-1 + 1)/2  )
  25.     var median: Double
  26.  
  27.     if arrayX.count % 2 == 0 {
  28.         median = Double( arrayX[arrayX.count/2 - 1] + arrayX[arrayX.count/2] ) / 2
  29.     } else {
  30.         median = Double(arrayX[arrayX.count/2])
  31.     }
  32.  
  33.     // 3) Для каждой данной ищем отраженную используя медиану и добавляем точки в новое множество
  34.     var reflectedSet = Set<[Int]>()
  35.  
  36.     for point in set {
  37.         let delta = Double(point[0]) - median
  38.         let reflectedPoint = point[0] - 2 * Int(delta)
  39.         reflectedSet.insert([reflectedPoint, point[1]])
  40.     }
  41.  
  42.     // 4) Если получились одинаковые множества, то такая отраженная линия есть
  43.     return set == reflectedSet
  44. }
  45.  
  46. //isReflected([[1, 1], [-1, 1], [1, 1]])
  47. //isReflected([[0, 0], [1, 0]])
  48. //isReflected([[-1, 2], [1, 0]])
  49. //isReflected([[1, 1], [5, 3], [2, 5], [4, 5], [2, 3], [4, 1]])
  50. isReflected([[-1, 3], [2, 4], [2, 4], [5, 3]])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement