これも去年の年末にやったやつです。
Fibonacci数列で、最初の9桁がPandigit(1-9を全て含む)で、最後の9桁もPandigitのものを探す問題。
Fibonacci数列を順に作って条件に合うかどうかチェックするだけですが、ちょっと工夫したと言えば、数字を文字列にするのってコストがかかるので、数字のまま取りだせる下9桁を先にチェックするようにしたところくらいでしょうか。
たいしたことやってないのに時間かかってます。
Fibonacci数列で、最初の9桁がPandigit(1-9を全て含む)で、最後の9桁もPandigitのものを探す問題。
Fibonacci数列を順に作って条件に合うかどうかチェックするだけですが、ちょっと工夫したと言えば、数字を文字列にするのってコストがかかるので、数字のまま取りだせる下9桁を先にチェックするようにしたところくらいでしょうか。
たいしたことやってないのに時間かかってます。
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
(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))))) | |
0 コメント:
コメントを投稿