No offence, Ashish, but this code is unreadable, this is horrible.
It'll be better if you first learn Clojure before you look for
optimizations. ~BG

On Mon, Oct 13, 2014 at 6:40 PM, Ashish Negi <thisismyidash...@gmail.com> wrote:
> I am competing in an online competition and the scenario is like this :
> I coded with my basic knowledge of clojure and got 11 out of 20 testcases
> and others being timed out and one being runtime error..
>
> I started optimizing my code and read
> https://groups.google.com/forum/#!searchin/clojure/performance/clojure/SxT2MaOsip8/xoMkDVHeOqMJ
> and other google articles for performance.. but after that i just managed to
> solve only one more problem and i am stuck at 12 solved.. ( the time for
> each case is 8 seconds max)
> The last 12th was completed in 7.05 secs :) .. just on the border huh... :)
>
> The problem is about that of Solving calculataor expressions like
> "2+3/2/2/(2+8)" mod 10^8+7  gives answer 10^8+3..
> Nevertheless it is the concern but optimizing code is :)
>
> This is current condition of my code :
>
> (ns fpcontest.expression)
>
> (def Term)
> (def Factor)
>
> (def ToMod (int (+ 1000000000 7)))
>
> ;; (int ToMod)
>
> (def toPrint false)
>
> (defn myprintln [& args]
>   ;; (if toPrint
>   ;;   (apply println args))
> )
>
> (defn EulerDivNonMemo [^long x ^long p]
>   (let [ToMod (+ p 2)]
>     (loop [num (long 1) toPow p numDouble x]
>       (if (= 0 toPow)
>         ;;(do (myprintln " EulerDiv : " num " for " x p))
>         num
>         (let [numDouble2 (rem (* numDouble numDouble) ToMod)
>               halfToPow (bit-shift-right toPow 1)]
>           (if (odd? toPow)
>             (recur (rem (* num numDouble) ToMod)
>                    halfToPow
>                    numDouble2)
>             (recur num halfToPow numDouble2))
>
>           ))))
>   )
>
> (def EulerDiv (memoize EulerDivNonMemo)
> )
>
> ;; (EulerDiv 2 2)
> ;; (defn TestEulerDiv []
> ;;   (and
> ;;    (= 2 (mod (* 4 (EulerDiv 2 (- 3 2))) 3))
> ;;    (= 1 (mod (* 2 (EulerDiv 2 (- 3 2))) 3))
> ;;    (= 1 (int (mod (* 2 (EulerDiv 2 (- ToMod 2))) ToMod))))
> ;;   )
>
> ;; (= true (TestEulerDiv))
>
> (defn Expression [lst]
>   (let [term (Term lst)
>         ;; p (myprintln term " term for exp " lst)
>         sizeTerm (count term)
>         evaluateExpr
>         (fn [opr lst]
>           (let [expr (Expression (drop 2 lst))
>                 ;; p (myprintln expr " expr for Expr " lst " and " opr)
>                 intLst (first lst)]
>             (cons (rem (opr intLst
>                             (first expr))
>                        ToMod) (drop 1 expr))))]
>     (if (> sizeTerm 2)
>       (if (= (second term) "+")
>         (evaluateExpr + term)
>         (if (= (second term) "-")
>           (evaluateExpr - term)
>           term)
>         )
>       ;; first of term is the answer
>       term
>       )
>     ))
>
>
> (defn Term [lst]
>   (let [factor (Factor lst)
>         ;; p (myprintln factor " factor for term " lst)
>         sizeFactor (count factor)
>         evaluateExpr
>         (fn [opr lst]
>           (let [expr (Term (drop 2 lst))
>                 ;;p (myprintln expr " term for expr " lst
> " and " opr)
>                 intLst (first lst)]
>             (cons (rem (opr intLst
>                             (first expr))
>                        ToMod) (drop 1 expr) )))]
>     (if (> sizeFactor 2)
>       (if (= (second factor) "*")
>         (evaluateExpr * factor)
>         (if (= (second factor) "/")
>           (let [expr (Term (drop 2 factor))
>                 fExpr (first expr)]
>             (cons (rem (* (first factor) (EulerDiv fExpr (- ToMod 2)))
>                        ToMod) (drop 1 expr))
>             )
>           ;;(evaluateExpr / factor)
>           factor)
>         )
>       factor
>       )
>     ))
>
> (defn Factor [lst]
>   (let [fFactor (first lst)
>         ;;p (myprintln " Factor has : " lst)
>         ]
>     (if (= fFactor "+")
>       (cons (int (Integer. (second lst))) (rest lst))
>       (if (= fFactor "-")
>         (cons (- (int (Integer. (second lst)))) (rest (rest lst)))
>         (if (= fFactor "(")
>           ;; remove the '(' and ')'
>           (let [expr (Expression (rest lst))]
>             (cons (first expr) (drop 2 expr))
>             )
>           ;; (if (= (count lst) 1))
>           (cons  (int (Integer. (first lst))) (rest lst))
>           ;;(myprintln "I do not know where i am... " lst)
>
>         )
>       ))
>   )
>
> (defn split-with-delim [d s]
>   (clojure.string/split
>    s (re-pattern (str "(?=" d
>                     ")|(?<=" d
>                     ")"))))
>
> (defn make-calulator-list [s]
>   (->> s
>        (split-with-delim #"[\/\+\-\*\(\) ]")
>        (filter #(not (or (= "" %) (= " " %))))
>        doall
>        ))
>
> (defn StartRun [FuncToCall inputParse outputParse]
>   (let [lines (line-seq (java.io.BufferedReader. *in*))]
>     (outputParse (FuncToCall (inputParse (first lines)))))
> )
>
>
> and this is how i am testing my code ................................
> ****************** Test ********************************
>
>
>
>
> (defn RunTests []
>   (and
>    (= 1717 (int (first (Expression (make-calulator-list " 22 * 79 - 21")))))
>
>    (= 12 (int (first (Expression (make-calulator-list " 4/2/2 + 8")))))
>
>    (= 4  (int (first (Expression (make-calulator-list "4/-2/2 + 8")))))
>
>    (= 999998605 (int (mod  (first (Expression (make-calulator-list
> "55+3-45*33-25"))) ToMod)))
>
>    (= 999999987 (int (mod  (first (Expression (make-calulator-list
> "4/-2/(2+8)"))) ToMod)))
>
>    (= 22 (int (first (Expression (make-calulator-list "(22)*+1/-1+(1)")))))
>
>    (= 22 (int (first (Expression (make-calulator-list "11*(2/2)*2")))))
>
>    (= 11 (int (first (Expression (make-calulator-list "22*2/2*2")))))
>
>    (= '("4" "/" "-" "2" "/" "2" "+" "8")
>       (make-calulator-list "4/-2/2 + 8"))
>    (= '("4" "/" "-" "2" "/" "(" "2" "+" "8" ")")
>       (make-calulator-list  " 4/-2/(2 + 8)"))
>
>    )
> )
>
> (RunTests)
>
> (Expression '("3" "+" "2"))
>
> (conj '("3") 1)
> (cons 2333 '(2 3 4))
> (cons 2 (drop 1 '()))
> (drop 1 '())
>
> (str (int 1.0))
> (cons "1" '(1 "3"))
> (cons "1" nil)
> (int (Integer. "1"))
>
> (int (mod (first (Expression (make-calulator-list "4/-2/(2+8)"))) ToMod))
>
>
> (mod (first (Expression (make-calulator-list "4/2"))) ToMod)
>
>
> (defn diffTime [func & args]
>   (let [start (.getTime (java.util.Date.))
>         res (apply func args)
>         end (.getTime (java.util.Date.))]
>     (- end start)))
>
> (defn somuchtime= [times]
>   (let [start (java.util.Date.)
>         ]
>     (loop [iTime 0]
>       (if (= iTime times)
>         start
>         (recur (inc iTime))))))
>
>
> (defn GenerateCalculatorTests [nums]
>   (loop [num 0 sb (StringBuilder.)]
>     (if (= num nums)
>       (str "1" (.toString sb))
>       (->> sb
>            ((fn [sb]
>               (let [r (rand-int 500)]
>                 (do (if (< r 100)
>                       (.append sb "+")
>                       (if (< r 200)
>                         (.append sb "-")
>                         (if (< r 300)
>                           (.append sb "*")
>                           (if (< r 497)
>                             (.append sb "/")
>                             (.append sb (str
>                                          "*("
>                                          (GenerateCalculatorTests 4)
>                                          ")+"))))))
>                     (.append sb (rand-int 1000000000))
>                     sb))))
>            (recur (inc num))
>        ))
>     )
> )
>
> (GenerateCalculatorTests 50)
>
> (defn Execute [num]
>   (let [str (GenerateCalculatorTests num)]
>     (do (println str " = " ) (Expression (make-calulator-list
> (GenerateCalculatorTests num))))))
>
> (diffTime Execute 2074)
>
>
>
> I find that the last problem which is giving runtime error is may be
> StackOverflow as i get it in with
> (diffTime Execute 3000) ;; where 3000 tries to get a calculator expression
> of 3000 or more ints.. see GenerateCalculatorTests..
>
>
> with diffTime i also found that using rem is faster than using mod..
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.



-- 
Baishampayan Ghose
b.ghose at gmail.com

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to