Advertisement
SEEEEEAAAAAA10000000

Make Raws From a Greed (Generic)

Dec 20th, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.40 KB | None | 0 0
  1. public protocol TwoDimensional {
  2.     associatedtype Measure: SignedNumeric, Comparable
  3.     var xmesure: Measure { get set }
  4.     var ymesure: Measure { get set }
  5. }
  6.  
  7. /// * (0,3)(1,3)(2,3)(3,3)
  8. /// * (0,2)(1,2)(2,2)(3,2)  
  9. /// * (0,1)(1,1)(2,1)(3,1)
  10. /// * (0,0)(1,0)(2,0)(3,0) -> (0,0)(1,0)(2,0)(3,0), (0,1)(1,1)(2,1)(3,1) ...
  11.  
  12. public func makeRawsFromGreed<C: Collection>(collection: C) -> [C.SubSequence]?
  13.     where
  14.     C.Element: TwoDimensional,
  15.     C.Element: Equatable,
  16.     C.SubSequence: RangeReplaceableCollection {
  17.         guard collection.count > 1 else { return nil }
  18.         let first = collection.first!
  19.         var previousY = first.ymesure
  20.         var corners = [C.Element]()
  21.        
  22.         for item in collection {
  23.             let currentY = item.ymesure
  24.             if currentY > previousY {
  25.                 corners.append(item)
  26.             }
  27.             previousY = currentY
  28.         }
  29.        
  30.         guard corners.count > 1 else { return nil }
  31.        
  32.         var rest: C.SubSequence?
  33.         var bunches = [C.SubSequence]()
  34.        
  35.         for corner in corners {
  36.            
  37.             let innersplit: [C.SubSequence]
  38.            
  39.             if let rest = rest {
  40.                 innersplit = rest.split(separator: corner, maxSplits: 1)
  41.             } else {
  42.                 innersplit = collection.split(separator: corner, maxSplits: 1)
  43.             }
  44.            
  45.             let bunch = innersplit.first!
  46.  
  47.             bunches.append(bunch)
  48.             rest = innersplit.last!
  49.         }
  50.         if let rest = rest {
  51.             bunches.append(rest)
  52.         }
  53.        
  54.         var cornersiterator = corners.makeIterator()
  55.         var outbunches = [C.SubSequence]()
  56.         for bunch in bunches.dropFirst() {
  57.             var workbunch = bunch
  58.             if let nextcorner = cornersiterator.next() {
  59.                 workbunch.insert(nextcorner, at: bunch.startIndex)
  60.             }
  61.             outbunches.append(workbunch)
  62.         }
  63.        
  64.         outbunches.insert(bunches.first!, at: outbunches.startIndex)
  65.        
  66.         return outbunches
  67. }
  68.  
  69. // Testing
  70.  
  71. struct Greeding {
  72.     func test() {
  73.        
  74.         var vectors = [Vector2D]()
  75.         vectors.append(Vector2D(x: 0, y: 0))
  76.         vectors.append(Vector2D(x: 1, y: 0))
  77.         vectors.append(Vector2D(x: 2, y: 0))
  78.         vectors.append(Vector2D(x: 3, y: 0))
  79.        
  80.         vectors.append(Vector2D(x: 0, y: 1))
  81.         vectors.append(Vector2D(x: 1, y: 1))
  82.         vectors.append(Vector2D(x: 2, y: 1))
  83.         vectors.append(Vector2D(x: 3, y: 1))
  84.        
  85.         vectors.append(Vector2D(x: 0, y: 2))
  86.         vectors.append(Vector2D(x: 1, y: 2))
  87.         vectors.append(Vector2D(x: 2, y: 2))
  88.         vectors.append(Vector2D(x: 3, y: 2))
  89.        
  90.         vectors.append(Vector2D(x: 0, y: 3))
  91.         vectors.append(Vector2D(x: 1, y: 3))
  92.         vectors.append(Vector2D(x: 2, y: 3))
  93.         vectors.append(Vector2D(x: 3, y: 3))
  94.        
  95.         guard let raws = makeRawsFromGreed(collection: vectors) else { return }
  96.         raws.forEach { print("raw: \($0)") }
  97.        
  98.     }
  99. }
  100.  
  101. raw: [[x: 0.0, y: 0.0], [x: 1.0, y: 0.0], [x: 2.0, y: 0.0], [x: 3.0, y: 0.0]]
  102. raw: [[x: 0.0, y: 1.0], [x: 1.0, y: 1.0], [x: 2.0, y: 1.0], [x: 3.0, y: 1.0]]
  103. raw: [[x: 0.0, y: 2.0], [x: 1.0, y: 2.0], [x: 2.0, y: 2.0], [x: 3.0, y: 2.0]]
  104. raw: [[x: 0.0, y: 3.0], [x: 1.0, y: 3.0], [x: 2.0, y: 3.0], [x: 3.0, y: 3.0]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement