2012年8月8日水曜日

FizzBuzzってなんだよ。

FizzBuzzってなんぞやと思ったら、世界のナベアツみたいなやつだった。

http://ja.wikipedia.org/wiki/Fizz_Buzz

3で割り切れたら Fizz で、5で割り切れたら Buzz で、どっちでも割れたら FizzBuzz なんだとさ。
出来るだけ短くプログラムを書くのが楽しいらしい。

業務プログラマがFizzBuzz書いたらどうなるか
https://gist.github.com/3292173 

が面白かった。ガッチガチやぞっ!って感じ。

で、なんかとりあえず考えてみた。 Javascriptですけども。

var fizzbuzz = function(num){
    if(typeof(num) !== "number"){return "not a number";}
    if(num < 1){return "input 0 upper";}
    return (!(num % 15) ? "fizzbuzz" : (!(num % 3) ? "fizz" : (!(num % 5) ? "buzz" : num)));
};
 

for(var i = 0;i < 31;++ i){
    alert(fizzbuzz(i));
}


長ぇな。
最初の方の例外処理みたいなの無ければ

var fizzbuzz = function(num){
    return (!(num % 15) ? "fizzbuzz" : (!(num % 3) ? "fizz" : (!(num % 5) ? "buzz" : num)));
};

 
だけでおっけーだけど、 なんか、メンテナンスし辛いよなこれでは。

var fizzbuzz = function(num){
    if(typeof(num) !== "number"){return "not a number";}
    if(num < 1){return "input 0 upper";}
    var fizz = 3,buzz = 5;
    return (!(num % (fizz * buzz)) ? "fizzbuzz" : (!(num % fizz) ? "fizz" : (!(num % buzz) ? "buzz" : num)));
};


これで fizz と buzz の条件が変わってもOKだよねっ!
いやいや、それだったら、

var fizzbuzz = function(num,fizz,buzz){
    if(typeof(num) !== "number"){return "not a number";}
    if(num < 1){return "input 0 upper";}
    return (!(num % (fizz * buzz)) ? "fizzbuzz" : (!(num % fizz) ? "fizz" : (!(num % buzz) ? "buzz" : num)));
};

var fizz = 3,buzz = 5;
for(var i = 0;i < 31;++ i){
    alert(fizzbuzz(i,fizz,buzz));
}


こっちのほうがいいよなぁ。うん。
FizzBuzzっていうゲームなんだから、ルールは関数の外で変わるんだから、こっちのほうが正しい。

グローバルが汚くても良いんなら、

i=0;while(i<31){alert(!(i%15)?"fizzbuzz":!(i%3)?"fizz":!(i%5)?"buzz":i);++i;}

こんな感じじゃね?使いまわせねーし読み辛いけど。78文字くらい。
もっと短くなるんだろうなぁ。凡人はこんなレベルです。

phpでFizzBuzz最短56Byte
http://d.hatena.ne.jp/milieu/20100204/1265305089

PHPだけど、こっちのが短い。
なるほど、割り切れたらベースじゃないほうが結果として短くなるのか。

i=0;while(i<31){alert(i%15?i%5?i%3?i:"fizz":"buzz":"fizzbuzz");++i;}

これで 69文字か。

0 件のコメント:

コメントを投稿