PythonでFizzBuzz問題をやってみた
PythonでFizzBuzz問題のプログラムを何通りか作ってみました。
目次
FizzBuzz問題とは
ツイッターをみていたらFizzBuzz問題というのが流れてきましたので、試しに自分でもプログラムを作ってみました。
FizzBuzz問題 というのは、下記の課題をコンピュータで解くというものです。(こちらのサイト からの引用です。)
1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
ループと条件分岐で解く方法
ぱっと見た感じ、ループと条件分岐の組み合わせで作れそうです。
おそらくこういう感じにするのがオーソドックスなのかと思います。
for i in range(1,101):
if i % 15 == 0:
print('FizzBuzz')
elif i % 3 == 0:
print('Fizz')
elif i % 5 == 0:
print('Buzz')
else:
print(i)
上記のコードでは、15と3と5とそれ以外の4つに場合分けして出力をします。分かり易いですね。
ループと条件分岐を使うが分岐を減らした方法
では、場合分けを1つ減らしてみます。
for i in range(1,101):
res = ''
if i % 3 == 0:
res += 'Fizz'
if i % 5 == 0:
res += 'Buzz'
if len(res) < 1:
res = str(i)
print(res)
空の文字列を作っておいて、3だったらFizzを5だったらBuzzを追加していって、文字列の長さが0だったらそのときの数字を文字として追加するわけです。 これも分かり易いですね。
リストに正解を入れておいて呼び出す方法
こんな力業はどうでしょうか。
fb_map = [
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'
]
for i in range(1,101):
print(fb_map[i-1])
リストに順番に結果を記入してしまって、インデックスを使って呼び出すだけです。これは速そう。
でも、FizzでもBuzzでもないデータをリストに入れるってのはどうでしょう。
辞書を使うことでデータを減らす方法
というわけで、辞書を使ってみます。
fb_map = [
{'id':3, 'text':'Fizz'},
{'id':5, 'text':'Buzz'},
{'id':6, 'text':'Fizz'},
{'id':9, 'text':'Fizz'},
{'id':10, 'text':'Buzz'},
{'id':12, 'text':'Fizz'},
{'id':15, 'text':'FizzBuzz'},
{'id':18, 'text':'Fizz'},
{'id':20, 'text':'Buzz'},
{'id':21, 'text':'Fizz'},
{'id':24, 'text':'Fizz'},
{'id':25, 'text':'Buzz'},
{'id':27, 'text':'Fizz'},
{'id':30, 'text':'FizzBuzz'},
{'id':33, 'text':'Fizz'},
{'id':35, 'text':'Buzz'},
{'id':36, 'text':'Fizz'},
{'id':39, 'text':'Fizz'},
{'id':40, 'text':'Buzz'},
{'id':42, 'text':'Fizz'},
{'id':45, 'text':'FizzBuzz'},
{'id':48, 'text':'Fizz'},
{'id':50, 'text':'Buzz'},
{'id':51, 'text':'Fizz'},
{'id':54, 'text':'Fizz'},
{'id':55, 'text':'Buzz'},
{'id':57, 'text':'Fizz'},
{'id':60, 'text':'FizzBuzz'},
{'id':63, 'text':'Fizz'},
{'id':65, 'text':'Buzz'},
{'id':66, 'text':'Fizz'},
{'id':69, 'text':'Fizz'},
{'id':70, 'text':'Buzz'},
{'id':72, 'text':'Fizz'},
{'id':75, 'text':'FizzBuzz'},
{'id':78, 'text':'Fizz'},
{'id':80, 'text':'Buzz'},
{'id':81, 'text':'Fizz'},
{'id':84, 'text':'Fizz'},
{'id':85, 'text':'Buzz'},
{'id':87, 'text':'Fizz'},
{'id':90, 'text':'FizzBuzz'},
{'id':93, 'text':'Fizz'},
{'id':95, 'text':'Buzz'},
{'id':96, 'text':'Fizz'},
{'id':99, 'text':'Fizz'},
{'id':100, 'text':'Buzz'}
]
for i in range(1,101):
c = [d.get('text') for d in fb_map if d['id']==i]
if len(c) < 1:
c = [i]
print(c[0])
リスト内包表記がPythonぽいですね。
他にもいろいろなやり方がありそうです。
ツイッターで見た中には、関数名だけ定義して中身は外注するという人もいたらしいという話がありましたが。。。そういう場合は検収するまで課題達成とは言えないのではないかと。
公開日
広告
作ってみたカテゴリの投稿
- PythonでFizzBuzz問題をやってみた
- PythonでPDFファイルのサムネイル画像を作る
- Pythonでオブジェクトを選択してクロップするツールを作ってみた
- Pythonでデータロガーのログから瞬断を抽出してみる
- Pythonで写真の中の線を抽出してみた
- Pythonで動画から静止部分を抜き出してみた
- Pythonで測定データのピーク値を検出してみる
- Pythonで複数のCSVデータを1つのファイルにまとめてみた
- PythonとExcelでフォルダの使用量を調べてみた
- Sphinx(ablog)の後処理をする
- WordPressのブログを静的サイトに書き換えてみました
- シェルスクリプトでSphinxのビルドの前処理をする
- 数式を中置記法から後置記法(逆ポーランド記法)に変換してみた