<div dir="ltr"><div><div>Hello Everyone <br></div>I am trying to learn parsec. I wrote this code to solve the problem ( <a href="http://www.spoj.com/problems/MAIN12C/">http://www.spoj.com/problems/MAIN12C/</a> ) but getting time limit exceed so how can I improve this code ? In case of indentation, I have pasted the code at ideone ( <a href="http://ideone.com/AmxvZq">http://ideone.com/AmxvZq</a> ). <br>
<br>import Data.List<br>import qualified Text.Parsec.ByteString as PB<br>import Text.Parsec.Prim<br>import Text.Parsec.Char<br>import Text.Parsec.Combinator<br>import qualified Data.ByteString.Char8 as BS<br>import Control.Applicative hiding ( ( <|> ) , many ) <br>
<br>validChars :: PB.Parser Char<br>validChars = alphaNum <|> oneOf "._" <br><br>dontCare :: PB.Parser Char <br>dontCare = oneOf "~!@#$%^&*()<>?,."<br><br>{--<br>emailAddress :: PB.Parser String<br>
emailAddress = do <br> _ <- many dontCare<br> fi <- alphaNum<br> se <- validChars<br> th <- validChars<br> fo <- validChars<br> ft <- validChars<br>
restAddr <- many validChars<br> let addr = fi : se : th : fo : ft : restAddr <br> char '@'<br> dom <- many1 alphaNum <br> rest <- try ( string ".com" <|> string ".org" <br>
<|> string ".edu" ) <|> try ( string ".<a href="http://co.in">co.in</a>" )<br> _ <- many dontCare<br> return $ addr ++ ( '@': dom ++ rest ) <br>
<br>--} <br> <br>emailAddress :: PB.Parser String<br>emailAddress = conCatfun <$> ( many dontCare *> alphaNum ) <*> validChars <*> <br> validChars <*> validChars <*> validChars <*> many alphaNum <*> <br>
( char '@' *> many1 alphaNum ) <*> ( try ( string ".com" <|> <br> string ".org" <|> string ".edu" ) <|> try ( string ".<a href="http://co.in">co.in</a>" ) <br>
<* many dontCare ) where <br> conCatfun a b c d e f dom rest = <br> ( a : b : c : d : e : f ) ++ ( '@' : dom ++ rest )<br><br><br>collectEmail :: BS.ByteString -> String<br>
collectEmail email = case parse emailAddress "" email of<br> Right addr -> addr <br> Left err -> "" <br><br>process :: ( Int , [ String ] ) -> BS.ByteString<br>
process ( k , xs ) = ( BS.pack "Case " ) `BS.append` ( BS.pack . show $ k ) <br> `BS.append` ( BS.pack ": " ) `BS.append` ( BS.pack . show $ k ) <br> `BS.append` ( BS.pack "\n" ) `BS.append` ( BS.pack <br>
( unlines . filter ( not . null ) $ xs ) )<br><br>main = BS.interact $ BS.concat . map process . zip [ 1.. ] . map ( map collectEmail . <br> BS.words ) . tail . BS.lines<br><br></div>Regards <br>Mukesh Tiwari<br>
<div><br><br></div></div>