ネットを巡回していたら、こんなものを見つけた。
どうしてプログラマに・・・プログラムが書けないのか?
ほうほう。
とりあえず、単純な問題・・・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でやってみてもいいかなぁ。もうどんな問題があったのかも忘れてるけど。