elevator.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #!/usr/bin/env python3
  2. from enum import Enum
  3. class Elevator:
  4. def __init__(self, e_id, floor, goal):
  5. self.id = e_id
  6. self.floor = floor
  7. self.goal = goal
  8. def __repr__(self):
  9. attrs = ', '.join('%s=%s' % t for t in self.__dict__.items())
  10. return 'Elevator(%s)' % attrs
  11. class Direction(Enum):
  12. UP = 1
  13. DOWN = 2
  14. class ElevatorControlSystem:
  15. def __init__(self, num_elevators):
  16. self.elevators = {i: Elevator(i, 1, None) for i in range(num_elevators)}
  17. self.pickup_requests = []
  18. def pickup(self, floor, direction):
  19. self.pickup_requests.append((floor, direction))
  20. def dropoff(self, elevator_id, floor):
  21. self.elevators[elevator_id].goal = floor
  22. def step(self):
  23. # serve pickup requests
  24. free_elevators = list(filter(lambda e: e.goal is None, self.elevators.values()))
  25. if free_elevators:
  26. for floor, direction in self.pickup_requests:
  27. elevator = min(free_elevators, key=lambda e: abs(e.floor - floor))
  28. elevator.goal = floor
  29. # move elevators to requested floors
  30. for elevator in self.elevators.values():
  31. if elevator.goal is not None:
  32. if elevator.goal > elevator.floor:
  33. elevator.floor += 1
  34. elif elevator.goal < elevator.floor:
  35. elevator.floor -= 1
  36. # check goal after moving
  37. if elevator.goal == elevator.floor:
  38. elevator.goal = None
  39. if __name__ == '__main__':
  40. ecs = ElevatorControlSystem(1)
  41. print(ecs.elevators)
  42. print('requesting pickup on floor 2 down')
  43. ecs.pickup(2, Direction.DOWN)
  44. ecs.step()
  45. print(ecs.elevators)
  46. print('requesting dropoff on floor 1')
  47. ecs.dropoff(0, 1)
  48. ecs.step()
  49. print(ecs.elevators)