トップページ⇒tech
1001コメント292KB

Ruby について Part 3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。

Ruby Home Page
http://www.ruby-lang.org/ja/

<前スレ>
Rubyについて Part 2
http://pc3.2ch.net/test/read.cgi/tech/1028906179/

<過去スレ>
Rubyについて
http://pc3.2ch.net/test/read.cgi/tech/1012096319/
0348デフォルトの名無しさんNGNG
>>341
hoge = '\\\\1000yen'
0349デフォルトの名無しさんNGNG
>>347
誰かがまとめてたの見たことあるよ
本家マニュアルサイトの「落し穴」あたりをあたってみては
0350デフォルトの名無しさんNGNG
>>348
それは直感的にわかりにくい。

>>346 のほうが新婦瑠でわかりやすいから、暗号的なプログラムを書きたい
のでないかぎり、ブロックを使ったほうが良いと思う。
0351デフォルトの名無しさんNGNG
>>335
POSIX regex で許されてる表現はそのまま通って欲しいな。
0352not333な初心者NGNG
>>338
の解説キボウ。お願いします。
なぜ、これなら、でかいファイルでもメモリを浪費しないんでしょうか?
2行目のunlinkが関係してるようなんですが。。
openしたブロックの中でunlinkって??
0353338NGNG
>>352
1. each_line なので全行をいっぺんにメモリに格納しません。

2. ファイルを open した状態で unlink してもファイルの中身は消えません。
(open したプロセスが一個も無くなってから消えます)
unlink 後に同名のファイルを open しても旧ファイルの中身に触れることはできません。
0354not333な初心者NGNG
>>353
じゃあ、メモリを浪費しないのは、each_lineを使ってるからで、
処理前と処理後を、同名のファイル名にしたい今回のような場合は、
一行ごと、each_lineするためには、unlinkして、
旧ファイルの内容と、新ファイルの内容を別々に扱ってるってことですね。

ありがとうございました。
0355デフォルトの名無しさんNGNG
>>354
だから結局一時ファイルを使っているのと変わらないのよ。
0356333NGNG
どうも、ファイル書き換えについて質問させていただいた 333 です。

338 さん、プログラムリストと解説ありがとうございました。
0357デフォルトの名無しさんNGNG
>>338
少なくともDOSISH(mswin32, mingw32, bccwin32, djgpp, たぶんhuman68kも)
ではopenしているファイルを削除することはできない。
それ以外は分からん。
0358デフォルトの名無しさんNGNG
RUBYってSmalltalkのぱくりだったんですね
0359デフォルトの名無しさんNGNG
んなこと言ったら、Rubyにオリジナルなとこなんて無い
0360デフォルトの名無しさんNGNG
色んな言語の良いとこ取りですよ?
0361デフォルトの名無しさんNGNG
mswin版のruby使ってるんですけど、
倍精度の浮動小数点数使うにはどうしたらいいの?
0362デフォルトの名無しさんNGNG
Float で間に合わないときは BigFloat
0363デフォルトの名無しさんNGNG
今ならBigdecimal。
0364デフォルトの名無しさんNGNG
>オリジナル
本当にオリジナルな言語なんて数えるほどしかないだろうし、
これからさらに減っていくのでは。
0365デフォルトの名無しさんNGNG
>>359
Rubyオリジナルなのは、モジュールを使ったMix-inあたりかなあ。
0366デフォルトの名無しさんNGNG
イテレータの柔軟な扱いは他の言語にはない・・・こともないか。
Lispじゃ常套手段だしな。

変数のスコープをprefixで区別するのはRubyオリジナルかな?
0367デフォルトの名無しさんNGNG
>>361
というか倍精度しか提供されてないのだが
0368デフォルトの名無しさんNGNG
名前空間ってこんな感じでいいの?

module ORE_NAME_SPACE
 class Main
 end
