Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import itertools
- import functools
- import operator
- fbs = []
- def fb(f):
- fbs.append(f)
- return f
- @fb
- def fizzbuzz0(n=100):
- for x in range(1, n+1):
- if x%3 == 0 and x%5 == 0:
- yield 'fizzbuzz'
- elif x%3 == 0:
- yield 'fizz'
- elif x%5 == 0:
- yield 'buzz'
- else:
- yield x
- @fb
- def fizzbuzz1(n=100):
- for x in range(1, n+1):
- l = [[x, 'buzz'],
- ['fizz', 'fizzbuzz']]
- yield l[x%3==0][x%5==0]
- @fb
- def fizzbuzz2(n=100):
- for x in range(1, n+1):
- l = ((x, 'buzz'),
- ('fizz', 'fizzbuzz'))
- yield l[x%3==0][x%5==0]
- @fb
- def fizzbuzz3(n=100):
- for x in range(1, n+1):
- a = x%3 or 'fizz'
- b = x%5 or 'buzz'
- try:
- if type(a+b) == str:
- yield a+b
- else: yield x
- except TypeError:
- if type(a) == str:
- yield a
- else:
- yield b
- @fb
- def fizzbuzz4(n=100):
- fizz = {x*3 for x in range(1, n//3+1)}
- buzz = {x*5 for x in range(1, n//5+1)}
- fizzbuzz = fizz & buzz
- for x in range(1, n+1):
- if x in fizzbuzz:
- yield 'fizzbuzz'
- elif x in fizz:
- yield 'fizz'
- elif x in buzz:
- yield 'buzz'
- else: yield x
- @fb
- def fizzbuzz5(n=100):
- ''' Hack! '''
- l = (0,0,'fizz',0,'buzz','fizz',0,0,'fizz','buzz',0,'fizz',0,0,'fizzbuzz')
- return (y if y else x for x,y in zip(range(1, n+1), itertools.cycle(l)))
- @fb
- def fizzbuzz6(n=100):
- l = list(range(1, n+1))
- l[2::3] = ['fizz'] * len(l[2::3])
- l[4::5] = ['buzz'] * len(l[4::5])
- l[14::15] = ['fizzbuzz'] * len(l[14::15])
- yield from l
- @fb
- def fizzbuzz7(n=100):
- l = list(range(1, n+1))
- l[2::3] = ['fizz' for __ in range(len(l[2::3]))]
- l[4::5] = ['buzz' for __ in range(len(l[4::5]))]
- l[14::15] = ['fizzbuzz' for __ in range(len(l[14::15]))]
- yield from l
- @fb
- def fizzbuzz8(n=100):
- for x in range(1, n+1):
- ret = ''
- if x%3 == 0:
- ret = 'fizz'
- if x%5 == 0:
- ret += 'buzz'
- if ret:
- yield ret
- else:
- yield x
- @fb
- def fizzbuzz9(n=100):
- l = list(range(1, n+1))
- l[2::3] = ['fizz'] * (n // 3)
- l[4::5] = ['buzz'] * (n // 5)
- l[14::15] = ['fizzbuzz'] * (n // 15)
- yield from l
- # Production ready.
- @fb
- def fizzbuzz_one(n=100):
- for i in range(1, n+1):
- str_ = ''
- if not i % 3:
- str_ = 'fizz'
- if not i % 5:
- str_ += 'buzz'
- if str_:
- yield str_
- else:
- yield i
- # Production ready, a bit faster.
- @fb
- def fizzbuzz_two(n=100):
- for i in range(1, n+1):
- if not i % 15:
- yield 'fizzbuzz'
- continue
- if not i % 3:
- yield 'fizz'
- continue
- if not i % 5:
- yield 'buzz'
- continue
- yield i
- def check(fbs, n=10000):
- fbs = [fb(n) for fb in fbs]
- for __ in range(1, n+1):
- assert len({next(fb) for fb in fbs}) == 1
- check(fbs)
- import timeit
- N = 1000
- results = []
- for fb in fbs:
- elapsed = timeit.timeit('list(fb())', number=N, globals={'fb': fb})
- results.append((fb, elapsed))
- for fb, elapsed in sorted(fb_t, key=operator.itemgetter(1)):
- print('name: {}, time: {:0.2f}µs'.format(fb.__name__, elapsed / N * 1e6))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement