#!/usr/bin/env ruby ################################################# # reads space delimted pairs of scores as input, # outputs Kendall's τ ################################################# def kendall_with_ties l concordant = 0 disconcordant = 0 tie_a = 0 tie_b = 0 l.each_with_index { |k,i| l[i+1,l.size].each_with_index { |m,j| if (k.first < m.first && k[1] < m[1]) || (k.first > m.first && k[1] > m[1]) concordant += 1 elsif (k.first == m.first && k[1] != m[1]) tie_a += 1 elsif (k.first != m.first && k[1] == m[1]) tie_b += 1 else disconcordant += 1 end } } return (concordant-disconcordant)/(Math.sqrt((concordant+disconcordant+tie_a)*(concordant+disconcordant+tie_b))) end def kendall l concordant = 0 disconcordant = 0 l.each_with_index { |k,i| l[i+1,l.size].each_with_index { |m,j| if (k.first <= m.first && k[1] <= m[1]) || (k.first >= m.first && k[1] >= m[1]) concordant += 1 else disconcordant += 1 end } } return (concordant-disconcordant)/(0.5 * l.size * (l.size-1)) end def has_ties? l if l.map{ |p| p[1] }.uniq.size != l.size || l.map{ |p| p[2] }.uniq.size != l.size return true end return false end def main l = [] while line = STDIN.gets a,b = line.split l << [a.to_f, b.to_f] end v = -1 if has_ties? l v = kendall_with_ties l else v = kendall l end puts v end main