rubyでFizzBuzz書いてみた

rubyってやつは記号が多いですね。。。
演算子かと思ったらメソッドだったりするし。なかなか慣れる事が出来てません。fizzbuzzすらも書けない・・・。
仕方がないのでirbを使って特訓しました。本とwebを見ながらひたすらirbで記号を中心にサンプル書いて動かすだけ。
で、そこまでやって、ようやくfizzbuzz壱号が書けました。

def fizzbuzz(n)
  
  for i in 1..n
    if i % 15 == 0 then
      p "fizzbuzz #{i} "
    elsif i % 5 == 0 then
      p "buzz  #{i} "
    elsif i % 3 == 0 then
      p "fizz #{i}"
    else
      p i
    end
  end
end
p fizzbuzz(100)


これを実行すると、1〜100まででfizzbuzzします。
実行結果は以下。

1
2
"fizz 3"
4
"buzz  5 "
"fizz 6"
7
8
"fizz 9"
"buzz  10 "
11
"fizz 12"
13
14
"fizzbuzz 15 "
16
17
"fizz 18"
19
"buzz  20 "
"fizz 21"
22
23
"fizz 24"
"buzz  25 "
26
"fizz 27"
28
29
"fizzbuzz 30 "
31
32
"fizz 33"
34
"buzz  35 "
"fizz 36"
37
38
"fizz 39"
"buzz  40 "
41
"fizz 42"
43
44
"fizzbuzz 45 "
46
47
"fizz 48"
49
"buzz  50 "
"fizz 51"
52
53
"fizz 54"
"buzz  55 "
56
"fizz 57"
58
59
"fizzbuzz 60 "
61
62
"fizz 63"
64
"buzz  65 "
"fizz 66"
67
68
"fizz 69"
"buzz  70 "
71
"fizz 72"
73
74
"fizzbuzz 75 "
76
77
"fizz 78"
79
"buzz  80 "
"fizz 81"
82
83
"fizz 84"
"buzz  85 "
86
"fizz 87"
88
89
"fizzbuzz 90 "
91
92
"fizz 93"
94
"buzz  95 "
"fizz 96"
97
98
"fizz 99"
"buzz  100 "
1..100
Complete(0)

"" がついてるのが気持ち悪いしロジックも洗練されてないけど、やっとこさ自分でイチから書けたので晒します。

ちなみに、irbでやってた特訓の結果は以下です。
楽器で言うところの運指の練習とかオルタネイトピッキングの練習みたいなもんですかね。

Microsoft Windows [Version 6.0.6002]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

C:\Users\mitsuo>p(!true)
'p' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\mitsuo>
C:\Users\mitsuo>
C:\Users\mitsuo>irb
irb(main):001:0> p(!true)
false
=> nil
irb(main):002:0> p(!false)
true
=> nil
irb(main):003:0>
irb(main):004:0* p(!1=2)
SyntaxError: compile error
(irb):4: syntax error, unexpected '=', expecting ')'
p(!1=2)
     ^
        from (irb):4
irb(main):005:0> p(!2)
false
=> nil
irb(main):006:0> (!0)
=> false
irb(main):007:0> (!1)
=> false
irb(main):008:0>
irb(main):009:0*
irb(main):010:0* p(3!=5)
true
=> nil
irb(main):011:0>
irb(main):012:0* p(3!=3)
false
=> nil
irb(main):013:0>
irb(main):014:0* /xxx/ !~ yyy
NameError: undefined local variable or method `yyy' for main:Object
        from (irb):14
irb(main):015:0>
irb(main):016:0* /"aaaa"/ !~ "bb"
=> true
irb(main):017:0>
irb(main):018:0* /"aaaa"/ !~ "aaaa"
=> true
irb(main):019:0>
irb(main):020:0* /"aaaa"/ !~ "aaa"
=> true
irb(main):021:0> /"aaaa"/ !~ "aaaaaaa"
=> true
irb(main):022:0> p('%04b%04b' % [3, ~3]
irb(main):023:1> )
"00111100"
=> nil
irb(main):024:0> /'aaaa'/ =~ 'bbb'
=> nil
irb(main):025:0>
irb(main):026:0* /'aaaa'/ =~ 'aaaa'
=> nil
irb(main):027:0>
irb(main):028:0*
irb(main):029:0* p(?a)
97
=> nil
irb(main):030:0> p(?a)  #=>97
97
=> nil
irb(main):031:0>
irb(main):032:0* def aa?
irb(main):033:1>   return false
irb(main):034:1> end
=> nil
irb(main):035:0>
irb(main):036:0* p aa?
false
=> nil
irb(main):037:0>
irb(main):038:0* def ab?
irb(main):039:1>   (1 != 2) ? p(false) : true
irb(main):040:1> end
=> nil
irb(main):041:0>
irb(main):042:0* p ab?
false
nil
=> nil
irb(main):043:0>
irb(main):044:0*
irb(main):045:0*
irb(main):046:0* p ("a is #{a}")
NameError: undefined local variable or method `a' for main:Object
        from (irb):46
        from :0
