Created
May 13, 2016 19:53
-
-
Save saml/6d625b98f80ee43b39e152e33a1acd19 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
// 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