FizzBuzz問題をRubyで書くと

FizzBuzz問題とはこれ。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

Step1
vi fizzbuzz.rbして以下を記述する。100.eachはさすがに通らなかった。iだけだと0から99表示になるのでi+1する。

100.times do |i|
 puts i+1
end

ruby fizzbuzz.rbを実行すると1〜99が表示される。

完成した。

#vi fizzbuzz.rb
100.times do |i|
  i += 1
  if i % 3 == 0 and i % 5 == 0
    puts "FizzBuzz"
  elsif i % 3 == 0
    puts "Fizz"
  elsif i % 5 == 0
    puts "Buzz"
  else 
    puts i
  end
end

が、仕様は満たしているが気に入らない。重複が多い。putsが何回も出てくるしi+=1とかダサい…。@ikmさんにしたがってちょっと直した。次はif文をどうにかしたいね。

#vi fizzbuzz.rb
1.upto 100 do |i|
  t = ""
  if i % 3 == 0 and i % 5 == 0
    t += "FizzBuzz\n"
  elsif i % 3 == 0
    t += "Fizz\n"
  elsif i % 5 == 0
    t += "Buzz\n"
  else
    t += "#{i}\n"
  end
  puts t
end

RailsのViewで奇数・偶数の表示制御

何回調べても忘れるのでメモ。テーブルの行毎に背景を変えたい場合の制御方法。

Railsではcycleというhelperメソッドが用意されている。
http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-cycle

@items = [1,2,3,4]
<table>
  <% @items.each do |item| -%>
  <tr class="<%= cycle("even", "odd") -%>">
    <td>item</td>
  </tr>
  <% end -%>
</table>

で出力が

<table>
  <tr class="odd">
    <td>1</td>
  </tr>
  <tr class="even">
    <td>2</td>
  </tr>
  <tr class="odd">
    <td>3</td>
  </tr>
  <tr class="even">
    <td>4</td>
  </tr>
</table>