目次
はじめに
今回は、プログラミング初学者の登竜門?“FizzBuzz“問題について触れたいと思います。
そもそも、FizzBuzz問題とは何なのでしょうか。
簡単に説明致しますと、数字を1から順番に数えていき、3で割り切れるときは”Fizz“, 5で割り切れるときは”Buzz“, 両方で割り切れるときは”FizzBuzz“と言っていく、単純な数字遊びのゲームです。
これをプログラミングでプログラムしてみましょうというのが、“FizzBuzz“問題。
個人的に、スタンダードな解答だと順次・ループ・条件分岐の3要素が絡んでくるので”良問“だと思っています。
もちろん、解ければそれでいいのですが、なるべくsimpleかつ美しく書くことを意識したいものです。
↓O師匠に紹介して頂いた参考記事です。
初心者も上級者も。FizzBuzz問題について考えてみよう | SiTest (サイテスト) ブログ
プログラマがプログラムを書けるか、どんなコードを書くかでよく登場するFizzBuzz問題について解説してみます。プログラミング初心者だけでなく、上級者も時々振り返ること…
解答例
今回は、Javaでどう書けるのか、色々なパターンの解答を調べてみました。(1から30までの数字で)
ラムダ式や三項演算子を使うとsimpleに書けていい感じになりますが、私にはまだ難しい。。。
以下がコードになります。
実行結果
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz1617Fizz19BuzzFizz2223FizzBuzz26Fizz2829FizzBuzz
①スタンダードな解答
public class FizzBuzz {
public static void main(String[] args) {
// for文と条件分岐を使った書き方
for ( int i = 1; i <= 30; i++ ) {
if ( i % 3 == 0 && i % 5 == 0 ) System.out.print("FizzBuzz");
else if ( i % 3 == 0 ) System.out.print("Fizz");
else if ( i % 5 == 0 ) System.out.print("Buzz");
else System.out.print(i);
}
}
}
②その他の解答 1
import java.util.*;
import java.util.stream.IntStream;
class FizzBuzz {
public static void main(String[] args) {
IntStream.rangeClosed(1, 30).forEach(
i -> System.out.format("%s%s",
(i % 3 == 0 ? "Fizz": ""),
(i % 5 == 0 ? "Buzz": (i % 3 == 0 ? "" : i))
)
);
}
}
③その他の解答 2
import java.util.*;
import java.util.stream.IntStream;
class FizzBuzz {
public static void main(String[] args) {
IntStream.rangeClosed(1, 30).mapToObj(
i -> i % 3 == 0 ?
(i % 5 == 0 ? "FizzBuzz" : "Fizz") :
(i % 5 == 0 ? "Buzz" : i))
.forEach(System.out::print);
}
}
④その他の解答 3
import java.util.*;
import java.util.stream.IntStream;
class FizzBuzz {
public static void main(String[] args) {
IntStream.rangeClosed(1, 30)
.mapToObj(i -> i % 15 == 0 ? "FizzBuzz" : i % 5 == 0 ? "Buzz" : i % 3 == 0 ? "Fizz" : i)
.forEach(System.out::print);
}
}
最後に
いかがでしたでしょうか。問題一つとってみても様々な解答が出てきて面白いですよね。
皆様もぜひ、自分独自のオリジナルな解答を追求してみて下さい。(笑)