-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpick-peaks.js
38 lines (29 loc) · 1.77 KB
/
pick-peaks.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// In this kata, you will write a function that returns the positions and the values of the "peaks" (or local maxima) of a numeric array.
// For example, the array arr = [0, 1, 2, 5, 1, 0] has a peak at position 3 with a value of 5 (since arr[3] equals 5).
// The output will be returned as an object with two properties: pos and peaks. Both of these properties should be arrays. If there is no peak in the given array, then the output should be {pos: [], peaks: []}.
// Example: pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3]) should return {pos: [3, 7], peaks: [6, 3]} (or equivalent in other languages)
// All input arrays will be valid integer arrays (although it could still be empty), so you won't need to validate the input.
// The first and last elements of the array will not be considered as peaks (in the context of a mathematical function, we don't know what is after and before and therefore, we don't know if it is a peak or not).
// Also, beware of plateaus !!! [1, 2, 2, 2, 1] has a peak while [1, 2, 2, 2, 3] and [1, 2, 2, 2, 2] do not. In case of a plateau-peak, please only return the position and value of the beginning of the plateau. For example: pickPeaks([1, 2, 2, 2, 1]) returns {pos: [1], peaks: [2]} (or equivalent in other languages)
// Have fun!
function pickPeaks(arr) {
let positions = []
let peaks = []
let peak;
let pos;
for (let i = 0; i < arr.length; i++) {
if (arr[i + 1] > arr[i] && arr[i + 1] != arr[i]) {
peak = arr[i + 1]
pos = i + 1;
} else if ((arr[i + 1] < arr[i]) && (typeof peak === "number")) {
peaks.push(peak)
positions.push(pos)
peak = undefined;
pos = undefined;
}
}
return {
pos: positions,
peaks: peaks
}
}