import Data.List main :: IO () main = interact $ unlines . map (show . dictIndex) . lines dictIndex :: Ord a => [a] -> Integer dictIndex = sum . zipWith ((*) <$> fac) [0..] . reverse . (zipWith countLower <*> tails) where countLower :: Ord a => a -> [a] -> Integer countLower c = genericLength . filter (< c) fac :: Integer -> Integer fac 0 = 1 fac x = x * fac (x - 1)