-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpick_peaks.py
More file actions
38 lines (26 loc) · 1.82 KB
/
pick_peaks.py
File metadata and controls
38 lines (26 loc) · 1.82 KB
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] does 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!
def pick_peaks(arr):
pos, peaks, aux = [], [], []
max = 0
for i in range(len(arr)):
if arr[i] > arr[i-1]:
max = i
aux.append("u")
elif arr[i] < arr[i-1]:
aux.append("d")
if len(aux) == 3:
if (aux[0] == "u" and aux[1] == "u" and aux[2] == "d") or (aux[0] == "d" and aux[1] == "u" and aux[2] == "d"):
pos.append(max)
peaks.append(arr[max])
max = i+1
del aux[0]
output = {"pos": pos, "peaks": peaks}
return output
#pick_peaks