Advertisement
tipsypastels

Untitled

Oct 20th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.32 KB | None | 0 0
  1. require 'levenshtein'
  2.  
  3. PHRASE = "METHINKS IT IS LIKE A WEASEL"
  4. MUTATION_RANGE = (-1..1)
  5.  
  6. class Array
  7.   def keys
  8.     (0...length).to_a
  9.   end
  10. end
  11.  
  12. class Range
  13.   def sample
  14.     to_a.sample
  15.   end
  16. end
  17.  
  18. class String
  19.   def mutate!(amount = 20)
  20.     arr = split('')
  21.     while amount > 0 do
  22.       key = arr.keys.sample
  23.       cur = arr[key].ord
  24.  
  25.       arr[key] = (cur + MUTATION_RANGE.sample).chr
  26.  
  27.       amount -= 1
  28.     end
  29.  
  30.     replace(arr.join)
  31.   end
  32.  
  33.   def mutate(amount = 20)
  34.     dup.mutate!(amount)
  35.   end
  36. end
  37.  
  38. class Evolution
  39.   def initialize(target, per_turn: 20)
  40.     @turn     = 0
  41.     @per_turn = per_turn
  42.  
  43.     @target = target
  44.     @string = (0...@target.length).map { ('A'..'Z').sample }.join
  45.     puts "Starting string: #{@string}"
  46.   end
  47.  
  48.   def go!
  49.     loop do
  50.       break if done?
  51.       turn
  52.     end
  53.   end
  54.  
  55.   private
  56.  
  57.   def turn
  58.     best = best_mutation(n_mutations)
  59.     puts "#{@turn}: #{best}"
  60.  
  61.     @turn += 1
  62.   end
  63.  
  64.   def done?
  65.     @target == @string
  66.   end
  67.  
  68.   def n_mutations
  69.     ([@string] * @per_turn).map(&:mutate)
  70.   end
  71.  
  72.   def best_mutation(muts)
  73.     muts.inject { |last, cur|
  74.       Levenshtein.distance(last, @target) >
  75.       Levenshtein.distance(cur, @target)  ?
  76.       last                                :
  77.       cur
  78.     }
  79.   end
  80. end
  81.  
  82. Evolution.new(PHRASE).go!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement