FizzBuzz問題の解法 Python

FizzBuzz問題の解法 Python Python

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のような機能は直接利用できませんが、mapfilterといった組み込み関数や、ジェネレータ式などを使用して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

コメント