#!/usr/bin/env python

# the idea is to compare two words, and measure how similar they are on a keyboard.
# this can be done by evaluating how close their letters are from one another.

from math import sqrt

q_count_close = 0
d_count_close = 0


#Initilization

qwerty = "qwertyuiop 0asdfghjkl 00zxcvbnm"
dvorak = "000pyfgcrl 0aoeuidhtns 000qjkxbmwvz"

qkey = {}
dkey = {}

row = 0
col = 0

for line in qwerty.split() :
    for character in line :
        qkey[character] = (row,col)
        col += 1
    row += 1
    col = 0
    
row = 0
col = 0
    
for line in dvorak.split() :
    for character in line :
        dkey[character] = (row,col)
        col += 1
    row += 1
    col = 0

#End init.

def qdistance(cone, ctwo):
    tone = qkey[cone]
    ttwo = qkey[ctwo]
    diff_r = abs(tone[0] - ttwo[0])
    diff_c = abs(tone[1] - ttwo[1])
    dist = sqrt(diff_c*diff_c + diff_r*diff_r)
    # print dist
    return dist

def ddistance(cone, ctwo):
    tone = dkey[cone]
    ttwo = dkey[ctwo]
    diff_r = abs(tone[0] - ttwo[0])
    diff_c = abs(tone[1] - ttwo[1])
    dist = sqrt(diff_c*diff_c + diff_r*diff_r)
    # print dist
    return dist

def compare_words(wone,wtwo):
    now_q_close_count = 0
    now_d_close_count = 0
    global q_count_close
    global d_count_close
    q_total_distance = 0
    d_total_distance = 0
    for i in range(len(wone)):
        q_distance = qdistance(wone[i],wtwo[i])
        d_distance = ddistance(wone[i],wtwo[i])
        if q_distance <= 1.5:
            now_q_close_count += 1
        if d_distance <=1.5:
            now_d_close_count += 1
        q_total_distance += q_distance
        d_total_distance += d_distance
    q_average = q_total_distance / len(wone)
    d_average = d_total_distance / len(wone)
    if now_q_close_count == len(wone) :
        q_count_close += 1
    if now_d_close_count == len(wone) :
        d_count_close += 1
    return q_average,d_average


total_total_distance_q = 0
total_total_distance_d = 0
count =0

wordlist = open("/usr/share/dict/words")
words = [set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set(),set()]


for word in wordlist :
    word = word.strip().lower()
    words[len(word)].add(word)
    count += 1

print "Words read into memory.",count,"words."

for i in range(3,4):#(1,len(words)) :  starting with length of just 4
    word_array = list(words[i])
    pairs = 0.0
    for j in range(len(word_array)) :
        for k in range(j+1,len(word_array)):
            #compare the two selected words of the same length.
            dq,dd = compare_words(word_array[j],word_array[k])
            total_total_distance_q += dq
            total_total_distance_d += dd
            pairs += 1
    print "for",pairs,"pairs of",i,"letter words: "
    print "qwerty average difference:",total_total_distance_q / pairs
    print "dvorak average difference:",total_total_distance_d / pairs
    print "qwerty almost matches:", q_count_close / pairs, "=",q_count_close
    print "dvorak almost matches:", d_count_close / pairs, "=",d_count_close

print "Done."
