Hatena::Grouppython

HM python

Pythonについて覺えたことや疑問に思ったこと、及び參考にしたリソースをメモして行く感じで。面倒なのでマーク附けは最小限に。

 | 

2007-05-16

集合型を使って「Fizz-Buzz問題」を解く

takkan_mのNo planな日常 - 考え方かぁに書かれてゐた次のアイディア:

15の倍数のリスト、5の倍数のリスト、3の倍数のリスト作って、そん中の要素だったら、値返してやればいいんでしょ

takkan_mのNo planな日常 - 考え方かぁ

をヒントにしてPythonで書いてみた。

正直2分*どころか大分梃摺ったが、最終的に出來上がったのはこれ:

def fizzbuzzsequence (fizznumber, buzznumber, first, last):
    # (1)
    result = range(first, last + 1)
    # (2)
    fizz = set(range(fizznumber, last + 1, fizznumber))
    buzz = set(range(buzznumber, last + 1, buzznumber))
    # (3)
    fizzbuzz = fizz.intersection(buzz)

    # (4)
    for i in fizz:
        result[i - 1] = 'Fizz'
    for i in buzz:
        result[i - 1] = 'Buzz'
    for i in fizzbuzz:
        result[i - 1] = 'FizzBuzz'

    return result

for i in fizzbuzzsequence(3, 5, 1, 100):
    print i

解説

(1) result = range(first, last + 1)
「Fizz-Buzz問題」では3と5の倍數以外ののときは數字をプリントしなければならない。その爲にまづ目的の範圍の數列を作成する。
(2) set(range(fizznumber, last + 1, fizznumber))
次に、3の倍數のリストと5の倍數のリストを作る。之にはrange(n, 上限, n)といふ風にrange函數を使った。そして次の處理の爲にリストを集合型(set型)に變換
(3) fizzbuzz = fizz.intersection(buzz)
3と5両方の倍数*を得る爲に集合型のメソッドを使った。intersectionメソッドは、レシーバ及び引數のset型オブジェクトに共通に含まれる要素を持った新しいsetを作成*する。り積集合を得る。
(4) for i in fizz: result[i - 1] = 'Fizz'
仕上に、最初に作って置いたリスト(result)について、此等三つの集合に含まれてゐる數値 - 1番目のアイテムを、'Fizz''Buzz''FizzBuzz'のそれぞれで上書きする。

參考

關聯リンク

So-net blog:ある nakagami の日記:集合演算で FizzBuzz問題
同じく集合型オブジェクトを使ってゐる回答。

關聯記事(當サイト内)

おまけ

setを使ふと決めてから最初に書いたヴァージョンも載せてみる。面倒なので解説は無し。

fizz = set(range(3, 101, 3))
buzz = set(range(5, 101, 5))
fizzbuzz = fizz.intersection(buzz)
number = set(range(1, 101, 1))

fizz = fizz.symmetric_difference(fizzbuzz)
buzz = buzz.symmetric_difference(fizzbuzz)

number = number.symmetric_difference(fizz)
number = number.symmetric_difference(buzz)
number = number.symmetric_difference(fizzbuzz)

fizz = [[i, 'Fizz'] for i in fizz]
buzz = [[i, 'Buzz'] for i in buzz]
fizzbuzz = [[i, 'FizzBuzz'] for i in fizzbuzz]
number = [[i, str(i)] for i in number]

result = number + fizz + buzz + fizzbuzz
result.sort(lambda a, b: a[0] - b[0])

for i in result:
    print i[1]
 | 
MORIYAMA Hiroshi <hiroshi@kvd.biglobe.ne.jp>