Euler: Problem 104

Posted by YpsilonTAKAI On 2020年3月14日土曜日 0 コメント
これも去年の年末にやったやつです。

Fibonacci数列で、最初の9桁がPandigit(1-9を全て含む)で、最後の9桁もPandigitのものを探す問題。

Fibonacci数列を順に作って条件に合うかどうかチェックするだけですが、ちょっと工夫したと言えば、数字を文字列にするのってコストがかかるので、数字のまま取りだせる下9桁を先にチェックするようにしたところくらいでしょうか。

たいしたことやってないのに時間かかってます。


(ns euler.euler_104
(:require [clojure.math.combinatorics :as combo]))
;; "Elapsed time: about 35sec"
(defn lfib
([]
(lfib 1 1))
([a b]
(lazy-seq (cons a (lfib b (+' a b))))))
(defn digit-list [num]
(loop [n num l []]
(if (< n 10)
(conj l n)
(recur (quot n 10) (conj l (mod n 10))))))
(defn pandigit1-9? [num]
(= #{1 2 3 4 5 6 7 8 9} (set (digit-list num))))
(defn get-high-9 [num]
(->> num
(str ,,)
(take 9 ,,)
(apply str ,,)
(Integer/parseInt ,,)))
(defn check-euler104 [num]
(let [last-9-digit (int (mod num (bigint 1e9)))]
(if (pandigit1-9? last-9-digit)
(let [high-9-digit (get-high-9 num)]
(if (pandigit1-9? high-9-digit)
num
false))
false)))
(defn e104 []
(take 1
(filter #(check-euler104 (last %))
(map-indexed vector (lfib)))))
view raw euler_104.clj hosted with ❤ by GitHub

0 コメント:

コメントを投稿