irb(main):006:0> a=2.4 => 2.4 irb(main):007:0> b=3.6 => 3.6 irb(main):008:0> a.to_i => 2 irb(main):009:0> a.floor => 2 irb(main):010:0> a.ceil => 3 irb(main):011:0> a.round => 2 irb(main):012:0> b.to_i => 3 irb(main):013:0> b.floor => 3 irb(main):014:0> b.ceil => 4 irb(main):015:0> b.round => 4
今回の例では,教科書の例にある "ATAG"と"AAC"のアラインメント表を作成してみることで確かめることができます.
irb(main):002:0> align("ATAG","AAC")
=> [[0, -2, -4, -6], [-2, 2, 0, -2], [-4, 0, 1, -1], [-6, -2, 2, 0], [-8, -4, 0, 1]]
ktanaka@dell:~$ irb1.9 irb(main):001:0> s="あいう" => "あいう" irb(main):002:0> s.length() => 3
def max(x,y)
if y < x
x
else
y
end
end
def make1d(w)
a=Array.new(w)
for i in 0..(w-1)
a[i]=0
end
a
end
def make2d(h,w)
a=Array.new(h)
for i in 0..(h-1)
a[i]=make1d(w)
end
a
end
def g()
-2
end
def q(c,d)
if c == d
return 2
else
return -1
end
end
def align(s,t)
m = s.length()
n = t.length()
a = make2d(m+1,n+1)
a[0][0] = 0
for j in 1..n
a[0][j] = a[0][j-1] + g()
end
for i in 1..m
a[i][0] = a[i-1][0] + g()
end
for i in 1..m
for j in 1..n
v2 = a[i][j-1] + g() # 上から
v1 = a[i-1][j-1] + q(s[i-1], t[j-1]) # 左上から
v0 = a[i-1][j] + g() # 左からのコスト
a[i][j]=max(v0,max(v1,v2)) # これらの最大のものを返す
end
end
a
end
動作は教科書の例にある "ATAG"と"AAC"のアラインメント表を作成してみることで確かめられる.
irb(main):001:0> load "/tmp/align.rb"
=> true
irb(main):002:0> align("ATAG","AAC")
=> [[0, -2, -4, -6], [-2, 2, 0, -2], [-4, 0, 1, -1], [-6, -2, 2, 0], [-8, -4, 0, 1]]
関数g()を呼び出さずに単に -2 と書いても同じ結果になるが,ギャップの得点
-2 を変更してテストをする場合などは,関数g()の呼び出しにしておくと,書
きなおす場所が1ヶ所になって間違えにくくなる.
for i in 1..m
for j in 1..n
とすると(i,j)は(1,1)から始まるが,この時のv1の計算は文字列s, 文字列tのそれぞれの先頭の文字を比較して得点を解散する必要がある.文字列sの先頭の文字は添字(index)を0として s[0] と表されるので,i=1の時s[i]は次の文字になってしまう.
ruby vote.rb 選択肢番号のように使います.
mkdir is10のようにしてください.そして,ターミナルを開くたびに
cd is10と入力してからirbを動かすと良いでしょう.詳しくは,はいぱーワークブック「13.4 コマンドを使ったファイル操作」を参照してください.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます.