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

Reply via email to