So-net無料ブログ作成
検索選択

集合演算で FizzBuzz問題 [Python]

http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
http://www.everes.net/2007/may/09/fizzbuzz/
http://d.hatena.ne.jp/aodag/20070509/1178681462
http://www.liris.org/blog/fuzzbuzzE381AAE38293E3818B/

ハッカーの皆さんのコードは読んでもよくわからないので、自分ならどう書くか?胸に手を当ててよく考えてみた。1行では書かないな(書けないな)。分かり易く書きたいな。

書いた。
Python 2.4 以降で動くと思うけど、手元に 2.3 しかなかったので IronPython で確認した。

fizz = set([i for i in range(1,101) if i % 3 == 0])
buzz = set([i for i in range(1,101) if i % 5 == 0])
fizzbuzz = fizz.intersection(buzz)
fizz = fizz - fizzbuzz
buzz = buzz - fizzbuzz

for i in range(1, 101):
    if i in fizz:
        print 'Fizz'
    elif i in buzz:
        print 'Buzz'
    elif i in fizzbuzz:
        print 'FizzBuzz'
    else:
        print i


うーん、分かり易いかなぁ?微妙だ。
「FizzBuzz と出しているところを BuzzFizz にして!」と言われた場合にも「FBにして」と言われても直し易いようにしたつもり。(嘘。集合演算が使ってみたかった)
いずれにせよ、2分ではできなかったので僕はダメプログラマ。

(追記)
どう考えても↓のが分かり易い。俺ってバカだな。脳みそ SQL になってる。
http://python.g.hatena.ne.jp/mhrs/20070509/p1
http://d.hatena.ne.jp/likk/20070509

(さらに追記)
どうせなので、集合演算にこだわってみた。処理速度は遅い。

fizz = set([i for i in range(1,101) if i % 3 == 0])
buzz = set([i for i in range(1,101) if i % 5 == 0])
fizzbuzz = fizz.intersection(buzz)
fizz = fizz - fizzbuzz
buzz = buzz - fizzbuzz
num = set(range(1,101)) - fizz - buzz - fizzbuzz

for i in range(1, 101):
    if i in num:
        print i
    if i in fizz:
        print 'Fizz'
    if i in buzz:
        print 'Buzz'
    if i in fizzbuzz:
        print 'FizzBuzz'

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。