[Haskell-cafe] Parsing email id
mukesh tiwari
mukeshtiwari.iiitm at gmail.com
Fri Mar 8 11:23:18 CET 2013
Hello Everyone
I am trying to learn parsec. I wrote this code to solve the problem (
http://www.spoj.com/problems/MAIN12C/ ) but getting time limit exceed so
how can I improve this code ? In case of indentation, I have pasted the
code at ideone ( http://ideone.com/AmxvZq ).
import Data.List
import qualified Text.Parsec.ByteString as PB
import Text.Parsec.Prim
import Text.Parsec.Char
import Text.Parsec.Combinator
import qualified Data.ByteString.Char8 as BS
import Control.Applicative hiding ( ( <|> ) , many )
validChars :: PB.Parser Char
validChars = alphaNum <|> oneOf "._"
dontCare :: PB.Parser Char
dontCare = oneOf "~!@#$%^&*()<>?,."
{--
emailAddress :: PB.Parser String
emailAddress = do
_ <- many dontCare
fi <- alphaNum
se <- validChars
th <- validChars
fo <- validChars
ft <- validChars
restAddr <- many validChars
let addr = fi : se : th : fo : ft : restAddr
char '@'
dom <- many1 alphaNum
rest <- try ( string ".com" <|> string ".org"
<|> string ".edu" ) <|> try ( string ".co.in" )
_ <- many dontCare
return $ addr ++ ( '@': dom ++ rest )
--}
emailAddress :: PB.Parser String
emailAddress = conCatfun <$> ( many dontCare *> alphaNum ) <*> validChars
<*>
validChars <*> validChars <*> validChars <*> many alphaNum
<*>
( char '@' *> many1 alphaNum ) <*> ( try ( string ".com" <|>
string ".org" <|> string ".edu" ) <|> try ( string ".co.in"
)
<* many dontCare ) where
conCatfun a b c d e f dom rest =
( a : b : c : d : e : f ) ++ ( '@' : dom ++ rest )
collectEmail :: BS.ByteString -> String
collectEmail email = case parse emailAddress "" email of
Right addr -> addr
Left err -> ""
process :: ( Int , [ String ] ) -> BS.ByteString
process ( k , xs ) = ( BS.pack "Case " ) `BS.append` ( BS.pack . show $ k )
`BS.append` ( BS.pack ": " ) `BS.append` ( BS.pack . show $ k )
`BS.append` ( BS.pack "\n" ) `BS.append` ( BS.pack
( unlines . filter ( not . null ) $ xs ) )
main = BS.interact $ BS.concat . map process . zip [ 1.. ] . map ( map
collectEmail .
BS.words ) . tail . BS.lines
Regards
Mukesh Tiwari
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130308/af4344a6/attachment-0001.htm>
More information about the Haskell-Cafe
mailing list