if x < y < zのように書きたかったのですが,
NoMethodError: undefined method `<' for true:TrueClassRuby言語では書けないのですか?
if x < y && y < zのように書いてください.なお,Javascriptというプログラミング言語では,
js> 1 < 2 < 3 trueとなるので,一見このような書き方ができるのかと思ってしまいますが,これは罠で,
js> -1 < 0 < 1 falseとなるので,想定したようには動いていないことがわかります.これは (-1 < 0) をまず評価して,true となり,trueを数字と比較する時は1と見なして比較するため,
js> true < 1 falseとなるという仕組みなのですが,エラーになるだけRubyの方がましかもしれません.
while j < w && s[i+j] == p[j]ではダメなのでしょうか?
isrb(main):022:2> 1 isrb(main):023:2> Display all 188 possibilities? (y or n)のような表示が出る.
> Display all *** possibilities? (y or n)と出るので、空白はspaceキーで入れるようにしてください。 文字列+tabを入力すると現在のディレクトリ中でその文字列から始まるファイル名を表示してくれるので、ファイル名を補完したり探したりするのに使えます。 irb起動前でも起動後でも同じ動作をします。
def b(s, x, y) r = s / 2.0 d = distance(x, y, r, r) if d <= r return (r - d) / r else return 1 end end
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「yを返すのはどの条件か?」のように考えて以下のように書いた解答もあった.
def median(x,y,z) if (x>=y && y>=z) || (z>=y && y>=x) y else if (x>=z && z>=y) || (y>=z && z>=x) z else x end end endmedian の回答の際には,「3 つの異なる値x, y, z」とあるように,同じ値が来ることは想定しなくても良いが,多くのプログラムは同じ値が来ても動く.
また,教科書の第5章で整列法(ソーティング)を扱うが,Ruby言語に組み込まれているsort 機能を使った解もあった.これを使うとたとえば,以下のように書ける.
def median(x, y, z) [x, y, z].sort()[1] end
def solutions(a, b, c) if a == 0 if b == 0 if c == 0 -1 else 0 end else 1 end else d = det(a, b, c) if d > 0 2 else if d < 0 0 else 1 end end end enda, b, cがすべての0の時は任意のxが解となるので,個数をどう返すかは迷うが上の例では「個数」としてはありえない整数として-1を返すようにしている.説明を書いた上であれば,文字列"inf"を返す解答でも0を返す解答でも問題ない.
import(Math)を書いたり,別の関数の定義を書く(solutions の定義の中に det の定義を書く)解答もあった.動くことは動くが,関数呼び出しのたびに関数定義をおこなうのは実行速度を落とす原因になるので,Ruby言語ではお勧めしない(他の言語の処理系では実行速度に影響しない場合もある.また,関数定義の中に関数定義を書くことに意味があるケースもあるが,教科書の範囲ではそのような使い方は導入していない).
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 ターミナルの便利な使い方に書いてあるので参考にしてください.
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」にして,改行コードを「LF(UNIX)」にして,ウィンドウを閉じてください.以降は,ファイル作成のさいに,「ファイル」->「新規」->「Ruby」で作成すると正しい改行コードが設定されているはずです.
ruby check.rb ex01.rbと実行すると,関数を与えた時の入力と出力があっていることが確認できます. 詳しくは,補足説明 (練習問題確認プログラムの使い方)を御覧ください.