Web系のこととかー。

第2回目のRubyプログラミング練習問題。今回は有名な「FizzBuzz問題」。

プログラミング練習問題2「FizzBuzz」

ルールは以下の通り
1から順番に数を表示する
その数が3で割り切れるなら”Fizz”、5で割り切れるなら”Buzz”、両方で割り切れるなら”FizzBuzz”と表示する
要するに”1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz ・・・”と出力される

回答

#!/usr/bin/ruby

1.upto(100) do |i|
    if  i % 3 == 0 && i % 5 == 0
        puts 'FizzBuzz '
    elsif i % 3 == 0
        puts 'Fizz '
    elsif i % 5 == 0
        puts 'Buzz '
    else
        puts i.to_s + " "
    end
end

実行結果
$./2_1.rb
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...

Ruby初心者な僕はこんな単純な条件分岐…。うーん。もっとスマートにできるはず。

解答例

#!/usr/bin/ruby

def fizz_buzz(n)
  ret = "#{["Fizz"][n % 3]}#{["Buzz"][n % 5]}"
  ret.empty? ? n.to_s : ret
end

puts (1..100).collect{|n| fizz_buzz n }

上記ページに載っている解答例はこんな感じ。

ret = "#{["Fizz"][n % 3]}#{["Buzz"][n % 5]}"

これなんだよ!って、調べてみたら配列の省略形?っぽいもの。つまり、これを書きなおすと

a = ["Fizz"]
b = ["Buzz"]
ret = "#{a[n % 3]}#{b[n % 5]}"

ってこと。
Rubyってこういう記述が普通というか一般的なのかな?教えてエロい人!

§105 · 2月 3, 2010 · プログラミング_Ruby · · [Print]

Leave a Reply