import List
rank :: Integer -> String
rank x
| x `mod` 10 == 1 = s ++ "st"
| x `mod` 10 == 2 = s ++ "nd"
| x `mod` 10 == 3 = s ++ "rd"
| otherwise = s ++ "th"
where s = show x

ranks :: [String]
ranks = map rank [1..]

sort_group :: Ord a => [a] -> [[a]]
sort_group l = group $ reverse $ sort l

main :: Ord a => [a] -> [(String,[a])]
main lst = zip ranks (sort_group lst)