clojureのツールをもうちょっとちゃんと調べてみないとだなぁ。

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
ポツポツとPEを解いてきたのですが、思いついたなりに処理を作っていっているので、ロジックの先については、あまり外の情報を見ていない。それで、こうやってブログに上げるときにコードを見直してみたりすると、なんか、もっといいやりかたができなかったのかなぁとか思って、ちょっとWebで調べてみると唖然とすることが何度もあるわけです。しかも、contribの中にあるよって情報は、さらに愕然とする。でも自分で探そうとすると、grepしてみようにも単語が出てこないのでうまく探せないし、上から順に見ていくしかないとなったら、面倒になってやっぱり自分で下手な処理を作ってしまう。でも、そろそろちゃんと一通り見ておいたほうがよさそうな気がしてきたので、ちょっとここいらで手を止めて、いろいろ調べてみることにする。ということで、PEは少しお休み。60番で詰ってしまった言い訳でも...
READ MORE

clojureのreduceの使いどころ

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
reduceの使いどころ(その2も書きました)reduceって全部足すとかそんな使い方しかしてなかったんだけど、コレクションを全部なめて何かをつくる。という捉えかたをするツールであると捉えると、かなり強力なツールであることがちょっとわかってきた。たとえば、下の2つの処理は同じことをしている。 (reduce #(conj (* 2 %1) %2) [] [1 2 3]) (map #(* 2 %) [1 2 3])これならmapでやればいいわけだけれども、でも、逆に言えば、reduceの方がやりたいことを細かく指定できるということなわけ。ここでは、「2倍したものをベクターにつっこむ」ということを指定している。ここは好きにいじることができるので、いろいろなことができる。特にmapを作るような場合に有効なのではないかと思う。たとえば、下のような処理。ポーカーの問題のときに作ったんだけど、個数の多い順に数字を並べたいわけ。単目的ならもう少しすっきりできたと思うけど、group-sameがあったからこうなってる。(defn...
READ MORE

Euler : Problem 59

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
PE 59XORで暗号化された暗号を解く問題。コードは長いけどたいしたことやってない。キーは3文字だと分っているので、暗号文を3文字ずつで分解して、1番目 2番目 3番目だけからなるリストを作る。それぞれのリストは同じ文字でエンコードされているので、元の文章の文字の出現頻度と同じ頻度になっているはず。リストに含まれる数を出現頻度順に並べると先頭が最頻の文字。さて、英語の文章の最頻文字は「e」、かというとそうではなくて「スペース」です。スペースでデコードしたものを出してみると、それらしきものが現われました。文章をデコードする関数も作って調べてみると当り。;;;; Problem 59 : 2011/6/22;;"Elapsed time: 37.556729 msecs"(defn group-same "Split into same value group...
READ MORE

Euler : Problem 58

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
数字をぐるぐる四角に並べたときに、中心から角に向う線上にある数が素数である確率が10%を下まわるのは何周並べたときかという問題。n周めの角にくる数字は、nで表わせるので素数かどうか判定する。あと、n週での対象となる数の数もnで表わせるので計算して、割合を出す。;;;; Problem 58 : 2011/6/21"Elapsed time: 3646.419866 msecs"(defn corner-set [n] (let [side-len (- (* n 2) 1) bottom-right (expt side-len 2) bottom-left (- bottom-right (- side-len 1)) top-left (- bottom-right (* 2 (- side-len 1)))...
READ MORE

Euler : Problem 57

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
2の平方根の連分数を1000段まで順に展開したときの分数表現の分子の桁数がが分母の桁数を超えるのは何回あるかっていう問題。連分数の展開には一般項の公式があるのでそれをあてはめて計算。と、ここで、分母と分子の式が漸化式になっているんだが、大きくなるとメモリが足りなくなるので、memoizeを使ってメモ化したのだか効果なし。なんでだーって調べて分ったのがちょっと前のポスト。defn-memoを使って再定義したらちゃんとできた。;;;; Problem 57 : 2011/6/21;; "Elapsed time: 4859.538293 msecs"(defn cf-seq [n] (if (zero? n) 1 2))(defn cf-numerator [n] (cond (zero? n) 1 (= 1 n) (cf-seq...
READ MORE

Euler : Problem 56

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
1の1乗から100の100乗までの数で、各桁の数を足したものが一番大きくなるものを求める問題。そのまま計算したのでございます。;;;; Problem 56 : 2011/6/20;; "Elapsed time: 15482.925064 msecs"(reduce max (for [a (range 1 100) b (range 1 100)] (reduce + (num-to-list (expt a b))))...
READ MORE

Euler : Problem 55

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
ある数に対して逆順にした数を足すという操作を繰りかえしたとき、何回か後に回文数になる数を求める問題。そのまま実装。あ、最初の数が回文数でもそれはあてはまらないという条件があるので、ループの最初の1回だけ生で計算してる。;;;; Problem 55 : 2011/6/20;; "Elapsed time: 9821.708625 msecs"(defn reverse-and-add-if-not-palindrome [n] (let [revnum (list-to-num (reverse (num-to-list n)))] (if (= revnum n) true (+ n revnum))))(defn lychrel? [n] (loop [depth 1 num (+ n (list-to-num (reverse...
READ MORE

Euler : Problem 54

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
ポーカーの勝敗を判定する問題。やたら長いけど身は少ない。まず、ファイルを読み込んで、扱いやすくする。  [[8 :club] [10 :spade] [13 :club] [8 :heart] [4 :spade]]役を判定する関数(rank-hand)を使って、役で判定。同じ役ならのところがちょっと考えた。結局、同じ役なんだから、手札を枚数の多い順に並べて、 2 3 1 3 1 3 3  ->  (3 3 3 3) (1 1) (2)1つだけにして (3 3 3 3) (1 1) (2)  -> 3 1 2頭から大小比較すればいいということに気づいた。ところで、A,1,2.3.4 をストレートと判定していないことに、今、気づいたんだけど、答えはあってたみたい。;;;; Problem 54...
READ MORE

Euler : Problem 53

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
100桁以下の数について、含まれる数字を幾つか選んで作られる新しい数の種類が百万個を超えるのは幾つあるかという問題。言われた通りに計算しちゃったけど、nCrの答えって、rがnの真ん中にあるときが極大だから、それを使うともうちょっと速いはず。やらなかったけど。;;;; Problem 53 : 2011/6/16;; "Elapsed time: 473.81832 msecs"(defn fact [n] (reduce * (range 1 (inc n))))(defn composision [n r] (/ (fact n) (* (fact r) (fact (- n r)))))(count (filter #(> % 1000000) (for [n (range 2 101) r (range 1 100) :when...
READ MORE

Euler : Problem 52

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
1から6までの数を掛けてできる数が同じ数字で構成されている数字を見つける問題。-6を掛けても桁数が変らないということは、たとえば、3桁なら166まで、  6桁なら16666までということになる-最上位が1なので、1から6倍した場合、最上位の数は全て異なる数になるので、  桁数は6以上のはず。あとは全数チェック。答を見て、「あー。なんだよ。これかよ」と思った。 ちょっとくやしい。;;;; Problem 52 : 2011/6/15;; "Elapsed time: 3178.80848 msecs"(defn same-digits? [n m] (= (sort (num-to-list n)) (sort (num-to-list m))))(defn pe52-end-num [digit] (+ (expt 10 digit)...
READ MORE

Euler : Problem 51

Posted by YpsilonTAKAI On 2011年7月3日日曜日 0 コメント
素数のうち、表われる全ての同じ数字をいれかえてできる組を作ったとき、8つ素数の組ができるものを探す問題。* 8つの組ができるということは、置き換えるところに 10個の数字(0123456789)のうちの  8つを入れることができなければならない。このことから、- 1の位は入れ替え対象にならない。  <== 10個のなかに偶数が5つありすべて取り除くことができない。      1の位が偶数のとき2以外は素数ではない。- 入れ替える数は1つではない。  <== 10個の数字には3を法とすると0,1.2になるものがそれぞれ3つ以上あるため、      2つを取り除いても、かならず0,1.2になるものが含まれる。      また、対象の数を構成する残りの各桁の数の和は、3を法とすると0,1.2のいずれかになる。 ...
READ MORE
Page 1 of 441234567Next