def b(s, x, y)
r = s / 2.0
d = distance(x, y, r, r)
if d <= r
(r - d) / r
else
1
end
end
def solutions(a,b,c)
d = b**2 - 4 * a * c
if a == 0 || d == 0
1
else
if d > 0
2
else
0
end
end
end
def median(x, y, z)
if (x < y && y < z) || (z < y && y < x)
y
else
if (y < x && x < z) || (z < x && x < y)
x
else
z
end
end
end
これだと,たとえば x < z < y の時に x と yの比較をおそらくは3回おこなうことになる.これを節約すると以下のように愚直に書く必要がある.
def median(x, y, z)
if x < y
if y < z
y
else
if x < z
z
else
x
end
end
else
if x < z
x
else
if y < z
z
else
y
end
end
end
end
以下のようにして条件をうまくまとめた解もあった.
def median(x,y,z)
if (y - x) * (y - z) < 0
y
else
if (z - x) * (z - y) < 0
z
else
x
end
end
end
関数maxを使った解もあった.
load("./max.rb")
def median(x,y,z)
if max(x,y) == max(y,z)
max(x,z)
else
if min(x,y) == min(y,z)
min(x,z)
else
y
end
end
end
講義では扱っていないが,Ruby言語ではif文のelseにすぐにifが来る場合は,elsif を使って以下のようにかける.これはendの数を抑える点では意味がある.
def median(x, y, z)
if (x < y && y < z) || (z < y && y < x)
y
elsif (y < x && x < z) || (z < x && x < y)
x
else
z
end
end
講義の範囲は超えているが,配列の整列(sorting)をおこなう組み込みメソッドsortを使った解答もあった.
def median(x, y, z)
answer = [x, y, z].sort()
answer[1]
end
mkdir algo17のようにします.そして,ターミナルを開くたびに
cd algo17と入力してからirbを動かしてください.詳しくは,はいぱーワークブック「14.4 コマンドを使ったファイル操作」を参照してください.
cd algo17 unzip allcode.zipを実行してください.
cd algo17を済ませてから,
ruby vote.rb 選択肢番号のように使います.
irbを使いながら(一旦終了せずに),投票システムも使うには,ターミナルのメニューバーの「シェル」->「新規タブ」を選ぶか,[Command]+[T]で別のタブを開いて(あるいは[Command]+[N]で別のウィンドウを開いて),投票システムを使うことをお勧めします.このあたりのことは,「はいぱーワークブック」の15.4 ターミナルの便利な使い方に書いてあるので参考にしてください.


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と実行すると,関数を与えた時の入力と出力があっていることが確認できます. 詳しくは,補足説明 (練習問題確認プログラムの使い方)を御覧ください.