Oct 29, 2008 - ActionScript 3.0

いまさらナベアツ問題に取り組んでみた。

プログラムがちょっとかけるようになったときに練習問題として取り組むFizzBuzz問題というものがある。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」を数の代わりに発言しなければならない。発言を間違えた者やためらった者は脱落となる。

これをプログラムで表現するというもので、意外とやってみると面白いんだよね。

実はこれとよく似た問題でちょっと前に流行ったのがNabeAtsu問題。
「3の倍数と3のつく数字だけアホになります」というあれが正にFizzBuzzと似てる。

ナベアツが盛り上がりだした頃にtrick7さんもこのNabeAtsu問題をやっていて、これで時計を作ってました。
すげーかわいくて好きだったんですが、残念ながら肖像権とかの関係で消されてしまいました。
trick7.com blog: 世界のナベアツXXXXXXX時計

んで、ちょうど会社の三谷くんが誕生日だったんで、3の倍数でアホになり、3のつく数字でミタニ〜と声がするFlashを作った。
まあ、これが昨日つくったやつです。

突然さっき、時間がなくて端折った部分がわかったのでメモ。
というのもFizzBuzzとNabeAtsuの決定的に違う部分は「nの倍数、mの倍数」でなく「nの倍数、mの付く数字」という点。
3の付く数字がめちゃくちゃだった。以下の処理。

  • 10で割って3余るのが3の付く数字。
  • 30台 if(i >=30 && i < 40)

となんかややこしく考えすぎたし、ぜんぜんプログラムって感じしない。
40までならなんとかなるけど130とかではやくも破綻するし、超気持ち悪い。

で、さっき思いついたのは正規表現使えば簡単だということ。(indexOfでもいいくらい。)
つまり人間と同じ考え方。3が付けばOKなんだから、文字に3があればいいわけだ。 AS3で正規表現が使えるということでトライしてみたら、JSと一緒。
得してるなーなんて思ったり。

で、リベンジ後のnabeAtsuソース

package {
    import flash.display.*;
    public class Main extends Sprite {
        public function Main () :void {
            nabeAtsu(40, 3, 3);
        }
        /**
         * NabeAtsu
         * maxNum:int   いくつまで数えるか
         * nabe:int     nの倍数
         * atsu:int     nのつく数字
         */
        private function nabeAtsu (maxNum:int, nabe:int, atsu:int) {
            for(var i:int = 1; i <= maxNum; i++ ){
                var retStr:String = "";
                var reg:RegExp = new RegExp(atsu.toString());

                if(i%nabe == 0){
                    retStr += "Nabe";
                }
                if(reg.test(i.toString())){
                    retStr += "Atsu";
                }
                trace((retStr != "" ? retStr : i));
            }
        };
    }
}

ま、こんなかんじかね。
いい頭の体操になりました。

ほんとは、作ったやつをアップしたいんですが、ウチワネタな上、 最高に不快なアホボイズが入っているので自粛します。
まあ、実はボイスを1音1音録音するのが一番大変だったんですがね。
深夜にアホ声を録音してる自分をほめてあげたい。

そして、本人には気に入ってもらいましたv
これが一番うれしいね!