Я ответил на проблему Эйлера очень грубо. Естественно, когда я добрался до новой разблокированной связанной ветки форума, был гораздо более умный алгоритм. А именно, у участника, который шел за ручку Begoner, был такой новый подход, что я решил переопределить свое решение, используя его алгоритм. Его версия была на Python (с использованием вложенных циклов), и я переопределил ее в Clojure (используя один цикл / recur).
Здесь для вашего развлечения:
(defn palindrome? [n]
(let [len (count n)]
(and
(= (first n) (last n))
(or (>= 1 (count n))
(palindrome? (. n (substring 1 (dec len))))))))
(defn begoners-palindrome []
(loop [mx 0
mxI 0
mxJ 0
i 999
j 990]
(if (> i 100)
(let [product (* i j)]
(if (and (> product mx) (palindrome? (str product)))
(recur product i j
(if (> j 100) i (dec i))
(if (> j 100) (- j 11) 990))
(recur mx mxI mxJ
(if (> j 100) i (dec i))
(if (> j 100) (- j 11) 990))))
mx)))
(time (prn (begoners-palindrome)))
Также были ответы на Common Lisp, но они были для меня невыносимы.