Ruby 初心者スレッド Part 52
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2013/06/06(木) 23:50:09.17質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ
前スレ
Ruby 初心者スレッド Part 51
http://toro.2ch.net/test/read.cgi/tech/1358636526/
るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/
Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
逆引きRuby
http://www.namaraii.com/rubytips/
0249デフォルトの名無しさん
2013/08/20(火) NY:AN:NY.AN0250244
2013/08/20(火) NY:AN:NY.ANforの前にk = -pとか書いたり
break if k <= deltaとか書いたり
しないといけないんですね
Rubyって意外に不便ですね
0251デフォルトの名無しさん
2013/08/20(火) NY:AN:NY.AN0252デフォルトの名無しさん
2013/08/20(火) NY:AN:NY.ANgem使えると思ったら大間違いですョ・・・
0253デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.AN0254デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.AN各行の処理(正確には、各行の前後にあるかもしれない処理)のせいでこちらからなにもできん
まあ、ループの書き方くらいはきちんと自分で理解して書いて欲しい
下手するとコピペで書いていただけでループや繰り返しの概念がないようにも見受けられる
0255デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.ANだからRubyは少しだけ中途半端な言語
0256デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.ANa..bてのがある。
点がふたつ。これは、他のスクリプト言語にもある。
a = -p
b = delta - 1
for k in a..b do
処理
end
0257デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.ANcatch :out do
end
という処理を書いたら、catch句の中にはいってくれないのはどうしてですか?
0258デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN0259デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN知りたいのはループ方法だけなんです
>>256
ありがとうございます。
でもその構文でインクリメントを2にするには、next if...とか使うしかないのでしょうか?
0260デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN違うと思う
たぶん>>254の見立てが正しそうだ
0261デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN(a..b).step(2)
ググレ
0262デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANb=[1,1,2]
に対して a-bを実行すると[3,4]が返ってくるのですが
[1,3,4]が返ってくるようにするにはどうしたらいいですか?
0263デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANいまは高校数学で、ベクトル、行列、群論とかやってないのかな
0264デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN% irb
> require 'multiset'
> a = Multiset.new([1,1,1,2,3,4])
=> #<Multiset:#3 1, #1 2, #1 3, #1 4>
> b = Multiset.new([1,1,2])
=> #<Multiset:#2 1, #1 2>
> a - b
=> #<Multiset:#1 1, #1 3, #1 4>
irb(main):006:0> (a - b).to_a
=> [1, 3, 4]
うおお
0265デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN高校数学で群論やってたのっていつの時代だよ?
0266デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANa=[1,1,1,2,3,4]
b=[1,1,2]
のとき、
a+b => [1,1,1,2,3,4,1,1,2]
なのに
a-b => [3,4]
というのは直感と反してるかもな。
0267デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANa+(b-b) => [1,1,1,2,3,4]
0268デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANありがとうございます
初心者なのでgemってよくわからないんですが
通常のarrayクラスの演算では求めるような操作を行うことはできない'multiset'モジュール?を使え
という理解でよろしいでしょうか?
0269デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANググるくらいしろ
0270デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANhttp://play.island.ac/codepaste/code?id=1551
0271デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.AN[1,1,1,2,3,4].diff[1,2,1] => ?
0272デフォルトの名無しさん
2013/08/22(木) NY:AN:NY.ANいつものアレだから無視しろ
0273デフォルトの名無しさん
2013/08/23(金) NY:AN:NY.ANa = [1, 2 ,3]
a.select.with_index(0) {|val, i| i == 0 || i == 2 }
#=> [1, 3]
0274デフォルトの名無しさん
2013/08/23(金) NY:AN:NY.ANTime.now - s
これで求めた時刻って、単位はなんなのでしょうか?
0275デフォルトの名無しさん
2013/08/23(金) NY:AN:NY.AN0276デフォルトの名無しさん
2013/08/23(金) NY:AN:NY.ANArray#values_at
0277デフォルトの名無しさん
2013/08/23(金) NY:AN:NY.AN[1,1,1,2,3,4].diff [1,2,1] => [1, 1, 3, 4]
また、>>271を更新しました
http://play.island.ac/codepaste/code?id=1552
更新版では、multisetパッケージ(>>264)と同様にメソッド Array#- をオーバライドさせました
[1,1,1,2,3,4] - [1,2,1] => [1, 1, 3, 4]
なお、この実装は(コードを見れば一目で分かるように)「配列の差」を単純に表現しています
もし質問者(>>262)が必要としているのが「真の多重集合」であるなら multsetを使うべきだし、
「単なる配列の差」でかまわないならばこちらを選んでもいいのではないかと思います
>>273
a.select.with_index { |_, i| [0, 2].include?(i) }
0278デフォルトの名無しさん
2013/08/23(金) NY:AN:NY.ANありがとうございました
秒なんですかね?
なんか1秒ぐらいかかってる処理が0.02秒で終わるのですが
0279デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANvar func = function(i) { //すっげー長い処理 }
func(1);
func(255);
func(1000);
}
こういう処理をRubyで書きたいんですが方法が分かりません。
def method
func = lamda { |k|
}
end
これはなんか違う気がします
0280デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANなぜlambdaでは駄目だと思うのか120文字程度で言えるもんなら言ってみろ(15点)
0281デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANend
func(10)
これで普通に上のJavaScriptと同じように動くのですか?
0282デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANfunc.call(10)
こうでした
Rubyって短く書くこと推奨なのにcall()が必要なんですね
0283デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.AN好きなの使えばいいと思うよ
0284デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANそんな推奨はない
0285デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.AN0286デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.AN0287デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANProcオブジェクトという態を捨てるわけにもいかないし
メソッド化するという機能があればいいんだろうけど
0288デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANfor ( i=0 ; c = getc© != EOF ; i++)
{
ほにゃ
]
c = STDIN.getc
while ( c != nil)
ほにゃ
c= STDIN.getc
end
って面倒くさい書き方になっちゃうんですけど、もっと上手いやり方ないですか?
0289デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.AN0290デフォルトの名無しさん
2013/08/25(日) NY:AN:NY.ANend
じゃね?
0291デフォルトの名無しさん
2013/08/26(月) NY:AN:NY.AN0292デフォルトの名無しさん
2013/08/26(月) NY:AN:NY.AN0293デフォルトの名無しさん
2013/08/26(月) NY:AN:NY.ANI/Oの反復処理を書く方法はいくつかあって(.... ここで「ほにゃ」を「英大文字変換」と仮定):
(1) 反復構文 until .... end を使う -- Rubyを使い始めたばかりの人向け
until (c = STDIN.getc).nil?
STDOUT.putc c.upcase
end
(2) イテレータ IO#each_char を使う(>>290) -- フツウにRubyらしいやりかた
STDIN.each_char do |c|
STDOUT.putc c.upcase
end
(3) (2) + 遅延評価 Enumuable#lazy を使う -- イマドキ(?)のRubyらしいやりかた(Ruby 2.0から)
STDIN.each_char.lazy.map { |c|
c.upcase
}.each do |c|
STDOUT.putc c
end
・Rubyist Magazine - 無限リストを map 可能にする Enumerable#lazy
http://magazine.rubyist.net/?0041-200Special-lazy
・Enumerable lazy について
http://www.slideshare.net/cuzic/enumerable-lazy
0294デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.ANhtml→css→php→rubyの順にしようと思うけどこれでいいと思う?
0295デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN0296デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.ANどんな順番がいいと思う?
0297デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.ANそしてなおかつそれの知識がないのだとしたら、
そりゃHTMLやCSSやJavascriptの勉強から始め「なければならない」と思う
極める必要などさらさらないが、区別分別できるくらいの知識は必要
0298デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.ANjsもいるのか
ありがとーRuby始められるくらいのレベルになったらまたここくるわ
0299デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN1. 情報を発信してー
2. HTMLを勉強する
3. 見栄えを良くするために CSS を勉強する
4. 細工したくて JavaScript 勉強する
5. 動的にしたくて CGI を勉強する
CGIでどんな言語を選択するかのが分岐点になる。
2000年はPerlの一強
0300デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN初心者が「やれそう!」と思うようなものは簡単で基礎的なものだろうから
後々無駄になることは多分おそらくあまりないんじゃないかなと思わなくもない
0301デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN遅くなりましたがありがとうございました!
0302デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN計算するだけのアプリとかなら、いきなりrubyでいいだろ。
0303デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN0304デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.ANこれは義務教育で算数や数学を学んでいて計算ができる前提だな。
0305デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN0306デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.ANサンクス
勉強してみます
0307デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN0308デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.ANconfigureからmake installまで1時間30分ぐらいかかりました
ホストOSがWindowsのCeleronの1コアのCPUです。
みなさんの環境ではどのくらいの時間でコンパイルできるのでしょうか?
20〜30分切れるというかた,スペック教えてください
0309デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN新しい一番安いmacmini(59,800円)でやってみた。
Parallels上のCentOS6(Core4個割り当て)
ruby-2.0.0-p247
# time ./configure
real 0m16.055s
user 0m7.716s
sys 0m3.865s
# time make -j
real 3m12.424s
user 4m30.528s
sys 0m13.983s
(うち、ドキュメント生成 127.1s)
0310309
2013/08/28(水) NY:AN:NY.AN79,800円の方だった。
2.3GHzクアッドコアIntel Core i7(Turbo Boost使用時最大3.3GHz)、6MB三次キャッシュ
0311デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.ANやっぱり買い替えます
ありがとうございます
0312デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN0313デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.ANLinux?ってやつで開発するとどんなメリットがあるの?
0314デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN無視して
0315デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN0316デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN>>239のサンプルコードを....
(1) 反復構文 until....end を使う
http://play.island.ac/codepaste/code?id=27
長い(1.2Kstep)けど、見るのは1262行から始めるメイン処理の箇所だけ
変数 seq_num と env をループの中でゴリゴリと(=破壊的代入で)更新するフツーなスタイル
(2) イテレータ IO#each_line を使う
http://play.island.ac/codepaste/code?id=1553
変数 seq_num を更新する代わりにメソッド Enumerable#with_index を、そして
変数 env を更新する代わりにメソッド Enumerable#inject をチェーン(繋ぐ)ことで
(1)と同じ反復処理を実現している
なお、(3)の遅延メソッド Enumuerable#lazy は無くても、ループが止まることは無く普通に動く
メソッドチェーンの途中で map や select 等を使うケースでは必要になるみたいだけど、
どんな条件で lazy が要(あるいは不要)か?に対する明確な答えは分からなかった....
0318デフォルトの名無しさん
2013/08/28(水) NY:AN:NY.AN開発ツールが豊富で簡単で安定してる。使い方によるだろうから、自分にあった環境使えばいいよ。
0319デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANnokogiriのGemファイルには他にもminitestやhoeといったGemが書かれているのですが、nokogiriとmini_portileしかインストールされないのは何故でしょうか?
0320デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN0321デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN0322デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN適当にeachを実装することでそれはできました。このような実装です
def each
items_read_position = -1
while get_next
(items_read_position+1).upto(@items.length-1) do |i|
yield @items[i]
end
items_read_position = @items.length-1
end
end
@itemsはアイテムが入った配列で、get_nextは取得した結果を@itemsにArray#<<し、取得終了時にfalse、それ以外はtrueを返すというメソッドです。
そこまでは出来たのですが、後々容易にアイテムを識別したり、リストの重複を防ぐために、Itemの中にあるキーを用いてhashにしようと考えました。
色々調べて、Hashの順序は保証されることがわかったので、Enumerator#nextというのが使えるかなと思いましたが、
nextの実行中に元オブジェクトの変更は出来ませんでした。
何かいい手段があれば教えてください。
0323デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANGemfileではどのgemもgroupに:developmentと:testが指定されているのですが、開発時に必要なものと実行時に必要なものが指定されているのは別のファイルでしょうか?
0324デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN0325デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANNokogiriって、 gemspecファイルないんだな。
Gem::Specification.find {|spec| spec.name == 'nokogiri'}.dependencies.map(&:type)
を見て。
0326デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN0327デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANジェネリクスが無効化される方法でお願いします。
0328デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN0329デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN0330デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANオブジェクト指向を学ぶのにRubyは適していますか?
0331デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANオブジェクト指向を学びたいならJavaを学んでください
0332デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.ANHoe使ってRakeファイルの中でgemspec作って依存性管理してるのかなという結論に至りました。
ありがとうございます!
0333デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.AN配列の中身はすべてハッシュで{:type=>"", text:=>""}という中身です。
:typeは、A, B, Cの3種類だけです。
今この巨大配列を
α:typeがAとCの配列
β:typeがBとCの配列
に分割したうえで、
αは、:typeがAの要素と:typeがAの要素からインデックスが±3以内の:typeがCの要素のみ
βは、:typeがBの要素と:typeがBの要素からインデックスが±3以内の:typeがCの要素のみ
にしたいんです。
alpha_tmp = big.dup.delete_if do |ele| if ele[:type] == B end
beta_tmp = big.dup.delete_if do |ele| if ele[:type] == A end
alpha = []
is_within = 0
alpha.tmp.each.do |ele, index|
if ele == A
alpha << A
is_within = index
else
is_within -4 < index && index < is_within + 4
alpha << A
end
alpha = alpha.uniq
書いてみましたが・・・なんか糞です。・・・もっと上手い書き方はないものでしょうか?
0334デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.ANcaseが使えるはず
インデックスは要素位置だとして、配列arrの2要素目から7要素目までの部分配列はarr[2..7]で得られる
プラマイ3がよくわかんが、xプラマイ3が欲しいならarr[(x-3)..(x+3)]でいいんじゃないのん
irb> ["a", "b", "c", "d", "e", "f", "g", "h", "i"][2..5]
=> ["c", "d", "e", "f"]
0335デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.ANAとCの配列、BとCの配列を作り、六つ以上連続するCがあったら
前後の3つを残して中側のCを削除する
あと杞憂かも知れんがAB分割する前と後の±3では結果が異なってくるぞ
[ABBBC]なら
分割前はalpha=[A],beta=[BBBC]
分割後はalpha=[AC],beta=[BBBC]
0336デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.ANありがとうございます。
助かりました。
AB分割後の配列の±3で問題ないです。
0337デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.AN9x9の問題を縦・横・3x3のブロックの3つの2次元配列に代入するのに
以下のものよりベターな方法ありませんか?
def set
for x in 0...9
for y in 0...9
@x[x][y] = @sheet[x][y]
@y[x][y] = @sheet[y][x]
@z[x][y] = @sheet[x / 3 * 3 + y / 3][x % 3 * 3 + y % 3]
end
end
end
0338デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.AN0339デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.AN0340デフォルトの名無しさん
2013/08/30(金) NY:AN:NY.ANをどう書くのか考えてみた
簡略化して要素はHashの代わりにSymbolで :a,:b,:c
big = 10000.times.map{[:a,:b,:c].sample} #ダミーデータでっちあげ
10.times{ big[rand(big.size),0] = [:c]*(rand(10)+7)} #数箇所に:cの連続するデータを挿入
alpha_tmp = big.reject{|e| e == :b}
beta_tmp = big.reject{|e| e == :a}
alpha = ([:c]*3 + alpha_tmp + [:c]*3).each_cons(7).reject{|s| not s.find{|e| e == :a}}.map{|s| s[3]}
# e のとこは e[:type] の代わりのイメージで
bigが数百メガ超とかならlazy使ったほうがいいのかな
0341デフォルトの名無しさん
2013/09/01(日) 01:12:22.21temp = []
start = 0
array.each_with_index do |e, i|
if e == "\r"
temp << array.slice(start..i)
start = i + 1
end
end
なんでgが切り出されないのでしょうか?
0342デフォルトの名無しさん
2013/09/01(日) 01:50:12.540343デフォルトの名無しさん
2013/09/01(日) 01:57:45.89のようなことをしたいのだろうか。。。
0344デフォルトの名無しさん
2013/09/01(日) 02:18:47.26splitとかscanを使うと平易に書けるかもしれない
0345デフォルトの名無しさん
2013/09/01(日) 06:12:15.59Rubyでは標準入力/ファイル読み混みは行単位または文字列全体として受け取るのが一般的
0346デフォルトの名無しさん
2013/09/01(日) 10:21:03.93そのバイトストリームを扱う様々なメソッドが提供されている
・バイトを単位として扱う -- IO#each_byte
・文字を単位として扱う -- IO#each_char
・行を単位として扱う -- IO#each_line
・ストリーム全体を単位として扱う -- IO.read
そして、I/O処理における「反復の制御方法(>>293,316,317)」と
「I/Oのデータ単位」は直交する概念だから、ごっちゃにせずそれらの組合せとして考え、
解決したい問題に対して最適な方法(組合せ)を選ぶ必要がある
で、それはさておき、>>316で紹介した(行をI/Oの単位とする)サンプルコードについて、
irb のようにカーソルキーで履歴/行編集ができるよう改造してみた
http://play.island.ac/codepaste/code?id=1554
標準ライブラリのreadlineとRuby1.9で導入されたEnumeratorクラスの応用になるけど、
Enumuratorクラスはなかなか面白い
0347デフォルトの名無しさん
2013/09/01(日) 11:04:03.73temp = [ ["a", "b", "c", "\r"], ["\n", "d", "e", "f", "\r"], ["\n", "g"]]
これを期待しているんです。
0348デフォルトの名無しさん
2013/09/01(日) 11:05:22.42下2桁45を取得方法をおしえて
■ このスレッドは過去ログ倉庫に格納されています