Advertisement
Guest User

Untitled

a guest
Jan 10th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 3.90 KB | None | 0 0
  1.             class Participant: CustomStringConvertible {
  2.         var name = "noname"
  3.         var contact = "nocontact"
  4.         var giveTo:Participant?
  5.         init(name:String,contact:String){
  6.             self.name = name
  7.             self.contact = contact
  8.         }
  9.         var description: String {return name + ((giveTo==nil) ?"":"->\(giveTo!.name)")}
  10.     }
  11.  
  12.     class Group: CustomDebugStringConvertible {
  13.         static var allGroups:[Group]=[]
  14.         static var counter = 0
  15.         var participants:[Participant]=[]
  16.         var name = "G-x"
  17.         var description:String {return name}
  18.         var debugDescription:String {return name}
  19.         init(participants:[Participant]){
  20.             self.participants=participants
  21.             name = "G-\(Group.counter++)"
  22.             Group.allGroups.append(self)
  23.             Group.allGroups = Group.sortGroups(Group.allGroups)
  24.         }
  25.  
  26.         func size()->Int{return self.participants.count}
  27.  
  28.         func getRandParticipant()->Participant{
  29.             let p = participants[Int(arc4random_uniform(UInt32(participants.count)))]
  30.             return p
  31.         }
  32.  
  33.         func remove(p:Participant)->Bool{
  34.             let originalIndex = participants.count
  35.             participants = participants.filter() { $0.name != p.name }
  36.             return originalIndex != participants.count
  37.         }
  38.  
  39.         static func sortGroups(g:[Group])->[Group]{
  40.             //remove groups with size = 0
  41.             let rg = g.filter() {return $0.size()>0}
  42.             //sort
  43.             return rg.sort() {return $0.0.size()>$0.1.size()}
  44.         }
  45.  
  46.         static func getRandGroup(groups:[Group])->Group{
  47.             return groups[Int(arc4random_uniform(UInt32(groups.count)))]
  48.         }
  49.  
  50.         static func removeFromGroups(groups:[Group],p:Participant)->[Group]{
  51.             for g in groups{
  52.                 if(g.remove(p)){
  53.                     break;
  54.                 }
  55.             }
  56.             return sortGroups(groups)
  57.         }
  58.  
  59.         static func getPairs(groups:[Group])->[Participant]{
  60.             var groups2consume = groups
  61.             var giverGroup = getRandGroup(groups2consume)
  62.             var searchIn:[Group]
  63.             var giver:Participant = giverGroup.getRandParticipant()
  64.             let first = giver
  65.             var returnArray:[Participant] = []
  66.             while(groups2consume.count>0){
  67.                 let indexO = groups2consume.indexOf() {$0.name==giverGroup.name}
  68.                 if let index = indexO{
  69.                     if (index>0){
  70.                         //if giverGroup is 0 it means it is in the largest group
  71.                         searchIn = [groups2consume[0]]
  72.                     }else if groups2consume.count>1{
  73.                         //if giverGroup is not 0 and the count is >0 then there are smaller groups
  74.                         searchIn = groups2consume
  75.                         searchIn.removeFirst()
  76.                     }else{
  77.                         //there is only one group left
  78.                         searchIn = groups2consume
  79.                         searchIn[0].remove(giver)
  80.                     }
  81.                     if searchIn[0].participants.count>0{
  82.                         let receiverGroup = getRandGroup(searchIn)
  83.                         let receiver = receiverGroup.getRandParticipant()
  84.                         groups2consume = removeFromGroups(groups2consume, p: giver)
  85.                         giver.giveTo=receiver
  86.                         returnArray.append(giver)
  87.                         giverGroup = receiverGroup
  88.                         giver = receiver
  89.                     }else{
  90.                         groups2consume = removeFromGroups(groups2consume, p: giver)
  91.                     }
  92.                 }else{
  93.                     break
  94.                 }
  95.             }
  96.             giver.giveTo=first
  97.             returnArray.append(giver)
  98.             return returnArray
  99.         }
  100.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement