同じ間隔で並んでいる3つの4桁の素数で、同じ数字で構成されているものを求める問題。
まず、4桁の素数を全てについて、構成する数字をキーにしたmapに入れる。同じ数字で構成されているものは同じキーに関連付けられる。
([1 4 8 7] , (1487 4817 8147))
のような感じ。
そして、その中の3つ以上の数が入っているものについて、等間隔にならんだ3数があれば取り出す。
まず、4桁の素数を全てについて、構成する数字をキーにしたmapに入れる。同じ数字で構成されているものは同じキーに関連付けられる。
([1 4 8 7] , (1487 4817 8147))
のような感じ。
そして、その中の3つ以上の数が入っているものについて、等間隔にならんだ3数があれば取り出す。
;;
;; Problem 49 : 2011/6/14
;; "Elapsed time: 93.160443 msecs"
(defn seq-of-3 [coll]
(for [a coll b coll c coll :when (= (- (* b 2) a) c)
:when (< a b)
:when (< b c)]
[a b c]))
(let [four-digit-primes (drop-while #(< % 1000) (prime-nums-under 10000))
*digits-map* (atom {})]
(dorun
(map (fn [n]
(let [key (sort (num-to-list n))]
(swap! *digits-map* assoc key (cons n (@*digits-map* key)))))
four-digit-primes))
(mapcat seq-of-3
(for [key (keys @*digits-map*) :when (>= (count (@*digits-map* key)) 3)]
(sort (@*digits-map* key))))
)
;;
0 コメント:
コメントを投稿