hellkite 日記と雑記とメモ。

Shiki Kazamaの駄文と音楽と、時々技術な感じ

Fizz-Buzz問題とやらをやってみる


スポンサーリンク


ネットを巡回していたら、こんなものを見つけた。
どうしてプログラマに・・・プログラムが書けないのか?
ほうほう。
とりあえず、単純な問題・・・Fizz-Buzz問題というものが載ってたのでやってみた。
この例で書いてあった問題は以下の通り。

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

さすがに、この程度なら余剰を使えばいいことくらい分かる。

>>> result = []
>>> for i in range(1,101):
...     if (i % 3 == 0) and (i % 5 == 0):
...             result.append("FizzBuzz")
...     elif (i % 3 == 0):
...             result.append("Fizz")
...     elif (i % 5 == 0):
...             result.append("Buzz")
...     else:
...             result.append(i)
...
>>> result
 ・・・以下結果

2分足らずかな?途中で打ち間違えたからそんなもんか*1
他のページでは、これに剰余算を使わないという条件が付いてる問題もあった。

>>> a = range(0,101,3)
>>> b = range(0,101,5)
>>> result = []
>>> for i in range(1,101):
...     if (i in a) and (i in b):
...             result.append("FizzBuzz")
...     elif (i in a):
...             result.append("Fizz")
...     elif (i in b):
...             result.append("Buzz")
...     else:
...             result.append(i)
...
>>> result
 ・・・以下結果


初め、

...      if i in (a and b):

とか、わけわかんない判定式を書いたのは秘密。力技だけど剰余演算子は消えた。
それだとアレなので、3の倍数かつ5の倍数ってのを積集合のリストにしてみようと思ったけど、うまくいかず。

c = a and b

とか

c = a & b

とか試したところで、set型とやらあることを知る。

>>> s_a = set(a)
>>> s_b = set(b)
>>> c = s_a & s_b
>>> c
set([0, 75, 45, 15, 90, 60, 30])

でも、for文のカウンタとどうやって比較すればいいのかわからず。
set型はset型同士で使うのが普通なのかな?


散々ブログ界でも取り上げられたみたいだけど、このくらいの問題でも曖昧だったところが分かるもんだ*2
他にもこの手の問題が置いてあるところがないかなぁ。
K&Rの練習問題をPythonでやってみてもいいかなぁ。もうどんな問題があったのかも忘れてるけど。

*1:とか言って間違ってたりして・・・ちょっとガクブル

*2:俺がトーシロなだけですorz