Haskell学习讨论
查看原帖
Haskell学习讨论
625398
_OTZ_楼主2024/10/8 23:16

业余爱好学一点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
2024/10/8 23:16
加载中...