ClojureでProject Euler(4)やってみた

ClojureProject Eulerの問題4をやってみた。

左右どちらから読んでも同じ値になる数を回文数という。 2桁の数の積で表される回文数のうち、最大のものは 9009 = 91 × 99 である。

では、3桁の数の積で表される回文数のうち最大のものはいくらになるか。

こんな感じかな

(defn palin? [x] 
    (= (reverse (str x))(reverse (reverse (str x))))) ;; 回文数の判定

(def numbers 
    (for [x (range 100 1000) y (range 100 1000)] (* x y ))) ;; 対象となる数字の遅延シーケンス

(apply max (filter palin? numbers)) ;; 数字の並びの中から回文数を探して最大値を得る

無理やりまとめると

(apply max (filter (fn [x] (= (reverse (str x))(reverse (reverse (str x))))) (for [ x (range 100 1000) y (range 100 1000) ] (* x y))))

で書けてしまう。

確かに超簡潔になるね...。

ただし、Clojure Boxのemacsみたいに()のネスティングを教えてくれるツールがないと死んじゃうねこれは(w

なお、答は906609であってると思うがどうでしょうか?
あと、これらが何と何の積か記録できるといいな...