定番: FizzBuzz
言語を覚えたら書く定番
FizzBuzz は、新しい言語を触ったときに最初に書かれることの多い練習問題です。
プレーンテキスト
1から順に数える
3で割り切れたら Fizz
5で割り切れたら Buzz
両方で割り切れたら FizzBuzz
それ以外は数字そのままプレーンテキスト
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz短いのに、ループ・条件分岐・剰余・文字列の組み立てが全部入ります。ここまでの第3章の総まとめとして、ちょうどよい形をしています。
剰余は %
割った余りを求める記号です。
Go
9 % 3 // 0。割り切れる
10 % 3 // 1「割り切れる」は「余りが0」と同じことなので、こう書きます。
Go
if n % 3 == 0 {
// 3で割り切れる
}判定の順番が肝心
ここが FizzBuzz の唯一の罠です。15 は 3 でも 5 でも割り切れます。
Go
if n % 3 == 0 {
return "Fizz" // 15 がここで確定してしまう
}
if n % 5 == 0 {
return "Buzz"
}この順番だと、15 は Fizz を返して終わります。FizzBuzz にたどり着きません。
両方の条件を先に書くのが正解です。
Go
if n % 3 == 0 && n % 5 == 0 {
return "FizzBuzz"
}&& は「かつ」です。両方が真のときだけ真になります。
条件が重なるときは、狭いほうから先に書く。これは FizzBuzz に限らず、条件分岐を書くときの一般的な順序です。
15で割ってもよい
3 と 5 の両方で割り切れる数は、15 で割り切れる数と同じです。
Go
if n % 15 == 0 {
return "FizzBuzz"
}短く書けますが、なぜ 15 なのかが読んだ人に伝わりにくくなります。n % 3 == 0 && n % 5 == 0 のほうが意図がそのまま読めます。短さと分かりやすさが食い違う、小さな例です。
要件
- 3でも5でも割り切れる数は
FizzBuzz - 3で割り切れる数は
Fizz - 5で割り切れる数は
Buzz - それ以外は数字そのまま
- 区切りは半角スペース1つ。最後にスペースを付けない
nが0以下なら空文字を返す
入出力例
fizzBuzz(5) → "1 2 Fizz 4 Buzz"
fizzBuzz(15) → "1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz"
fizzBuzz(1) → "1"
fizzBuzz(3) → "1 2 Fizz"
fizzBuzz(0) → ""ヒント
編集 ゆめさく編集部