Ranking methods: Difference between revisions

→‎{{header|Julia}}: A new entry for Julia
(Added Haskell)
(→‎{{header|Julia}}: A new entry for Julia)
Line 789:
ordinal: [1,2,3,4,5,6,7]
fractional: [1,2.5,2.5,5,5,5,7]
 
=={{header|Julia}}==
'''ties''', a helper function used by some of the ranking methods. It lists any duplicated scores.
<lang Julia>
function ties{T<:Real}(a::Array{T,1})
unique(a[2:end][a[2:end] .== a[1:end-1]])
end
</lang>
<code>ties</code> assumes that the there are at least 2 scores in the list to be checked, and the calling functions are designed to avoid calls to it in this case.
 
'''Standard Ranking Function'''
<lang Julia>
function rankstandard{T<:Real}(a::Array{T,1})
r = collect(1:length(a))
1 < r[end] || return r
for i in ties(a)
r[a.==i] = r[a.==i][1]
end
return r
end
</lang>
 
'''Modified Ranking Function'''
<lang Julia>
function rankmodified{T<:Real}(a::Array{T,1})
indexin(a, a)
end
</lang>
 
'''Dense Ranking Function'''
<lang Julia>
function rankdense{T<:Real}(a::Array{T,1})
indexin(a, unique(a))
end
</lang>
 
'''Ordinal Ranking Function'''
<lang Julia>
function rankordinal{T<:Real}(a::Array{T,1})
collect(1:length(a))
end
</lang>
For ordinal ranking, there are a variety of ways of handling tied scores. I've taken the easy way out and assumed that the position in the list already reflects any tie-breaking policy. In this case, there is not much that needs to be done.
 
'''Fractional Ranking Function'''
<lang Julia>
function rankfractional{T<:Real}(a::Array{T,1})
r = float64(collect(1:length(a)))
1.0 < r[end] || return r
for i in ties(a)
r[a.==i] = mean(r[a.==i])
end
return r
end
</lang>
 
'''Main'''
<lang Julia>
scores = [44, 42, 42, 41, 41, 41, 39]
names = ["Solomon", "Jason", "Errol", "Garry",
"Bernard", "Barry", "Stephen"]
 
srank = rankstandard(scores)
mrank = rankmodified(scores)
drank = rankdense(scores)
orank = rankordinal(scores)
frank = rankfractional(scores)
 
println(" Name Score Std Mod Den Ord Frac")
for i in 1:length(scores)
print(@sprintf(" %-7s", names[i]))
print(@sprintf("%5d ", scores[i]))
print(@sprintf("%5d", srank[i]))
print(@sprintf("%5d", mrank[i]))
print(@sprintf("%5d", drank[i]))
print(@sprintf("%5d", orank[i]))
print(@sprintf("%7.2f", frank[i]))
println()
end
</lang>
 
{{out}}
<pre>
Name Score Std Mod Den Ord Frac
Solomon 44 1 1 1 1 1.00
Jason 42 2 3 2 2 2.50
Errol 42 2 3 2 3 2.50
Garry 41 4 6 3 4 5.00
Bernard 41 4 6 3 5 5.00
Barry 41 4 6 3 6 5.00
Stephen 39 7 7 4 7 7.00
</pre>
 
=={{header|Perl 6}}==