剰余演算子を使わずにFizzBuzzを解く の題名を見て「そうだよな剰余演算子って別になくてもできるよな」って妙に納得してしまったので、自分だったらどうやるかな?と思って考えてみました。
「3の倍数かどうか」 と考えれば剰余演算子の出番ですが、「みっつめごとに"Fizz"になる」と考えれば別のやりかたがありそうです。
def print_fizzbuzz(n):
for _, fizzbuzz in zip(range(0, n)
, fizzbuzz_gen()
):
print(fizzbuzz)
def fizzbuzz_gen():
for fizz, buzz in zip(mod_gen(3, "Fizz")
, mod_gen(5, "Buzz")
):
yield (
fizz if type(buzz) == int else
buzz if type(fizz) == int else
fizz + buzz
)
def mod_gen(m, name):
n = 1
while True :
for i in range(n, n+m-1):
yield i
yield name
n = n + m
print_fizzbuzz(100)
無限にFizzするジェネレータと無限にBuzzするジェネレータを組み合わせて無限にFizzBuzzするジェネレータを作り、それの最初から n 個を出力しています。
みっつめごとに"Fizz"って叫ぶ芸人と五つ目ごとに"Buzz"って叫ぶ芸人がコンビを組んでFizzBuzz芸をする、ってコンセプトです。