Javaで制限つきのFizzBuzz問題を解いてみる


何をするか

Qiitaのアカウントを作成したものの、何も書いていなかったので
記事投稿の練習も兼ねて枯れるほど語り尽くされているFizzBuzz問題をJavaで解いてみる。
そのまま普通に解いたのでは、本当に意味のないものになってしまうので、
今回は以下のルールに従って作ってみた。

条件分岐なし

String[] fizz = new String[]{"Fizz", " ", " "}; // index 1~2には半角スペースが入ってます
String[] buzz = new String[]{"Buzz", " ", " ", " ", " "}; // index 1~4には半角スペースが入ってます

for (int i = 1; i <= 100; i++) {
    System.out.println((fizz[i % 3] + buzz[i % 5]).replaceAll("^\\s+$", String.valueOf(i)).trim());
}

3, 5, 15で割り切れるときは0、それ以外1って言う処理を書ければ空白文字列が入っているところスッキリさせられるんだけど
思い浮かばなかった・・・

除算と余剰算なし

int fizzCounter = 0;
int buzzCounter = 0;

for (int i = 1; i <= 100; i++) {
    fizzCounter++;
    buzzCounter++;
    if (fizzCounter != 3 && buzzCounter != 5) {
        System.out.print(i);
    }
    if (fizzCounter == 3) {
        System.out.print("Fizz");
        fizzCounter = 0;
    }
    if (buzzCounter == 5) {
        System.out.print("Buzz");
        buzzCounter = 0;
    }
    System.out.println();
}

15進数にして最後の桁を見たほうが早いでしょって話なんだけど、僕にはそういう難しい話はわかりません

繰り返し文なし

public static void main(String[] args) {
    printFizzBuzz(1);
}

static void printFizzBuzz(int num) {
    if (num % 15 == 0) {
        System.out.println("FizzBuzz");
    } else if (num % 3 == 0) {
        System.out.println("Fizz");
    } else if (num % 5 == 0) {
        System.out.println("Buzz");
    } else {
        System.out.println(num);
    }

    if (num < 100) {
        printFizzBuzz(num + 1);
    } else {
        return;
    }
}

どんなに語り尽くされていて、どんなに効率的でスマートな書き方が出回っていても、
自分が思いつくロジックで実際に書き起こして動かしてみるのってすごい大事だと思うの。