さて、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 文などを利用)を正しく理解しそれを利用できているか、がわかるということらしいです。