関西Ruby会議04で初級者向けレッスンやってきた
2011年11月11日(金)・12日(土)に関西Ruby会議04が開催された。
「会議」という感じではないが、KOF (関西オープンソース2011)というイベントの会場で開催されるということもあり、新人Rubyistを勧誘 (洗脳?) すべく初級者向けレッスンも開催した。*1
レッスン内容
大クラス主義、オープンクラス、ダック・タイピングなんかも話したかったけど、時間の都合で割愛した。
課題
初心者が対象なので 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の倍数でないとき、あるときの配列が入っている。