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で計算しています。計算の過程も残るし、コピペも楽だし。