With the tricks we learned in the last problem, solving problem 45 was a snap.
(def triangle-nums (map #(bit-shift-right (* % (dec %)) 1) (iterate inc 2)))
(defn pentagonal? [n]
(zero? (rem (+ 1 (Math/sqrt (+ 1 (* 24 n)))) 6)))
(defn hexagonal? [n]
(zero? (rem (+ 1 (Math/sqrt (+ 1 (* 8 n)))) 4)))
(defn euler-45 []
(first (drop 2 (filter #(and (pentagonal? %)
(hexagonal? %))
triangle-nums))))
(time (euler-45)) ;; "Elapsed time: 147.319195 msecs"
One of the more straightforward solutions, I think. The obvious optimization from reading wikipedia is to realize that all hexagonal numbers are also triangular, so we can generate the hexagonal numbers directly and they will necessarily be triangular.
(def hexagonal-nums (map #(* % (dec (* 2 %))) (iterate inc 1)))
(defn pentagonal? [n]
(zero? (rem (+ 1 (Math/sqrt (+ 1 (* 24 n)))) 6)))
(defn euler-45-revised []
(first (drop 2 (filter pentagonal? hexagonal-nums))))
(time (euler-45-revised)) ;; "Elapsed time: 11.504974 msecs"
See you tomorrow!