I new the palindrome? function wasn't good in performance, but I
didn't think it would be that bad. The type hinting does improve
performance plus a mid way to compare.
Thanks for pointing that out and the max-key function.

On Oct 12, 4:15 pm, Justin Kramer <jkkra...@gmail.com> wrote:
> The 'palindrome?' function can be made much faster. Your version --
> which is idiomatic and fine when perf isn't a factor -- turns the test
> string into a sequence, reverses it, turns it back into a string, then
> checks for full equality with the original. There are faster (if
> uglier) ways to check for palindromes. This version finds the Level 1
> answer in about 150ms on my machine:
>
> (defn palindrome?
>   [^String s]
>   (let [len (.length s)
>         mid (quot len 2)]
>     (loop [i 0
>            j (dec len)]
>       (if (= i mid)
>         true
>         (when (= (.charAt s i) (.charAt s j))
>           (recur (inc i) (dec j)))))))
>
> Also, the built-in function max-key will do what your sort/max-comp
> code is doing more concisely:
>
> (apply max-key count (filter palindrome? (all-combs input)))
>
> HTH,
>
> Justin
>
> On Oct 12, 3:02 pm, tonyl <celtich...@gmail.com> wrote:
>
>
>
> > Hi, I just started to learn clojure in a more serious way and I am
> > doing the first level of the greplin challenge.
>
> > I made it to work with a short palindrome like the example they give
> > me, but when it comes to work with the input file, it takes for ever
> > and I have to stop it.
>
> > $ time clj level1.clj
> > ^C
> > real    11m35.477s
> > user    1m44.431s
> > sys     9m3.878s
>
> > This is my code:
>
> > (defn palindrome? [s]
> >   (= s (reduce str (reverse s))))
>
> > (defn all-combs [in]
> >   (let [len (count in)]
> >     (for [i (range 0 (- len 2)), j (range (+ i 1) len)]
> >       (subs in i j))))
>
> > (defn max-comp [x y]
> >   (let [lenx (count x), leny (count y)]
> >     (cond (< lenx leny) 1
> >           (= lenx leny) 0
> >           (> lenx leny) -1)))
>
> > ;;(let [input "I like racecars that go fast"]
> > (let [input (slurp "../_input/level1.in")]
> >     (println (nth (sort max-comp (filter palindrome? (all-combs
> > input))) 0)))
>
> > The input file is thishttp://challenge.greplin.com/static/gettysburg.txt
>
> > It looks a bit procedural. It is long, but I don't think is the
> > biggest bottleneck, I think it is my approach to create all the
> > combinations possible for substrings. Maybe I should be using a lazy
> > seq? How would I go to do that?

-- 
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

Reply via email to