CoffeeScriptでFizzBuzz書いた

開発したいサービスがあるので、CoffeeScriptを0からこつこつ勉強しています。

わたしのプログラミング歴は、2000年頃にMacromedia DirectorのLingoを少々書いていたのと、2004年頃に半年くらい付け焼刃でJavaScriptとPHPを終電まで書いていたことがあったけれど、文法は9割忘れたぐらいです。

というわけでお勉強がてら、FizzBuzz問題を解いてみました。ロジック考えて文法調べて一行ずつ心をこめて丁寧に作りました。難しかった・・・!

CoffeeScript で書いてみた

# numという配列に1〜100までの数字を入れる
num = [1..100]

# numの配列の数だけforループし、条件に応じてnumの値を入れ替える
# iは配列の値、つまり1〜100
for i in num
  # []内はnumの添え字、0から始まるためiの値から-1して数字を揃える
  num[i-1] = "Fizz" if i % 3 is 0
  # 1回目のループ時、上のコードは num[1] = Fizz if 1 % 3 is 0となる。
  num[i-1] = "Buzz" if i % 5 is 0
  num[i-1] = "FizzBuzz" if i % 3 is 0 and i % 5 is 0

# numの中身をアラート
alert num

結果

CoffeeScriptの可読性のおかげで、見通しの良いコードになったと思います。過剰なコメントを除けば。

仕様通り動くコードは30分くらいで作れたけれども、一言一句なんでそうなるのかをちゃんと調査するのに+1時間くらいかかった感じ。調査の結果、わかったことは全部コメントに書いてあるとおりです。

ハマったポイントは2つ。

  • for文の宣言に何をどう書いていいものかわからなかった
    • iの「どっから出てきたのあなた感」、慣れない・・・
  • 配列の添字が0から始まるのが謎だった
    • i-1とかこのとってつけた感は、かっこ悪すぎやしないか

両方とも、プログラマの皆様的には超当たり前ポイントなのでしょうが、慣れてないといちいちつまづくなあ。書いてみるとよくわかる。あたしゃ何もわかっちゃいねえということが。

そして、上のコードをJSに変換したのがこちら

var i, num, _i, _j, _len, _results;

num = (function() {
  _results = [];
  for (_i = 1; _i <= 100; _i++){ _results.push(_i); }
  return _results;
}).apply(this);

for (_j = 0, _len = num.length; _j < _len; _j++) {
  i = num[_j];
  if (i % 3 === 0) {
    num[i - 1] = "Fizz";
  }
  if (i % 5 === 0) {
    num[i - 1] = "Buzz";
  }
  if (i % 3 === 0 && i % 5 === 0) {
    num[i - 1] = "FizzBuzz";
  }
}

alert(num);

おおお、なんだか複雑になった!! 「for i in num」すら、ひーひー書いた私には、到底書けないコードが出来上がってます。

これを読んでから、CoffeeScriptを読み返すと、とってもシンプル。わたしにもCoffeeScriptなら書けるかもしれない、と思わせてくれるものがあるね。

先が長いけど、がんばろう。

関連記事

前の記事へ

Mac OS X Lion で、makeコマンドないやんけ!という時の対処方法

次の記事へ

タリーズのポットサービスは指定時間に持ってきて&持って帰ってくれてとても素晴らしい