Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2011-01-24

FizzBuzz問題ってこういうことなのかな

01:03

「1から100までの数を出力しなさい。ただし3で割れるときは Fizz、5で割れるときは Buzz、その両方で割れるときは FizzBuzz と出力しなさい。」

という問題。

なんでこんなのがよく話題になるのかなと考えたんだけど、これはこういうことなのかなと思った。


この問題をナイーヴに解いてみる。

function FizzBuzz(n) {
  for (var i = 0; i < n; i++) {
    if (i % 3 === 0) {
      if (i % 5 === 0) {
        print('FizzBuzz');
      } else {
        print('Fizz');
      }
    } else if (i % 5 === 0) {
      print('Buzz');
    } else {
      print(i);
    }
  }
}

FizzBuzz(100);

これの汚いところは、i % 5 === 0 の条件式が2か所に出てきているところ。

では、もし、第二問目として

「1から100までの数を出力しなさい。ただし3で割れるときは Fizz、5で割れるときは Buzz、7で割れるときは Woof、3と5で割れるときは FizzBuzz、3と7で割れるときは FizzWoof、5と7で割れるときは BuzzWoof、その全部で割れるときは FizzBuzzWoof と出力しなさい。」

という問題があったら、

function FizzBuzzWoof(n) {
  for (var i = 0; i < n; i++) {
    if (i % 3 === 0) {
      if (i % 5 === 0) {
        if (i % 7 === 0) {
          print('FizzBuzzWoof');
        } else {
          print('FizzBuzz');
        }
      } else {
        if (i % 7 === 0) {
          print('FizzWoof');
        } else {
          print('Fizz');
        }
      }
    } else if (i % 5 === 0) {
      if (i % 7 === 0) {
        print('BuzzWoof');
      } else {
        print('Buzz');
      }
    } else if (i % 7 === 0) {
      print('Woof');
    } else {
      print(i);
    }
  }
}

FizzBuzzWoof(100);

なんて書くか。

もし次の問題が FizzBuzzBangWoof だったら…


こうなったときにコードの増加が O(N) より大きかったら失格だよね。


なんて考えながら

for(i=0;++i<101;)print((i%3?'':'Fizz')+(i%5?'':'Buzz')||i)

とか書いてみました。58bytes。

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20110124
 |