For this problem, we just need to find the sum of the longest sequence of consecutive primes that sums to a prime less than 1,000,000.
(use '[clojure.contrib.lazy-seqs :only (primes)]) ;; This is better than euler-19 accum, which wasn't lazy (defn make-seq-accumulator [seq] (map first (iterate (fn [[sum s]] [(+ sum (first s)) (next s)]) [(first seq) (rest seq)]))) (def prime-sums (conj (make-seq-accumulator primes) 0)) (defn euler-50 [goal] (loop [c 1] (let [bots (reverse (take c prime-sums)) tops (take c (reverse (take-while #(> goal (- % (last bots))) (rest prime-sums))))] (if-let [v (some #(if (prime? %) % nil) (map #(- %1 %2) tops bots))] v (recur (inc c)))))) (euler-50 1000000) ;; "Elapsed time: 2.675548 msecs"
That may be my most performant solution yet, especially for my first trial! (To be honest, I’m pretty sure
primes must already be cached in memory…)
See you later!