import Data.List(sortBy) import Data.Char(isDigit) data Mark = D | C | H | S deriving (Show, Enum, Read) toNum :: String -> Int toNum "A" = 1 toNum "T" = 10 toNum "J" = 11 toNum "Q" = 12 toNum "K" = 13 toNum str | and (map isDigit str) = read str | otherwise = 0 fromNum :: Int -> String fromNum 1 = "A" fromNum 10 = "T" fromNum 11 = "J" fromNum 12 = "Q" fromNum 13 = "K" fromNum x = show x comp :: (Mark, Int) -> (Mark, Int) -> Ordering comp (ma, a) (mb, b) | c /= EQ = c | otherwise = compare a b where c = compare (fromEnum ma) (fromEnum mb) main = do getLine cards <- return . unwords . map (\(m, n) -> show m ++ fromNum n) . sortBy comp . map ((\(m, n) -> (read m :: Mark, toNum n)) . (splitAt 1)) . words =<< getLine putStrLn cards