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