Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么该代码在spoj上运行较慢,从而触发超时?_Haskell - Fatal编程技术网

Haskell 为什么该代码在spoj上运行较慢,从而触发超时?

Haskell 为什么该代码在spoj上运行较慢,从而触发超时?,haskell,Haskell,我试图在spoj上解决这个问题: 我的代码在我的笔记本电脑上运行得又快又好(甚至比spoj提供的cpu还要慢),但spoj一直给我超长的时间: import Control.Monad main = do num <- getLine inputs <- replicateM (read num) getLine test inputs test [] = return () test (l:ls) = do putStrL

我试图在spoj上解决这个问题:

我的代码在我的笔记本电脑上运行得又快又好(甚至比spoj提供的cpu还要慢),但spoj一直给我超长的时间:

import Control.Monad

main = do
        num <- getLine
        inputs <- replicateM (read num) getLine
        test inputs

test [] = return ()
test (l:ls) = do
    putStrLn (send l)
    test ls

send :: String -> String
send str
    | odd (length str) = makePalindrome str (take (length str `div` 2 + 1) str ++ ( reverse $ take (length str `div` 2) str))
    | otherwise        = makePalindrome str (take (length str `div` 2) str ++ (reverse $ take (length str `div` 2) str))
makePalindrome :: String -> String  -> String
makePalindrome str pal 
        | (read str :: Integer) < (read pal :: Integer) = pal
        | otherwise = makePalindrome str (nextPalindrome pal)


nextPalindrome :: String -> String
nextPalindrome (x:xs) = succ' ++ (reverse $ take rightlen succ')
        where
            strlen = length (x:xs)
            allNine = all ( (==) '9') 
            odd' = odd strlen
            left = if odd' then take (strlen `div` 2 + 1) (x:xs)  else take (strlen `div` 2) (x:xs)
            rightlen = strlen - (length left)
            succ' = show (read left + 1)


checkPalindrome :: String -> Bool
checkPalindrome str = str == (reverse str)
import-Control.Monad
main=do
数值字符串->字符串
makepalindromestrpal
|(read str::Integer)<(read pal::Integer)=pal
|否则=makePalindrome str(nextPalindrome pal)
nextPalindrome::字符串->字符串
nextPalindrome(x:xs)=成功“+”(反向$take rightlen成功)
哪里
strlen=长度(x:xs)
allNine=all((==)'9')
奇数'=奇数strlen
左=如果是奇数,则取(strlen`div`2+1)(x:xs)否则取(strlen`div`2)(x:xs)
rightlen=strlen-(长度左侧)
成功“=显示(读取左侧+1)
checkPalindrome::String->Bool
检查回文str=str==(反向str)

你读过吗?还有我两年前的个人日记说,使用
数据。通过使用
而不是
字符串
,它通过了SPOJ的佩林问题。你在你的机器上分析过代码了吗?我的意思是,你有没有验证过,在你的笔记本电脑上,代码运行的时间比spoj所需的时间要短?@ymonad,Bakuriu非常感谢,我的代码在50000位以下的0.5秒内工作,但在这段时间内会冻结。也许我应该试试数据。ByteString@SeoHaKim请注意,实际上我使用了
Data.ByteString.Lazy.Char8
来解决它,因为它比
Data.ByteString
更方便(至少两年前)。