Advertisement
UniQuet0p1

Untitled

Oct 19th, 2020
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. """Train Station."""
  2.  
  3.  
  4. class Passenger:
  5. """Passenger class."""
  6.  
  7. def __init__(self, passenger_id: str, seat: str):
  8. """Passenger constructor."""
  9. self._id = passenger_id
  10. self._seat = seat
  11.  
  12. @property
  13. def id(self) -> str:
  14. """Id getter."""
  15. return self._id
  16.  
  17. @property
  18. def seat(self) -> str:
  19. """Seat getter."""
  20. return self._seat
  21.  
  22. @property
  23. def train_id(self):
  24. """Train id getter."""
  25. return self._seat.split("-")[0]
  26.  
  27. @property
  28. def carriage(self):
  29. """Train id getter."""
  30. return self._seat.split("-")[1]
  31.  
  32. @property
  33. def place(self):
  34. """Train id getter."""
  35. return self._seat.split("-")[2]
  36.  
  37. @property
  38. def _dict(self):
  39. """Dict form of Passenger."""
  40. return self.__dict__
  41.  
  42. def __repr__(self):
  43. return f"{self.train_id} {self._id}"
  44.  
  45.  
  46. def check_passenger_may_be_added(passenger: Passenger, train):
  47. """Function for distribute passengers."""
  48. if passenger.train_id != train.train_id:
  49. return False
  50. if 1 > int(passenger.carriage) or int(passenger.carriage) > train.carriages or \
  51. 1 > int(passenger.place) or int(passenger.place) > train.seats_in_carriage:
  52. return False
  53. for pas in train.passengers:
  54. if passenger.carriage == pas.carriage and passenger.place == pas.place:
  55. return False
  56. return True
  57.  
  58.  
  59. class Train:
  60. """Train class."""
  61.  
  62. def __init__(self, train_id: str, carriages: int, seats_in_carriage: int):
  63. """Train constructor."""
  64. self._train_id = train_id
  65. self._carriages = carriages
  66. self._seats_in_carriage = seats_in_carriage
  67. self._passengers = []
  68.  
  69. @property
  70. def carriages(self) -> int:
  71. """Carriage getter."""
  72. return self._carriages
  73.  
  74. @property
  75. def train_id(self) -> str:
  76. """Train id getter."""
  77. return self._train_id
  78.  
  79. @property
  80. def seats_in_carriage(self) -> int:
  81. """Seat count in carriage getter."""
  82. return self._seats_in_carriage
  83.  
  84. @property
  85. def passengers(self) -> list:
  86. """Passenger list getter."""
  87. return self._passengers
  88.  
  89. def get_seats_in_train(self) -> int:
  90. """Seat count in train getter."""
  91. return self._carriages * self._seats_in_carriage
  92.  
  93. def get_number_of_passengers(self) -> int:
  94. """Passenger count in train getter."""
  95. return len(self._passengers)
  96.  
  97. def get_passengers_in_carriages(self) -> dict:
  98. """Gog."""
  99. passengers_in_carriage = {str(x): [] for x in range(1, self._carriages + 1)}
  100. for passenger in self._passengers:
  101. if passenger.carriage in passengers_in_carriage:
  102. passengers_in_carriage[passenger.carriage].append(passenger)
  103. return passengers_in_carriage
  104.  
  105. @train_id.setter
  106. def train_id(self, value: str):
  107. """Train id setter."""
  108. self._train_id = value
  109.  
  110. @carriages.setter
  111. def carriages(self, value: int):
  112. """Carriage setter."""
  113. self._carriages = value if value >= 0 else self._carriages
  114.  
  115. @seats_in_carriage.setter
  116. def seats_in_carriage(self, value: int):
  117. """Seat count in carriage setter."""
  118. self._seats_in_carriage = value if value >= 0 else self._seats_in_carriage
  119.  
  120. def add_passenger(self, passenger: Passenger) -> Passenger:
  121. """Add passenger to passengers."""
  122. if check_passenger_may_be_added(passenger, self):
  123. self._passengers.append(passenger)
  124. return passenger
  125.  
  126. @property
  127. def to_dict(self):
  128. """Dict form of Train."""
  129. return {'train_id': self.train_id,
  130. 'carriages': self.carriages,
  131. 'seats': f'{self.get_number_of_passengers()}/{self.get_seats_in_train()}'}
  132.  
  133.  
  134. class TrainStation:
  135. """Train station."""
  136.  
  137. def __init__(self, trains: list, passengers: list):
  138. """Train station constructor."""
  139. self._trains = trains
  140. self._passengers = passengers
  141. self.distribute_passengers()
  142.  
  143. def distribute_passengers(self):
  144. """Distribute passengers to trains."""
  145. trains_dict = {train.train_id: train for train in self._trains}
  146. gatecrashers = []
  147. for pas in self._passengers:
  148. if pas.train_id in trains_dict and check_passenger_may_be_added(pas, trains_dict[pas.train_id]):
  149. trains_dict[pas.train_id].add_passenger(pas)
  150. else:
  151. gatecrashers.append(pas)
  152. self._passengers = [pas for pas in self._passengers if pas not in gatecrashers]
  153.  
  154. def get_station_overview(self) -> list:
  155. """Hz."""
  156. return [train.to_dict for train in self._trains]
  157.  
  158. def get_number_of_passengers(self) -> int:
  159. """Hz."""
  160. return len(self._passengers)
  161.  
  162. @property
  163. def passengers(self) -> list:
  164. """Passenger list getter."""
  165. return self._passengers
  166.  
  167. @passengers.setter
  168. def passengers(self, value_list: list):
  169. """Passenger list setter."""
  170. self._passengers = value_list
  171.  
  172. @property
  173. def trains(self) -> list:
  174. """Train list getter."""
  175. return self._trains
  176.  
  177. @trains.setter
  178. def trains(self, value_list: list):
  179. """Train list setter."""
  180. self.trains = value_list
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement