Hi all, Since I'm fp-phobic when doing arithmetic :-) here is mine:
(defn pythagorean-triples [] (for [a (iterate inc 1) :let [squares (into {} (for [c (range a (* 1.5 a))] [(* c c) c]))] b (range 1 a) :let [c (squares (+ (* a a) (* b b)))] :when c] [a b c])) Christophe On Wed, Mar 10, 2010 at 8:39 PM, Stuart Halloway <stuart.hallo...@gmail.com>wrote: > Hi Glen, > > When your are working with infinite sets in Clojure, is it better to take > advantage of laziness as far as possible, instead of passing limits such as > the coll argument to trips. Here's how I would think about this problem: > > (defn pairs-adding-to-n > "Pairs of distinct positive integers that sum to n." > [n] > (for [x (range 1 (quot (inc n) 2))] > [x (- n x)])) > > (defn pairs > "Lazy sequence of all pairs of distinct positive integers, > in nondecreasing order by sum of the pair." > [] > (apply concat (map pairs-adding-to-n (iterate inc 1)))) > > (defn pythagorean-triples > "Lazy sequence of pythagorean triples" > [] > (->> (pairs) > (map (fn [[a b]] [a b (sqrt (+ (* a a) (* b b)))])) > (filter (fn [[a b c]] (integer? c))))) > > ;; only apply the limit (e.g. first) when asking the final question > (first (filter > (fn [args] > (= 1000 (apply + args))) > (pythagorean-triples))) > > Stu > > > I am working on the following problem: >> >> Find the only Pythagorean triplet, {a, b, c}, for which a + b + c = >> 1000 >> >> My strategy is to produce a series of triplets of a^2 + b^2 and then >> filter out the ones where the c^2 is a perfect square, in order to >> determine Pythagorean triplets. >> >> I wrote a function to produce triplets that takes a range as input: >> >> >> (use '[clojure.contrib.math :only (sqrt)]) >> >> (defn trips [coll] >> (loop [a (first coll) b (rest coll) trip []] >> (cond (seq b) >> (recur (first b) (rest b) (conj trip (map #(vector a % (sqrt (+ >> (* >> a a) (* % %)))) b))) >> true trip))) >> >> >> ,so if I want to see all triplets over the range of 1-7, I just do: >> >> (trips (range 1 7)), which yields the following; >> >> [([1 2 2.23606797749979] [1 3 3.1622776601683795] [1 4 >> 4.123105625617661] [1 5 5.0990195135927845] [1 6 6.082762530298219]) >> ([2 3 3.605551275463989] [2 4 4.47213595499958] [2 5 >> 5.385164807134504] [2 6 6.324555320336759]) ([3 4 5] [3 5 >> 5.830951894845301] [3 6 6.708203932499369]) ([4 5 6.4031242374328485] >> [4 6 7.211102550927978]) ([5 6 7.810249675906654])] >> >> Obviously the only Pythagorean triplet burried in there is 3, 4, 5. >> >> Now, I can easily test a single vector for integers as follows: >> >> (map integer? [5 6 7]) >> >> However, the output of my trips function yields multiple collections >> of vectors inside of a larger vector. I am completely befuddled as to >> how to process this behemoth. >> >> I guess I need to use some functions for merging collections? >> >> Any help apprectiated. thanks!! >> >> -- >> 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<clojure%2bunsubscr...@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 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<clojure%2bunsubscr...@googlegroups.com> > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > -- Professional: http://cgrand.net/ (fr) On Clojure: http://clj-me.cgrand.net/ (en) -- 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