-- | Projected result of valuation A vs valuation B, with 1 = sure win
-- for A, 0 = sure win for B.
--
-- This is the core formula of Elo.
projected :: Double -> Double -> Double
projected a b = 1 / (1 + exp ( log 10 / e * (b-a) ) )
where e = 400
-- | Points to grant the first player for a given result of a 1vs1
points1vs1 :: Double -> Double -> Double -> Double
points1vs1 a b d = c * (d - projected a b)
where c = 4
-- | 1vs1 result to assume for a player finishing in i-th place vs a
-- player finishing in j-th place.
--
-- It's important that "result i j = 1 - result j i" holds!
result :: Int -> Int -> Double
result i j
| i < j = 1
| otherwise = 0
-- | NvsN evaluation. Assumes valuations are sorted by finishing placement.
pointsNvsN :: [Double] -> [Double]
pointsNvsN rs =
[ sum [ points1vs1 a b (result i j)
| (j, b) <- rps, i /= j]
| (i, a) <- rps]
where rps = zip [1..] rs