1 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:21:23 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。) なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
130 名前:デフォルトの名無しさん [2009/08/15(土) 16:08:48 ] Ruby1.9系でシーザー暗号プログラムを作っています。 1.8では文字列配列をFixnumとして扱えましたが1.9ではStringが帰ってきます。 今、each_byteを使ってますがもっとスマートな方法を教えてください
131 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 16:16:37 ] メールヘッダのMIMEエンコードはRubyではどうするのでしょうか? Perlでいう以下です。 use Encode; $text = "あ"; #ソースコードはcp932 Encode::from_to($text, "cp932", "MIME-Header-ISO_2022_JP"); print $text; #=>=?ISO-2022-JP?B?GyRCJCIbKEI=?=
132 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 16:57:03 ] >>131 text = NKF.nkf('-M','あ')
133 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 17:14:27 ] >>132 d
134 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 17:32:39 ] >>130 文字列配列をFixnumで扱うのくだりがさっぱりわからんが、 Ruby1.8のStringはたまたまバイト列だっただけだ バイト列として扱いたければeach_byte等で回せ
135 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 19:31:18 ] 1.9はpack unpackも使えないのか?
136 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 23:23:59 ] >>130 str.tr("A-Z", "B-ZA")
137 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 23:32:30 ] >>135 普通に使えるよ。
138 名前:デフォルトの名無しさん [2009/08/16(日) 04:39:04 ] >>130 です "aaaa".bytes.to_a[2] のような形で、同じようなことができるようです。答えてくださったかたありがとうございました
139 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 05:47:38 ] スマートには見えんのだが…
140 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 06:04:49 ] 子飼団ってテレビとかに出てるくらいだから本来下衆でしょ。まともなら低能なマスゴミとは距離を置いてる。
141 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 06:16:40 ] >>139 ホワイラーなんだと思う
142 名前:デフォルトの名無しさん [2009/08/16(日) 06:31:12 ] >>139 codepad.org/rgAGQvq5 別に代入する所もいらないし、trと違って任意の数だけ進められる
143 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 07:16:44 ] str.unpack('C*').collecgt {|x| x+i}.pack('C*') なら1.0でも1.9でも動く
144 名前:デフォルトの名無しさん [2009/08/16(日) 20:07:42 ] 質問です。 使用している端末エミュレータの高さ(行数)を取得するには どうすればいいのでしょうか?
145 名前:デフォルトの名無しさん mailto:sage [2009/08/16(日) 20:09:55 ] >>144 www.ruby-lang.org/ja/man/html/curses.html
146 名前:144 mailto:sage [2009/08/16(日) 22:44:47 ] >>145 ありがとうございます。 Curses::lines でいけました。
147 名前:デフォルトの名無しさん [2009/08/17(月) 00:26:17 ] class Parent attr_accessor :foo end class Child < Parent #... end という継承関係がある時、Childクラスではfooアクセッサーを 削除したいのですが、どうすればよいのでしょうか。 具体的に書きますと以下のように例外が発生してほしいです。 child = Child.new p child.foo #=> 例外発生!
148 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 00:39:58 ] Rubyにアクセサは存在しない ただのメソッドだ ということを踏まえると class Parent attr_accessor :foo end class Child < Parent undef :foo end Child.new.foo NoMethodError: undefined method `foo' for #<Child:0xb7d42530> from (irb):8 from :0
149 名前:デフォルトの名無しさん [2009/08/17(月) 00:46:40 ] リスコフの置換規則に違反することになるかもしれないが、undef_method :foo, :foo= というのがある。
150 名前:デフォルトの名無しさん [2009/08/17(月) 00:56:53 ] >>143 codepad.org/QlJCG6Ry できました。ありがとう
151 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 03:31:00 ] リスコフなんて糞くらえ。 ってか変数に型が無い言語で継承するって、実装の継承しか無いんだから undefでも好き勝手にしたらいいと思う。 え?俺OO分かってない?
152 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 04:29:32 ] >>147 の要求の時点でLSP無視なんだから何やっても構わんよ 特定のメソッドの有無に意味を持たせようとすること自体が邪悪
153 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:10:02 ] > Rubyにアクセサは存在しない このへんは後々尾を引いてくると推測
154 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:15:23 ] 特定のメソッドの有無こそがオブジェクトの本質ぢゃないか。
155 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:20:24 ] Rubyにアクセサは存在しないっつーか、 アクセサは、作るもの(用意するもの)なんじゃねーの? あるメソッドがアクセサかどうかというだけで。
156 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 10:45:20 ] アクセサというシステム的なナニカがあるわけではない、という程度の意味なような気もする たとえば、Object#accessors でアクセサメソッドの一覧が返るとか def hoge と def hoge= と attr_reader :hoge と attr_writer :hoge を全部定義しても hoge() と hoge=() と hoge と hoge= で全部別個に使い分けが可能だとか
157 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:34:53 ] リファレンスマニュアル FAQより www.ruby-lang.org/ja/man/html/FAQ_A5E1A5BDA5C3A5C9.html > 5.4 オブジェクトのインスタンス変数を外から参照できますか > 直接はできません。あらかじめそのオブジェクトにインスタンス変数を参照するためのメソッド (アクセサと言います) > を定義しておく必要があります。たとえば以下のようにします。 メソッドとアクセサは同じレベルの概念じゃないだろ
158 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 14:44:57 ] 大変だ、>>157 だけが明後日の方向に
159 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 15:05:41 ] アクセサってのはインスタンス変数へのアクセスを提供する何かであって それが言語によってメソッドだったり属性参照式だったりするということじゃないの?
160 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 15:35:17 ] >>158 おまえが理解できてないだけだ
161 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 16:08:04 ] だからさ、>>148 が悪いんだよ
162 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 16:11:43 ] 「Rubyにはアクセサという機構は存在せず、メソッド定義で代用する」 「定義の簡便のためにattr*系のメソッドがあるが、メソッド定義以上のことを期待するのは勘弁してください」 こう書けばよかったんだな
163 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 16:44:41 ] >>162 が想定する他の言語のアクセサってどんなの?
164 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 16:46:42 ] アクセサが言語レベルで実装されてる言語なんてあるのか?
165 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 16:48:22 ] def attribute=(value) これって明らかにアクセサ用の機能だろ
166 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 16:58:35 ] 初心者ですがまったく話がわかりません
167 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 17:01:10 ] 確かに、メソッド名の最後に(だけ)は = が使えるとか、 obj.foo = bar が obj.foo=(bar) の意味である、だとか、 言語レベルの機能だよな。
168 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 17:34:33 ] テストファイルで Enumerable を拡張してるんですが、これってテストにならないですよね?
169 名前: 106.79-160-162.customer.lyse.net mailto:age [2009/08/17(月) 17:53:40 ] 自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L 名言集 その3 『いつもサボってばかりのキャップがウゼえ』 yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★ > 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0 > >>69 > 大変って言うか > 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。 > ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて > その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから > > 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。 ---------------------------------------------- この自動焼人 ★メールマガジンの配信停止をご希望される方は qb5.2ch.net/test/read.cgi/sec2chd/1250169591/ にて自動焼人 ★までご連絡ください
170 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 20:35:18 ] Array#include?だと指定した値と等しい要素がある場合trueを返しますけど、 等しい要素数を返すにはselectで条件を満たす要素だけとりだしてそれのsizeを調べるしかないでしょうか?
171 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 20:52:31 ] >>170 その通りです。 便乗して質問させて下さい。 include? ってなんで Array で再定義してるんでしょうか? Enumerable#include? とは違う実装になってるんでしょうか?
172 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 20:53:08 ] まあ基本的にはそう grepしてもいいが、「一致する要素の数」というのを直接返すメソッドはない というかもしあったとしても内部でfind_allしてsize求めるはず
173 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 20:58:51 ] 例として非nilを数える場合 [true,false,1, "a",nil,nil].inject(0){|r, i| r += (!i.nil?) ? 1 : 0} 書いてみたはいいけど汚いなぁ
174 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:11:12 ] >>171 rb_ary_includesが遅いと困るからきちんと作ったのだと推測
175 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:16:15 ] NTFSの副ストリームって対応してる?
176 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:19:19 ] >>174 なるほど。Array#include? をネイティブに書いて少しでも性能をだそうとした ということですね。 でも。。今 ruby-1.9.1-p129 の array.c 見てみたんだけど、すごく当たり前な 実装なんですね。 この程度でもネイティブ化すると結構速くなるものなんですかね?
177 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:22:49 ] わざわざEnumerableで定義したのを探してアクセスする時間が惜しいからそばに入れたんじゃね >>175 Windows版Rubyとして何かをしたという話は聞かない コンパイルしたときに自動で何かがどうかできるのなら対応してるかも
178 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:25:45 ] >>175 これで足りる? ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] open('foo.txt', 'w'){|f| f.write('in foo.txt') } open('foo.txt:sub', 'w'){|f| f.write('in foo.txt:sub') } puts File.read('foo.txt') puts File.read('foo.txt:sub')
179 名前:デフォルトの名無しさん [2009/08/17(月) 21:44:20 ] >>173 低脳死ねカス [true,false,1, "a",nil,nil].cmplact.length
180 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:49:39 ] >>179 低能氏ねカス s/cmplact/compact/
181 名前:デフォルトの名無しさん [2009/08/17(月) 21:54:05 ] cmplact?
182 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:54:11 ] length厨はマジでどうにかならんものか
183 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:58:14 ] size の方が好きなのけ?
184 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:58:26 ] >>170 sizeを調べる「しかない」わけではない。 cnt = 0 array.each {|x| cnt += 1 if some_condition(x) }
puts cnt あまり美しくないけど、どうぞ。
185 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:12:45 ] 質問です。 SGEをダウンロードしたいのだけれども、 www.etek.chalmers.se/~e8cal1/sge/index.html がNOT FOUNDになります。 いま、SGEはどこでダウンロードできますか?
186 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:27:53 ] 用途によって変えるっていう当たり前の答えが返ってくるとは思うけど・・・・ ary=["hage","hige","huge","hege","hoge"] の要素数を出力したいときに p ary.size これはaryを後で別の処理が行われると思われる場合でしょ んで、 p ["hage","hige","huge","hege","hoge"].size これは確認したい時だけでしょ んで、 ary_num=ary.size p ary_num ってやってる人がいるんだけど,これは変数が説明になってるってこと? どの段階で処理したものを変数に入れるかってのがわかんない。好き好きかな?
187 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:44:15 ] >aryを後で別の処理が行われると思われる場合 これは ["hage","hige","huge","hege","hoge"] の要素数を出力したいときに ary = ["hage","hige","huge","hege","hoge"] p ary.size という感じ aryに代入するのが前提なら、一番目は最も素直 二番目は主に説明・動作確認・デバッグで使われる 代入するのもめんどくさいとかスペース減らしたいとかそういうのが主な理由 三番目は正直くどい でも説明以外にも値をキャッシュしておきたいケースはあるし、そういう時には避けられない
188 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:45:40 ] 二番目は説明というかスレや記事とかでの解説だった
189 名前:186 mailto:sage [2009/08/17(月) 23:03:10 ] >>187-188 2番めと3番めの説明がわかりやすかったです。ありがとうございます。
190 名前:デフォルトの名無しさん [2009/08/18(火) 00:40:37 ] >>180 低脳死ね。タイプ量が多い s/l//
191 名前:デフォルトの名無しさん [2009/08/18(火) 00:54:11 ] >>190 低脳死ね。置換できてない。 cmplact => cmpact 正しくは compact ^
192 名前:チンパンジー愛ちゃん [2009/08/18(火) 02:24:08 ] >>191 うきっきーきーきぃっ
193 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 05:15:32 ] >>185 質問するスレ間違ってね? まあいいや、ここ行ってみ ttp://www.archive.org/
194 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 09:49:05 ] >>175 C:\> dir a.txt (略) 2009/08/18 09:46 0 a.txt (略) C:\> ruby -e "open('a.txt:foo', 'w'){|f| f.write 'abc'}" C:\> dir a.txt (略) 2009/08/18 09:46 0 a.txt (略) C:\> ruby -e "p IO.read('a.txt:foo')" "abc"
195 名前:デフォルトの名無しさん [2009/08/18(火) 14:13:54 ] くだらない質問だと思いますが、文字列 a = "001011" b = "000111" から c = "000011" を求める(論理積?)にはどうしたら良いのでしょうか?
196 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 14:25:39 ] irb> a = "001011" irb> b = "000111" irb> ax = a.split(//n) irb> bx = b.split(//n) irb> p (0..5).to_a.map{|i| ax[i].to_i & bx[i].to_i}.join "000011"
197 名前:チンパンジー愛ちゃん [2009/08/18(火) 14:30:51 ] def and_str(a, b) return (Integer(a) & Integer(b)).to_s(2) end
198 名前:チンパンジー愛ちゃん [2009/08/18(火) 14:33:05 ] def and_str(a, b) return (Integer("0b" + a) & Integer("0b" + b)).to_s(2) end
199 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 14:38:04 ] >>196 1.9 だけでいいなら a[i] で分割いらないんだけどな どっちでも動作させるならまだ split がスレ的に無難か めんどい負の遺産じゃのう
200 名前:195 mailto:sage [2009/08/18(火) 14:45:00 ] >>196-199 ありがとうございました! 196が自分には理解しやすい一方、 198の方が速そうに見えるのですが(こちらはpaddingが必要ですね) 大量のデータを処理する際には、違いが出るでしょうか。
201 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 14:56:25 ] 100万桁を0.5秒で処理しないと銃殺されるとかそういう時にはチェックが必要
202 名前:195 mailto:sage [2009/08/18(火) 15:03:24 ] そこまで深刻じゃないので、また両方試してみます!
203 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:21:38 ] ハッシュがよくわからなくなったので質問させていただきます h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>0,"b"=>0,"c"=>0} } となって次に "usa"=>{"a"=>1,"b"=>1,"c"=>0}が出たら h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>1,"b"=>1,"c"=>0} } となってほしいのですが,どうすればいいでしょうか? 説明が分かり辛いですが・・・ ループ内にハッシュのキーが一致したら加算していってほしいのです
204 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:25:02 ] >>170 1.8.7以降なら Enumerable#count(obj)
205 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:29:26 ] >>203 とりあえず usa = {"a"=>1,"b"=>1,"c"=>0} を h["usa"] に加算する場合 h["usa"].merge!(usa) { |k, s, d| s += d } { "usa" => {"a"=>1,"b"=>1,"c"=>0} } でやりたいなら適当にネストさせて
206 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:30:16 ] 代入いらねーよorz h["usa"].merge!(usa) { |k, s, d| s + d }
207 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:37:29 ] >>198 def and_str(a, b) sprintf("%.*b", [a.length, b.length].max, (a.to_i(2) & b.to_i(2))) end
208 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:43:26 ] >>203 最初はとにかくやりたいことをそのまま書くといい 多くの場合、そのまま実行しても充分に速い def add(base, key, val) if tgt = base[key] val.each_pair do |k,v| if tgt[k] then tgt[k] = tgt[k] + v else tgt[k] = v end end else base[key] = val end end h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>0,"b"=>0,"c"=>0} } add(h, 'usa', {"a"=>1,"b"=>1,"c"=>0}) p h {"ja"=>{"a"=>1, "b"=>1, "c"=>0}, "usa"=>{"a"=>1, "b"=>1, "c"=>0}}
209 名前:203 mailto:sage [2009/08/18(火) 16:27:26 ] >>205-206 ,>>208 ありがとうございます。mergeを使ったりやaddを定義するのですね。 本当は require 'pp' ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) hc =Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } pp b b.each {|count| hin[count] +=1} hout[ary[i]] = hin puts "@@@" pp hout puts "@@@" } pp hout こんなことをやってます。 最後の pp houtが自分の思ったものと違っていて悩んでいます. 完全質問だと悪いと思って203で質問しました。
210 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:12:53 ] ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError) どうしたらいいんでしょう><
211 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:02:54 ] >>210 正しいMeCabバインディングを使う Taggerは今SourceForgeにあるMeCabバインディングをそもそも知らない
212 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:48:35 ] >>211 hm.. ってことはMeCabがバージョン9.07ではダメってことで、 古いバージョンのMeCabでおk って解釈でいいんですかね?
213 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:08:14 ] 6年前のな
214 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:17:36 ] MeCab本体とMeCabライブラリは違う
215 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:25:58 ] ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError) Possible C/C++ prototypes are: Tagger.new(char const *argc) Tagger.new() 少しいじった結果エラーログがこうなりました・・。 これはスクリプト書き換えとかで回避できないんでしょうか?
216 名前:203 mailto:sage [2009/08/18(火) 21:30:24 ] >>205->>206 ,>>208 さんのもの自体は理解できたのですが, やはり>>209 での問題が解決しませんでした. ハッシュのハッシュのvalueを加算していきたいのですが助言お願いします.
217 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:57:11 ] どんな値が返ってくれば正解なのかすら知らせずに丸投げとな require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new ary.size.times do |i| b = ary[i + 1, window].delete_if{|w| /#{ary[i]}/ =~ w} b.each do |w| hout[w] = 0 unless hout[w] hout[w] += 1 end end pp hout {"w1"=> 10, "w2"=> 9, "w3"=> 11, "w4"=> 9, "w5"=> 6}
218 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 22:02:04 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new ary.size.times do |i| ary[i+1, window].each do |w| next if /#{ary[i]}/ =~ w hout[w] = 0 unless hout[w] hout[w] += 1 end end pp hout
219 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 22:28:25 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new(0) ary.size.times do |i| ary[i+1, window].reject{|w| w == ary[i]}.each{|w| hout[w] += 1} end pp hout
220 名前:203 mailto:sage [2009/08/18(火) 22:30:53 ] >>217->>218 すいません。欲しい出力を書いていませんでした。申し訳ありません。 {"w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2}, "w2"=>{"w1"=>4, "w3"=>5, "w4"=>2, "w5"=>1}, "w3"=>{"w1"=>4, "w2"=>2, "w4"=>3, "w5"=>2}, "w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w5"=>1}, "w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1}} と出力して欲しいのです。
221 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:01:40 ] require 'pp' def hash_add(base, add) ret = add.each do |nest_key, nest_value| if base[nest_key] nest_value.each do |add_key, add_value| base[nest_key][add_key] += add_value end else base[nest_key] = nest_value end end return base end h1 = { "ja"=>{"a"=>5,"b"=>7,"c"=>9}, "usa"=>{"a"=>4,"b"=>2,"c"=>1} } # $(B$H$J$C$F<!$K(B h2 = { "ja"=>{"a"=>3,"b"=>8,"c"=>4}, "usa"=>{"a"=>14,"b"=>8,"c"=>5} } # $(B$,=P$?$i(B pp hash_add(h1, h2) # h1.inspect h = { "ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>1,"b"=>1,"c"=>0} }
222 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 23:07:58 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h } window = 6 hout = Hash.new ary.each_with_index do |key,i| (hout[key] = zero.dup).delete(key) unless hout.key?(key) ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 } end
223 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:25:03 ] 核と思われる部分だけを抜き出すとこんなことになるんだけど、 問題をうまくまとめれてないんじゃない? もうちょっと整理してから再度質問して。 require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 ary.size.times { |i| j = i + 1 p [":ary[#{j},#{window}]", ary[j, window]] } t217.3.rb [utf-8][unix] :!ruby t217.3.rb [":ary[1,6]", ["w2", "w3", "w4", "w2", "w3", "w1"]] [":ary[2,6]", ["w3", "w4", "w2", "w3", "w1", "w1"]] [":ary[3,6]", ["w4", "w2", "w3", "w1", "w1", "w5"]] [":ary[4,6]", ["w2", "w3", "w1", "w1", "w5", "w2"]] [":ary[5,6]", ["w3", "w1", "w1", "w5", "w2", "w3"]] [":ary[6,6]", ["w1", "w1", "w5", "w2", "w3", "w4"]] [":ary[7,6]", ["w1", "w5", "w2", "w3", "w4"]] [":ary[8,6]", ["w5", "w2", "w3", "w4"]] [":ary[9,6]", ["w2", "w3", "w4"]] [":ary[10,6]", ["w3", "w4"]] [":ary[11,6]", ["w4"]] [":ary[12,6]", []]
224 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:25:52 ] ary[12, 6]がおかしいと思わない?
225 名前:203 mailto:sage [2009/08/18(火) 23:44:32 ] >>221->>224 ありがとうございます。 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) でhinを初期化しているから同じkeyが来たときに上書きされてしまっているのが一つ問題と 同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする方法がわからないのがもう一つの問題です。 mergeの方法は>>205-206 ,>>208 さんのやり方になるのかなと思ってます。 >>224 ary[12,6]はそれでもOKだと思ってます。 そこは加算しなくていいよーということで。だめなんでしょうか?
226 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:45:41 ] >>215 @mecab = MeCab::Tagger.new([$0]) ってかいてあるところに @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") みたいな感じで直接Mecab用のオプション書けばうまくいくよ
227 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:53:51 ] >>225 ary[12, 6]をきちんと認識しているのなら何も問題はないでふ ただ、ここがバグの原因じゃないかな?と思っただけで。 Hash.new(0) してあるんだから、 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 は、 h["unknown_value"] += unknown_value_key と直接書けばよいでしょ。 以下のコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_keh0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5 y] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
228 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:55:27 ] 上のはゴミコードが入っちゃった。ごめん。 こっちのコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
229 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:57:18 ] rails仙人やーい
230 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:04:07 ] >>228 0 5 0 5 では・・・・ないんですか?すいません。 あと:unknownという表記になれていませんのでそこがわかりません。