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
v0 = a[i-1][j] + g()
v1 = a[i-1][j-1] + q(s[i-1],t[j-1])
v2 = a[i][j-1] + g()
a[i][j] = max(v0,max(v1,v2))
end
end
a
end
def traceback(a,s,t)
u = ""
v = ""
i = s.length()
j = t.length()
while i>0 || j>0
if j>0 && a[i][j] == a[i][j-1] + g() # 左のマスの値からa[i][j]の値が決まっていた場合
u = "-" + u
v = t[j-1 .. j-1] + v
j = j - 1 # go left
else
if i>0 && j>0 &&
a[i][j] == a[i-1][j-1] + q(s[i-1], t[j-1]) # 左上のマスの値からa[i][j]の値が決まっていた場合
u = s[i-1 .. i-1] + u
v = t[j-1 .. j-1] + v
i = i - 1
j = j - 1
else
if i>0 && a[i][j] == a[i-1][j] + g() # 上のマスの値からa[i][j] の値が決まっていた場合
u = s[i-1 .. i-1] + u
v = "-" + v
i = i - 1
end
end
end
end
[u,v]
end
なお,現在の Ruby では文字列sのi-1番目の1文字からなる文字列を生成するには,s[i-1 .. i-1]と書かずに s[i-1] と書くことも可能なので,そのように書いていた人もいた.
cd algo17を済ませてから,
ruby vote.rb 選択肢番号のように使います.
irbを使いながら(一旦終了せずに),投票システムも使うには,ターミナルのメニューバーの「シェル」->「新規タブ」を選ぶか,[Command]+[T]で別のタブを開いて(あるいは[Command]+[N]で別のウィンドウを開いて),投票システムを使うことをお勧めします.このあたりのことは,「はいぱーワークブック」の15.4 ターミナルの便利な使い方に書いてあるので参考にしてください.
irb(main):034:0> a = 0.5
=> 0.5
irb(main):035:0> s = ("0"*64 + [a].pack("E").unpack("Q")[0].to_s(2))[-64..-1]
=> "0011111111100000000000000000000000000000000000000000000000000000"
irb(main):036:0> [s[0], s[1..11], s[12..-1]]
=> ["0", "01111111110", "0000000000000000000000000000000000000000000000000000"]


cd ~/algo17と入力してください.これらの機能を使うと,irbを抜けずにvoteできます.
ターミナルの基本的な使い方は,はいぱーワークブックの15.2 ターミナルの基本的な使い方を,より高度な使い方は,15.4 ターミナルの便利な使い方を参照してください.
cdというコマンドと「~」の意味は,はいぱーワークブックの14.4 コマンドを使ったファイル操作の14.4.1 ディレクトリを読むと分かります.
iruby notebookを実行すると,Webブラウザ上で対応するタブが開きます.
include(Math)を入力するように書いています. 毎回入力するのが面倒な場合は,ホームディレクトリの下に「.irbrc」というテキストファイルを作り,その中に
include(Math)と書いておくと,irb起動時にこのファイルの中身を実行してくれるので,毎回指定しなくても大丈夫です.ただし,このファイルの実行中にエラーが出ないように正しく記述剃る必要があります.また,
Math.sqrt(2)のような形で指定すれば,
include(Math)は不要です.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます. 詳しくは,補足説明 (練習問題確認プログラムの使い方)を御覧ください.