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、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]]は2番目の用語を指します。それらはすべて極大値と極小値になります。
{10、6、9、0、1}