-
Notifications
You must be signed in to change notification settings - Fork 0
/
bill_splitter.py
88 lines (78 loc) · 3.08 KB
/
bill_splitter.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import random
def get_friend_names(friend_count: int) -> dict:
"""
Prompts the user to input the names of friends and returns a dictionary with names as the keys and zeroes as the initial values.
"""
friends_dictionary = {}
print('Enter the name of every friend (including you), each on a new line:')
for _ in range(friend_count):
friend_name = input()
friends_dictionary[friend_name] = 0
return friends_dictionary
def get_friend_count() -> int:
"""
Prompts the user to input the number of friends joining and returns the count.
"""
try:
number_of_friends = int(input('Enter the number of friends joining (including you): '))
if number_of_friends >= 1:
return number_of_friends
else:
print('No one is joining for the party')
return 0
except ValueError:
print('ValueError. Only integers are allowed.')
return 0
def get_total_bill() -> int:
"""
Prompts the user to input the total bill value and returns it.
"""
try:
total_bill_value = int(input('Enter the total bill value:\n'))
return total_bill_value
except ValueError:
print('ValueError. Only integers are allowed.')
return 0
def split_the_bill(friend_count: int, total_bill_value: int) -> int:
"""
Calculates the split bill value per friend.
"""
if total_bill_value % friend_count == 0:
return total_bill_value // friend_count
else:
return round(total_bill_value / friend_count, 2)
def apply_lucky_feature(friend_count: int, friends_dictionary: dict, total_bill_value: int) -> dict:
"""
Applies the lucky feature, where one friend is chosen randomly to not pay, and the rest share the bill.
"""
user_choice = input('Do you want to use the "Who is lucky?" feature? Write Yes/No:\n')
if user_choice == 'Yes':
lucky_friend = random.choice(list(friends_dictionary.keys()))
print(f'{lucky_friend} is the lucky one!')
adjusted_split_value = (
total_bill_value // (friend_count - 1)
if total_bill_value % (friend_count - 1) == 0
else round(total_bill_value / (friend_count - 1), 2)
)
for friend in friends_dictionary:
friends_dictionary[friend] = adjusted_split_value
friends_dictionary[lucky_friend] = 0
elif user_choice == 'No':
print('No one is going to be lucky')
else:
print('Sorry, only Yes or No are accepted as input.')
return friends_dictionary
def main():
number_of_friends = get_friend_count()
if number_of_friends == 0:
return
friends_dictionary = get_friend_names(number_of_friends)
total_bill_value = get_total_bill()
if total_bill_value == 0:
return
split_value = split_the_bill(number_of_friends, total_bill_value)
friends_dictionary = {key: split_value for key in friends_dictionary.keys()}
friends_dictionary = apply_lucky_feature(number_of_friends, friends_dictionary, total_bill_value)
print(friends_dictionary)
if __name__ == '__main__':
main()