薫のメモ帳

私が学んだことをメモ帳がわりに

PYTHONでFIZZBUZZプログラムを書く

0 はじめに

 約15か月前、「FIZZBUZZプログラムを書く」という課題にチャレンジしたことがあった。

 

hiroringo.hatenablog.com

 

hiroringo.hatenablog.com

 

 上の2つのブログの記事を起案したとき、主として用いたプログラミング言語PERLであった。

 

 その後、約11か月前、RUBYを勉強していたとき、FIZZBUZZZ問題についてRUBYでできるかどうかのチェックを行った。

 

hiroringo.hatenablog.com

 

 そして、先週、PYTHON3エンジニア認定基礎試験なるものに合格した

 せっかくなので、PERLやRUBYでやったことがPYTHONでできるのかのチェックを行う。

 

 

 今回の課題はRUBYのときと同じ次の3種類である。

 

① 教科書などを見ないでFIZZBUZZプログラムを書く

② 1行でFIZZBUZZプログラムを書く

③ 「%」を用いないでFIZZBUZZプログラムを書く

 以下、チャレンジする。

 

1 チャレンジの結果

 まず、①の条件で書いたプログラムは次のとおりである

 

for i in range(1, 101):
    if i % 15 == 0:
        print("FizzBuzz!,")
    elif i % 3 == 0:
        print("Fizz!", end=",")
    elif i % 5 == 0:
        print("Buzz!", end=",")
    else:
        print(i, end=",")
 

 

 この点、何も見ないで書いたコードは「不要な半角スペース」が不規則に存在した。

 そこで、「flake8」という文法チェックツールを用いて修正した

 

 

 次に、②の条件(1行以内に収める)で書いたプログラムは次のとおりである

 この点、1行をそのままこのブログにペーストすると幅がオーバーする。

 そこで、このブログに転載する際、プログラムにバックスラッシュを加えて改行した。

 もちろん、バックスラッシュと改行とインデントを消去すれば1行のプログラムとして動く。

 

for i in range(1,101):print("FizzBuzz!,\n" if i%15==0 else "Fizz!," \
    if i%3==0 else "Buzz!," if i%5==0 else str(i)+",", end="")
 

 

 一般的に、ループを作るとき、ヘッダーの末尾に「:」を付け、改行してインデントを追加してループの内容を書いていく。

 ただ、実際問題、ループの後ろは改行とインデントを追加する必要がないらしい

 

 このプログラムの文字数を次のサイトでカウントしたところ、文字数は126文字(スペース含む)だった。

 まあ、こんなところであろうか。

 

http://www1.odn.ne.jp/megukuma/count.htm

 

 

 最後に、③の「%」を用いないで書いたプログラムは次のとおりである。

 

def FizzBuzz(x):
    y = x
    while True:
        if y > 15:
            y -= 15
        elif y == 15:
            return "FizzBuzz!,\n"
        elif y == 3 or y == 6 or y == 9 or y == 12:
            return "Fizz!,"
        elif y == 5 or y == 10:
            return "Buzz!,"
        else:
            return str(x)+","


for i in range(1, 101):
    print(FizzBuzz(i), end="")
 

 

 上ではwhileループを用いたが、再帰関数を用いた場合のプログラムは次のとおりである。

 

def FizzBuzz(x, y):
    while True:
        if y > 15:
            return FizzBuzz(x, y-15)
        elif y == 15:
            return "FizzBuzz!,\n"
        elif y == 3 or y == 6 or y == 9 or y == 12:
            return "Fizz!,"
        elif y == 5 or y == 10:
            return "Buzz!,"
        else:
            return str(i)+","


for i in range(1, 101):
    print(FizzBuzz(i, i), end="")
 

 

 以上、色々なプログラムを書いてみた。

 4つのプログラミングの実行結果は次のとおりである。

 といっても、全部同じだが。

 

(以下、4つのプログラムの実行結果を表示)

PS C:\Labratory\AppLab\HatenaBlog> python FizzBuzzPython02.py
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!,
31,32,Fizz!,34,Buzz!,Fizz!,37,38,Fizz!,Buzz!,41,Fizz!,43,44,FizzBuzz!,
46,47,Fizz!,49,Buzz!,Fizz!,52,53,Fizz!,Buzz!,56,Fizz!,58,59,FizzBuzz!,
61,62,Fizz!,64,Buzz!,Fizz!,67,68,Fizz!,Buzz!,71,Fizz!,73,74,FizzBuzz!,
76,77,Fizz!,79,Buzz!,Fizz!,82,83,Fizz!,Buzz!,86,Fizz!,88,89,FizzBuzz!,
91,92,Fizz!,94,Buzz!,Fizz!,97,98,Fizz!,Buzz!,
PS C:\Labratory\AppLab\HatenaBlog> python FizzBuzzPython03.py
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!,
31,32,Fizz!,34,Buzz!,Fizz!,37,38,Fizz!,Buzz!,41,Fizz!,43,44,FizzBuzz!,
46,47,Fizz!,49,Buzz!,Fizz!,52,53,Fizz!,Buzz!,56,Fizz!,58,59,FizzBuzz!,
61,62,Fizz!,64,Buzz!,Fizz!,67,68,Fizz!,Buzz!,71,Fizz!,73,74,FizzBuzz!,
76,77,Fizz!,79,Buzz!,Fizz!,82,83,Fizz!,Buzz!,86,Fizz!,88,89,FizzBuzz!,
91,92,Fizz!,94,Buzz!,Fizz!,97,98,Fizz!,Buzz!,
PS C:\Labratory\AppLab\HatenaBlog> python FizzBuzzPython04.py
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!,
31,32,Fizz!,34,Buzz!,Fizz!,37,38,Fizz!,Buzz!,41,Fizz!,43,44,FizzBuzz!,
46,47,Fizz!,49,Buzz!,Fizz!,52,53,Fizz!,Buzz!,56,Fizz!,58,59,FizzBuzz!,
61,62,Fizz!,64,Buzz!,Fizz!,67,68,Fizz!,Buzz!,71,Fizz!,73,74,FizzBuzz!,
76,77,Fizz!,79,Buzz!,Fizz!,82,83,Fizz!,Buzz!,86,Fizz!,88,89,FizzBuzz!,
91,92,Fizz!,94,Buzz!,Fizz!,97,98,Fizz!,Buzz!,
PS C:\Labratory\AppLab\HatenaBlog> python FizzBuzzPython05.py
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!,
31,32,Fizz!,34,Buzz!,Fizz!,37,38,Fizz!,Buzz!,41,Fizz!,43,44,FizzBuzz!,
46,47,Fizz!,49,Buzz!,Fizz!,52,53,Fizz!,Buzz!,56,Fizz!,58,59,FizzBuzz!,
61,62,Fizz!,64,Buzz!,Fizz!,67,68,Fizz!,Buzz!,71,Fizz!,73,74,FizzBuzz!,
76,77,Fizz!,79,Buzz!,Fizz!,82,83,Fizz!,Buzz!,86,Fizz!,88,89,FizzBuzz!,
91,92,Fizz!,94,Buzz!,Fizz!,97,98,Fizz!,Buzz!,

(終了)

 

 要求通りの結果が出ている。

 これならミッションクリアと言ってもよかろう。

 

 以上、PYTHONの学習成果を試すため「FIZZBUZZ問題」にチャレンジした。

 今後もプログラミングとの距離を開けないようにいろいろやっていきたい(それが一番大事)。

 当分の間は「Python3エンジニア認定基礎試験を受ける」と宣言することでゲットした次の本を読んでいこうと考えている。