General FizzBuzz: Difference between revisions

Content added Content deleted
m (→‎Fast Version without Modulo: clean up & add explanation)
Line 2,907: Line 2,907:
<lang Python>from collections import defaultdict
<lang Python>from collections import defaultdict


n = 100
N = 100
mods = {
FACTOR_TO_WORD = {
3: "Fizz",
3: "Fizz",
5: "Buzz",
5: "Buzz",
}
}


def fizzbuzz(n=n, mods=mods):
def fizzbuzz(n=N, factor_to_word=FACTOR_TO_WORD):

factors = defaultdict(list)
factors = defaultdict(list)
for mod in mods:
factors[mod].append(mod)


for i in range(1, n+1):
for factor in factor_to_word:
if not (factors_for_i := factors.get(i)):
factors[factor].append(factor)

yield i
else:
for i in range(1, n+1):
del factors[i]
res = ''
res = ''
for factor in sorted(factors.pop(i, ())):
for mod in sorted(factors_for_i):
factors[i+factor].append(factor)
factors[i+mod].append(mod)
res += factor_to_word[factor]
res += mods[mod]
yield res or i
yield res


if __name__ == '__main__':
if __name__ == '__main__':