fizzbuzz 問題の coding

さて、fizzbuzz について少し気になったので、更に深く掘り下げてみますわ。

Python の場合は Wikipedia に載っているとおりなので。
https://ja.wikipedia.org/wiki/Fizz_Buzz#FizzBuzz%E5%95%8F%E9%A1%8C

Java でとりあえず一行で表現するのにチャレンジしてみました。1 から 100 までの自然数に対し順番に、コンピュータが数や fizz, buzz, fizzbuzz を独唱していくだけのプログラムです。

class fizzbuzz{
    public static void main(String[] args){
        for (int i = 1; i <= 100; i++)
            System.out.println((i % 15 == 0) ? "fizzbuzz" : ((i % 5 == 0) ? "buzz" : (i % 3 == 0) ? "fizz" : i));
    }
}

ここで利用しているのが、条件演算子と呼ばれる三項演算子で以下のように記述されます。それを更に入れ子にしているわけです。Java だけではなく C にも同じかたちで存在します。

(条件)?(条件が真の場合の値):(条件が偽の場合の値)

Excel や Google スプレッドシート での IF 関数に似ていますね。以下のようなものです。

=IF(条件, 条件が真の場合の値, 条件が偽の場合の値)

これについて、具体例を挙げるとすれば、テストの得点 score が100点の場合に「満点」、80点以上の場合に「合格」、80点未満の場合に「不合格」という文字列を str に代入するとしたら、

str = (score == 100) ? "満点" : ((score >= 80) ? "合格" : "不合格");

なんてふうに記述できるところのものになります。

まぁ、これを多用して、さらに入れ子にしたりすることが重なると、コードが読みにくくなってしまうだけなので、if 文を利用したほうがいいかとは思います。

Python にも条件演算子は存在するらしいので、先程と同じ事を Python でやろうとするなら、

for i in range(1, 101):
    print("fizzbuzz" if (i % 15 == 0) else ("buzz" if (i % 5 == 0) else ("fizz" if (i % 3 == 0) else i)))

こうなりますね。ああ、入れ子ごちゃごちゃしてるぅー。なお、Python での条件演算子は

(条件が真のときの値) if (条件) else (条件が偽のときの値)

と記述されます。先程のテストの得点による判定を記述するならば、

str = "満点" if (score == 100) else ("合格" if (score >= 80) else "不合格")

というふうになりますね。

折角ですから、コンピュータと人間で fizzbuzz を対戦させるプログラムも作ってみたいですね。例のアレクサスキルみたいに。ただ、コンピュータが計算や処理を間違うということは(バグとかではない限り)ありえないので、ある確率でコンピュータが「わざと間違う」ように仕組んでみるとより一層おもしろくなるかもしれません。

とりあえず、fizzbuzz 問題が解けるかどうかで、コンピュータプログラミングにおける初歩からのカナメであるところの、繰り返し処理(for 文などを利用)と条件分岐(if 文などを利用)を正しく理解しそれを利用できているか、がわかるということらしいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です