Pythonについて覺えたことや疑問に思ったこと、及び參考にしたリソースをメモして行く感じで。面倒なのでマーク附けは最小限に。
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
result = range(first, last + 1)set(range(fizznumber, last + 1, fizznumber))range(n, 上限, n)といふ風にrange函數を使った。そして次の處理の爲にリストを集合型(set型)に變換。fizzbuzz = fizz.intersection(buzz)3と5両方の倍数*を得る爲に集合型のメソッドを使った。intersectionメソッドは、レシーバ及び引數のset型オブジェクトに
共通に含まれる要素を持った新しいsetを作成*する。詰り積集合を得る。
for i in fizz: result[i - 1] = 'Fizz'result)について、此等三つの集合に含まれてゐる數値 - 1番目のアイテムを、'Fizz'・'Buzz'・'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]