Skip to content

Instantly share code, notes, and snippets.

@saml
Created May 13, 2016 19:53
Show Gist options
  • Save saml/6d625b98f80ee43b39e152e33a1acd19 to your computer and use it in GitHub Desktop.
Save saml/6d625b98f80ee43b39e152e33a1acd19 to your computer and use it in GitHub Desktop.
// http://hastebin.com/ubagequlal.pas
// pit bro
// find deepest pit (which is also the widest due to constraints given in the problem around strict ordering).
function Pit(start, middle, end) {
return {start: start, middle: middle, end: end};
}
var NoPit = Pit(-1, -1, -1);
function until(pred, arr, start) {
// returns last index until pred becomes false.
var n = arr.length;
var prevIndex = start;
var prev = arr[prevIndex];
for (var i = start + 1; i < n; i++) {
var curr = arr[i];
if (!pred(prev, curr)) {
break;
}
prevIndex = i;
prev = curr;
}
return prevIndex;
}
function lessThan(prev, curr) { return curr < prev; }
function greaterThan(prev, curr) { return curr > prev; }
function findPit(arr, start) {
// returns Pit
var n = arr.length;
// silde down
var middle = until(lessThan, arr, start);
if (middle <= start) {
return NoPit;
}
// ride up
var end = until(greaterThan, arr, middle);
if (end <= middle) {
return NoPit;
}
return Pit(start, middle, end);
}
function allPits(arr) {
var start = 0;
var n = arr.length;
var pits = [];
while (start < n - 3) {
var pit = findPit(arr, start);
if (pit === NoPit) {
break;
}
pits.push(pit);
start = pit.end;
}
return pits;
}
function sizeOfPit(arr, pit) {
return Math.min(arr[pit.start] - arr[pit.middle], arr[pit.end] - arr[pit.middle]);
}
function largestPit(arr) {
var pits = allPits(arr);
if (pits.length < 1) {
return;
}
var largest = pits[0];
for (var i = 1; i < pits.length; i++) {
if (sizeOfPit(pits[i]) > sizeOfPit(largest)) {
largest = pits[i];
}
}
return largest;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment