#daiizメモ

Cosenseに夢中

RubyでFizzBuzz

今期の大学の講義でRubyが使われるとのことなので、事前練習として久しぶりにRubyを触ってみました。

FizzBuzzを書きました。

FizzBuzz とは

Fizz-Buzz問題については下記を参照してください。

Fizz-Buzz問題とは編集

このページには「1から100までの数をプリントするプログラムを書け。」とあるけれど、 この部分は置いておいて、今回は「ある数についてFizzBuzzFizzBuzzのどれなのかを判定して返すプログラムを書け。どれでもなければ数をそのまま返せ」と読み替えました。

任意の数について判定する関数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では整数320などもオブジェクトです。これらが何のクラスのインスタンスであるかは

3.class()

を実行すればわかり、Fixnumと返ってきます。これは整数のクラスを意味します。

直接聞いてみる

ここでは、Fixnumクラスにインスタンスメソッドfizzbuzz()を追加してみます。整数クラスにfizzbuzzの動作を定義しておくことで、 このクラスを基に生成された整数320などに直接問いかけて答えをもらうことができるようになります。オブジェクト指向ですね。 $ 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()};

のように書くことができます。