瀏覽代碼

Pass challenges 1-8

master
Ashton Charbonneau 5 年之前
父節點
當前提交
84ae3d5bc9
共有 1 個檔案被更改,包括 72 行新增51 行删除
  1. 72
    51
      elevator.js

+ 72
- 51
elevator.js 查看文件

@@ -1,76 +1,97 @@
1 1
 {
2 2
 	init: function(elevators, floors) {
3 3
 		console.clear();
4
-		console.log("----" + "\n");
5 4
 		console.log("Starting...");
6
-		console.log("----" + "\n");
7 5
 
8
-		let floorCount = floors.length;
9
-		let bottomFloor = 0;
10
-		let topFloor = floorCount - 1;
6
+		// Get elevator/building info
7
+		let floorCount    = floors.length;
8
+		let bottomFloor   = 0;
9
+		let topFloor      = floorCount - 1;
11 10
 		let elevatorCount = elevators.length;
12 11
 
13
-		let upRequestFloorSet = new Set();
14
-		let downRequestFloorSet = new Set();
12
+		// Direction/status constants
13
+		const UP   = 0;
14
+		const DOWN = 1;
15
+		const IDLE = 2;
16
+
17
+		// Create a data structure for floor requests
18
+		let requests = [new Set(), new Set()];
15 19
 
16 20
 		// Register floor button presses
17 21
 		floors.forEach(function (floor) {
18
-			floor.on("up_button_pressed", function() {
19
-				console.log("Up request: " + floor.level);
20
-				upRequestFloorSet.add(floor.floorNum);
21
-			});
22
-
23
-			floor.on("down_button_pressed", function() {
24
-				console.log("Down request: " + floor.level);
25
-				downRequestFloorSet.add(floor.floorNum);
26
-			});
22
+			floor.on("up_button_pressed", function() { requests[UP].add(floor.floorNum); });
23
+			floor.on("down_button_pressed", function() { requests[DOWN].add(floor.floorNum); });
27 24
 		});
28 25
 
26
+
27
+		// ----
28
+		// Functions
29
+		// ----
30
+
31
+		function getClosestFloor(currentFloor, floorList){
32
+			let distance = floorCount;
33
+			let closestFloor = currentFloor;
34
+			floorList.forEach(function(floorNum) {
35
+				let newDistance = Math.abs(currentFloor - floorNum);
36
+				if (newDistance < distance) {
37
+					closestFloor = floorNum;
38
+					distance = newDistance;
39
+				}
40
+			})
41
+			return closestFloor;
42
+		}
43
+
44
+		// ----
29 45
 		// Individual elevators
30
-		let elevator = elevators[0];
31
-		let elevatorIndex = elevators.indexOf(elevator);
46
+		// ----
32 47
 
33
-		let destinationSet = new Set();
48
+		elevators.forEach(function (elevator) {
49
+		elevator.on("floor_button_pressed", function(floorNum) { destinations.add(floorNum); });
34 50
 
35
-		let defaultRange = [
36
-			(elevatorIndex + 0) * Math.floor(floorCount / (elevatorCount + 1)),
37
-			(elevatorIndex + 1) * Math.floor(floorCount / (elevatorCount + 1)),
38
-			(elevatorIndex + 2) * Math.floor(floorCount / (elevatorCount + 1))
39
-		]
51
+		// Basic elevator info
52
+		const elevatorIndex = elevators.indexOf(elevator);
53
+			const restFloors = [
54
+				(elevatorIndex + 0) * Math.floor(floorCount / (elevatorCount + 1)),
55
+				(elevatorIndex + 1) * Math.floor(floorCount / (elevatorCount + 1)),
56
+				(elevatorIndex + 2) * Math.floor(floorCount / (elevatorCount + 1))
57
+			]
40 58
 
41
-		// Elevator starts on floor 0; must be going up
42
-		elevator.goingUpIndicator(true);
43
-		elevator.goingDownIndicator(false);
59
+			// Elevator variables
60
+			let status = UP;
61
+			let destinations = new Set();
44 62
 
45
-		// Go to designated starting floor
46
-		console.log("Sending elevator[" + elevatorIndex + "] to floor[" + defaultRange[0] + "]")
47
-		elevator.goToFloor((elevatorIndex + 0) * Math.floor(floorCount / (elevatorCount + 1)));
63
+			// Go to designated starting floor
64
+			console.log("Sending elevator[" + elevatorIndex + "] to floor[" + restFloors[0] + "]")
65
+			elevator.goToFloor(restFloors[0]);
48 66
 
49
-		elevator.on("idle", function() {
50
-			console.log("Idle...");
51
-			elevator.goingUpIndicator(false);
52
-			elevator.goingDownIndicator(false);
53
-		});
67
+			elevator.on("idle", function() {
68
+				status = IDLE;
69
+				if (requests[UP].size == 0 && requests[DOWN].size == 0 && destinations.size == 0) {
70
+					elevator.goToFloor(restFloors[1]);
71
+				} else {
72
+					let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]);
73
+					elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops));
74
+				}
75
+			});
54 76
 
55
-		elevator.on("floor_button_pressed", function(floorNum) {
56
-			console.log("Floor pressed: " + floorNum);
57
-			destinationSet.add(floorNum);
58
-			elevator.goToFloor(floorNum);
59
-		});
77
+			elevator.on("passing_floor", function(floorNum, direction) {
78
+				if(requests[UP].has(floorNum) || requests[DOWN].has(floorNum) || destinations.has(floorNum)) {
79
+					elevator.goToFloor(floorNum, true);
80
+				}
81
+			});
60 82
 
61
-		elevator.on("passing_floor", function(floorNum, direction) {
62
-			if(upRequestFloorSet.has(floorNum) || downRequestFloorSet.has(floorNum) || destinationSet.has(floorNum)) {
63
-				elevator.goToFloor(floorNum);
64
-			}
65
-		});
83
+			elevator.on("stopped_at_floor", function(floorNum) {
84
+				requests[UP].delete(floorNum);
85
+				requests[DOWN].delete(floorNum);
86
+				destinations.delete(floorNum);
66 87
 
67
-		elevator.on("stopped_at_floor", function(floorNum) {
68
-			console.log("Stopped at: " + floorNum);
69
-			upRequestFloorSet.delete(floorNum);
70
-			downRequestFloorSet.delete(floorNum);
71
-			destinationSet.delete(floorNum);
88
+				if (destinations.size > 0 || requests[UP] > 0 || requests[DOWN] > 0) {
89
+					let allStops = new Set([...destinations, ...requests[UP], ...requests[DOWN]]);
90
+					elevator.goToFloor(getClosestFloor(elevator.currentFloor(), allStops));
91
+				}
92
+			});
72 93
 		});
73 94
 	},
74 95
 
75 96
 	update: function(dt, elevators, floors) {}
76
-}
97
+}

Loading…
取消
儲存