«前の日記(2008-03-02) 最新 次の日記(2008-03-04)» 編集

Matzにっき


2008-03-03 [長年日記]

_ [言語] CS 11: Python track: python idioms

Pythonのイディオム。

List Comprehensionの解説で

results = [(x, y)
           for x in range(10)
           for y in range(10)
           if x + y == 5
           if x > y]

という例題がある。そうか、forって複数指定できるんだ。

で、Rubyのメソッドチェーンではこのような複数シーケンスの ネストしたループをストレートに書くことができないことに気がついた。

(1..2).xxxx(1..2)

で、

[1,1],[1,2],[2,1],[2,2]

を返すようなxxxxメソッドがあれば、

(1..10).xxxx(1..10).select{|x,y| x+y == 5}.select{|x,y|x > y}

と書けるんだけど、名前がな。いい名前ないかな。

_ [Ruby] Binary search algorithm - Wikipedia, the free encyclopedia

Rubyのオブジェクトはヒープと呼ばれる複数のメモリ領域のいずれかに所属する。 GCの過程で(保守的なチェックの一環で)ポインタがどのヒープ領域に所属するか をチェックしているところがある。

今までは線形探索をしていたのだが、 ここを二分検索するようにした。 まあ、現時点ではヒープの数はあまり多くならないので メリットはさしてないのだが、今後ひとつひとつのヒープのサイズを小さくすることを 考えているのでそのための下準備として。

ところが、二分検索の基本的なアルゴリズムは理解していたはずなのに なかなかバグが取れない。結構、情けない。

_ [OSS] Theological Cultural Analysis of the Free Software Movement

クリスチャン的視点から見たフリーソフトウェア運動。

っていうか、タイトルを見た時にはどういう論理展開するのかと思って読んだのだが、 実は穏当な意見であった。

_ 小寺信良:正直、テレビはもうダメかもしれん - ITmedia +D LifeStyle

テレビはダメかもしれん、という話(そのまんま)。

実際、ここ数年テレビを見る時間はぐんぐん減っている。 私の家族も最近はPCを使った情報収集に時間を取られて テレビはあまり見なくなってしまっている。

テレビはもはや時間が余った時に雑学を入力する手段くらいにしかなってなくて、 しかもそれってインターネットで代用可能だったりするんだよね。

やっぱ、2011年にはテレビを捨てることになるのかなあ。

_ [Ruby] You Used Ruby to Write WHAT?! - CIO.com - Business Technology Leadership

Zed 「ゲットー」 Shawが(CIOに向けて)Rubyの「欠点」について語る。

言語そのものについての欠点の指摘はほとんどないので 言語デザイナーとしては安堵なのだが、欠点のほとんどは私の実装(MRI)の弱点なので そういう意味では涙目である。

やや、根拠が薄いような気もするが(ほんとに遅いのかとか、ほんとにリークするのかとか)、 改善の余地があることについては私も認める。

悔しいので、また手を入れることにする。 一番難しいのはGCだろうか。「保守性によるリーク」や「停止時間」の問題について また考えてみたい。

_ 取材

某雑誌の記事のため写真撮影。 なんか金かけてるよな。

今日はいきつけの本屋さんで立ち読みしているところの撮影だとか。 事前に本屋には許可を取ってあるのだが、 立ち読みしてるところをバシバシとられるのは かなり恥ずかしい。

本日のツッコミ(全22件) [ツッコミを入れる]
_ takiuchi (2008-03-07 22:12)

cartesian_productは長いですかねぇ。<br>「×」の読みをとってcrossとか。

_ k のつくゴルファー (2008-03-07 23:02)

ここは思い切って,(1..2)*(1..2) とか. 

_ まつもと (2008-03-07 23:16)

みっつ以上ネストすることもありえるんで*演算子はあまりよくありませんね。

_ 元職業プログラマ (2008-03-07 23:42)

>みっつ以上ネストすることもありえるんで*演算子はあまりよくありませんね。<br>どのような場合でしょうか?

_ 元職業プログラマ (2008-03-08 00:08)

>ここは思い切って,(1..2)*(1..2) とか.<br>私が考えたのは、[^1..2]*[^1..2]です。<br>Haskellだったら、[1..2]*[1..2]にしたいです。

_ まつもと (2008-03-08 00:10)

どのような場合と言われても、もともとlist comprehensionのforが複数あるケースに対応したいという話ですから、forの数が限定されていない以上、ふたつまで限定というのはうれしくないのです。<br><br>で、実は1.9にはproductというメソッドがすでにあるのですが、これは<br><br> * 引数がto_aryを持つ必要がある<br> * 戻り値が配列(Enumeratorじゃない)<br><br>というのがちょっとうれしくないですねえ。

_ 元職業プログラマ (2008-03-08 00:34)

