はじめに
資格の勉強もひと段落がつき、そろそろ何か趣味でコーディングしたいとなり、最初に思いついたのが何故か世界のナベアツのあのネタである。
FizzBuzz問題の延長だろうと考え、安易に取り組むことになったのだが...
これより以下、本文です。
大変下らない記事ですので、興味の無い方やお忙しい方はブラウザバック推奨です。
本文
なにはともあれ要件定義
FizzBuzz問題の要件定義
- 最初のプレイヤーは「1」と数字を発言する。
- 次のプレイヤーは直前のプレイヤーの発言した数字に1を足した数字を発言していく。
- ただし、3の倍数の場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合(すなわち15の倍数の場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。
世界のナベアツ問題の要件定義
- 世界のナベアツが「1」という数字を発言する。
- 世界のナベアツが直前に発言した数字に1を足した数字を発言していく。
- 3の倍数と3が付く数字のときだけ阿呆になります
- それぞれには上限が定められていないので、爆笑レッドカーペット時代によく宣言されていた「40」を上限とします。
- 阿呆の声は、数値の後に
(阿呆の声)
を連結して表現するものとします。
よって上記の要件をすべてまとめると以下のようになります。
# | 要件 |
---|---|
1 | 世界のナベアツが「1」という数字を発言する。 |
2 | 世界のナベアツが直前に発言した数字に1を足した数字を発言していく。 |
3 | 3の倍数と3が付く数字のときだけ阿呆になります。 |
4 | 1から始まり、40まで数える。 |
5 | 阿呆の声は、数値の後に(阿呆の声) を連結して表現する。 |
ようやく本文
まずは、今回のベースとなるFizzBuzzのソースをここに。
for i in range(1, 41):
if i % 3 == 0 and i % 5 == 0:
print("Fizz Buzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
FizzBuzzのソースから世界のナベアツ問題に修正するにあたり、不要な記述を削除します。
for i in range(1, 41):
- if i % 3 == 0 and i % 5 == 0:
- print("Fizz Buzz")
- elif i % 3 == 0:
+ if i % 3 == 0:
- print("Fizz")
+ print(i) # 数値の後に文字列を連結するため、この時点で数値に変えておく
- elif i % 5 == 0:
- print("Buzz")
else:
print(i)
修正後のファイルは以下のようになります。
for i in range(1, 41):
if i % 3 == 0:
print(i)
else:
print(i)
シンプルになりましたね。
本格的に世界のナベアツ問題に取り組んでいきます。
この時点で、既に3の倍数の条件を満たしているので、追記するのは3がつく数字のとき
という条件です。
まず必要なのは、range object
をstrにキャストするということ。
その後、キャストしたstr(i)
に3が含まれるかをstr.count()
を通して、3が出現する回数を受け取ります。
その返り値を元に分岐をさせて、3がつく数字を判定しようと思います。
for i in range(1, 41):
+ if str(i).count("3") >= 1 or i % 3 == 0:
+ print(i, "(阿呆の声)")
+ else:
print(i)
@fujitanozomu 様より、ご指摘頂いた内容を元にソースを修正しました。
それではこの作成したPythonファイルを実行しましょう。
$ python sample.py
以下のような結果がコマンドラインに出力されたら終了です。
1
2
3 (阿呆の声)
4
5
6 (阿呆の声)
7
8
9 (阿呆の声)
10
11
12 (阿呆の声)
13 (阿呆の声)
14
15 (阿呆の声)
16
17
18 (阿呆の声)
19
20
21 (阿呆の声)
22
23 (阿呆の声)
24 (阿呆の声)
25
26
27 (阿呆の声)
28
29
30 (阿呆の声)
31 (阿呆の声)
32 (阿呆の声)
33 (阿呆の声)
34 (阿呆の声)
35 (阿呆の声)
36 (阿呆の声)
37 (阿呆の声)
38 (阿呆の声)
39 (阿呆の声)
40
期待通りの結果が出力されましたね。
本文はここまでです、お疲れさまでした。
まとめ
まとめも、何もなくFizzBuzz問題のソースに分岐を追加しただけですね。しかし、私の技量では、スマートに書くことができなかったことを反省しようと思います。
どなたか「こんな書き方があるよ」みたいなのをご存知でしたら、コメントを頂けると嬉しいです。
最後まで、読んで頂きありがとうございました。
参考文献
- Fizz Buzz: wikipedia
-
桂三度: Wikipedia
こんなに丁寧に過去のネタがまとめられているなんて...