ruby check.rb ex07.rbとしたときに、
テストデータファイルとして ex07.rb を使います... ファイル align.rb を読み込みます... Ex7.4 [対象のメソッド: align ] => PASSで止まってしまったのですが、どうしてなのか見当がつきませんでした。
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][j - 1] + g()
v1 = a[i - 1][j - 1] + q(s[i-1],t[j-1])
v2 = a[i - 1][j] + g()
a[i][j] = max(v0, max(v1, v2))
end
end
a
end
穴埋めの部分を
a[i][j] = [a[i][j-1] + g(), a[i-1][j-1] + q(s[i-1], t[j-1]), a[i-1][j] + g()].max()
のように1行で解答している人もいた.
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()
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])
u = s[i - 1 .. i - 1] + u
v = t[j - 1 .. j - 1] + v
i = i - 1
j = j - 1 # go up left
else
if i > 0 && a[i][j] == a[i - 1][j] + g()
u = s[i - 1] + u
v = "-" + v
i = i - 1 # go up
end
end
end
end
[u, v]
end
上のプログラムでは,文字列sからi - 1文字目の1文字だけからなる部分文字列を取り出すのに s[i - 1 .. i - 1] と書いているが,現在のRuby 言語仕様では s[i - 1] のように書いても同じ意味になる.
また,tracebackの中で3方向に分岐しているが,「alignで作成された正しい配列aが与えられれば,必ず3方向に分岐するので,最後のifはいらない」,「正しくない配列aが与えられた時は例外処理をおこなうのが良い」と指摘した人はあり正しいが,わかりやすさを重視して穴埋めプログラムは作られている.
mkdir algo16のようにします.そして,ターミナルを開くたびに
cd algo16と入力してからirbを動かしてください.詳しくは,はいぱーワークブック「14.4 コマンドを使ったファイル操作」を参照してください.
cd algo16 unzip allcode.zipを実行するか,Finderでalgo16のフォルダの下のallcode.zipをダブルクリックすると,algo16の下にすべての配付プログラムが展開されます.
cd algo16を済ませてから,
ruby vote.rb 選択肢番号のように使います.
irbを使いながら(一旦終了せずに),投票システムも使うには,ターミナルのメニューバーの「シェル」->「新規タブ」を選ぶか,[Command]+[T]で別のタブを開いて(あるいは[Command]+[N]で別のウィンドウを開いて),投票システムを使うことをお勧めします.このあたりのことは,「はいぱーワークブック」の15.4 ターミナルの便利な使い方に書いてあるので参考にしてください.
irb(main):003:0> a = 0.5
=> 0.5
irb(main):004:0> printf("%064b\n",[a].pack("E").unpack("Q")[0])
0011111111100000000000000000000000000000000000000000000000000000
=> nil
逆の変換は以下のようにやる.
b = "0011111111100000000000000000000000000000000000000000000000000000"
[b.to_i(2)].pack("Q").unpack("E")
単精度表現は
irb(main):005:0> printf("%032b\n",[0.5].pack("e").unpack("L")[0])
00111111000000000000000000000000
=> nil
と
irb(main):006:0> ["00111111000000000000000000000000".to_i(2)].pack("L").unpack("e")
=> [0.5]
isrb(main):004:0> Dir.chdir("./algo16")
のように,Dirクラスのchdirメソッドを使うと良いようです.Windows版のisrbで起動後にカレントディレクトリが変わってしまうという症状が出る場合は,これで対応できます.


cd ~/algo16と入力してください.これらの機能を使うと,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)は不要です.
cp -rp /home/5320954122/Ruby ~/Library/Application\ Support/mi/mode/を実行してからmiを立ち上げるとRubyモードが利用可能なモードとして加わります.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます. 詳しくは,補足説明 (練習問題確認プログラムの使い方)を御覧ください.