アーシの毎日インプット

毎日1つ以上学習する。学習した内容を公開する。を目標に自分のスキルアップを目指します。

FizzBuzz問題と拡張性①

スポンサードリンク

FizzBuzz問題って知っていますか?

 

プログラミングに携わったことのある方なら聞いたことがある方も多いと思います。

 

そんなFizzBuzz問題、概要としては下記です。

==========

1から順に自然数を加算していって、

・3で割り切れる時はFizzを表示
・5で割りけれる時はBuzzを表示
・3でも5でも割り切れる時はFizzBuzzを表示
・その他は数字をそのまま表示

==========

 

<ここから先のプログラミング部分はJavaで書きます>

 

問題の意図としては下記のように固定の文字列で書くのではなく、

==========

System.out.println("1");
System.out.println("2");
System.out.println("Fizz");
System.out.println("4");
System.out.println("Buzz");
System.out.println("Fizz");
System.out.println("7");
System.out.println("8");
System.out.println("Fizz");
System.out.println("Buzz");
System.out.println("11");
System.out.println("Fizz");
System.out.println("13");
System.out.println("14");
System.out.println("FizzBuzz");
System.out.println("16");
System.out.println("17");
System.out.println("Fizz");
System.out.println("19");
System.out.println("Buzz");

==========

 

下記のようにfor文と条件分岐を使うと上手くいきますよっていう問題です。

==========

for (int i = 1; i <= 20; i++) {
    if (i % 3 == 0 && i % 5 == 0) {
        // 3の倍数かつ5の倍数
        System.out.println("FizzBuzz");
    } else if (i % 3 == 0) {
        System.out.println("Fizz");
    } else if (i % 5 == 0) {
        System.out.println("Buzz");
    } else {
        // 3の倍数でも5の倍数でもない場合、数字をそのまま表示
        System.out.println(i);
    }
}

==========

 

特に、繰り返し回数iの部分はfor文を使った時の方がはるかに柔軟性・拡張性があることが分かると思います。

 

しかし、ある程度プログラミング経験がある私が久しぶりにFizzBuzz問題を見た時に気付いてしまったのです。

 

これ縦方向(繰り返し回数)への拡張性はあるけど、横方向(条件)への拡張性が足りないのではないかと・・・

 

例えば、7の倍数の時Pazz、11の倍数の時Wezz、それぞれの組み合わせの時にそれぞれの文字列を繋げて出力したいという形で拡張したいとき、

 例:105であればFizzBuzzPazz

 

この記法だとif文の条件文がすごく複雑になるんですよね。

 

この部分を改善するにはどのようにプログラムを書けばいいのか、プログラミングを学び始めたばかりの人に考えて解いて欲しいなと思いました。

 

解答については後日改めて記事を投稿します。

 

お楽しみに

【アーシの原点】

【頭を鍛える迷路集】


スポンサードリンク