Skip to content

Instantly share code, notes, and snippets.

@gapato
Created February 8, 2015 16:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gapato/f62f52f0fee216b02c9b to your computer and use it in GitHub Desktop.
Save gapato/f62f52f0fee216b02c9b to your computer and use it in GitHub Desktop.
ElevatorSaga try
{
init: function(elevators, floors) {
document.elevators = elevators;
document.way = function() {
c = this.currentFloor();
if (this.destinationQueue.length === 0) {
return null;
}
d = this.destinationQueue[0];
if (c == d) {
return 0;
}
if (c > d) {
return -1;
} else {
return 1;
}
}
document.opposite = function(e, i, a) { return -e; }
document.score = function(elevator, floor, wanted_way) {
elev_way = elevator.way();
if (elev_way > 0) {
fq = elevator.destinationQueue;
ff = floor;
fc = elevator.currentFloor();
} else {
fq = elevator.destinationQueue.map(document.opposite);
ff = -floor;
fc = -elevator.currentFloor();
}
if (wanted_way > 0) {
if (ff > fc) {
loc = 'head';
} else {
loc = 'tail';
}
} else {
loc = 'intermediate';
}
offset = 0;
elev_score = 0;
// head
[idx, elev_score] = document.head_score(fc, fq, ff, elev_score, loc != 'head');
if (loc === 'head') {
return [idx, elev_score, loc];
}
// intermediate
fq = fq.slice(idx).map(document.opposite);
ff = -ff;
[idx, elev_score] = document.head_score(fq[0], fq, ff, elev_score, loc != 'intermediate');
if (loc === 'intermediate') {
return [idx, elev_score, loc];
}
// tail
fq = fq.slice(idx).map(document.opposite);
ff = -ff;
[idx, elev_score] = document.head_score(fq[0], fq, ff, elev_score, false);
return [idx, elev_score, loc];
}
document.head_score = function(current, queue, floor, h_score, skip) {
idx = 0;
l = queue.length;
cost = h_score + floor - current;
if (l === 0) return [-1, cost];
while ((idx < l-1) || (queue[idx] < queue[idx+1])) {
if (!skip) {
if (floor === queue[idx]) { return [-2, cost]; }
if (floor > queue[idx] && floor < queue[idx+1]) { return [idx+1, cost]; }
}
idx++;
}
if (!skip) {
if (floor === queue[idx]) { return [-2, cost]; }
return [idx+1, cost];
}
return [idx, h_score+idx-current];
}
document.call_elevator = function(floor, wanted_way) {
min_score = 9999999;
min_elevator = document.elevators[0];
min_idx = -3;
document.elevators.forEach(function(e, i, a) {
[idx, score, loc] = document.score(e, floor, wanted_way);
if (score < min_score) {
min_score = score;
min_elevator = e;
min_idx = idx;
}
});
min_elevator.destinationQueue.splice(idx, 0, floor);
min_elevator.checkDestinationQueue();
}
document.insert_head = function(elevator, floor) {
idx = 0;
queue = elevator.destinationQueue;
l = queue.length;
if (l === 0) {
queue.push(floor);
return;
}
elev_way = elevator.way();
if (elev_way > 0) {
queue = queue.map(document.opposite);
ff = -floor;
}
while ((idx < l-1) || (queue[idx] < queue[idx+1])) {
if (ff === queue[idx]) { return; }
if (ff > queue[idx] && floor < queue[idx+1]) {
elevator.destinationQueue.splice(idx+1, 0, floor);
return;
}
idx++;
}
if (ff === queue[idx]) { return; }
elevator.destinationQueue.splice(idx+1, 0, floor);
}
elevators.forEach(function(elevator, idx, array) {
elevator.way = document.way;
elevator.on('floor_button_pressed', function(floor) {
console.log('pressed: '+floor);
console.log(elevator.destinationQueue);
document.insert_head(elevator, floor);
console.log(elevator.destinationQueue);
elevator.checkDestinationQueue();
});
elevator.on('stopped_at_floor', function(floor) {
q = elevator.destinationQueue;
if (elevator.goingUpIndicator()) {
if ((q.length > 0) && q[0] < elevator.currentFloor()) {
elevator.goingDownIndicator(true);
}
}
if (elevator.goingDownIndicator()) {
if ((q.length > 0) && q[0] > elevator.currentFloor()) {
elevator.goingUpIndicator(true);
}
}
});
});
floors.forEach(function(floor, idx, array) {
floor.on("up_button_pressed", function() {
console.log('called: '+floor.floorNum());
console.log(elevators[0].destinationQueue);
document.call_elevator(floor.floorNum(), 1);
console.log(elevators[0].destinationQueue);
});
floor.on("down_button_pressed", function() {
console.log('called: '+floor.floorNum());
console.log(elevators[0].destinationQueue);
document.call_elevator(floor.floorNum(), -1);
console.log(elevators[0].destinationQueue);
});
});
},
update: function(dt, elevators, floors) {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment