业余爱好学一点Haskell,欢迎━(`∀´)ノ亻! 大佬们前来指导讨论
一开始想着按照越靠前越大来排序,写出来又长又丑
module Main where
import Control.Monad.Reader
import Data.Char (digitToInt)
import Data.List
main :: IO ()
main = getLine >> words <$> getLine
>>= putStrLn . concat . sortBy compareStringsAsNumbers
compareStringsAsNumbers :: String -> String -> Ordering
compareStringsAsNumbers (x : xs) (y : ys) =
let cmp' = compare (digitToInt y) (digitToInt x)
in if cmp' == EQ then flip runReader x $ compareStringsAsNumbers' xs ys else cmp'
compareStringsAsNumbers [] [] = EQ
compareStringsAsNumbers [] _ = LT
compareStringsAsNumbers _ [] = GT
compareStringsAsNumbers' :: String -> String -> Reader Char Ordering
compareStringsAsNumbers' (x : xs) (y : ys) = do
let cmp' = compare (digitToInt y) (digitToInt x)
if cmp' /= EQ then return cmp' else compareStringsAsNumbers' xs ys
compareStringsAsNumbers' [] [] = return EQ
compareStringsAsNumbers' [] (x : _) = do
initial <- ask
return $ if x >= initial then GT else LT
compareStringsAsNumbers' (x : _) [] = do
initial <- ask
return $ if x >= initial then LT else GT
无意间看到了 HexMagic 大佬的代码, 又看了看题解, 大佬们真是太牛啦, 精准而优雅
module Main where
import Data.List
myCompare :: String -> String -> Ordering
myCompare a b = compare x y
where
x = a ++ b
y = b ++ a
main :: IO ()
main = getLine >> words <$> getLine >>= putStrLn . concat . reverse . sortBy myCompare