Skip to content

Instantly share code, notes, and snippets.

@ypsilon-takai
Created December 17, 2012 07:55
Show Gist options
  • Save ypsilon-takai/4316509 to your computer and use it in GitHub Desktop.
Save ypsilon-takai/4316509 to your computer and use it in GitHub Desktop.
Project euler 4
;;ざっと思い付いたものを実装してみました。
;; 合っているかどうかも未検証 (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)))))))
@tnoda
Copy link

tnoda commented Dec 17, 2012

元が一桁増える毎に実行時間が 100 倍だったので,これ(一桁増える毎に 10 倍)はかなり速くなっていますね.

@kohyama
Copy link

kohyama commented Dec 19, 2012

👍
私も, 最初に, 同じ探索順序を検討したのですが, 降順にならないことが分かった時点であきらめてしまっていました.
方法ももちろん参考になりますが, 思いつきを最後まで形にする実行力. 見習いたいです.

桁が増えるとかなり効いてきますから, 元の問題の範囲での費用対効果にとらわれず, こういった演習をしておくと実用開発の時に役立ちますよね.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment