関西Ruby会議04で初級者向けレッスンやってきた

2011年11月11日(金)・12日(土)に関西Ruby会議04が開催された。

「会議」という感じではないが、KOF (関西オープンソース2011)というイベントの会場で開催されるということもあり、新人Rubyistを勧誘 (洗脳?) すべく初級者向けレッスンも開催した。*1

レッスン内容

  • Rubyとは?
    • 余計な記述が少なく仕事に集中できる (LL)
    • すべてがオブジェクト (OO)
  • irb の使い方
  • るりまの使い方

大クラス主義、オープンクラス、ダック・タイピングなんかも話したかったけど、時間の都合で割愛した。

課題

初心者が対象なので FizzBuzz を出題した。

解答例1

まず一般的な回答例

(1..30).each do |i|
  case
  when i % 15 == 0 then puts "FizzBuzz"
  when i %  5 == 0 then puts "Buzz"
  when i %  3 == 0 then puts "Fizz"
  else                  puts i
  end
end
解答例2

TAをしてくれたアジャイルかわばたさんがワンライナーで書きたいと言って、その場で書いたもの。*2

(1..30).each{|i|puts i%15==0? "FizzBuzz": i%3==0? "Fizz": i%5==0? "Buzz" : i}


以下むりやり考えた逸般的な解答例。

解答例3

0 から 30 までの文字列の配列を用意して、3の倍数と 5の倍数を潰す。

a = [*"0".."30"]
3.step(30, 3){|i|a[i].sub!(/\d*$/, "Fizz")}
5.step(30, 5){|i|a[i].sub!(/\d*$/, "Buzz")}
puts a[1..-1]
  • "0".. なので添字と内容が一致する
  • \d* なので数字がなくてもマッチ
  • $ なので末尾にマッチ
  • 1.. なので "0" は表示しない
解答例4

ググッて見つけたのをちょっと改造。

puts (1..30).map{|i|[[i, "Fizz"], ["Buzz", "FizzBuzz"]][i%5==0?1:0][i%3==0?1:0]}

5の倍数でないとき、あるときの配列に、3の倍数でないとき、あるときの配列が入っている。

*1:Rubyをよく知らない人も多く集まる会場なので、初級者向けレッスンの伝統をやぶって初心者を対象にした。

*2:彼は英語キーボードに不慣れらしくtypoの連続で、まるでダメプログラマかのように見えた。