第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ってこういう記述が普通というか一般的なのかな?教えてエロい人!