まつもとさま、ご回答有難うございます。<br>少し美しくないですが、([^1..2]*[^1..2])*[^1..2]というようには出来ないのでしょうか?<br>と思いましたが、確かに直積を二重に実行すると、[[[1,1],1],[[1,1],2],..]とするのか、というようなりますですね。<br>それなら諦めて、cprod([^1..2],[^1..2],..).select{..}としたほうが、素直ではないかと思ったのですが、いかがでしょうか?

_ atushi (2008-03-08 08:05)

tupleとか?<br><br>Mathematicaではtupleを似たよーな感じで使っているようですが。<br>http://reference.wolfram.com/mathematica/ref/Tuples.html

_ atushi (2008-03-08 08:18)

(1..2).tuple(1..2) #=> Tupleクラス{(1..2),(1..2)}<br>Tuple.to_ary #=> {[1,1],[1,2],[2,1],[2,2]}<br><br>組み合わせ爆発が起こらないように、Tupleクラスを間に挟むとか・・・。Rubyを良く知って言っている訳ではないので、すでにこんなの存在してたらごめんなさい。

_ 元職業プログラマ (2008-03-08 09:07)

atushiさま<br>いまさら(?)Rubyにタプルを実装するのも如何なものかと思います。<br>集合論的に考えれば、集合≒配列としてよいのではないでしょうか?<br>ただし、[a,a,b]というのを集合としていいのか、という話しがあるので、例えば、集合クラスのインスタンスを、s=[<a,a,b>]としたら、例外が発生するというやり方があるのではないかと思っております。

_ 元職業プログラマ (2008-03-08 12:58)

先に申した「集合クラス」は、大袈裟に、「擬似集合クラス」とかいう名前で定義し、数学的な意味での集合とタプルの性質を合わせ持ったクラスであると宣言すれば、カッコ良くないでしょうか?<br>http://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%97%E3%83%AB

_ 元職業プログラマ (2008-03-08 17:05)

「数学的な意味での集合とタプルの性質を合わせ持ったクラス」というのは、非常に無理がありましたっていうか、無理でした。(多分?) 申し訳御座いません。

_ yasm (2008-03-09 21:19)

pair、pair_with なんてどうでしょう? 直感的に。

_ まつもと (2008-03-09 22:05)

pairだと2重しか意味しませんよね。

_ Thor (2008-03-10 00:30)

単純に関数として (Ruby1.9ではGeneratorが死んでるので1.8で)<br><br>require 'generator'<br>def foreach_inner(a,*b)<br> l = b.shift<br> if b.empty?<br> l.each{|x| yield *(a+[x])}<br> else<br> l.each{|x| foreach_inner(a+[x],*b,&Proc.new)}<br> end<br>end<br>def foreach(*arg)<br> if block_given?<br> foreach_inner([],*arg,&Proc.new)<br> arg<br> else<br> Generator.new do |g|<br> foreach_inner([],*arg){|*x| g.yield(x)}<br> end<br> end<br>end<br><br>foreach(1..3){|x| p x}<br>foreach(1..2,5..6,8..9,'a'..'b'){|x,y,z,s| p [x,y,z,s]}<br>p foreach(1..10,1..10).select{|x,y| x+y == 5}.select{|x,y|x > y}

_ kzgs (2008-03-10 17:02)

配列の要素数が決まってしまう&Ruby的に怪しい雰囲気になりますが<br><br>(1..3).ijk { i+j+k }<br><br>なんてのはどうでしょう

_ taiji (2008-03-10 21:01)

comboってのは?

_ じょりちょこ (2008-03-10 22:40)

nest_withでは?

_ 元職業プログラマ (2008-03-11 01:50)

いっそのこと、<br>([1..2],[1..2],[1..2]).select{|x,y,z| ...}<br>とか、<br>([1..2],[1..2],[1..2]).each{|x,y,z| ...}<br>なんていうのはいかがでしょうか?

_ uehaj (2008-03-11 15:42)

Groovyでは「combinations()」が相当するようですね。<br><br>http://groovy.codehaus.org/api/groovy/util/GroovyCollections.html#combinations(java.util.Collection)<br>http://groovy.codehaus.org/groovy-jdk/java/util/Collection.html#combinations()<br><br>こんな感じ。<br>[1..10, 1..20].combinations().grep{ it[0]+it[1] == 5 }.grep{ it[0]> it[1] }

_ まつもと (2008-03-11 18:56)

ううむ。Ruby1.9にはArray#combinationっていう全然違うことをするメソッドがありますから混乱しそうですね。<br><br> > [1,2,3].combination(2){|x| p x}'<br> [1, 2]<br> [1, 3]<br> [2, 3]

_ 元職業プログラマ (2008-03-11 19:22)

さすがはRuby!<br>Ruby1.9にはArray#permutationもあるんですね。<br>http://d.hatena.ne.jp/rubikitch/20071224/ruby19

お名前:
E-mail:
コメント:
[]

«前の日記(2008-03-02) 最新 次の日記(2008-03-04)» 編集

track feed Matzにっき Creative Commons License This work is licensed under a Creative Commons License.