FizzBuzz問題は、プログラミングの初学者からエキスパートまで、さまざまな技術面接でよく使われるクラシックな問題です。この問題は、1から100までの数を順番に出力するプログラムを書くというもので、ただし3で割り切れる場合は “Fizz”、5で割り切れる場合は “Buzz”、3と5で割り切れる場合は “FizzBuzz” と出力するというルールがあります。
C#の次はPythonでFizzBuzz問題を解いていきます。
例 1: 基本的な条件分岐
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
このプログラムは、1から100までの数を順番に評価し、各数に対して条件を満たす場合には “Fizz”、”Buzz”、または “FizzBuzz” を出力し、それ以外の場合には数自体を出力します。このような形式でFizzBuzz問題を解くことが一般的です。
この方法はC#と同様です。
例2:簡潔な文字列補完を使用
for i in range(1, 101):
output = ""
if i % 3 == 0:
output += "Fizz"
if i % 5 == 0:
output += "Buzz"
print(output if output else i)
このコードでは、各数に対してoutput
と呼ばれる空の文字列を用意し、3で割り切れる場合は “Fizz” を、5で割り切れる場合は “Buzz” をoutput
に追加します。最終的にoutput
が空でない場合はその内容を表示し、そうでない場合は数自体を表示します。
この方法ではif-elif-else
の構造を使わずに、各条件を独立して扱っています。
この方法もC#と同様です。
例3:リスト内包表記と条件式を使用
result = ["Fizz" * (i % 3 == 0) + "Buzz" * (i % 5 == 0) or i for i in range(1, 101)]
print("\n".join(map(str, result)))
このコードでは、リスト内包表記を使用して1から100までの数に対する結果のリストを生成し、最後に "\n".join(map(str, result))
を使って結果を表示しています。
このアプローチでは、"Fizz" * (i % 3 == 0)
は i
が3で割り切れる場合に “Fizz” を、"Buzz" * (i % 5 == 0)
は i
が5で割り切れる場合に “Buzz” を生成します。そして、or i
はどちらも満たされない場合には i
を結果として採用します。
Pythonらしい、簡潔かつ効果的なコードの記述、コードになります。
例4:C#のようにLinqっぽく解けるのか?
ChatGptに無茶なお願いをしました。
LINQのような機能は直接利用できませんが、
map
やfilter
といった組み込み関数や、ジェネレータ式などを使用してLINQに似た操作を行うことができます。
def fizz_buzz(number):
return (
"FizzBuzz" if number % 3 == 0 and number % 5 == 0
else "Fizz" if number % 3 == 0
else "Buzz" if number % 5 == 0
else str(number)
)
numbers = range(1, 101)
fizz_buzz_results = map(fizz_buzz, numbers)
for result in fizz_buzz_results:
print(result)
このコードでは、fizz_buzz
関数でFizzBuzzの条件を評価し、map
関数を使用して各数値に対してFizzBuzz関数を適用しています。最終的に、結果をprint
文で表示しています。LINQに直接相当するものはありませんが、Pythonの組み込み関数やジェネレータなどを組み合わせて同様の操作を実現できます。
その他
プラグイン:Highlighting Code Block
コメント