1000以下の回文素数で最大のものを示せ
プログラマ採用にあたり事前にコーディング技術を評価するCodeEval、βを終了して一般公開という記事がTechCrunchに出ていた。
リンク先にはデモのページがある。これによると例題として
「1000以下の最大の回文素数を見つけるプログラムを書きなさい」
とある。
回文数っていうのは「右から読んでも左から読んでも同じ数字になる数」でヒトケタのものも含まれる。例えば
1 2 3 11 22 121 1221 12221 123454321
などは回文数である。回文素数は素数でしかも回文数になっているもの。
手順としては
ことになるのは間違いないが、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個あることもわかる。