-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfizbuz.py
63 lines (43 loc) · 1.5 KB
/
fizbuz.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from dataclasses import dataclass
from typing import Callable
def generate_fizbuz_answers(answers_count: int) -> list[str]:
results = []
for number in range(1, answers_count + 1):
results.append(compile_result(number))
return results
@dataclass
class FizzBuzzResult:
fizz: int = 0
buzz: int = 0
def __add__(self, other: 'FizzBuzzResult') -> 'FizzBuzzResult':
fizzes = self.fizz + other.fizz
buzzes = self.buzz + other.buzz
return FizzBuzzResult(fizz=fizzes, buzz=buzzes)
def get_fizbuz(number: int) -> FizzBuzzResult:
result = FizzBuzzResult()
if number % 3 == 0:
result.fizz += 1
if number % 5 == 0:
result.buzz += 1
return result
def get_extended_fizbuz(number: int) -> FizzBuzzResult:
result = FizzBuzzResult()
if '3' in str(number):
result.fizz += 1
if '5' in str(number):
result.buzz += 1
return result
def compile_result(number):
scoring_function: list[Callable[[int], FizzBuzzResult]] = [get_fizbuz, get_extended_fizbuz]
scores = list(map(lambda x: x(number), scoring_function))
summary_fizbuz = FizzBuzzResult()
for score in scores:
summary_fizbuz += score
default = str(number)
result = 'Fizz' * summary_fizbuz.fizz + 'Buzz' * summary_fizbuz.buzz
result = result or default # use number themselves if no rule for given number
return result
def main():
print(*generate_fizbuz_answers(100), sep='\n')
if __name__ == '__main__':
main()