CODE Polyglot / 入門 / 第3回

FizzBuzz — 条件分岐と繰り返し

1 から n までの数を順に出し、3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz と出します。条件分岐(if)と繰り返し(for)の練習によく使われる問題です。

画面にこう出れば正解

どの言語で書いても、同じ入力なら画面に出る文字は1文字も違わない、というのが正解の決め方です(例は Python で動かしたときのコマンドです)。

15まで

$ python3 fizzbuzz.py 15
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

5まで

$ python3 fizzbuzz.py 5
1
2
Fizz
4
Buzz

1まで

$ python3 fizzbuzz.py 1
1

30まで

$ python3 fizzbuzz.py 30
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

0(何も出さない)

$ python3 fizzbuzz.py 0

10言語のプログラム

どれもそのまま保存して動かせます。毎朝、上の正解の例をすべて実際に動かして確かめています。

fizzbuzz.php8.4.26 で 5 / 5 件の出力が正解と一致

<?php
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
$n = (int) $argv[1];
for ($i = 1; $i <= $n; $i++) {
    if ($i % 15 === 0) {
        echo "FizzBuzz\n";
    } elseif ($i % 3 === 0) {
        echo "Fizz\n";
    } elseif ($i % 5 === 0) {
        echo "Buzz\n";
    } else {
        echo $i, "\n";
    }
}

動かし方(ファイルを保存したフォルダで) ・ PHP を入れる

$ php fizzbuzz.php 15

この回でやること

  • 1 から n まで数を増やしながら、同じ処理を繰り返す(for・each)
  • 条件によって、出すものを変える(if・else if・switch)
  • 「割り切れるか」を余り(%)で調べる

解説

繰り返し

for は「数を1つずつ増やしながら、同じことを何度もする」ための書き方です。Python の range(1, n + 1) や Ruby の (1..n) のように、「1 から n まで」をひとまとまりで書ける言語もあります。Python の range(1, n) は n を含まないので、n + 1 と書きます。

「割り切れるか」は余りで調べる

i % 3 は「i を 3 で割った余り」です。余りが 0 なら、3 で割り切れる、つまり 3 の倍数です。

調べる順番が大事

15 は、3 の倍数でも 5 の倍数でもあります。先に「3 の倍数か」を調べると、15 で「Fizz」と出て、そこで終わってしまいます。両方の倍数(15 の倍数)を最初に調べるのがコツです。

この回は、8言語とも同じ考え方で書けて、答えも割れません。書き方(elif・elseif・else if・switch)の違いを見比べてみてください。

練習

  1. 7 の倍数のときに「Lucky」と出すようにしてみましょう
  2. n までではなく、n から 1 へ逆の順に出してみましょう