Skip to content

Instantly share code, notes, and snippets.

Created October 29, 2009 10:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/221336 to your computer and use it in GitHub Desktop.
Save anonymous/221336 to your computer and use it in GitHub Desktop.
; Project euler problem 138
(use 'clojure.contrib.math)
(defn height [base leg]
(sqrt (- (expt leg 2) (expt (/ base 2) 2))))
(defn base [leg height]
(* 2 (sqrt (- (expt leg 2) (expt height 2)))))
(defn valid? [t]
(and
(= (int (t :leg)) (t :leg))
(or
(= (t :height) (dec (t :base)))
(= (t :height) (inc (t :base))))))
(defn leg [base height]
(sqrt (+ (expt (/ base 2) 2) (expt height 2))))
(defn whole-factors [x]
(map
(fn [n] [n (/ x n)])
(filter #(zero? (rem x %)) (range 1 (inc x)))))
(defn make-triangle [b-h]
(let [base (first b-h)
height (last b-h)]
{:base base :height height :leg (leg base height)}))
(defn make-triangles [size]
(filter valid?
(map make-triangle (whole-factors (* 2 size)))))
(defn sum-legs [triangles]
(reduce + 0 (map #(% :leg) triangles)))
(println (sum-legs (take 12 (reduce (fn [xs y] (into xs (make-triangles y))) [] (iterate inc 1)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment