Last active
December 31, 2015 23:19
-
-
Save skatenerd/8059125 to your computer and use it in GitHub Desktop.
projecteuler.net/problem=60
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns euler.60 | |
(:use euler.prime)) | |
(defn- crude-log [target base] | |
(let [raises (iterate #(* base %) 1)] | |
(first (keep-indexed #(if (> %2 target) %1) raises)))) | |
(defn pairs [unique-elements] | |
(set (for [first-element unique-elements | |
second-element unique-elements | |
:when (not (= first-element second-element))] | |
[first-element second-element]))) | |
(defn concat-numbers [head tail] | |
(let [exponent (crude-log tail 10) | |
raised (apply * head (repeat exponent 10)) ] | |
(+ raised tail))) | |
(def fast-concat-numbers (memoize concat-numbers)) | |
(defn remarkable-primes? [primes primes-reservoir] | |
(and | |
(every? #(prime? % primes-reservoir) (map #(apply concat-numbers %) (pairs primes))))) | |
(defn dfs [node neighbors predicate] | |
(if (predicate node) | |
node | |
(some #(dfs % neighbors predicate) (neighbors node)))) | |
(def fast-prime (memoize prime?)) | |
(defn composable? [p1 p2] | |
(and | |
(fast-prime (fast-concat-numbers p1 p2)) | |
(fast-prime (fast-concat-numbers p2 p1)))) | |
(defn find-interesting-primes [upper-boundary length] | |
(let [primes (primes-under upper-boundary)] | |
(dfs | |
#{} | |
(fn [interesting-so-far] | |
(let [addable-stuff | |
(filter | |
(fn [candidate-prime] | |
(every? | |
#(composable? candidate-prime %) | |
interesting-so-far)) | |
primes)] | |
(map #(conj interesting-so-far %) addable-stuff) | |
)) | |
#(= length (count %))))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment