Advertisement
skaramicke

Predestination Generations

Jun 28th, 2016
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.52 KB | None | 0 0
  1. // Calculate the number of generations it takes before a man that goes back in time
  2. // and has a baby with herself has identical genes in both sets of a rather small
  3. // chromosome, that for some reason also complete resists random mutation.
  4.  
  5. import Foundation
  6.  
  7. struct individual {
  8.     let alpha:String
  9.     let beta:String
  10.     func represent() -> String
  11.     {
  12.         return "\(self.alpha) and \(self.beta)"
  13.     }
  14. }
  15.  
  16.  
  17. func combineStrings(alpha:String, beta:String) -> (String, String)
  18. {
  19.     assert(alpha.characters.count == beta.characters.count)
  20.    
  21.     var newAlpha = ""
  22.     var newBeta = ""
  23.     while newAlpha.characters.count < alpha.characters.count {
  24.         let index = newAlpha.characters.count
  25.         if (arc4random_uniform(100) < 50) {
  26.             newAlpha.append(alpha[ alpha.startIndex.advancedBy(index) ])
  27.             newBeta.append(beta[ beta.startIndex.advancedBy(index) ])
  28.         }
  29.         else {
  30.             newAlpha.append(beta[ beta.startIndex.advancedBy(index) ])
  31.             newBeta.append(alpha[ alpha.startIndex.advancedBy(index) ])
  32.         }
  33.     }
  34.     return (newAlpha, newBeta)
  35. }
  36.  
  37.  
  38. func makeChild(male:individual, female:individual) -> individual
  39. {
  40.     let (sperm, _) = combineStrings(male.alpha, beta: male.beta)
  41.     let (_, egg) = combineStrings(female.alpha, beta: female.beta)
  42.     let (childAlpha, childBeta) = combineStrings(sperm, beta: egg)
  43.     return individual(alpha: childAlpha, beta: childBeta)
  44. }
  45.  
  46. let runs = 100
  47. let tries = 20
  48.  
  49. var max = 0
  50. var min = tries
  51. var sum = 0
  52.  
  53.  
  54. for run in 1...runs {
  55.    
  56.     // Initial individual
  57.     var woman = individual(
  58.         alpha: "0123456789!#โ‚ฌ%&/()=.,ยจ'*_-ABCDEFGHIJKLM",
  59.         beta:  "abcdefghijklmnopqrstuvwxyzNOPQRSTUVWXYZ"
  60.     )
  61.    
  62.     for generation in 1...20 {
  63.         // A woman has post delivery surgery and becomes a man
  64.         let man = woman
  65.        
  66.         // The man travels back in time and impregnates himself as a woman
  67.         let child = makeChild(man, female: woman)
  68.        
  69.         // The child is moved back in time by the bartender and becomes the woman
  70.         woman = child
  71.        
  72.         if child.alpha == child.beta {
  73.             print("\(generation): \(child.represent())")
  74.             sum += generation
  75.             if generation < min {
  76.                 min = generation
  77.             }
  78.             if generation > max {
  79.                 max = generation
  80.             }
  81.             break
  82.         }
  83.     }
  84. }
  85.  
  86.  
  87. print("Average: \(Float(sum) / Float(runs)). Max: \(max). Min: \(min)")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement