Euler : Problem 50

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
100万以下の素数で、もっとも大くの連続する素数の和で表わされるものを求める問題。そのまま解いた。素数のリストについて、初めから順に足していって、結果が素数になるかどうか都度判定する。素数でなくなったら、素数のリストの先頭をとりのぞいてまた同様のことをする。素数でなくなったときの情報を、前の結果と比べて結果を更新する。時間かかりすぎ。;;;; Problem 50 : 2011/6/14;; "Elapsed time: 276190.732342 msecs"(defn longest-seq [coll max-val] (loop [forward-coll [] rest-coll coll max-seq []] (if (empty? rest-coll) max-seq (let [next-foward...
READ MORE

Euler : Problem 49

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
同じ間隔で並んでいる3つの4桁の素数で、同じ数字で構成されているものを求める問題。まず、4桁の素数を全てについて、構成する数字をキーにしたmapに入れる。同じ数字で構成されているものは同じキーに関連付けられる。 ([1 4 8 7] , (1487 4817 8147))のような感じ。そして、その中の3つ以上の数が入っているものについて、等間隔にならんだ3数があれば取り出す。;;;; Problem 49 : 2011/6/14;; "Elapsed time: 93.160443 msecs"(defn seq-of-3 [coll] (for [a coll b coll c coll :when (= (- (* b 2) a) c) :when (< a b) ...
READ MORE

Euler : Problem 48

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
1から1000までの数nについてnのn乗の和を求める問題。そのまま解いただけ。最後の10桁だけ求めればいいので、足す前に11桁め以上を消してます。;;;; Problem 48 : 2011/6/13;; "Elapsed time: 217.941386 msecs"(reduce + (map #(rem (expt % %) 10000000000)(range 1 1001))...
READ MORE

Euler : Problem 47

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
4つの連続駿数で、全てが4種類の素数に因数分解できるようなものをみつける問題。1から順に全ての数を素因数分解して出てくる数字の種類を数え、もとの数とのペアにしたデータを作る。あたまから順に4つずつ取って、全部の数字の種類が4になった最初のものが答え。factorsは前に作った、素因数分解したものをリストで返す関数。時間かかりすぎ。;;;; Problem 47 : 2011/6/13;; "Elapsed time: 162902.866705 msecs"(take 1 (filter (fn [coll] (every? #(= 4 (first %)) coll)) (partition 4 1 (map #(vector (count (distinct (factors %)))...
READ MORE

Euler : Problem 46

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
奇数の合成数のうち、「素数と、何かの2乗の2倍の和」で表わされない最小の数を求める問題。なんか、全然エレガントじゃないけど、素数じゃない奇数について、その数以下の素数を引いた残りが平方数になっているかどうか判定した。;;;; Problem 46 : 2011/6/13;; "Elapsed time: 841.523433 msecs"(defn square? [n] (= (sqrt n) (int (sqrt n))))(defn not-prime-plus-double-sq [n] (every? false? (map (fn [pnum] (let [tstval (- n pnum)] (and (even? tstval) ...
READ MORE

Euler: Problem 45

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
三角数で五角数で六角数であるようなもので40755の次の数をみつける問題。三角数かどうかと五角数かどうかの判定は作ってある。六角数を順に作って三角数で五角数かどうかの確認をした。hexagonal?は使わないけど、作っておいた。;;;; Problem 45 : 2011/6/13;; "Elapsed time: 248.191879 msecs"(defn hexagonal [n] (* n (- (* 2 n) 1)))(defn hexagonal? [n] (zero? (rem (+ 1 (sqrt (+ 1 (* 8 n)))) 4)))(take 3(filter (fn [x] (and (triangle-num? n) (pentagonal? n))) (map hexagonal...
READ MORE

Euler : Problem 44

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
2つの五角数の和も差もまた五角数になるような組のうち、最小のものを求める問題。基本的にしらみつぶし。n番目の五角数について、(n-1)番目以前のそれぞれの五角数が条件に合うかどうか確認して、最初にみつかったものを答えにしている。五角数かどうかの判定は、n番目の五角数をxとするとx=n(3n-1)/23n^2-n-2x=0n=(1+sqrt(24x+1))/2だから、24倍して1を足したものの平方根に1を足したものが2で割りきれるかどうかで判定。;;;; Problem 44 : 2011/6/13;;"Elapsed time: 10744.530939 msecs";;;; Memoized!!??;; "Elapsed time: 38270.006104 msecs" (use 'clojure.contrib.math)(defn...
READ MORE

Euler : Problem 43

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
0から9の10桁のパンデジタルの数で、条件に合うものの総和を求める問題。条件から - d4 が偶数であること - d3 + d4 + d5 が3で割りきれること。 - d6 が 0 か 5 であること。がわかる。また、[d6d7d8]が11で割りきれるとき、d6が0だと、d7とd8が同じ数字でなければならなくなるので、d6は0でない。なので、d6は 5。そして、5ではじまる3桁(5[d7d8])の11の倍数は 506 517 528 539 561 572 583 594 の8つ (550もだけれどは5が2回でてきちゃうのでだめ)それと、d4が偶数という条件も入れて、全ての数列を作成して、残りの条件に合うかどうか確認した。;;;; Problem 43 : 2011/6/10;; "Elapsed time: 724.777311 msecs";; d2d3d4=406...
READ MORE

Euler : Problem 42

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
文字のアルファベット順での位置(A=1として)をその文字の値として、単語の文字の値の和が三角数になるものの個数を数える問題。三角数かどうかの判定は、n番目の三角数xの式を変形してx = n(n+1)/2n^2 + n - 2x = 0n = ( 1 +/- sqrt(8x + 1)) / 2負の数にならないから、n = ( 1 + sqrt(8x + 1)) / 2ということで、8倍の平方根に1を足したものが2で割りきれるかどうかで判断します。文字->数値変換は、文字コードを使うといいのかもしれないけど、換算表を使った。ファイルからの読みこみのところは、今見るとwith-openの使いかたが間違ってるけど、動いたのでこのまま。;;;; Problem 42 : 2011/6/9"Elapsed time: 22.138288 msecs"(use '[clojure.contrib.duck-streams...
READ MORE

Euler : Problem 41

Posted by YpsilonTAKAI On 2011年6月29日水曜日 0 コメント
最大のパンデジタルな素数を求める問題。ここでのパンデジタルな数というのは、1からnまでの全ての数を使った数ということなので、最大でも9桁(1から9)ということになります。また、1から9まで全部足すと45になるので、9桁のパンデジタルな数は必ず3の倍数になっちゃいます。計算すると、3の倍数にならないのは、7桁と4桁(と1桁だけど、1は素数じゃない)だけ。あとは、7桁以下の素数の大きなほうから順にパンデジタルかどうか確認していけばいいのでしょうけど、あえて、パンデジタルな数を作って素数かどうか判定する方式にした。最初のコードは、あえてした割にはエレガントじゃないコードになっちゃった。select-numsとnum-listx関数で、1からxまでの数の順列を作ろうとしてるんだけど、一般化できなかった。 マクロしかないような気がするけど、どうなんだろうと思って調べたら、contrib.combinatorics...
READ MORE

Clojureの関数のメモ化 >> だめだめmemoizeの巻

Posted by YpsilonTAKAI On 2011年6月21日火曜日 0 コメント
  これまでもPEを解いていて、memoize関数によるメモ化が効いていないなぁと思うことが何度かあったのだけれど、そのままにしてあった。でも、Problem 57 を解いているときにこれを解決しないと問題が解けないことが判明。ちょっと調べてみたら、memoizeが思ったようなmemoizeをしていないことがわかって、僕の思うようなmemoizeをしてくれる関数を作る新しいマクロを作って解決。 なので、そのことについて。たとえば、フィボナッチ数を求める関数。(実験のためにプリント文を仕込んである。);;(defn fib [n] (do (println "-->" n) (if (<= n 1) n (+ (fib (dec n)) (fib (- n 2))))));;メモ化する前に実行するとこんな感じuser>...
READ MORE

Euler : Problem 40

Posted by YpsilonTAKAI On 2011年6月5日日曜日 0 コメント
ここのところ忙しくてすすんでない。1ケタが9こで 9ケタ分2けたが90こで180ケタ分3けたが900こで2700ケタ分っていう具合になっていることを利用して求めようかと思ったけど、めんどくさくなって、普通に解いちゃった。;;;; Problem 40 : 2011/6/5;; "Elapsed time: 6926.687051 msecs"(use 'clojure.contrib.math)(defn fractional-part-of-irrational [] (mapcat #(seq (str %)) (iterate inc 1)))(loop [seq (map list (fractional-part-of-irrational) (iterate inc 1)) tgt (map #(expt 10 %) (range...
READ MORE
Page 1 of 441234567Next