Source

euler / clojure / 12.clj

Full commit
; The sequence of triangle numbers is generated by adding the natural numbers.
; So the 7^(th) triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The
; first ten terms would be:
; 
; 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
; 
; Let us list the factors of the first seven triangle numbers:
; 
;      1: 1
;      3: 1,3
;      6: 1,2,3,6
;     10: 1,2,5,10
;     15: 1,3,5,15
;     21: 1,3,7,21
;     28: 1,2,4,7,14,28
; 
; We can see that 28 is the first triangle number to have over five divisors.
; 
; What is the value of the first triangle number to have over five hundred
; divisors?
;
; Answer: 76576500

(defn num-factors [n]
  (let [max (inc (int (Math/sqrt n)))]
   (loop [fs [] i 1]
     (if (= i max)
       (count (set fs)) ; Unique items
       (if (zero? (mod n i))
         (recur (concat fs [i (/ n i)]) (inc i))
         (recur fs (inc i)))))))

(defn traignles-step [it]
  (let [i (first it) t (last it)]
    [(inc i) (+ i t)]))

(defn triangles []
  (map last (rest (iterate traignles-step [1 0]))))

(defn find-n [n]
  (let [fseq (pmap (fn [i] [i (num-factors i)]) (triangles))]
    (ffirst (filter (fn [fs] (> (last fs) n)) fseq))))

(prn (find-n 500))
(shutdown-agents) ; So we'll exit nicely