Created
December 17, 2012 07:55
-
-
Save ypsilon-takai/4316509 to your computer and use it in GitHub Desktop.
Project euler 4
This file contains hidden or 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))))))) | |
👍
私も, 最初に, 同じ探索順序を検討したのですが, 降順にならないことが分かった時点であきらめてしまっていました.
方法ももちろん参考になりますが, 思いつきを最後まで形にする実行力. 見習いたいです.
桁が増えるとかなり効いてきますから, 元の問題の範囲での費用対効果にとらわれず, こういった演習をしておくと実用開発の時に役立ちますよね.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
元が一桁増える毎に実行時間が 100 倍だったので,これ(一桁増える毎に 10 倍)はかなり速くなっていますね.