end
0369デフォルトの名無しさんNGNG
>368いい
0370デフォルトの名無しさんNGNG
るびきち氏ついにHP閉鎖?
http://www.ruby-lang.org/~rubikitch/
http://rubyist.net/~rubikitch/
我、詳細求む
0371デフォルトの名無しさんNGNG
>>370
「ついに」って、いままでなんかあったの?
0372370NGNG
>>371
るびきち氏
http://enya-mp3.tripod.com
Ruby撲滅スレ part 2
http://pc.2ch.net/tech/kako/1009/10091/1009193707.html

撲滅スレ内をキーワード"るびきち"で辿っていきますと...
0373デフォルトの名無しさんNGNG
★賞金が当たる★彼女が出来る★未成年クリック禁止★
http://www.pink-angel.jp/betu/linkvp2/linkvp.html
0374デフォルトの名無しさんNGNG
>>370
http://www.rubyist.net/~rubikitch/

つーか単純にURLが変わっただけ。
0375デフォルトの名無しさんNGNG
>>370
糠喜びさせやがって。まぁあの粘着君が閉めるわきゃねーわな。
0376デフォルトの名無しさんNGNG
Rubyなんて言語仕様がころころ変わるもんは使えないと上司に言われてしまいました。
(´・ω・`)ショボーン
0377デフォルトの名無しさんNGNG
バージョン番号振ってある様な言語は信用できんな。
0378デフォルトの名無しさんNGNG
正直バージョン番号の無い言語って何だろう。
C/C++ はライブラリ無いと何も出来ないし。
0379デフォルトの名無しさんNGNG
C も C++ も Perl も言語仕様が結構変わっているわけだが。
結局メジャーかどうかだな。
0380デフォルトの名無しさんNGNG
確かにC++なんて初期のころと比べたら仕様は変わりまくってる。
rubyなんかの比じゃない。
0381デフォルトの名無しさんNGNG
Windows も API が突然使えなくなったりとかしてるけど、
だから使うの止めたとか聞かないし。
0382デフォルトの名無しさんNGNG
すみません。数字をバイナリでファイルに出力、そして読み込むことを目的で以下のメソッドを書いたのですが、
もっと簡単な方法はないのでしょうか??またはこう書いた方が速いとか。
それとネーミングセンスがないので、良い名前がありましたら教えてください (^^;

class Integer
  def fixedByte(byte)
    fixedByte_(byte, self.abs, 1, (self < 0 ? 0b10000000 : 0b00000000))
  end
private
  def fixedByte_(byte, target, count, flg)
    nexttarget = target / 256
    if count != 1
      str = (target % 256).chr
    else
      str = ((target % 256) | flg).chr
    end
    if byte > count
      str = fixedByteS_(byte, nexttarget, count + 1, flg) << str
    end
    str
  end
end
0383デフォルトの名無しさんNGNG
class String
  def b_to_i
    ssize = self.size - 1
    i = 0
    for x in 0..ssize
        y = 1
        for z in 1..(ssize - x)
          y *= 256
        end
        if x != ssize
          i += self[x] * y
        else
          flg = ((self[x] & 0b10000000) > 0 ? -1 : 1)
          i += (self[x] & 0b01111111) * y
          i *= flg
        end
    end
    i
  end
end
0384デフォルトの名無しさんNGNG
pack unpack じゃだめなの?
0385デフォルトの名無しさんNGNG
お仕事の場合はゴルァって電話をかける先があるかどうかが問題じゃないかね
0386デフォルトの名無しさんNGNG
end読みにくいなあ。LISPみたい
0387デフォルトの名無しさんNGNG
今日は釣りが多い気がする。
0388デフォルトの名無しさんNGNG
lispのほうが256倍読みやすいYO
0389デフォルトの名無しさんNGNG
(・∀・)イイヨイイヨ-
0390デフォルトの名無しさんNGNG
>>382
Marshal.dump
0391デフォルトの名無しさんNGNG
>>382
fixedByteS_ってのがないがfixedByte_のtypoか?
任意のバイト数のビッグエンディアンで書き出そうという意図に見えるが、
最下位に符号をつけるのはまずかろう。
0392デフォルトの名無しさんNGNG
PealユーザーのためのRuby入門
吉田 和弘 (著)
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06515-4
http://www.amazon.co.jp/exec/obidos/ASIN/4274065154/
0393382NGNG
こんばんは〜。
ビッグエンディアン‥そうですねそのようです。
その用語はじめて触れました (^^;
はじめ、符号なしを書いて、上で書いていたメソッド名にして、
そのあと、符号つきを書いてその名前の後ろに'S'を付けてました。
バグありましたね。符号つきを書くとき、あまり考えず、テストをしないでいたようです (^^;
ここにカキコする際に、符号つきを'S'を取り払った状態でカキコしたつもりでそうなりました。

pack unpackは〜機能を限定すればスッキリ書けるようですね。同等の機能を持たせるには複雑になりそうな予感‥
Marshalは〜、そもそも使いたくありません。すみません。

取り敢えず、方法としては、あまり間違ってないんですね??
ところで、メソッド名とかいい名前はありませんかね‥
0394デフォルトの名無しさんNGNG
>>393
> 取り敢えず、方法としては、あまり間違ってないんですね??
方向としては間違ってないが、再帰を使う必要はないだろう。

> ところで、メソッド名とかいい名前はありませんかね‥
うーん、いい名前があればなぁ。前からこういうのは提案しようとは思ってる
んだけど。

# ワンライナー版
class Integer
def to_bin(width = self.size)
n = self
(0...width).inject([]) {|a,i| a << (n & 0xff); n >>=8; a}.reverse.pack("cC*")
end
def self.from_bin(s)
s.unpack("cC*").inject(0){|i,j| (i<<8)|j}
end
end
0395デフォルトの名無しさんNGNG
>>392
まだ、ruby2perlないですか?
0396393NGNG
394さんありがとうございます!
わー短くてカッコイイなァ〜 (笑
そもそも私が用いた方法では、マイナスの表現方法がダサイしね (苦笑
はじめinjectでひっかかりましたが、それを使える方法で置き換えたらばっちりでした!
0397395NGNG
ちがた。ほすぃのは、perl2ruby
0398デフォルトの名無しさんNGNG
どぞ
http://www.google.co.jp/
0399393NGNG
うっ、ばっちりと思っていましたら、
文字列から数字に変える変換で、ちょっと複雑になりそうな感じです‥
0400395NGNG
>>398
ぐぐってきたけど、ない。
みんなhttp://pluto.im.uec.ac.jp/~sekita-n/jdocs/perl2ruby.htmlへの
リンク。これ見てrubyべんきょしますだ。a2pなんかもだめだったしさ、
どうせさんこにならないだろとはおもてますたがね。
0401デフォルトの名無しさんNGNG
現実的には、Perl 処理系を Ruby から使うか、
Ruby で Perl をエミュレートするライブラリを使うかくらいなので、
速度が糞遅くなることを考えれば、手で移植した方がまし。
0402デフォルトの名無しさんNGNG
perl2ruby程度なら作れそうだけど、
問題はライブラリなんじゃないかと。
おれは興味ないが。
0403デフォルトの名無しさんNGNG
>>393
仕様がよく分からないのだけど、これであってる?

class Integer
  def dump(w) f = f(self,w); (1..w).map{|i|(f>>(8*(w-i)))&255}.pack("C*") end
  private; def f(x,w) n = 2**(8*w); (x+n)%n; end
end

class String
  def undump(w) g(unpack("C*").inject(0){|i,j| (i<<8)|j},w) end
  private; def g(b,w) n = 2**(8*w); (b+n/2)%n-n/2; end
end

20.times do
  w = rand(10)+1
  x = (-1)**rand(2)*rand(256**(w-1))
  d = x.dump(w)
  u = d.undump(w)
  p [x == u, d.size == w, w, x, d.unpack("H*")[0].scan(/../).join(" ")]
end
0404393NGNG
すみません。
私のinjectの分解方法が悪かったです。
injectをArrayに実装して、そのままで動かしたら、
394さんのもので、符号付きでしっかり動きました。
ありがとうございました。

符号付きでしたら、文字(?)から数字に変えるときはunpackを使ったほうが速そうですが、
そうでない場合はもunpackを使わないほうが速かったりするのでしょうか。
packは使わないほうが速そうです。
あまりまともには速度のテストしてませんけど (^^;
0405デフォルトの名無しさんNGNG
>>404
そりゃコードによるがたいていは組み込みメソッドが早い。
0406デフォルトの名無しさんNGNG
str = 'efgh'
str2 = 'abcd'
str = str + str2

より

str = 'efgh'
str2 = 'abcd'
str << str2

のほうが遅いのですが、どうしてでしょうか??

ruby 1.6.7 (2002-03-01) [i586-mswin32]
です。
0407デフォルトの名無しさんNGNG
>>406
http://www1.u-netsurf.ne.jp/~brew/mine/ja/ruby/optimize.html
0408デフォルトの名無しさんNGNG
>>406
どうやって計ったかを書くべし。これで計ったらどうよ?

N=1000000
t0=Time::times; N.times{str='efgh';str2='abcd';str=str+str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+",  u,s,u+s)
t0=Time::times; N.times{str='efgh';str2='abcd';str<<str2};    t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)
0409デフォルトの名無しさんNGNG
406ではないがやってみた。

[分かったこと]
・ オレの環境では << の方が少々早い。
・ その差は1ケタパーセント。これが大きいのか小さいのかよーわからん。
・ 1.8 の方がちょい遅い。そんなもん?
・ 1.8 では Time::times が obsolete。

% ruby -v ~/hoge.rb
ruby 1.6.8 (2002-12-24) [i686-cygwin]
+ user 3.6150, system 0.0000, total 3.6150
<< user 3.3850, system 0.0000, total 3.3850

% ruby-18 -v ~/hoge.rb
ruby 1.8.0 (2003-03-03) [i386-cygwin]
./hoge.rb:2: warning: obsolete method Time::times; use Process::times
./hoge.rb:2: warning: obsolete method Time::times; use Process::times
+ user 3.7350, system 0.0100, total 3.7450
./hoge.rb:5: warning: obsolete method Time::times; use Process::times
./hoge.rb:5: warning: obsolete method Time::times; use Process::times
<< user 3.4750, system 0.0000, total 3.4750
0410デフォルトの名無しさんNGNG
>>409
> ・ 1.8 では Time::times が obsolete。
ちょっとワロタ

同じく406ではないがやってみた。

ruby 1.6.8 (2003-03-11) [i386-netbsdelf1.6]
+ user 3.4000, system 0.0200, total 3.4200
<< user 3.2600, system 0.0100, total 3.2700

ruby 1.8.0 (2003-04-04) [i386-netbsdelf1.6]
+ user 3.6600, system 0.0000, total 3.6600
<< user 3.6200, system 0.0100, total 3.6300

全然変わらねぇ…
0411デフォルトの名無しさんNGNG
a)
for i in 0..10000000
1+1
end

と

b)
for i in 0..10000000
2
end

ではb)の方が早い。
a)10.21s user 0.03s system 100% cpu 10.208 total
b)5.85s user 0.00s system 100% cpu 5.802 total

rubyは毎回のループごとに1+1をいちいち計算してるわけか…
0412デフォルトの名無しさんNGNG
>>411
> rubyは毎回のループごとに1+1をいちいち計算してるわけか…

その手の最適化って一切しないのけ?
0413デフォルトの名無しさんNGNG
>>412
Fixnum#+が再定義されないとも限らないので、「最適化」しちゃうわけにはいかない。
この議論はdevでもtalkでも繰り返し出てるんで、検索してみるのがよろしいかと。
0414デフォルトの名無しさんNGNG
>>404
http://raa.ruby-lang.org/list.rhtml?name=shim-ruby16_18
0415デフォルトの名無しさんNGNG
>>409 >>410
str='efgh';str2='abcd' を N.times の外に出したら変わるのかも
0416デフォルトの名無しさんNGNG
PerlのInline::Ruby使ってる人いる?
これでレンタル鯖にRubyインスコされてなくてもCGI書けるね。
http://search.cpan.org/author/NEILW/Inline-Ruby-0.02/lib/Inline/Ruby.pod
0417デフォルトの名無しさんNGNG
うーんしかしこういうのはいかがなものか

#define BEGIN {
とかいうのとあんまり変わらないような気もする(そんなこともないかな)
0418デフォルトの名無しさんNGNG
つーか Ruby が入って無いと使えないんじゃないのか?
0419デフォルトの名無しさんNGNG
正規表現の互換性を無くす話だけど、ruby-talk側には常識的な人が
多いようで、少し安心した。
0420デフォルトの名無しさんNGNG
頭が逝かれてるのは作者と一部の信者だけだろ
0421デフォルトの名無しさんNGNG
>>408-410
同じく406ではないがやってみた。
$ ruby -v ./time.rb
ruby 1.6.4 (2001-06-04) [i586-linux]
+ user 9.3900, system 0.0500, total 9.4400
<< user 10.1600, system 0.0400, total 10.2000

何故だ......_| ̄|○
0422デフォルトの名無しさんNGNG
>>421
<< の測定前にGCしたら変わったりして

N=1000000
t0=Time::times; N.times{str='efgh';str2='abcd';str=str+str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+", u,s,u+s)
GC.start
t0=Time::times; N.times{str='efgh';str2='abcd';str<<str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)
0423421NGNG
406ではな(ry

>>422
変わらなかったっす。
くっだらねーイージーミスであることを恐れてソースを>>422からコピペして動かしてみましたが結果変わらず。
+ user 9.0300, system 0.0800, total 9.1100
<< user 9.7100, system 0.0800, total 9.7900

ちなみに
$ rpm -qi ruby
Name : ruby Relocations: (not relocateable)
Distribution: Kondara MNU/Linux 2.0(Mary) Vendor: (none)
Version : 1.6.4 Option: (none)
Release : 2k Build Date: 2001年06月07日 13時12分4

時代に取り残された環境です(〃▽〃)♪
0424デフォルトの名無しさんNGNG
http://www.k-514.com/
(σ・∀・)σゲッツ!!
0425デフォルトの名無しさんNGNG
>423
1.6.4ってえらく古いな
kondaraの動向は知らんがmomongaに乗り換えたら新しいrpmが使えるのかな
0426 ◆hMJAPH9PWA NGNG
一見<<演算子のほうが速いように思えるが…どういう実装なんだろう。
<<の実装と+の実装が同じなのかな。
0427デフォルトの名無しさんNGNG
jpegのデータを読み込んだStringから
GD::Image.newFromJpeg(file)でimage instanceを作りたいのですが
ファイルを作らずにStringから直接image instanceを作れないでしょうか?
0428デフォルトの名無しさんNGNG
ローカル変数のアクセスが微妙に影響してるような。

N=1000000
t0=Time::times; N.times{'efgh'+'abcd'}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+", u,s,u+s)
GC.start
t0=Time::times; N.times{'efgh'<<'abcd'}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)

$ ruby-1.6 -v /tmp/s.rb
ruby 1.6.8 (2003-03-26) [i686-linux]
+ user 4.7000, system 0.0300, total 4.7300
<< user 4.6700, system 0.0300, total 4.7000
0429デフォルトの名無しさんNGNG
>>427
gdImageCreateFrom*Ctx()はサポートしてないみたいだな。
作者にリクエスト汁。
0430デフォルトの名無しさんNGNG
1.8はいつ出るの?
0431デフォルトの名無しさんNGNG
作者の気が向いたら。
0432デフォルトの名無しさんNGNG
>>431
Preview releaseが出てるのに気が向いたらも糞もあるか
0433デフォルトの名無しさんNGNG
子供の日とかじゃないの?
0434デフォルトの名無しさんNGNG
もう一回くらいはpreview必要だろ。五月でもどうかなぁ。
0435デフォルトの名無しさんNGNG
作者はイラクに人間の盾に行ったので、戻ってきません。
0436初心者NGNG
class Insertion_sort
def mini_sort(index,array)
i = index
unsorted_array = array
judge = true
while judge
if unsorted_array[i - 1] > unsorted_array[i] || i != 1
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i--
else
judge = false
end
end
end
def Insertionsort.sort(unsorted_array)
i = 1
while i < (unsorted_array.size)
mini_sort(i,unsorted_array)
i++
end
sorted_array = unsorted_array
return sorted_array
end
end

test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p Insertionsort::sort(test_array)
0437初心者436NGNG
配列とし渡した、数字の並びを挿入ソートしたいのですが
上のように書いたら次のようなメッセージで動きません。
test3.rb:12: parse error
test3.rb:22: parse error
test3.rb:29: parse error
p Insertionsort::sort(test_array)
^
Ruby始めたばっかりで、どこがおかしいか検討がつきません。
endの閉じ忘れとかは注意したはずなんですが。。
なにかおかしなところ指摘してください。
動かない理由以外でも、書き方のへんなところとか教えて下さい。
0438デフォルトの名無しさんNGNG
i++やi--はないのでi+=1やi-=1とかいてください
0439初心者436NGNG
>>438
そこを直すと、違うエラーメッセージがでてきて進みそうです。
よくみたらクラス名もおかしかった。。

もうちょっと自分でやってみます
アドバイスありがとうございました

0440できた436NGNG
class Insertion_sort
def self.mini_sort(index,array)
i = index
unsorted_array = array
judge = true
while judge
if unsorted_array[i-1] > unsorted_array[i] && i != 0 then
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i -= 1
else
judge = false
end
end
return unsorted_array
end

def self.sort(unsorted_array)
i = 1
while i < unsorted_array.size do
unsorted_array = mini_sort(i,unsorted_array)
i += 1
end
sorted_array = unsorted_array
return sorted_array
end
end

test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p Insertion_sort::sort(test_array)
0441デフォルトの名無しさんNGNG
>>440
これだと破壊的だがそれで良い?

例えば
test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p test_array.sort, test_array # Array#sort は test_array を破壊しない
p Insertion_sort::sort(test_array), test_array # Insertion_sort::sort は破壊的

結果
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
[2, 4, 45, 6, 3, 677, 32, 64, 453, 1, 3, 56, 7, 0]
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
0442デフォルトの名無しさんNGNG
>>440
breakというものを教えて上げたいような上げたくないような。
0443436NGNG
>>441
もとのsortメソッドの名前をsort!に改めて
新しく次のようにsortメソッドを作りました。
普段、あまり破壊的、非破壊的ということを意識してませんでした。
単純にcloneメソッドを使ってつくりました。
def self.sort(unsorted_array)
i = 1
cloned_unsorted_array = unsorted_array.clone
while i < cloned_unsorted_array.size do
cloned_unsorted_array = mini_sort(i,cloned_unsorted_array)
i += 1
end
sorted_array = cloned_unsorted_array
return sorted_array
end
0444436NGNG
>>442
breakを使うとしたら、mini_sortのwhile文中でしょうか?
loopとbreakを使うとすっきりしました。
def self.mini_sort(index,array)
i = index
unsorted_array = array
loop{
if unsorted_array[i-1] > unsorted_array[i] && i != 0 then
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i -= 1
else
break
end
}
return unsorted_array
end
0445デフォルトの名無しさんNGNG
なんで>>443でwhile使っときながら>>444ではloop&breakになっちゃうんだよ。
0446 NGNG
私だったこう書く

module InsertionSort
  module_function

  def insertion_sort!(array)
    modified = nil
    for n in 0..array.size-1
      n.downto(1) do |i|
        break unless array[i-1] > array[i]
        array[i-1], array[i], modified = array[i], array[i-1], true
      end
    end
    modified and array
  end

  def insertion_sort(array)
    insertion_sort!(copy = array.dup) or copy
  end
end
0447デフォルトの名無しさんNGNG
しまった、ら抜き言葉を発明してしまった
■ このスレッドは過去ログ倉庫に格納されています