# FizzBuzz (again).
# 1.
# Start with the most obvious solution.
# Notice the string/number pattern repeats with a period of 15.
def fizzbuzz_base(n):
if n%3 == 0 and n%5 == 0:
return 'FizzBuzz'
if n%3 == 0:
return 'Fizz'
if n%5 == 0:
return 'Buzz'
return n
print('Ver.1 (base)')
for i in range(1, 17):
print(fizzbuzz_base(i))
# 2a.
# Combine string table created using base version with
# logical operator short-circuit (to avoid explicit if
# statement).
def fizzbuzz_table_generator():
for x in map(fizzbuzz_base, range(15)):
yield x if isinstance(x, str) else ''
def fizzbuzz(n):
return fizzbuzz.table[n % 15] or n
fizzbuzz.table = list(fizzbuzz_table_generator())
print('Ver.2a')
print(fizzbuzz.table)
for i in range(1, 17):
print(fizzbuzz(i))
# 2b.
# Combine int:string dictionary created using base version
# with input as a default argument for get method.
def fizzbuzz_table_generator():
for i in range(15):
x = fizzbuzz_base(i)
if isinstance(x, str):
yield i, x
def fizzbuzz(n):
return fizzbuzz.table.get(n % 15, n)
fizzbuzz.table = dict(fizzbuzz_table_generator())
print('Ver.2b')
print(fizzbuzz.table)
for i in range(1, 17):
print(fizzbuzz(i))
# 3.
# Combine string slicing with logical operator short-circuit.
def fizzbuzz(n):
return 'Fizz'[n%3*4:] + 'Buzz'[n%5*4:] or n
print('Ver.3')
for i in range(1, 17):
print(fizzbuzz(i))
IyBGaXp6QnV6eiAoYWdhaW4pLgoKIyAxLgojIFN0YXJ0IHdpdGggdGhlIG1vc3Qgb2J2aW91cyBzb2x1dGlvbi4KIyBOb3RpY2UgdGhlIHN0cmluZy9udW1iZXIgcGF0dGVybiByZXBlYXRzIHdpdGggYSBwZXJpb2Qgb2YgMTUuCgpkZWYgZml6emJ1enpfYmFzZShuKToKICAgIGlmIG4lMyA9PSAwIGFuZCBuJTUgPT0gMDoKICAgICAgICByZXR1cm4gJ0ZpenpCdXp6JwogICAgaWYgbiUzID09IDA6CiAgICAgICAgcmV0dXJuICdGaXp6JwogICAgaWYgbiU1ID09IDA6CiAgICAgICAgcmV0dXJuICdCdXp6JwogICAgcmV0dXJuIG4KCnByaW50KCdWZXIuMSAoYmFzZSknKQpmb3IgaSBpbiByYW5nZSgxLCAxNyk6CiAgICBwcmludChmaXp6YnV6el9iYXNlKGkpKQoKIyAyYS4KIyBDb21iaW5lIHN0cmluZyB0YWJsZSBjcmVhdGVkIHVzaW5nIGJhc2UgdmVyc2lvbiB3aXRoCiMgbG9naWNhbCBvcGVyYXRvciBzaG9ydC1jaXJjdWl0ICh0byBhdm9pZCBleHBsaWNpdCBpZgojIHN0YXRlbWVudCkuCgpkZWYgZml6emJ1enpfdGFibGVfZ2VuZXJhdG9yKCk6CiAgICBmb3IgeCBpbiBtYXAoZml6emJ1enpfYmFzZSwgcmFuZ2UoMTUpKToKICAgICAgICB5aWVsZCB4IGlmIGlzaW5zdGFuY2UoeCwgc3RyKSBlbHNlICcnCgpkZWYgZml6emJ1enoobik6CiAgICByZXR1cm4gZml6emJ1enoudGFibGVbbiAlIDE1XSBvciBuCgpmaXp6YnV6ei50YWJsZSA9IGxpc3QoZml6emJ1enpfdGFibGVfZ2VuZXJhdG9yKCkpCgpwcmludCgnVmVyLjJhJykKcHJpbnQoZml6emJ1enoudGFibGUpCmZvciBpIGluIHJhbmdlKDEsIDE3KToKICAgIHByaW50KGZpenpidXp6KGkpKQoKIyAyYi4KIyBDb21iaW5lIGludDpzdHJpbmcgZGljdGlvbmFyeSBjcmVhdGVkIHVzaW5nIGJhc2UgdmVyc2lvbgojIHdpdGggaW5wdXQgYXMgYSBkZWZhdWx0IGFyZ3VtZW50IGZvciBnZXQgbWV0aG9kLgoKZGVmIGZpenpidXp6X3RhYmxlX2dlbmVyYXRvcigpOgogICAgZm9yIGkgaW4gcmFuZ2UoMTUpOgogICAgICAgIHggPSBmaXp6YnV6el9iYXNlKGkpCiAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBzdHIpOgogICAgICAgICAgICB5aWVsZCBpLCB4CgpkZWYgZml6emJ1enoobik6CiAgICByZXR1cm4gZml6emJ1enoudGFibGUuZ2V0KG4gJSAxNSwgbikKCmZpenpidXp6LnRhYmxlID0gZGljdChmaXp6YnV6el90YWJsZV9nZW5lcmF0b3IoKSkKCnByaW50KCdWZXIuMmInKQpwcmludChmaXp6YnV6ei50YWJsZSkKZm9yIGkgaW4gcmFuZ2UoMSwgMTcpOgogICAgcHJpbnQoZml6emJ1enooaSkpCgojIDMuCiMgQ29tYmluZSBzdHJpbmcgc2xpY2luZyB3aXRoIGxvZ2ljYWwgb3BlcmF0b3Igc2hvcnQtY2lyY3VpdC4KCmRlZiBmaXp6YnV6eihuKToKICAgIHJldHVybiAnRml6eidbbiUzKjQ6XSArICdCdXp6J1tuJTUqNDpdIG9yIG4KCnByaW50KCdWZXIuMycpCmZvciBpIGluIHJhbmdlKDEsIDE3KToKICAgIHByaW50KGZpenpidXp6KGkpKQ==
Ver.1 (base)
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
Ver.2a
['FizzBuzz', '', '', 'Fizz', '', 'Buzz', 'Fizz', '', '', 'Fizz', 'Buzz', '', 'Fizz', '', '']
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
Ver.2b
{0: 'FizzBuzz', 3: 'Fizz', 5: 'Buzz', 6: 'Fizz', 9: 'Fizz', 10: 'Buzz', 12: 'Fizz'}
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
Ver.3
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16