最近、Clojureの勉強会に出ていて、Project Euler の4番の高速版を作ってみました。
説明の画像を作ったので、貼ります。
コードも貼っときます。
説明はgistのコメントで。
説明の画像を作ったので、貼ります。
コードも貼っときます。
説明はgistのコメントで。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;ざっと思い付いたものを実装してみました。 | |
;; 合っているかどうかも未検証 (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))))))) | |
0 コメント:
コメントを投稿