1000以下の回文素数で最大のものを示す

1000以下の回文素数で最大のものを示せ

示してみる。

(use '[clojure.contrib.lazy-seqs :only (primes)])

(defn palindromic-number? [n]
  (let [v (vec (str n))]
    (= v (reverse v))))
    
(defn last-palindromic-prime-number [limit]
  (->> primes
       (take-while (partial > limit))
       (filter palindromic-number?)
       last))
(last-palindromic-prime-number 1000) ;=> 929

部分シーケンスの切出しと回文判定はどっちが先でもいいね。

(defn last-palindromic-prime-number [limit]
  (->> primes
       (filter palindromic-number?)
       (take-while (partial > limit))
       last))

回文判定の回数を最小限にしたいならこうかな?

(defn last-palindromic-prime-number [limit]
  (->> primes
       (take-while (partial > limit))
       reverse
       (filter palindromic-number?)
       first))

reverse のコストがどれだけのものかよくわからないので、これが効率的なのかどうかはわからない。