Skip to content

Instantly share code, notes, and snippets.

@matthavener
Created June 8, 2012 03:22
Show Gist options
  • Select an option

  • Save matthavener/2893355 to your computer and use it in GitHub Desktop.

Select an option

Save matthavener/2893355 to your computer and use it in GitHub Desktop.
proj euler 12
(ns junk.core
(:use clojure.test))
(defn check-prime [ps candidate] (every? #(not= 0 (mod candidate %)) ps))
(deftest check-prime-test
(is (check-prime [2 3 5] 7))
(is (not (check-prime [2 3 5] 6))))
(defn next-prime [ps max] (first
(filter #(check-prime ps %)
(map (partial + max) (range)))))
(deftest next-prime-test
(is (= (next-prime [2] 2) 3)))
(defn primes
([] (cons 2 (primes [2] 2)))
([ps max]
(lazy-seq (let [np (next-prime ps max)]
(cons np
(primes
(conj ps np)
(inc max)))))))
(deftest primes-test
(is (= (first (primes)) 2))
(is (= (seq [2 3 5 7 11 13]) (seq (take 6 (primes))))))
(defn divides-times [n div]
(loop [n' n count 0]
(if (= 0 (mod n' div))
(recur (quot n' div) (inc count))
[n' count])))
(deftest divides-times-test
(is (= (divides-times 6 2) [3 1]))
(is (= (divides-times 6 5) [6 0])))
(defn find-divisors' [n ps]
(reduce
(fn [[n m] div]
(let [[n' count] (divides-times n div)]
(if (= count 0)
[n' m]
[n' (conj m [div count])]))) [n {}] ps))
(defn find-divisors [n ps]
(second (find-divisors' n (take-while (partial > n) ps))))
(deftest find-divisors-test
(let [ps (primes)]
(is (= (find-divisors 28 ps) {7 1 2 2}))))
(defn count-divisors [n ps]
(apply * (map (partial + 1) (vals (find-divisors n ps)))))
(deftest count-divisors-test
(is (= (count-divisors 28 (primes)) 6)))
(defn tris [n cur] (lazy-seq (cons n (tris (+ n cur) (inc cur)))))
(deftest test-tris
(is (= (take 5 (tris 1 2)) '(1 3 6 10 15))))
(defn find-solution [maxdivs ps]
(first (filter #(< maxdivs (count-divisors % ps)) (tris 1 2))))
(defn -main
"I don't do a whole lot."
[& args]
(let [ps (take 501 (primes))
soltri (find-solution 500 ps)]
(println "sol " (str soltri))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment