Task is implemented in Typescript, to transpile it to JS run tsc --target ES6 road-repair.ts
,
then it should be easily runnable like with nodejs like node road-repair.js
Created
March 22, 2017 22:15
-
-
Save vmasek/77da25108e55fad8ed055c37193bd0f0 to your computer and use it in GitHub Desktop.
ALVAO drone road repair task
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface DamageRepair { | |
start: number; | |
end: number; | |
} | |
const ACCURACY_IN_CM = 1; | |
const THRESHOLD_CM = 200; | |
const OFFSET_CM = 50; | |
// centimeters of road that are damaged | |
let testDamages = [-THRESHOLD_CM, 11, 12, 13, 14, 15, 220, 221, 222, 243, 300, 550, 551]; | |
// generate test data and apply damages so data can be used for LastHolePositionCm() function | |
let testData = Array(700).fill(-THRESHOLD_CM).map((e, i) => { | |
if (i >= testDamages[1]) { | |
testDamages.shift(); | |
} | |
return testDamages[0]; | |
}); | |
// variable that stores current position of drone, used as accessor for damage data | |
let currentPositionCm = 0; | |
// this data structure is used to store the damage repairs objects, | |
// first object is just for algorithmic purposes and is sliced out when computing the LengthToRepairCm result | |
let damageRepairs: DamageRepair[] = [{ | |
start: 0, | |
end: -THRESHOLD_CM | |
}]; | |
function OnIdle(): void { | |
let currentPos = GetCurrentPositionCm(); | |
if (currentPos === LastHolePositionCm()) { | |
if (currentPos >= damageRepairs[damageRepairs.length - 1].end - OFFSET_CM + THRESHOLD_CM) { | |
damageRepairs.push({ | |
start: currentPos - OFFSET_CM > 0 ? currentPos - OFFSET_CM : 0, | |
end: currentPos + OFFSET_CM | |
}); | |
} else { | |
damageRepairs[damageRepairs.length - 1].end = currentPos + OFFSET_CM; | |
} | |
} | |
} | |
function LengthToRepairCm(): number { | |
return damageRepairs.slice(1).reduce((acc, dmg) => acc + (dmg.end - dmg.start), 0); | |
} | |
function GetCurrentPositionCm(): number { | |
return currentPositionCm; | |
} | |
function LastHolePositionCm(): number { | |
return testData[currentPositionCm]; | |
} | |
testData.forEach((dmg, i) => { | |
currentPositionCm = i; | |
OnIdle(); | |
}); | |
console.log('damageRepairs', damageRepairs); | |
console.log('LengthToRepairCm():', LengthToRepairCm()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment