今期の大学の講義でRubyが使われるとのことなので、事前練習として久しぶりにRubyを触ってみました。
FizzBuzzを書きました。
FizzBuzz とは
Fizz-Buzz問題については下記を参照してください。
- プログラマーの基本的な素養をみるための、ごく簡単な問題。Fizz-Buzz問題の例はこんな感じだ。 1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合.. 続きを読む
- どうしてプログラマに・・・プログラムが書けないのか? www.aoky.net
- このキーワードを含むブログを見る
このページには「1から100までの数をプリントするプログラムを書け。」とあるけれど、
この部分は置いておいて、今回は「ある数についてFizz
、Buzz
、FizzBuzz
のどれなのかを判定して返すプログラムを書け。どれでもなければ数をそのまま返せ」と読み替えました。
任意の数について判定する関数fizzbuzz()さえ書ければ、for
文で
for n in 1..100 do puts fizzbuzz(n); end
とすることができます。
C言語ライク(?)な書き方
引数に与えられた整数のFizzBuzz判定する関数を最もシンプルな方法で書いてみます。
def fizzbuzz (n) if (n % 15 == 0) then "FizzBuzz"; elsif (n % 3 == 0) then "Fizz"; elsif (n % 5 == 0) then "Buzz"; else n; end end
これで十分動きますが、せっかくRubyで書いているので、オブジェクト指向を意識して書き直してみたいと思います。
Rubyでは整数3
や20
などもオブジェクトです。これらが何のクラスのインスタンスであるかは
3.class()
を実行すればわかり、Fixnum
と返ってきます。これは整数のクラスを意味します。
直接聞いてみる
ここでは、Fixnumクラスにインスタンスメソッドfizzbuzz()
を追加してみます。整数クラスにfizzbuzzの動作を定義しておくことで、
このクラスを基に生成された整数3
や20
などに直接問いかけて答えをもらうことができるようになります。オブジェクト指向ですね。
$ irb
での実行例は、
3.fizzbuzz() => Fizz 20.fizzbuzz() => Buzz (15 * 17).fizzbuzz() => FizzBuzz
のような感じです。コードは下記の通りです。self
を使うと「問いかけられている数」が得られます。
class Fixnum def fizzbuzz if (self % 15 == 0) then "FizzBuzz"; elsif (self % 3 == 0) then "Fizz"; elsif (self % 5 == 0) then "Buzz"; else self; end end end
ちなみに、この場合の1 ~ 100までのfizzbuzz判定は、
(1..100).to_a.each {|n| puts n.fizzbuzz()};
のように書くことができます。