Euler : Problem 37

Posted by TAKAIY On 2011年5月22日日曜日 0 コメント
1ケタになるまで最上位や最下位の数を取っていっても素数のままの素数の問題。

数字をリスト化して操作

最上位や最下位が素数でないものと、途中に偶数を含んでいるものものははずしてチェックした。

member?関数を作った、every?とかを使って代用できたかも。



;;
;; Problem 37 : 2011/5/19
;; "Elapsed time: 5385.057877 msecs"

(defn member? [n col]
(not-every? false? (map #(= n %) col)))

(defn list-to-num [digit-list]
(apply + (map #(* %1 (expt 10 %2)) (reverse digit-list) (iterate inc 0))))

(defn num-to-list [num]
(map #(Character/digit % 10) (str num)))

(defn all-prime-left? [numlist]
(cond (empty? numlist) true
((complement is-prime?) (list-to-num numlist)) false
:else (recur (rest numlist))))

(defn all-prime-right? [numlist]
(cond (empty? numlist) true
((complement is-prime?) (list-to-num numlist)) false
:else (recur (butlast numlist))))

(defn prob37? [n]
(let [numlist (num-to-list n)]
(cond (< n 10) false
(member? (first numlist) [1 4 6 8 9]) false
(member? (last numlist) [1 5 9])) false
(some even? (rest numlist)) false
:else
(and (all-prime-left? numlist)
(all-prime-right? numlist)))))

(reduce + (filter prob37? @*prime-list*))

;;

0 コメント:

コメントを投稿