69 lines
1.3 KiB
TypeScript
69 lines
1.3 KiB
TypeScript
|
function findRotationPoint(xs: Array<string>): number {
|
||
|
// Find the rotation point in the vector.
|
||
|
let beg = 0;
|
||
|
let end = xs.length - 1;
|
||
|
|
||
|
while (beg != end) {
|
||
|
let mid = beg + Math.floor((end - beg) / 2);
|
||
|
|
||
|
if (beg === mid) {
|
||
|
return xs[beg] < xs[end] ? beg : end;
|
||
|
}
|
||
|
|
||
|
if (xs[end] <= xs[mid]) {
|
||
|
beg = mid;
|
||
|
end = end;
|
||
|
} else {
|
||
|
beg = beg;
|
||
|
end = mid;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return beg;
|
||
|
}
|
||
|
|
||
|
// Tests
|
||
|
let desc;
|
||
|
let actual;
|
||
|
let expected;
|
||
|
|
||
|
desc = "small array one";
|
||
|
actual = findRotationPoint(["cape", "cake"]);
|
||
|
expected = 1;
|
||
|
assertEquals(actual, expected, desc);
|
||
|
|
||
|
desc = "small array two";
|
||
|
actual = findRotationPoint(["cake", "cape"]);
|
||
|
expected = 0;
|
||
|
assertEquals(actual, expected, desc);
|
||
|
|
||
|
desc = "medium array";
|
||
|
actual = findRotationPoint(["grape", "orange", "plum", "radish", "apple"]);
|
||
|
expected = 4;
|
||
|
assertEquals(actual, expected, desc);
|
||
|
|
||
|
desc = "large array";
|
||
|
actual = findRotationPoint([
|
||
|
"ptolemaic",
|
||
|
"retrograde",
|
||
|
"supplant",
|
||
|
"undulate",
|
||
|
"xenoepist",
|
||
|
"asymptote",
|
||
|
"babka",
|
||
|
"banoffee",
|
||
|
"engender",
|
||
|
"karpatka",
|
||
|
"othellolagkage"
|
||
|
]);
|
||
|
expected = 5;
|
||
|
assertEquals(actual, expected, desc);
|
||
|
|
||
|
function assertEquals(a, b, desc) {
|
||
|
if (a === b) {
|
||
|
console.log(`${desc} ... PASS`);
|
||
|
} else {
|
||
|
console.log(`${desc} ... FAIL: ${a} != ${b}`);
|
||
|
}
|
||
|
}
|