Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Python OOP Retake Exam - 22 Aug 2020 - Hotel Everland
- # https://judge.softuni.org/Contests/Practice/Index/2472#1
- =============================================================================================
- # file name: appliance.py
- from abc import ABC
- class Appliance(ABC):
- def __init__(self, cost: float):
- self.cost = cost # cost for a single day!
- def get_monthly_expense(self):
- return self.cost * 30
- =============================================================================================
- # file name: fridge.py
- from project.appliances.appliance import Appliance
- class Fridge(Appliance):
- COST = 1.2
- def __init__(self):
- super().__init__(self.COST)
- self.cost = self.COST
- def get_monthly_expense(self):
- return self.cost * 30
- def calculate_cost(self, toys_cost):
- total_cost = 0
- for cost in toys_cost:
- total_cost += cost
- return total_cost + self.get_monthly_expense()
- =============================================================================================
- # file name: laptop.py
- from project.appliances.appliance import Appliance
- class Laptop(Appliance):
- COST = 1
- def __init__(self):
- super().__init__(self.COST)
- self.cost = self.COST
- def get_monthly_expense(self):
- return self.cost * 30
- def calculate_cost(self, toys_cost):
- total_cost = 0
- for cost in toys_cost:
- total_cost += cost
- return total_cost + self.get_monthly_expense()
- =============================================================================================
- # file name: stove.py
- from project.appliances.appliance import Appliance
- class Stove(Appliance):
- COST = 0.7
- def __init__(self):
- super().__init__(self.COST)
- self.cost = self.COST
- def get_monthly_expense(self):
- return self.cost * 30
- def calculate_cost(self, toys_cost):
- total_cost = 0
- for cost in toys_cost:
- total_cost += cost
- return total_cost + self.get_monthly_expense()
- =============================================================================================
- # file name: tv.py
- from project.appliances.appliance import Appliance
- class TV(Appliance):
- COST = 1.5
- def __init__(self):
- super().__init__(self.COST)
- self.cost = self.COST
- def get_monthly_expense(self):
- return self.cost * 30
- def calculate_cost(self, toys_cost):
- total_cost = 0
- for cost in toys_cost:
- total_cost += cost
- return total_cost + self.get_monthly_expense()
- =============================================================================================
- # file name: child.py
- class Child:
- def __init__(self, food_cost: int, *toys_cost):
- self.food_cost = food_cost
- self.cost = sum(x for x in toys_cost) + self.food_cost
- =============================================================================================
- # file name: room.py
- class Room:
- def __init__(self, name: str, budget: float, members_count: int):
- self.family_name = name
- self.budget = budget
- self.members_count = members_count
- self.children = [] # will contain all kids in that room (objects)!
- self.expenses = self.calculate_expenses()
- @property
- def expenses(self):
- return self.__expenses
- @expenses.setter
- def expenses(self, value):
- if value < 0:
- raise ValueError("Expenses cannot be negative")
- self.__expenses = value
- @staticmethod
- def calculate_expenses(*args):
- total_expenses = 0
- for el in args:
- for sub_el in el:
- if type(sub_el).__name__ != 'Child':
- total_expenses += sub_el.get_monthly_expense()
- else:
- total_expenses += sub_el.cost * 30
- return total_expenses
- @staticmethod
- def child_cost(children):
- total_cost = 0
- for child in children:
- total_cost += child.cost
- return total_cost
- =============================================================================================
- # file name: alone_old.py
- from project.rooms.room import Room
- class AloneOld(Room):
- def __init__(self, family_name: str, pension: float):
- super().__init__(family_name, pension, 1)
- self.family_name = family_name
- self.budget = pension
- self.members_count = 1
- self.room_cost = 10
- self.appliances = []
- =============================================================================================
- # file name: alone_young.py
- from project.appliances.tv import TV
- from project.rooms.room import Room
- class AloneYoung(Room):
- def __init__(self, family_name: str, salary: float):
- super().__init__(family_name, salary, 1)
- self.family_name = family_name
- self.budget = salary
- self.members_count = 1
- self.appliances = [TV()]
- self.room_cost = 10
- self.expenses = self.calculate_expenses(self.appliances)
- =============================================================================================
- # file name: old_couple.py
- from project.appliances.fridge import Fridge
- from project.appliances.stove import Stove
- from project.appliances.tv import TV
- from project.rooms.room import Room
- class OldCouple(Room):
- def __init__(self, family_name: str, pension_one: float, pension_two: float):
- super().__init__(family_name, pension_one + pension_two, 2)
- self.family_name = family_name
- self.budget = pension_one + pension_two
- self.appliances = [TV(), TV(), Fridge(), Fridge(), Stove(), Stove()]
- self.room_cost = 15
- self.expenses = self.calculate_expenses(self.appliances)
- =============================================================================================
- # file name: young_couple.py
- from project.appliances.fridge import Fridge
- from project.appliances.laptop import Laptop
- from project.appliances.tv import TV
- from project.rooms.room import Room
- class YoungCouple(Room):
- def __init__(self, family_name: str, salary_one: float, salary_two: float):
- super().__init__(family_name, salary_one + salary_two, 2)
- self.family_name = family_name
- self.budget = salary_one + salary_two
- self.members_count = 2
- self.appliances = [TV(), TV(), Fridge(), Fridge(), Laptop(), Laptop()]
- self.room_cost = 20
- self.expenses = self.calculate_expenses(self.appliances)
- =============================================================================================
- # file name: young_couple_with_children.py
- from project.appliances.fridge import Fridge
- from project.appliances.laptop import Laptop
- from project.appliances.tv import TV
- from project.rooms.room import Room
- class YoungCoupleWithChildren(Room):
- def __init__(self, family_name: str, salary_one: float, salary_two: float, *children):
- super().__init__(family_name, salary_two + salary_one, 2 + len(children))
- self.family_name = family_name
- self.budget = salary_one + salary_two
- self.children = [*children]
- self.members_count = 2 + len(children)
- self.room_cost = 30
- self.appliances = [TV(), TV(), Fridge(), Fridge(), Laptop(), Laptop()]
- self.appliances.extend(self.extra_items(children))
- self.expenses = self.calculate_expenses(self.appliances, children)
- @staticmethod
- def extra_items(children):
- extra_items_need = []
- for _ in children:
- extra_items_need.extend([TV(), Fridge(), Laptop()])
- return [*extra_items_need]
- =============================================================================================
- # file name: everland.py
- from project.rooms.room import Room
- class Everland:
- def __init__(self):
- self.rooms = []
- def add_room(self, room: Room):
- if room not in self.rooms:
- self.rooms.append(room)
- def get_monthly_consumptions(self):
- total_sum = 0
- for room in self.rooms:
- total_sum += room.expenses + room.room_cost
- return f"Monthly consumption: {total_sum:.2f}$."
- def pay(self):
- result = []
- for room in self.rooms:
- if room.budget >= room.expenses + room.room_cost:
- room.budget -= (room.expenses + room.room_cost)
- result.append(f"{room.family_name} paid {room.expenses + room.room_cost:.2f}$ and have {room.budget:.2f}$ left.")
- else:
- result.append(f"{room.family_name} does not have enough budget and must leave the hotel.")
- self.rooms.remove(room)
- return '\n'.join(result)
- def status(self):
- total_population = sum([p.members_count for p in self.rooms])
- result = [f'Total population: {total_population}']
- for room in self.rooms:
- child_exp = sum([c.cost for c in room.children]) * 30
- if not child_exp:
- child_exp = 0
- current_budget = room.budget
- result.append(f'{room.family_name} with {room.members_count} members. '
- f'Budget: {current_budget:.2f}$, Expenses: {room.expenses:.2f}$')
- for index, child in enumerate(room.children):
- result.append(f'--- Child {index + 1} monthly cost: {room.children[index].cost*30:.2f}$')
- result.append(f'--- Appliances monthly cost: '
- f'{(room.expenses - child_exp):.2f}$')
- return '\n'.join(result)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement