Skip to content

Instantly share code, notes, and snippets.

@1tgr
Last active March 8, 2021 18:55
Show Gist options
  • Save 1tgr/7671819fe09f9f5d1e179a69bf7db555 to your computer and use it in GitHub Desktop.
Save 1tgr/7671819fe09f9f5d1e179a69bf7db555 to your computer and use it in GitHub Desktop.
// https://play.elevatorsaga.com
{
init: function(elevators, floors) {
function anyoneWaiting(e) {
var c = e.currentFloor();
var dest = _.head(e.destinationQueue);
var bs = floors[c].buttonStates;
if (dest === undefined || dest == c)
return !!bs.up || !!bs.down;
/*else if (dest > c)
return !!bs.up;
else
return !!bs.down;*/
else
return false;
}
function nextPressedFloor(e) {
var c = e.currentFloor();
var dest = _.head(e.destinationQueue);
var fs = e.getPressedFloors();
if (dest === undefined || dest == c) {
return _.min(fs, f => Math.abs(f - c));
} else if (dest > c) {
fs = _.filter(fs, f => f > c);
return fs.length == 0 ? _.max(e.getPressedFloors()) : _.min(fs);
} else {
fs = _.filter(fs, f => f < c);
return fs.length == 0 ? _.min(e.getPressedFloors()) : _.max(fs);
}
}
function nextCalledFloor(e, dest, u, d) {
var c = e.currentFloor();
if (dest === undefined || !_.isFinite(dest))
dest = c;
if (e.maxPassengerCount() > 5) {
u = _.filter(u, n => n == 0);
d = _.filter(d, n => n == 0);
}
var called;
if (dest == c) {
if (!_.includes(e.getPressedFloors(), c)) {
called = _.min(_.flatten([u, d]), f => Math.abs(f - c));
}
} else if (dest > c) {
called = _.min(_.filter(u, n => n > c));
} else {
called = _.max(_.filter(d, n => n < c));
}
return called === undefined || !_.isFinite(called)
? { dest: dest, called: false }
: { dest: called, called: true };
}
function goAll() {
var u = {};
var d = {};
_.each(floors, f => {
if (f.buttonStates.up == "activated")
u[f.level.toString()] = f.level;
if (f.buttonStates.down == "activated")
d[f.level.toString()] = f.level;
});
_.each(elevators, (e, index) => {
var c = e.currentFloor();
var pressedDest, dest;
if (e.loadFactor() < 0.5 && anyoneWaiting(e)) {
pressedDest = c;
dest = { dest: c, called: true };
} else {
pressedDest = nextPressedFloor(e);
dest = nextCalledFloor(e, pressedDest, _.values(u), _.values(d));
}
var { dest, called } = dest;
if (called) {
delete u[dest.toString()];
delete d[dest.toString()];
e.goingUpIndicator(dest >= c);
e.goingDownIndicator(dest <= c);
} else {
e.goingUpIndicator(false);
e.goingDownIndicator(false);
}
e.destinationQueue = [dest];
e.checkDestinationQueue();
});
}
_.forEach(floors, floor => {
floor.on("up_button_pressed", goAll);
floor.on("down_button_pressed", goAll);
});
_.each(elevators, elevator => {
elevator.on("idle", goAll);
elevator.on("floor_button_pressed", goAll);
elevator.on("stopped_at_floor", goAll);
});
},
update: function(dt, elevators, floors) {
// We normally don't need to do anything here
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment