この記事について
CODEBASE okinawa Advent Calendar 2019 の19日目の記事にあたります。
内容
いい感じにFizz Buzz問題をPython3を用いて解いていきます。
とりあえずやってみよう。
Fizz Buzz問題とは
最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、**3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」**を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
『Fizz Buzz』 Wikipediaより
整理して考えてみる
- 3 で割り切れる数字(3, 6, ...)のときはFizz
- 5 で割り切れる数字(5, 10, ...)のときはBuzz
- 3 と 5 の両方で割り切れる数字(15, 30, ...)のときはFizzBuzz
- 上記の条件に満たないならそのまま数字
条件ごとに分解したコードに直す
言語としては Python3 で条件ごとにコードにしていきます。
また数字は変数xに置いて進めていきます。
3 で割り切れる場合
3 で割り切れるとは 3 で除算を行った場合に余りが 0 になると考えることが出来る。
条件分岐は if 表現で書くことができ、条件を満たすなら中の処理を行います。
Python はインデント(半角スペース4つ)で区切られてます。
if x % 3 == 0:
print("Fizz")
5で割り切れる場合
5 で割り切れるとは 5 で除算を行った場合に余りが 0 になると考えることが出来る。
if x % 5 == 0:
print("Buzz")
3 と 5 の両方で割り切れる場合
今までの if 表現だけで書くと下のように書けます。
if x % 3 == 0:
if x % 5 == 0:
print("FizzBuzz")
上記のコード以外にも 3 と 5 の両方を満たすを 15 で割り切れると考えられます。
if x % 15 == 0:
print("FizzBuzz")
条件に満たない場合
if の条件分岐を満たさないを書きたい場合は else 表現を用いる事ができます。
if 条件式1:
`条件式1を満たすときに行う処理`
else if (elifに省略可) 条件式2:
`条件式1を満たさず条件式2を満たすときに行う処理`
else:
`全ての条件式を満たさないときに行う処理`
実際のコードとして書いてみる
条件分岐部分を書いてみる
条件ごとに分解して書いたコードを合体させてコードを完成させていきます。
ここでの注意点としてコードは上から下に見ていく事です。
つまり最初の if 条件を満たしたならそれ以降の条件に当てはまっても基本的には処理を行わないと言う事です。この注意点を踏まえたうえでコードを書くと下記になります。
if x % 15 == 0:
print("FizzBuzz")
elif x % 5 == 0:
print("Buzz")
elif x % 3 == 0:
print("Fizz")
else:
print(x)
これで基本的な FizzBuzz の条件をコードにする事ができました。
条件分岐に使う変数 x の準備
変数 x は 1, 2, 3, ..., 30 になるように準備します。
繰り返し処理を行うためのコードは下記になります。
for x in range(1,31):
`繰り返したい処理`
上記のコードで 1 ~ 30 まで処理を行い、変数 x に試行回数分の値をセットできます。
これで本当にコードが完成!!
for x in range(1,31):
if x % 15 == 0:
print("FizzBuzz")
elif x % 5 == 0:
print("Buzz")
elif x % 3 == 0:
print("Fizz")
else:
print(x)
色々コードを加工してみよう (本編です)
文字の加算を利用した FizzBuzz
文字同士の加算が可能な言語なら if 条件だけでも書く事が可能です。
for i in range(1,31):
ans = ""
if i % 3 == 0:
ans += "Fizz"
if i % 5 == 0:
ans += "Buzz"
if ans == "":
ans = i
print(ans)
1 行の FizzBuzz リスト内包表記版
リスト内包表記を用いると 1 行で Fizz Buzz を書く事ができます。
print("\n".join("FizzBuzz" if n % 15 == 0 else "Fizz" if n % 3 == 0 else "Buzz" if n % 5 == 0 else str(n) for n in range(1,31)))
1 行の FizzBuzz bool 型利用版
Python では bool 型の True, False は int 型の 0, 1 と等価として四則演算が可能である。
この条件と文字の加算を利用して下記のように書く事も出来ます。
print("\n".join( "Fizz" * (n % 3 == 0) + "Buzz" * (n % 5 == 0) or str(n) for n in range(1,31)))