summaryrefslogtreecommitdiffstats
path: root/elevator.py
blob: 9469c9a72dbf9422011311a59a988d04713fa509 (plain)
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
#!/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)