<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 ( ( &lt;|&gt; ) , many ) <br>
<br>validChars :: PB.Parser Char<br>validChars  = alphaNum &lt;|&gt; oneOf &quot;._&quot; <br><br>dontCare :: PB.Parser Char <br>dontCare = oneOf &quot;~!@#$%^&amp;*()&lt;&gt;?,.&quot;<br><br>{--<br>emailAddress :: PB.Parser  String<br>
emailAddress = do <br>             _ &lt;- many dontCare<br>             fi &lt;- alphaNum<br>             se &lt;- validChars<br>             th &lt;- validChars<br>             fo &lt;- validChars<br>             ft &lt;- validChars<br>
             restAddr &lt;- many validChars<br>             let addr = fi : se : th : fo : ft : restAddr <br>             char &#39;@&#39;<br>             dom &lt;- many1 alphaNum <br>             rest &lt;- try ( string &quot;.com&quot; &lt;|&gt; string &quot;.org&quot;  <br>
                  &lt;|&gt;  string &quot;.edu&quot; ) &lt;|&gt; try ( string &quot;.<a href="http://co.in">co.in</a>&quot; )<br>             _ &lt;- many dontCare<br>             return $  addr ++ (  &#39;@&#39;: dom ++ rest ) <br>
   <br>--} <br>          <br>emailAddress :: PB.Parser String<br>emailAddress = conCatfun &lt;$&gt; ( many dontCare *&gt; alphaNum ) &lt;*&gt; validChars &lt;*&gt; <br>               validChars &lt;*&gt; validChars &lt;*&gt; validChars &lt;*&gt; many alphaNum  &lt;*&gt; <br>
               ( char &#39;@&#39; *&gt; many1 alphaNum ) &lt;*&gt; ( try ( string &quot;.com&quot; &lt;|&gt; <br>               string &quot;.org&quot; &lt;|&gt;  string &quot;.edu&quot; ) &lt;|&gt; try ( string &quot;.<a href="http://co.in">co.in</a>&quot; ) <br>
               &lt;* many dontCare ) where <br>                conCatfun a b c d e f dom rest = <br>                       ( a : b : c : d : e : f ) ++ ( &#39;@&#39; : dom ++ rest )<br><br><br>collectEmail :: BS.ByteString -&gt; String<br>
collectEmail email = case  parse emailAddress &quot;&quot; email of<br>                        Right addr -&gt; addr <br>                        Left err -&gt;  &quot;&quot; <br><br>process :: ( Int , [ String ] ) -&gt; BS.ByteString<br>
process ( k , xs ) = ( BS.pack &quot;Case &quot; ) `BS.append` ( BS.pack . show $ k ) <br>          `BS.append` ( BS.pack &quot;: &quot; ) `BS.append` ( BS.pack . show $ k ) <br>          `BS.append` ( BS.pack &quot;\n&quot; ) `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>