Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Calculate the number of generations it takes before a man that goes back in time
- // and has a baby with herself has identical genes in both sets of a rather small
- // chromosome, that for some reason also complete resists random mutation.
- import Foundation
- struct individual {
- let alpha:String
- let beta:String
- func represent() -> String
- {
- return "\(self.alpha) and \(self.beta)"
- }
- }
- func combineStrings(alpha:String, beta:String) -> (String, String)
- {
- assert(alpha.characters.count == beta.characters.count)
- var newAlpha = ""
- var newBeta = ""
- while newAlpha.characters.count < alpha.characters.count {
- let index = newAlpha.characters.count
- if (arc4random_uniform(100) < 50) {
- newAlpha.append(alpha[ alpha.startIndex.advancedBy(index) ])
- newBeta.append(beta[ beta.startIndex.advancedBy(index) ])
- }
- else {
- newAlpha.append(beta[ beta.startIndex.advancedBy(index) ])
- newBeta.append(alpha[ alpha.startIndex.advancedBy(index) ])
- }
- }
- return (newAlpha, newBeta)
- }
- func makeChild(male:individual, female:individual) -> individual
- {
- let (sperm, _) = combineStrings(male.alpha, beta: male.beta)
- let (_, egg) = combineStrings(female.alpha, beta: female.beta)
- let (childAlpha, childBeta) = combineStrings(sperm, beta: egg)
- return individual(alpha: childAlpha, beta: childBeta)
- }
- let runs = 100
- let tries = 20
- var max = 0
- var min = tries
- var sum = 0
- for run in 1...runs {
- // Initial individual
- var woman = individual(
- alpha: "0123456789!#โฌ%&/()=.,ยจ'*_-ABCDEFGHIJKLM",
- beta: "abcdefghijklmnopqrstuvwxyzNOPQRSTUVWXYZ"
- )
- for generation in 1...20 {
- // A woman has post delivery surgery and becomes a man
- let man = woman
- // The man travels back in time and impregnates himself as a woman
- let child = makeChild(man, female: woman)
- // The child is moved back in time by the bartender and becomes the woman
- woman = child
- if child.alpha == child.beta {
- print("\(generation): \(child.represent())")
- sum += generation
- if generation < min {
- min = generation
- }
- if generation > max {
- max = generation
- }
- break
- }
- }
- }
- print("Average: \(Float(sum) / Float(runs)). Max: \(max). Min: \(min)")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement