2002-03-17 [長年日記]
λ. Y先生宅でホームパーティ。料理も素晴らしかったし、ゲームも楽しかった。
ゲームは、いつもの「上海」の他に「スコットランドヤード」と花札をやった。スコットランドヤードでは3回とも怪盗側のミスで刑事側が勝利。ミスさえしなければ怪盗側の方がかなり有利だと思うので、またやってみたいところ。花札もまあ楽しかった。花札は絵が綺麗でルールも覚えやすいので外国人にもウケが良いらしい。そういえば、Rはゲゲゲの鬼太郎の花札を持っているそうだ。それから「ロジ」もやりたかったのだけど、行方不明でちょっと残念だった。
楽しい時間をありがとう!
λ. 読書
- 『HELLSING(ヘルシング) 1』
- 平野耕太[画]
λ. 商集合 (Enumerable#/)
module Enumerable def /(r) result = Array.new each{|item| if a = result.find{|b| r.call(b.first, item)} a.push(item) else result.push([item]) end } result end end (0..10) / lambda{|a,b| a%3 == b%3} #=> [[0, 3, 6, 9], [1, 4, 7, 10], [2, 5, 8]]
代表値を計算する block/proc を与えて Hash につっこむと大変に<br>簡単な上に O(n) だという気がするけど何か穴があるかな?<br><br>....代表値の計算っていうのが困難な場合があるかっていう話になるかな....<br><br><br>module Enumerable<br> def /(r)<br> # 1.7.x 以降なら Hash.new {[]} ってやると後が簡単.<br> # res[r[e]] << e だけですむはず.<br> # 結果の順番が一般には予測不能なんだな.<br> res = {}<br> each do {|e| res[r[e]] = res.fetch(r[e], []) << e}<br> res.values<br> end<br>end<br><br>(0..10) / proc {|e| e%3} #=> [[0, 3, 6, 9], [1, 4, 7, 10], [2, 5, 8]]
その通りなんですが、ここでは「同値関係」で割っているのを強調したかったので、このように書いてみました。<br>(代表値の計算が困難な場合ってのは考えてなかったです)<br><br>ちなみに、次のネタとして以下のようなのを考えていたのだけど、こりゃ先を越されてしまったなぁ。<br><br>module Enumerable<br> def stack<br> result = Hash.new<br> each{|item|<br> (result[yield(item)] ||= Array.new).push(item)<br> }<br> #result.default = Array.new.freeze<br> result<br> end<br>end<br><br>(0..10).stack{|i| i % 2 == 0 ? :even : :odd}<br>#=> {:even=>[0, 2, 4, 6, 8, 10], :odd=>[1, 3, 5, 7, 9]}
これって私の finite-set.rb と関係あるのかな。<br>あそこでは剰余群を求める事が念頭にあって、まさに代表値が計算しにくい、っていうか、代表元を求めること自体が / の仕事なんですよ。<br>そしてHashを使うって事は hash 関数をうまく使うという事であって、これは(大まかな)代表値を求めることなので、若干堂々巡りっぽくなるんですね。
ども。finite-set.rbの事は知りませんでしたが、既にあったのですね。ちぇ(笑)