Euler 4 retry

Posted by YpsilonTAKAI On 2012年12月17日月曜日 0 コメント
最近、Clojureの勉強会に出ていて、Project Euler の4番の高速版を作ってみました。

説明の画像を作ったので、貼ります。


コードも貼っときます。
説明はgistのコメントで。

;;ざっと思い付いたものを実装してみました。
;; 合っているかどうかも未検証 (12/17)
;;(12/17 21:00)
;; やっぱり考慮がまったく足りていなかったので、基本は変えずに全面みなおし。
(defn palindromic? [s]
(= (seq s) (reverse s)))
(defn diagonal-line [ulimit llimit]
(mapcat #(list [% %]
[% (dec %)]) (range ulimit llimit -1)))
(defn shicho [[l r] ulimit llimit]
(map vector (range l (inc ulimit)) (range r (dec llimit) -1)))
(defn find-bigger [max-data new-pair ulimit llimit]
(loop [pair-list (shicho new-pair ulimit llimit)]
(let [new-num (reduce * (first pair-list))]
(cond (empty? pair-list)
,,max-data
(< new-num (first max-data))
,,max-data
(parindromic? new-num)
,,[new-num (first pair-list)]
:t
,,(recur (next pair-list))))))
(defn pe4 [n]
(let [ulimit (dec (reduce * (repeat n 10)))
llimit (reduce * (repeat (dec n) 10))]
(loop [[max pair :as max-data] [0 [0 0]]
diagonal-list (diagonal-line ulimit llimit)]
(if(> max (reduce * (first diagonal-list)))
max-data
(let [new-max (find-bigger max-data
(first diagonal-list)
ulimit
llimit)]
(recur new-max (next diagonal-list)))))))
view raw pe_4_other.clj hosted with ❤ by GitHub



0 コメント:

コメントを投稿