Solution for http://play.elevatorsaga.com/
Best level: http://play.elevatorsaga.com/#challenge=6
Solution for http://play.elevatorsaga.com/
Best level: http://play.elevatorsaga.com/#challenge=6
{ | |
init(elevators, floors) { | |
floors.forEach((floor) => { | |
floor.on('up_button_pressed', () => { | |
floor.up = true | |
}) | |
floor.on('down_button_pressed', () => { | |
floor.down = true | |
}) | |
}) | |
elevators.forEach((elevator) => { | |
elevator.on('floor_button_pressed', (floorNum) => { | |
smartAddDest(elevator, floorNum) | |
}) | |
elevator.on('passing_floor', (floorNum, direction) => { | |
let floor = floors[floorNum] | |
if (floor[direction] && elevator.loadFactor() < 0.8) { | |
elevator.goToFloor(floorNum, true) | |
floor[direction] = false | |
} | |
}) | |
elevator.on('stopped_at_floor', (floorNum) => { | |
const floor = floors[floorNum] | |
floor[elevator.destinationDirection()] = false | |
removeFloorFromQueue(elevator, floorNum) | |
}) | |
elevator.on('idle', () => { | |
const destFloor = findFurthestFloor(elevator.currentFloor()) | |
if (destFloor != null) { | |
elevator.goToFloor(destFloor.floorNum()) | |
destFloor.up = false | |
destFloor.down = false | |
} | |
}) | |
}) | |
function findFurthestFloor(currentFloor) { | |
return floors.filter(floor => floor.up || floor.down) | |
.sort((floor) => -Math.abs(floor.floorNum - currentFloor))[0] | |
} | |
function removeFloorFromQueue(elevator, floorNum) { | |
const filteredDestinationQueue = elevator.destinationQueue.filter((i) => i !== floorNum) | |
if (elevator.destinationQueue.length !== filteredDestinationQueue.length) { | |
elevator.destinationQueue = filteredDestinationQueue | |
elevator.checkDestinationQueue() | |
} | |
} | |
function smartAddDest(elevator, floorNum) { | |
const queue = elevator.destinationQueue | |
if (queue.includes(floorNum)) { | |
return | |
} | |
queue.push(floorNum) | |
let direction = elevator.destinationDirection() | |
const current = elevator.currentFloor() | |
if (direction === 'stopped') { | |
const closet = queue.sort((num) => Math.abs(num - current))[0] | |
direction = (closet - current > 0) ? 'up' : 'down' | |
} | |
if (direction === 'up') { | |
queue.sort((dest) => (dest - current) % floors.length) | |
} else { // 'down' | |
queue.sort((dest) => (current - dest) % floors.length) | |
} | |
elevator.checkDestinationQueue() | |
} | |
}, | |
update(dt, elevators, floors) { | |
function findFurthestFloor(currentFloor) { | |
return floors.filter(floor => floor.up || floor.down) | |
.sort((floor) => -Math.abs(floor.floorNum - currentFloor))[0] | |
} | |
elevators.filter((elevator) => elevator.loadFactor() === 0) | |
.filter((elevator) => elevator.destinationDirection() === 'stopped ') | |
.forEach((elevator) => { | |
const destFloor = findFurthestFloor(elevator.currentFloor()) | |
if (destFloor != null) { | |
elevator.goToFloor(destFloor.floorNum()) | |
destFloor.up = false | |
destFloor.down = false | |
} | |
}) | |
} | |
} |