irb(main):047:0>
irb(main):048:0*
irb(main):049:0*
irb(main):050:0* class  C
irb(main):051:1>   def foo
irb(main):052:2>     @foo
irb(main):053:2>   end
irb(main):054:1>   def foo=( v )
irb(main):055:2>     @foo = v
irb(main):056:2>   end
irb(main):057:1> end
=> nil
irb(main):058:0>
irb(main):059:0* c = C.new
=> #<C:0x42fd024>
irb(main):060:0> c.foo  = 5
=> 5
irb(main):061:0>
irb(main):062:0* p c.foo
5
=> nil
irb(main):063:0>
irb(main):064:0*
irb(main):065:0* class C
irb(main):066:1>   attr :foo,true
irb(main):067:1> end
=> nil
irb(main):068:0>
irb(main):069:0* c = C.new
=> #<C:0x42ed930>
irb(main):070:0> c.foo = 4
=> 4
irb(main):071:0> p c.foo
4
=> nil
irb(main):072:0> foo = bar
NameError: undefined local variable or method `bar' for main:Object
        from (irb):72
        from :0
irb(main):073:0> foo[0] = bar
NameError: undefined local variable or method `bar' for main:Object
        from (irb):73
        from :0
irb(main):074:0>
irb(main):075:0* foo.bar = baz
NameError: undefined local variable or method `baz' for main:Object
        from (irb):75
        from :0
irb(main):076:0>
irb(main):077:0*
irb(main):078:0*
irb(main):079:0*
irb(main):080:0*
irb(main):081:0* class C
irb(main):082:1>   def initialize
irb(main):083:2>     @ary = [0,1,2,3,4,5,6,7]
irb(main):084:2>   end
irb(main):085:1>   def [](i)
irb(main):086:2>     @ary[i*2]
irb(main):087:2>   end
irb(main):088:1>   def []=(i,v)
irb(main):089:2>     @ary[i*2] = v
irb(main):090:2>   end
irb(main):091:1> end
=> nil
irb(main):092:0>
irb(main):093:0* c = C.new
=> #<C:0x42c6bdc @ary=[0, 1, 2, 3, 4, 5, 6, 7]>
irb(main):094:0>
irb(main):095:0* p c[3]
6
=> nil
irb(main):096:0>
irb(main):097:0* p c[3]  = 1
1
=> nil
irb(main):098:0>
irb(main):099:0*
irb(main):100:0* a = 10
=> 10
irb(main):101:0> p"a is #{a}"
"a is 10"
=> nil
irb(main):102:0>
irb(main):103:0*
irb(main):104:0* p(10%3)
1
=> nil
irb(main):105:0>
irb(main):106:0* p(20%3)
2
=> nil
irb(main):107:0>
irb(main):108:0* p("%05d" % 10)
"00010"
=> nil
irb(main):109:0>
irb(main):110:0*
irb(main):111:0* p %r{/etc/httpd/logs$}
/\/etc\/httpd\/logs$/
=> nil
irb(main):112:0>
irb(main):113:0* p %w{foo bar baz}
["foo", "bar", "baz"]
=> nil
irb(main):114:0>
irb(main):115:0*
irb(main):116:0* p %!nomad!
"nomad"
=> nil
irb(main):117:0>
irb(main):118:0*
irb(main):119:0*
irb(main):120:0* p (3&5)
1
=> nil
irb(main):121:0>
irb(main):122:0*
irb(main):123:0* i =3
=> 3
irb(main):124:0> p (i &=3)
3
=> nil
irb(main):125:0> p (i &=3)
3
=> nil
irb(main):126:0> p (i &=3)
3
=> nil
irb(main):127:0> p (i &=2)
2
=> nil
irb(main):128:0> p i
2
=> nil
irb(main):129:0>
irb(main):130:0*
irb(main):131:0*
irb(main):132:0*
irb(main):133:0*
irb(main):134:0*
irb(main):135:0* p(3 && 4)
4
=> nil
irb(main):136:0> p(3 | 5)
7
=> nil
irb(main):137:0>
irb(main):138:0* p(3 || 5)
3
=> nil
irb(main):139:0>
irb(main):140:0*
irb(main):141:0* a ||= :some
=> 10
irb(main):142:0>
irb(main):143:0* p a
10
=> nil
irb(main):144:0> a ||= :sec
=> 10
irb(main):145:0> p a
10
=> nil
irb(main):146:0>
irb(main):147:0*
irb(main):148:0*
irb(main):149:0*
irb(main):150:0*
irb(main):151:0*
irb(main):152:0*
irb(main):153:0*  def fizzbuzz(n)
irb(main):154:1>   1.upto(n) do |i|
irb(main):155:2*     if i%3==0 then
irb(main):156:3*       p "fizz : #{i}"
irb(main):157:3>     else i% 5 ==0 then
irb(main):158:3*       p "buzz : #{i}"
irb(main):159:3>     end
irb(main):160:2>   end
irb(main):161:1> end
SyntaxError: compile error
(irb):157: syntax error, unexpected kTHEN, expecting kEND
        from (irb):161
        from :0
irb(main):162:0>
irb(main):163:0* exit

C:\Users\mitsuo>

書いてて思ったけど、俺が楽器上達したのはバンドやってからだったなー。基礎練習だけやってたから上達したんじゃなくて、実践と同時に基礎を学んでたからかな。
楽器とか音楽とプログラミングの上達の仕方って非常に似てると思います。
俺のプログラミングの上達の仕方が楽器と同じだとすると、具体的なモノをコピーして動かしたりしながら基礎を学んだ方がよさそうだ。
繰り返しと制御構造とメソッドの使い方がなんとなくわかってきたので、以降はサンプルコードを読んでは動かし、壊しては作り・・・を繰り返そうと思います。ちょうどコピーバンドやってるような感じ。



しかしirb楽しいなぁ。
最近は、仕事でちょっとした計算するとき、電卓使わないでirbで計算しています。計算の過程も残るし、コピペも楽だし。