パターンがあるので、それを数えるのがいいかなと思ったんだけど、それだと、手で計算できちゃうので、なんならということで、1000までの数字を読み下ろす関数を作ってみた。user> (writedown 999)"nine hundred and ninety nine"ということで、あえて力ずく。関係ないけど、four で fourteen なのに forty なんだね。「u」はどこへいっちゃうんだろ。この問題を解くまで気づかなかったというか、忘れていたというか、ねぇ。 ;;;; Problem 17 : 2011/4/22;; "Elapsed time: 106.548179 msecs"(def number-table '{ 1 "one" 2 "two" 3 "three" ...
2の1000乗に出てくる数字を全部足すといくつ? って問題です。とりあえず作ってみたら動いちゃったので、そのまま。計算して、各桁足してます。芸が無い。;;;; Problem 16 : 2011/4/22;; "Elapsed time: 16.475557 msecs"(use 'clojure.contrib.math)(loop [num (expt 2 1000) result 0] (if (< num 1) result (recur (floor (/ num 10)) (+ result (rem num 10))))...
碁盤の目の通路の問題です。まあ、普通にやるんだったら、組み合わせで解くんだけれども、やってみたら、すごく時間がかかる。んで、交差点ごとの数を数えあげる方法を実装してみた。動的計画法にあたるかな?3x3だと1 1 11 2 31 3 6てな感じ。実際の計算で使っているのは update-child と 最後のループのところだけ。あとは、データ作成のためのもの。;;;; Problem 15 : 2011/4/22;;"Elapsed time: 32.748855 msecs";; too long time(use 'clojure.contrib.combinatorics)(count (combinations (range 40) 20));; grid parameter(def *grid-x-max* 21)(def *grid-y-max*...
角谷の予想(コラッツの予想)の問題です。この問題、中学生ぐらいのころに手計算でノートいっぽいに数字を書いてみたりしてたので、ちょっとなつかしい。1から逆にたどって系統樹を作ってやればいいかなと思ったんだけど、「途中で百万を超えてもかまわない」という条件があるので、逆にたどるのは戻ってくる可能性を考慮しなければならないということなんだけれど、そこのところがうまく表現できなくて断念。1から順にしらべることになっちゃいました。;;;; Problem 14 : 2011/4/15;; "Elapsed time: 54894.586881 msecs";; momoise : from clojure.org(defn memoize [f] (let [mem (atom {})] (fn [& args] (if-let [e (find...
でかい数の足し算。前の13桁だけ足して答を出した。 まあ、もとのデータを文字列で読んじゃったから、なんのことはない。;;;; Problem 13 : 2011/4/14;; "Elapsed time: 4.569016 msecs"(reduce + (map #(new BigInteger (apply str (take 13 %))) target-list))(def target-list [ "37107287533902102798797998220837590246510135740250" "46376937677490009712648124896970078050417018260538" "74324986199524741059474233309513058123726617309629" "91942213363574161572522430563301811072406154908250"...
三角数に関する問題。 だけど、三角数の性質とは関係ないのかな?始めは逆の探索で、約数が500個以上ある数を求めて、それが三角数かどうか確認するって方法をやろうとしたんだけど、挫折した。三角数かどうか確認する関数も作ったけど、使わなかった。挫折した方法のときに必要だね。結局、小さいほうから全調べ方式。いつかリベンジしてやる。factorsは前につくったやつで、そこで素数の一覧も使ってる。時間には素数を作る時間は入ってない。三角数を作る方法を2通り試したけど、とくに時間は変らないみたい。;;;; Problem 12 : 2011/4/14;; "Elapsed time: 1954.309557 msecs";; pre defined func : factors [n];; (foctors 12) => (2 2 3);; count divisor;;...
コンセプトはすぐに思いついたんだけど、実現するのに時間がかかってしまった。Clojureにもだいぶ慣れてきたんだけどねぇ。あと、しばらく「5つ」だと思いこんでやってて、結果が合わなくて、なんでだー!ってしばらく騒いでしまった。 あほ。17msec。 いいんじゃない?でも、最後の計算のところがちょっときれいじゃないなぁ。 ;; Problem 11 : 2011/4/11;; "Elapsed time: 16.602669 msecs"(def target-grid [[ 8 2 22 97 38 15 0 40 0 75 4 5 7 78 52 12 50 77 91 8] [49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 4 56 62 0] [81 49 31 73 55 79 14...
10番目に到達です。そしてまた素数の問題です。前に作ったやつを使ったら、あっさりとオーバーフローしたので、やっぱり作りなおし。こんどはatomを使って作ったデータを保存してみた。これならかなりでかいのでも大丈夫でしょう。13秒かかりました。遅いのか? 速いのか?;;;; Problem 10 : 2011/4/9;; "Elapsed time: 13662.498447 msecs"(def *prime-list* (atom []))(defn is-prime? [target] (loop [plist @*prime-list*] (let [check-num (first plist)] (cond (empty? plist) true (> check-num (Math/sqrt target))...
三平方の定理の問題だぁ。足して1000になる、小さい順になった数列全部を作って、後はしらみつぶし。しらみつぶしが多いなぁ。どうしたもんか。;;;; Problem 9 : 2011/4/8;; a^2 + b^2 = c^2;; a + b + c = 1000(use 'clojure.contrib.math)(defn third+1 [n] (if (zero? (rem n 3)) (inc (/ n 3)) (inc (int (/ n 3)))))(defn half+1 [n] (if (zero? (rem n 2)) (inc (/ n 2)) (inc (int (/ n 2)))))(let [max-num 1000] (filter #(not (= % nil)) (for [a (range...
でかい数列の問題。文字列で読みこんで、1桁の数のリストにして処理。0のところで分割するとか、構成している数をチェックするとかやってみたらよさそうなことは思い浮かぶけれど、たいして速くならないような気がしたので、力ずくでやった。 ;;;; Problem 8 : 2011/4/8(def target1000num "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450")(defn...
また出た。素数。素数かどうかの判定を作った。見つけた素数を取っておいて、判定に使うようにした。これいいんじゃないかなぁ。10000までは作れた。 その後はわからない。;; Problem 7 : 2011/4/8(defn is-prime-sub? [target prm-list] (zero? (count (filter #(zero? (rem target %)) (take-while (< % (Math/sqrt target) prm-list))))))(defn find-prime [n] (loop [prime-list '(2 3 5) target 6] (if (>= (count prime-list) n) prime-list (if (is-prime-sub?...
これは書いてあるとおりにやっただけ。こんな処理はClojureならではかなぁ。;;;; Problem 6 : 2011/4/7 ; (- (expt (reduce + (range 1 101)) 2) (reduce + (map #(expt % 2) (range 1 101)))...
また出てきた素数。素因数分解して解の員数を出して解いているんだけど、素数列をその度に作っているので非効率。今後のためにも、素数列は取っておけるようにしようかなぁ。;;;; Problem 5 : 2011/4/7;; prime-nums-under : defined above(defn factors [n] ;; (foctors 12) => (2 2 3) (loop [factor-list () target n prime-list (prime-nums-under target)] (if (or (= target 1) (empty? prime-list)) (reverse factor-list) (let [one-prime (first prime-list)] ...
回文数の問題10秒考えて戦略決定。数字を作ってから3けたで割りきれるか確認する。6桁だけでいいだろうと思ったけど、5桁の処理も作った。;;;; Problem 4 : 2011/4/7(* 999 999) ;998001(* 100 100) ;10000(use 'clojure.contrib.math)(defn palindromic-5-digit-num [] (for [one (range 9 1 -1) two (range 9 0 -1) three (range 9 0 -1)] (sort (+ (* 10000 one) (* 1000 two) (* 100 three) (* 10 two) one))))(defn palindromic-6-digit-num [] (for [one (range...
問題3は、素数の問題。この後にも何個か出て来たし、これからも沢山出てくるんだろうけど、これは手強い。まずは、できなかったやつ。 10000位でメモリーオーバーフローになっちまった;;;; overflow with 10000(defn prime-nums-under [n] (let [limt (inc (int (sqrt n)))] (loop [prm-nums () candidate (range 2 (inc n))] (let [target (first candidate)] (if (>= target limt) (concat prm-nums candidate) (recur (concat prm-nums (list target)) ...
問題2です。フィボナッチ数列の問題なんですけど、これ、自力じゃない。この間、どこかのサイトでみつけたやりかたなんだよね。;;;; Problem 2 2011/4/4(defn my-fibo ([] (concat [1 2] (my-fibo 1 2))) ([x y] (let [next-num (+ x y)] (lazy-seq (cons next-num (my-fibo y next-num))))))(reduce + (filter even? (take-while #(< % 4000000) (my-fibo))));;この数列の構築のしかた、なるほどなぁ。だな。...
さて、問題1です。まあ、そんなに難しくはないね。;;;; Problem 1 : 2011/4/4(defn is-3x-or-5x? [x] (or (zero? (rem x 3)) (zero? (rem x 5))))(reduce + (filter is-3x-or-5x? (range 1 10000))...
プロジェクト オイラーってのがありまして、かなり前にみつけて「おや?」っと思ってたのですが、そのときは乗り気にならなかったので無視してましたが、Clojureに手をつけたこともあり、練習にいいかなと思って、今週から初めました。
ところが、これが、はまってしまうわけですよ。
昼休みとか終ってからとかやってるんですけど、食べたかどうかわからなくなるは、帰りがさらに遅くなるはで、ちょっと迷惑。
迷惑ついでに新しいブログを作って載せていこうというわけ。
とは言っても、それだけじゃもたないだろうから、コンピュータ関連の話題で埋めていこうかと思っております...