10の練習問題をやってみよう

新しくプログラミング言語を覚えたいときに行うべき10の練習問題
実際にやってみます。最後までいけるかわかんないけど。

準備

RubyForgeからRubyインストーラをダウンロードしてインストール。
別ウィンドウでリファレンスマニュアルを開いておく。
準備完了!

第一問

なんらかの文字列を無限で表示する(例:俺って天才!)。← 良く考えると危険だから「なんらかのカウントアップメッセージを1から100まで出すけど、3のときだけアホになる!(例:1万円!2万円!しゃ〜ん万円!とか)」に変更。

なんてこった!こないだやったばっかりの課題じゃないか!パス!
http://code.nanigac.com/source/view/429

第二問

現在時刻にあわせてやる気のでるメッセージを出力(例:もうすぐランチ!がんばれ!)。

現在の時刻を取得するにはどうすればいいんだ?!マニュアルを見よう。組み込みクラスの一覧で「Date」を検索。該当なし!わぉ、なんてこったい。くじけずに「Time」で検索。あった!ひゃっほう!
Timeクラスをirbで確認

irb(main):005:0> Time
=> Time
irb(main):006:0> Time.new
=> Sat Feb 09 22:06:11 +0900 2008
irb(main):007:0> Time.now
=> Sat Feb 09 22:06:13 +0900 2008

newとnowの動きが一緒だ!つづりも似てる。面白い!
メソッド一覧で「○○時」の部分だけ数値で取得できるようなものがないか探す。あった!「hour」メソッド。こいつを使おう。

irb(main):008:0> Time.hour
NoMethodError: undefined method `hour' for Time:Class
        from (irb):8

ダメだった。オブジェクトを作らないとダメなのか。

irb(main):009:0> Time.now.hour
=> 22

よっしゃ!取得できた!「now」にするか「new」にするかで逡巡した。時計を確認する。間違いなく22時。イヤ待て。まだ心を許してはイカン。もしかしたらこいつは文字列かも知れないし、もっと得体の知れない何かかもしれない。irbの出力だけで信用するわけにはいかないのだ。

irb(main):010:0> Time.now.hour.class
=> Fixnum

ああ、疑ってゴメンナサイ。あなたは紛れもなくtwenty-twoでした。こいつをif文にかけて24通りのメッセージを出力すればいいんだ。でも待てよ・・・。「if」より「switch」の方がモテそうな気がする。スイッチといえば来週は月曜日が祝日だからジャンプが発売してるんじゃないか!これ終わったら買ってこよう。
というわけでマニュアルを確認。多分制御構造のところだろう。アレ?!「switch」がないぞ。あ、Rubyでは「case」っていうのか。例文が載っていたので、さっそくまるごとコピーしてくる。

case $age
when 0 .. 2
  "baby"
when 3 .. 6
  "little child"
when 7 .. 12
  "child"
when 13 .. 18
  "youth"
else
  "adult"
end

こっ・・これは奇ッ怪な。
なぜwhenのところにRangeのオブジェクトがあるんだ?あ、下に説明がある。説明を読もう。・・・説明を読んでも分からなかった。Rangeだけ特別扱いなのかな?配列変数に「*」をつけて展開するのとは違うよなあ。「case」文はRangeオブジェクトだけをエコヒイキしてるのかな。ひいきだひいきだ。不公平だ。たしかに「case文とかif文で範囲指定できたらいいなあ」と思ったことは何度もあるので、この機能はとても便利だなあと思うけど、なんだか釈然としない。私のような融通の利かないJavaプログラマは頭を抱えてしまう。まぁいいか。

case Time.now.hour
when 18
  print "もうすぐエコノミータイム。急げ!\n"
when 19 .. 23, 0
  print "エコノミータイムです。今のうちに睡眠をとりましょう\n"
when 1
  print "もうすぐエコノミータイム終わり。起きろ!\n"
else
  print "ただいまニコニコ中・・・\n"
end

できたー!

第三問

複数の数値を入力させ、昇順に並び替え、最大値と最小値を出す(例:同僚の体重を入力して計算)。

ユーザーからの入力を受け取る問題だ。標準入力とか呼ばれているアレだな。Javaの場合だと「System.in」っていう入力ストリームから文字列リーダーを作って、文字列を数値に変換して、色んな例外を捕まえて、LLの人たちから「長い」と罵られたら出来上がりだ。Rubyではどうやるんだろう。組み込みクラスの一覧を見たら「IO」っていうクラスがあった。おぉ、これだ、間違いない。「標準」でページ内を検索。パイプがどうこうっていうのが出てきた。うーん。よくわからない。
よくわからなかったので定数の一覧を見たら「STDIN」っていう定数を見つけた。これだ!!

irb(main):032:0> io = IO.open STDIN
TypeError: can't convert IO into Integer
        from (irb):32:in `initialize'
        from (irb):32:in `open'
        from (irb):32

ダメだった・・・無念。今日はここまで。