Mathematica 66 58 51
当前解决方案
由于Calle的贡献而缩短了。
Cases[Partition[#,3,1],{a_,b_,c_}/;(a-b) (b-c)<0⧴b]&
Partition[#,3,1] 找到三元组。
(a-b) (b-c)<0为真,当且仅当b以下是a,c,或以上a,c。然后看一下差异的迹象。局部极值将返回{-1,1}或{1,-1}。
例子
Cases[Partition[#, 3, 1], {a_, b_, c_} /; (a - b) (b - c) < 0 :> b] &[{1, 2, 1}]
Cases[Partition[#, 3, 1], {a_, b_, c_} /; (a - b) (b - c) < 0 :> b] &[{0, 1, 0, 1, 0}]
Cases[Partition[#, 3, 1], {a_, b_, c_} /; (a - b) (b - c) < 0 :> b] &[{}]
Cases[Partition[#, 3, 1], {a_, b_, c_} /; (a - b) (b - c) < 0 :> b] &[{9, 10, 7, 6, 9, 0, 3, 3, 1, 10}]
{2}
{1,0,1}
{}
{10,6,9,0,1}
较早的解决方案
该示例查找所有三元组(由生成Partition)的示例,并确定中间元素是否小于两个极端或大于两个极端。
Cases[Partition[#,3,1],{a_,b_,c_}/;(b<a∧b<c)∨(b>a∧b>c)⧴b]& ;
第一个解决方案
这将查找三元组,并查看差异的迹象。局部极值将返回{-1,1}或{1,-1}。
Cases[Partition[#,3,1],x_/;Sort@Sign@Differences@x=={-1,1}⧴x[[2]]]&
例
Cases[Partition[#,3,1],x_/;Sort@Sign@Differences@x=={-1,1}:>x[[2]]]&[{9, 10, 7, 6, 9, 0, 3, 3, 1, 10}]
{10,6,9,9,0,1}
分析:
Partition[{9, 10, 7, 6, 9, 0, 3, 3, 1, 10}]
{{9,10,7},{10,7,6},{7,6,9},{6,9,0},{9,0,3},{0,3,3},{ 3,3,1},{3,1,10}}
% 是指相应的前一行的结果。
Differences/@ %
{{1,-3},{-3,-1},{-1,3},{3,-9},{-9,3},{3,0},{0,-2}, {-2,9}}
Sort@Sign@Differences@x=={-1,1}从{{9,10,7},{10,7,6},{7,6,9},{6,9,0},{9,0,3},{0,3, 3},{3、3、1},{3、1、10}},使得差异的符号(-,0,+)由a -1和a组成1。在当前情况下,这些是:
{{9,10,7},{7,6,9},{6,9,0},{9,0,3},{3,1,10}}
对于每种情况,x x[[2]]都是第二项。这些将是所有局部最大值和最小值。
{10,6,9,9,0,1}