Advertisement
Guest User

Untitled

a guest
Jun 26th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. import itertools
  2. import functools
  3. import operator
  4.  
  5. fbs = []
  6. def fb(f):
  7. fbs.append(f)
  8. return f
  9.  
  10. @fb
  11. def fizzbuzz0(n=100):
  12. for x in range(1, n+1):
  13. if x%3 == 0 and x%5 == 0:
  14. yield 'fizzbuzz'
  15. elif x%3 == 0:
  16. yield 'fizz'
  17. elif x%5 == 0:
  18. yield 'buzz'
  19. else:
  20. yield x
  21.  
  22. @fb
  23. def fizzbuzz1(n=100):
  24. for x in range(1, n+1):
  25. l = [[x, 'buzz'],
  26. ['fizz', 'fizzbuzz']]
  27. yield l[x%3==0][x%5==0]
  28.  
  29. @fb
  30. def fizzbuzz2(n=100):
  31. for x in range(1, n+1):
  32. l = ((x, 'buzz'),
  33. ('fizz', 'fizzbuzz'))
  34. yield l[x%3==0][x%5==0]
  35.  
  36. @fb
  37. def fizzbuzz3(n=100):
  38. for x in range(1, n+1):
  39. a = x%3 or 'fizz'
  40. b = x%5 or 'buzz'
  41. try:
  42. if type(a+b) == str:
  43. yield a+b
  44. else: yield x
  45. except TypeError:
  46. if type(a) == str:
  47. yield a
  48. else:
  49. yield b
  50.  
  51. @fb
  52. def fizzbuzz4(n=100):
  53. fizz = {x*3 for x in range(1, n//3+1)}
  54. buzz = {x*5 for x in range(1, n//5+1)}
  55. fizzbuzz = fizz & buzz
  56. for x in range(1, n+1):
  57. if x in fizzbuzz:
  58. yield 'fizzbuzz'
  59. elif x in fizz:
  60. yield 'fizz'
  61. elif x in buzz:
  62. yield 'buzz'
  63. else: yield x
  64.  
  65. @fb
  66. def fizzbuzz5(n=100):
  67. ''' Hack! '''
  68. l = (0,0,'fizz',0,'buzz','fizz',0,0,'fizz','buzz',0,'fizz',0,0,'fizzbuzz')
  69. return (y if y else x for x,y in zip(range(1, n+1), itertools.cycle(l)))
  70.  
  71. @fb
  72. def fizzbuzz6(n=100):
  73. l = list(range(1, n+1))
  74. l[2::3] = ['fizz'] * len(l[2::3])
  75. l[4::5] = ['buzz'] * len(l[4::5])
  76. l[14::15] = ['fizzbuzz'] * len(l[14::15])
  77. yield from l
  78.  
  79. @fb
  80. def fizzbuzz7(n=100):
  81. l = list(range(1, n+1))
  82. l[2::3] = ['fizz' for __ in range(len(l[2::3]))]
  83. l[4::5] = ['buzz' for __ in range(len(l[4::5]))]
  84. l[14::15] = ['fizzbuzz' for __ in range(len(l[14::15]))]
  85. yield from l
  86.  
  87. @fb
  88. def fizzbuzz8(n=100):
  89. for x in range(1, n+1):
  90. ret = ''
  91. if x%3 == 0:
  92. ret = 'fizz'
  93. if x%5 == 0:
  94. ret += 'buzz'
  95. if ret:
  96. yield ret
  97. else:
  98. yield x
  99.  
  100. @fb
  101. def fizzbuzz9(n=100):
  102. l = list(range(1, n+1))
  103. l[2::3] = ['fizz'] * (n // 3)
  104. l[4::5] = ['buzz'] * (n // 5)
  105. l[14::15] = ['fizzbuzz'] * (n // 15)
  106. yield from l
  107.  
  108. # Production ready.
  109. @fb
  110. def fizzbuzz_one(n=100):
  111. for i in range(1, n+1):
  112. str_ = ''
  113. if not i % 3:
  114. str_ = 'fizz'
  115. if not i % 5:
  116. str_ += 'buzz'
  117. if str_:
  118. yield str_
  119. else:
  120. yield i
  121.  
  122. # Production ready, a bit faster.
  123. @fb
  124. def fizzbuzz_two(n=100):
  125. for i in range(1, n+1):
  126. if not i % 15:
  127. yield 'fizzbuzz'
  128. continue
  129. if not i % 3:
  130. yield 'fizz'
  131. continue
  132. if not i % 5:
  133. yield 'buzz'
  134. continue
  135. yield i
  136.  
  137.  
  138. def check(fbs, n=10000):
  139. fbs = [fb(n) for fb in fbs]
  140. for __ in range(1, n+1):
  141. assert len({next(fb) for fb in fbs}) == 1
  142.  
  143. check(fbs)
  144.  
  145.  
  146. import timeit
  147.  
  148. N = 1000
  149. results = []
  150.  
  151. for fb in fbs:
  152. elapsed = timeit.timeit('list(fb())', number=N, globals={'fb': fb})
  153. results.append((fb, elapsed))
  154.  
  155. for fb, elapsed in sorted(fb_t, key=operator.itemgetter(1)):
  156. print('name: {}, time: {:0.2f}µs'.format(fb.__name__, elapsed / N * 1e6))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement