Эх сурвалжийг харах

elevator direction, multiple dropoffs

raylu 9 жил өмнө
parent
commit
c4bfe29b8f
1 өөрчлөгдсөн 42 нэмэгдсэн , 7 устгасан
  1. 42 7
      elevator.py

+ 42 - 7
elevator.py

@@ -7,6 +7,37 @@ class Elevator:
 		self.id = e_id
 		self.floor = floor
 		self.goal = goal
+		self.dropoffs = []
+
+	def direction(self):
+		if self.goal is None:
+			return None
+		if self.goal > self.floor:
+			return Direction.UP
+		else:
+			return Direction.DOWN
+
+	def dropoff(self, floor):
+		if floor in self.dropoffs:
+			assert self.goal is not None
+			return
+		assert floor != self.floor
+
+		if self.goal is None:
+			self.goal = floor
+			self.dropoffs.append(floor)
+		else:
+			direction = self.direction()
+			if direction == Direction.UP:
+				if floor > self.goal:
+					self.goal = floor
+				self.dropoffs.append(floor)
+				self.dropoffs.sort()
+			elif direction == Direction.DOWN:
+				if floor < self.goal:
+					self.goal = floor
+				self.dropoffs.append(floor)
+				self.dropoffs.sort(reverse=True)
 
 	def __repr__(self):
 		attrs = ', '.join('%s=%s' % t for t in self.__dict__.items())
@@ -25,7 +56,7 @@ class ElevatorControlSystem:
 		self.pickup_requests.append((floor, direction))
 
 	def dropoff(self, elevator_id, floor):
-		self.elevators[elevator_id].goal = floor
+		self.elevators[elevator_id].dropoff(floor)
 
 	def step(self):
 		# serve pickup requests
@@ -42,29 +73,33 @@ class ElevatorControlSystem:
 					elevator.floor += 1
 				elif elevator.goal < elevator.floor:
 					elevator.floor -= 1
-				# check goal after moving
+				# check dropoffs and goal after moving
+				if elevator.dropoffs and elevator.dropoffs[0] == elevator.floor:
+					elevator.dropoffs = elevator.dropoffs[1:]
 				if elevator.goal == elevator.floor:
 					elevator.goal = None
 
 if __name__ == '__main__':
 	ecs = ElevatorControlSystem(2)
-	print(ecs.elevators)
+	print(' '*4, ecs.elevators)
 
 	print('requesting pickup on floor 2 down')
 	ecs.pickup(2, Direction.DOWN)
 	ecs.step()
-	print(ecs.elevators)
+	print(' '*4, ecs.elevators)
 
 	print('requesting dropoff on floor 1 and pickup on floor 1 up')
 	ecs.dropoff(0, 1)
 	ecs.pickup(1, Direction.UP)
 	ecs.step()
-	print(ecs.elevators)
+	print(' '*4, ecs.elevators)
 
 	print('requesting dropoff on floor 3')
 	ecs.dropoff(1, 3)
 	ecs.step()
-	print(ecs.elevators)
+	print(' '*4, ecs.elevators)
 
+	print('requesting pickup on floor 2 up')
+	ecs.pickup(2, Direction.UP)
 	ecs.step()
-	print(ecs.elevators)
+	print(' '*4, ecs.elevators)