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

プログラマ採用にあたり事前にコーディング技術を評価するCodeEval、βを終了して一般公開という記事がTechCrunchに出ていた。
リンク先にはデモのページがある。これによると例題として

「1000以下の最大の回文素数を見つけるプログラムを書きなさい」

とある。
回文数っていうのは「右から読んでも左から読んでも同じ数字になる数」でヒトケタのものも含まれる。例えば

1 2 3 11 22 121 1221 12221 123454321

などは回文数である。回文素数素数でしかも回文数になっているもの。
手順としては

  • 1000までの素数を見つける
  • 片っぱしから回文数になっているかどうかを調べる

ことになるのは間違いないが、Clojureだと多少スマートに書ける。

ネットで調べてClojure素数を見つけるプログラムはここにあったのでいただく(w

以下答:

(defn nums [] (iterate inc 2))

(defn sieve [[p & xs]]
  (remove #(= (rem % p) 0) xs))

(defn primes []
  (map first (iterate sieve (nums))))

(defn palin? [n]
  (= (String. (into-array Character/TYPE (reverse (str n))))
     (str n)))

(last (filter palin? (take-while #(< % 1000) (primes))))

答えは 929

文字のシーケンスを文字列にする関数がないのがちょっとしょぼい>Clojure

(count (filter palin? (take-while #(< % 1000) (primes))))

で1000までの回文素数は20個あることもわかる。