Euler : Problem 33

Posted by YpsilonTAKAI On 2011年5月22日日曜日 0 コメント
分数の上下からおなじ数字を取り除いても値が変らないものについての問題。

調べてみると、2パターンしかなくて、
[ax]/[ya] = x/y
[xa]/[ay] = x/y
片方計算すれば、其を逆数にしたものがもう一方になるはず。
また、aとxとyは全部異なる数であることもわかる。

ということで、1から9の数字からa,x,yの3つの数字を選んで分数を作って、あてはまるかどうか計算する。

;
;; Problem 33 : 2011/5/18
;; "Elapsed time: 12.869792 msecs"
;; type
;; [ax]/[ay] = x/y
;; a=0 or x=y :: not allowed
;; [xa]/[ya/ = x/y
;; x=y :: not allowed
;;
;; [ax]/[ya] = x/y
;; [xa]/[ay] = x/y

(defn select-nums
([col] (select-nums col [1 2 3 4 5 6 7 8 9]))
([col digit-list]
(loop [num-list digit-list
coll col
res-list []]
(if (empty? coll)
res-list
(let [tgt-num (nth num-list (first coll))]
(recur (vec (remove #(= % tgt-num) num-list))
(rest coll)
(conj res-list tgt-num )))))))

(defn num-list []
(for [a (range 9) x (range 8) y (range 7)]
(select-nums [a x y] [1 2 3 4 5 6 7 8 9])))

(reduce *
(map (fn [[a x y]]
(let [n (+ (* 10 x) a)
m (+ (* 10 a) y)]
(if (and (= (/ n m) (/ x y)) (< n m))
(/ n m)
1)))
(num-list)))

;;

0 コメント:

コメントを投稿