Created
June 24, 2020 19:08
-
-
Save LeopoldTal/9713aecf4abb45c8515c95b913b017ab to your computer and use it in GitHub Desktop.
Cleanroom binary search challenge
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
/* | |
Cleanroom binary search challenge | |
Write a binary search, correct the first time, without testing. They say it's harder that it sounds. | |
https://reprog.wordpress.com/2010/04/19/are-you-one-of-the-10-percent/ | |
*/ | |
// Binary search | |
// Obnoxiously careful - if there's any mistake here I fail the challenge | |
// Putting all my thought process as comments so you can make fun | |
const getMidPoint = (start, end) => { | |
// Yes I'm abstracting this into a function so I can reason about it more carefully | |
// Yes this is ridiculous but so is pretending we're writing punch cards in 2020 | |
// n n -> n: but that can't happen, `end` is exclusive | |
// 0 1 -> 0 | |
// (len-1) len -> (2len - 1)/2 = len - 1 | |
// n (n+1) -> (2n+1)/2 = n: if bounds are touching there's only 1 to try | |
// 0 2 -> 1 | |
// (len-2) len -> (2len - 2)/2 = len - 1 | |
// n (n+2) -> n+1 | |
// n (n+2k) -> (2n+2k)/2 = n+k: good, finds the middle | |
// n (n+2k+1) -> (2n+2k+1)/2 = n+k: looks ok | |
return Math.floor((start + end) / 2); | |
}; | |
const binSearch = (haystack, needle) => { | |
let startIndex = 0; // lowest where needle might be (inclusive) | |
let endIndex = haystack.length; // highest where needle can't be (exclusive) | |
let midIndex; | |
let midValue; | |
while (startIndex < endIndex) { // strict because endIndex is exclusive | |
midIndex = getMidPoint(startIndex, endIndex); | |
midValue = haystack[midIndex]; | |
if (midValue === needle) { // found | |
return midIndex; | |
} | |
if (midValue < needle) { // needle is towards end of array | |
// startIndex is inclusive: +1 to exclude midIndex | |
startIndex = midIndex + 1; | |
} else { // needle is towards start of array | |
// endIndex is exclusive: +0 excludes midIndex | |
endIndex = midIndex; | |
} | |
} | |
return -1; | |
}; | |
// Unit tests | |
// Wasn't super careful about the test cases, some may be wrong or redundant | |
// I'll still consider the challenge a pass if there's a mistake below this line | |
const testCases = [ | |
// Length 0 | |
{ | |
haystack: [], | |
needle: 42, | |
expected: [-1] | |
}, | |
// Length 1 | |
{ | |
haystack: [0], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [100], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [42], | |
needle: 42, | |
expected: [0] | |
}, | |
// Length 2 | |
{ | |
haystack: [0, 1], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [0, 100], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [50, 100], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [42, 100], | |
needle: 42, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 42], | |
needle: 42, | |
expected: [1] | |
}, | |
{ | |
haystack: [42, 42], | |
needle: 42, | |
expected: [0, 1] | |
}, | |
// Length 3 | |
{ | |
haystack: [0, 1, 100], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [42, 50, 100], | |
needle: 42, | |
expected: [0] | |
}, | |
{ | |
haystack: [0, 42, 100], | |
needle: 42, | |
expected: [1] | |
}, | |
{ | |
haystack: [0, 1, 42], | |
needle: 42, | |
expected: [2] | |
}, | |
{ | |
haystack: [42, 42, 100], | |
needle: 42, | |
expected: [0, 1] | |
}, | |
{ | |
haystack: [0, 42, 42], | |
needle: 42, | |
expected: [1, 2] | |
}, | |
{ | |
haystack: [42, 42, 42], | |
needle: 42, | |
expected: [0, 1, 2] | |
}, | |
// Length 4 | |
{ | |
haystack: [1, 2, 3, 4], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 1, 2, 3], | |
needle: 1, | |
expected: [0, 1] | |
}, | |
{ | |
haystack: [1, 2, 2, 3], | |
needle: 2, | |
expected: [1, 2] | |
}, | |
{ | |
haystack: [1, 1, 2, 2], | |
needle: 2, | |
expected: [2, 3] | |
}, | |
// Length 5 | |
{ | |
haystack: [1, 2, 3, 4, 5], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 1, 2, 3, 4], | |
needle: 1, | |
expected: [0, 1] | |
}, | |
{ | |
haystack: [1, 2, 2, 3, 4], | |
needle: 2, | |
expected: [1, 2] | |
}, | |
{ | |
haystack: [1, 2, 3, 3, 4], | |
needle: 3, | |
expected: [2, 3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 4], | |
needle: 4, | |
expected: [3, 4] | |
}, | |
{ | |
haystack: [1, 1, 1, 2, 3], | |
needle: 1, | |
expected: [0, 1, 2] | |
}, | |
{ | |
haystack: [1, 2, 2, 2, 3], | |
needle: 2, | |
expected: [1, 2, 3] | |
}, | |
{ | |
haystack: [1, 2, 3, 3, 3], | |
needle: 3, | |
expected: [2, 3, 4] | |
}, | |
// Length 6 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6], | |
needle: 6, | |
expected: [5] | |
}, | |
// Length 7 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7], | |
needle: 7, | |
expected: [6] | |
}, | |
// Length 8 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8], | |
needle: 8, | |
expected: [7] | |
}, | |
// Length 9 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 8, | |
expected: [7] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9], | |
needle: 9, | |
expected: [8] | |
}, | |
// Length 10 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 8, | |
expected: [7] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 9, | |
expected: [8] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], | |
needle: 10, | |
expected: [9] | |
}, | |
// Length 11 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 8, | |
expected: [7] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 9, | |
expected: [8] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 10, | |
expected: [9] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], | |
needle: 11, | |
expected: [10] | |
}, | |
// Length 12 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 8, | |
expected: [7] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 9, | |
expected: [8] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 10, | |
expected: [9] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 11, | |
expected: [10] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], | |
needle: 12, | |
expected: [11] | |
}, | |
// Length 20 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 8, | |
expected: [7] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 9, | |
expected: [8] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 10, | |
expected: [9] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 11, | |
expected: [10] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 12, | |
expected: [11] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 13, | |
expected: [12] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 14, | |
expected: [13] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 15, | |
expected: [14] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 16, | |
expected: [15] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 17, | |
expected: [16] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 18, | |
expected: [17] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 19, | |
expected: [18] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], | |
needle: 20, | |
expected: [19] | |
}, | |
// Length 21 | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 42, | |
expected: [-1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 1, | |
expected: [0] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 2, | |
expected: [1] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 3, | |
expected: [2] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 4, | |
expected: [3] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 5, | |
expected: [4] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 6, | |
expected: [5] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 7, | |
expected: [6] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 8, | |
expected: [7] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 9, | |
expected: [8] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 10, | |
expected: [9] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 11, | |
expected: [10] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 12, | |
expected: [11] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 13, | |
expected: [12] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 14, | |
expected: [13] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 15, | |
expected: [14] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 16, | |
expected: [15] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 17, | |
expected: [16] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 18, | |
expected: [17] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 19, | |
expected: [18] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 20, | |
expected: [19] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 21, | |
expected: [20] | |
}, | |
{ | |
haystack: [1, 2, 3, 4, 5, 6, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], | |
needle: 6, | |
expected: [5, 6] | |
}, | |
]; | |
const runTests = () => { | |
let nbTests = 0; | |
let failures = []; | |
for (let testCase of testCases) { | |
const actual = binSearch(testCase.haystack, testCase.needle); | |
const passes = testCase.expected.includes(actual); | |
nbTests++; | |
if (!passes) { | |
failures.push(testCase); | |
} | |
console.log(testCase, actual, passes ? 'ok' : 'FAIL'); | |
} | |
console.log('------------------------'); | |
console.log(`Ran ${nbTests}, ${nbTests - failures.length} passed, ${failures.length} failed.`); | |
console.log(failures); | |
}; | |
runTests(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment