正整数列表可以可视化为量化的山脉,其中每个列表条目代表山脉的一个垂直部分的高度。
例如清单
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
可以成为范围
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(缺乏诗情画意的人可能将其称为条形图,但我离题了。)
这个挑战中的问题是:在某个任意列表的山脉中有多少个峰?本质上,列表中有多少个局部最大值?
峰定义为山峰的一列或多列高度相等的连续部分,其中左右两列的高度较低。
可以很容易地从视觉上看出该示例在这些带括号的位置有四个峰:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
请注意,(3, 3, 3)
平稳段如何算作一个峰值,因为它是一组连续的,高度相等的列,其高度高于其相邻列。
最后一个也(3)
算作一个峰值,因为出于此挑战的目的,我们将最左列的左邻居和最右列的右邻居都定义为零高度。
这意味着,例如1, 1, 1
,只有一个值的列表可以解释为0, 1, 1, 1, 0
,因此具有一个峰值,而没有一个峰值:0, (1, 1, 1), 0
。
零峰的唯一列表是空列表。
挑战
编写一个函数或程序,该函数或程序接受任意正整数列表,并打印或返回相应山脉中的峰数。
以字节为单位的最短代码获胜。Tiebreaker是较早的帖子。
测试用例
Input List -> Output Peak Count
[empty list] -> 0
1, 1, 1 -> 1
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3 -> 4
1 -> 1
1, 1 -> 1
2, 2, 2, 2, 2 -> 1
90 -> 1
2, 1, 2 -> 2
5, 2, 5, 2, 5 -> 3
2, 5, 2, 5, 2, 5, 2 -> 3
1, 2, 3, 4 -> 1
1, 2, 3, 4, 1, 2 -> 2
1, 3, 5, 3, 1 -> 1
7, 4, 2, 1, 2, 3, 7 -> 2
7, 4, 2, 1, 2, 1, 2, 3, 7 -> 3
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 -> 10
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 3, 3, 3, 1 -> 4
12, 1, 2, 1, 2, 3, 3, 3, 2, 4, 4, 4, 1, 5, 5, 4, 7, 9 -> 6
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 909 -> 3
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 908, 909 -> 4