| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #!/usr/bin/env python3
- from enum import Enum
- class Elevator:
- def __init__(self, e_id, floor, goal):
- self.id = e_id
- self.floor = floor
- self.goal = goal
- def __repr__(self):
- attrs = ', '.join('%s=%s' % t for t in self.__dict__.items())
- return 'Elevator(%s)' % attrs
- class Direction(Enum):
- UP = 1
- DOWN = 2
- class ElevatorControlSystem:
- def __init__(self, num_elevators):
- self.elevators = {i: Elevator(i, 1, None) for i in range(num_elevators)}
- self.pickup_requests = []
- def pickup(self, floor, direction):
- self.pickup_requests.append((floor, direction))
- def dropoff(self, elevator_id, floor):
- self.elevators[elevator_id].goal = floor
- def step(self):
- # serve pickup requests
- free_elevators = list(filter(lambda e: e.goal is None, self.elevators.values()))
- if free_elevators:
- for floor, direction in self.pickup_requests:
- elevator = min(free_elevators, key=lambda e: abs(e.floor - floor))
- elevator.goal = floor
- # move elevators to requested floors
- for elevator in self.elevators.values():
- if elevator.goal is not None:
- if elevator.goal > elevator.floor:
- elevator.floor += 1
- elif elevator.goal < elevator.floor:
- elevator.floor -= 1
- # check goal after moving
- if elevator.goal == elevator.floor:
- elevator.goal = None
- if __name__ == '__main__':
- ecs = ElevatorControlSystem(1)
- print(ecs.elevators)
- print('requesting pickup on floor 2 down')
- ecs.pickup(2, Direction.DOWN)
- ecs.step()
- print(ecs.elevators)
- print('requesting dropoff on floor 1')
- ecs.dropoff(0, 1)
- ecs.step()
- print(ecs.elevators)
|