#!/usr/bin/ruby
require 'rubygems'
require 'levenshtein'
categories = ["first_name", "middle_name", "pounds", "ounces", "inches", "day", "hour", "minute"]
guesses = {
'Ignatius' => {
:first_name => 'Erin',
:middle_name => 'Hera',
:pounds => 7,
:ounces => 7,
:inches => 21,
:day => 21,
:hour => 8,
:minute => 14
},
'Maximillian' => {
:first_name => 'Jocelyn',
:middle_name => 'Amidala',
:pounds => 9,
:ounces => 0,
:inches => 18,
:day => 24,
:hour => 14,
:minute => 45
}
}
actual = {
:first_name => 'Mikayla',
:middle_name => 'Grace',
:pounds => 7,
:ounces => 15,
:inches => 19.5,
:day => 18,
:hour => 3,
:minute => 57
}
n_space = actual.keys.length
vectors = {}
guesses.keys.each {|guesser| vectors[guesser] = {}}
actual.each_pair do |key, actual_value|
guesses.each_pair do |guesser, guesser_guesses|
guessed_value = guesser_guesses[key]
distance = if actual_value.respond_to? :-
(guessed_value - actual_value).abs
else
guessed_value.downcase!
actual_value.downcase!
Levenshtein.distance(guessed_value, actual_value)
end
vectors[guesser][key] = distance
end
end
vectors.each_pair do |guesser, distances|
puts '## ' + guesser
all_distances = []
categories.sort.each do |category|
key = category.to_sym
key_distance = distances[key]
puts "- #{key}: guessed #{guesses[guesser][key]}, which was off by #{key_distance}"
all_distances << key_distance
end
all_distances << distances[:first_name]
all_distances << distances[:middle_name]
vector_length = Math.sqrt(all_distances.inject(0) do |total, key_distance|
total + key_distance ** 2
end)
puts '', "### Distance: #{vector_length}", ''
end