Skip to content

Instantly share code, notes, and snippets.

@vmasek
Created March 22, 2017 22:15
Show Gist options
  • Save vmasek/77da25108e55fad8ed055c37193bd0f0 to your computer and use it in GitHub Desktop.
Save vmasek/77da25108e55fad8ed055c37193bd0f0 to your computer and use it in GitHub Desktop.
ALVAO drone road repair task

How to run

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

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