someone posted a 200,000 char test-string: 
http://pastebin.com/raw.php?i=a8veAND3
(doesn't view properly in chrome, view-source and save)
and the previous code failed pretty hard..

so, new approach

- one pass has all the information on where each character occurs. so,
create a map with each character as key having value as list of
indices where the character occurs
- test for palindrome between these indices for each key(character)
- keep track of current-largest-palindrome and ignore strings smaller
than that

code: http://clojure.pastebin.com/zmmH1G58

new times(for 200,000 char string):
real    3m0.351s
user    3m1.299s
sys     0m1.008s

largest palindrome: amanaplanaracecaranalpanama


On Oct 15, 1:22 pm, siddarth shankar <sith.darth.shan...@gmail.com>
wrote:
> i could get it down to around 1.6/1.7 seconds
>
> s...@sid-xxxxxxxx:~$ time clojure dummy.clj
> woohoo palindrome:  eve
> woohoo palindrome:  ranynar
>
> real    0m1.739s
> user    0m2.088s
> sys     0m0.124s
>
> made a couple of changes
> - only call 'palindrome?' for substrings between identical
> characters(between 2 'p's etc.)
> - ignore substrings smaller than our currently largest palindrome
>
> code:
> --------------------------------------------------------------------------- 
> --------------------------------------------------------------------------- 
> -------------------------
> (def source2
> "fourscoreandsevenyearsagoourfaathersbroughtforthonthiscontainentanewnation
> conceivedinzlibertyanddedicatedtothepropositionthatallmenarecreatedequalnow
> weareengagedinagreahtcivilwartestingwhetherthatnaptionoranynartionsoconceiv
> edandsodedicatedcanlongendureweareqmetonagreatbattlefiemldoftzhatwarwehavec
> ometodedicpateaportionofthatfieldasafinalrestingplaceforthosewhoheregavethe
> irlivesthatthatnationmightliveitisaltogetherfangandproperthatweshoulddothis
> butinalargersensewecannotdedicatewecannotconsecratewecannothallowthisground
> thebravelmenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorpo
> nwertoaddordetracttgheworldadswfilllittlenotlenorlongrememberwhatwesayhereb
> utitcanneverforgetwhattheydidhereitisforusthelivingrathertobededicatedheret
> otheulnfinishedworkwhichtheywhofoughtherehavethusfarsonoblyadvanceditisrath
> erforustobeherededicatedtothegreattdafskremainingbeforeusthatfromthesehonor
> eddeadwetakeincreaseddevotiontothatcauseforwhichtheygavethelastpfullmeasure
> ofdevotionthatweherehighlyresolvethatthesedeadshallnothavediedinvainthatthi
> snationunsdergodshallhaveanewbirthoffreedomandthatgovernmentofthepeoplebyth
> epeopleforthepeopleshallnotperishfromtheearth")
>
> (def max-length 2)
>
> (defn palindrome?
>   [#^String s]
>   (let [len (.length s)]
>     (loop [i 0
>            j (dec len)]
>       (if (> i j)
>         (do
>           (println "woohoo palindrome: " s)
>           (when (> len max-length)                 ;; set the max-length
> thread-safely?
>             (def max-length len)))
>         (when (= (.charAt s i) (.charAt s j))
>           (recur (inc i) (dec j)))))))
>
> (defn find-largest-palindrome
>   [#^String s]
>   (let [len (.length s)]
>     (loop [i 0
>            j (+ i max-length 1)]
>       (let [sub-string (.substring s i (inc j))]
>         (if (= (.charAt s i) (.charAt s j))
>           (palindrome? sub-string))               ;; can spawn into a thread-
> pool?
>         (if (= j (- len 1))
>           (when (< i (- len max-length))
>             (recur (inc i) (if (> len (+ i max-length 1))
>                              (+ i max-length 1)
>                              (dec len))))
>           (recur i (inc j)))))))
>
> (find-largest-palindrome source2)
> --------------------------------------------------------------------------- 
> -----------------------------------------------------------------------
>
> - using clojure 1.1.0 (ubuntu maverick package!!)
> - ignoring substrings smaller than current-palindrome makes a
> difference of only about .5 secs (maybe better for larger strings?)
> - can the recur bits in the code above be more elegant/idiomatic?
> looks really hacky
>
> ps: getting clojure + emacs to work is still bumpy :D
>
> On Oct 14, 5:19 am, Btsai <benny.t...@gmail.com> wrote:
>
>
>
> > I think the indexing in all-combs may be off, causing it to miss
> > certain combinations/substrings.
>
> > user=> (all-combs "abc")
> > ("a" "ab")
>
> > I used this instead:
>
> > (defn substrings [s]
> >   (let [length (count s)]
> >     (for [i (range length)
> >           j (range (inc i) (inc length))]
> >       (subs s i j))))
>
> > user=> (substrings "abc")
> > ("a" "ab" "abc" "b" "bc" "c")
>
> > On Oct 12, 1: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