#!/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