バンプはありますか?


39

正の整数のリストが与えられると、2つの近傍よりも大きいか、2つの近傍よりも小さい(「バンプ」)要素があるかどうかを判別します。明確にするために、バンプは隣人が1人しかいないため、リストの最初または最後の項目にはなりません。

プログラムは、バンプのないリストまたはバンプのあるリストにそれぞれ対応する2つの一貫した値のいずれかを出力する必要があります。値が何であるかは重要ではありません。自分で選択することができます。

これはため、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。

テストケース

[] -> False
[1] -> False
[1,2] -> False
[1,2,1] -> True
[1,2,2] -> False
[1,2,3] -> False
[1,2,2,1] -> False
[1,2,2,3] -> False
[1,2,1,2] -> True
[1,3,2] -> True
[3,1,2] -> True
[2,2,2] -> False

5
テストケースのリクエスト:0-1-2-3以外の数字、また、ネガティブなものは許可/禁止されていますか?
魔法のタコ

推奨されるテストケース:([1,3,3]デニスのアルゴリズムを使用した回答が、増分そのものを使用するのではなく、増分の符号を取ることを確認します)
ETHproductions

1
@ETHproductionsそれはすでにカバーされていません[1,2,2]か?それとも何か不足していますか?
ニックハートリー

2
@NicHartley、のデルタは[1,2,2]それらのデルタの符号と同じですが、そうではありません[1,3,3]
シャギー

回答:


15

ゼリー、5バイト

IṠIỊẠ

バンプがある場合は0、そうでない場合は1を返します。

オンラインでお試しください!

使い方

IṠIỊẠ  Main link. Argument: A (integer array)

I      Increments; take all forward differences of A.
 Ṡ     Take the signs.
       The signs indicate whether the array is increasing (1), decreasing (-1), or
       constant at the corresponding point. A 1 followed by a -1 indicates a local
       maximum, a -1 followed by a 1 a local minimum.
  I    Increments; take the forward differences again.
       Note that 1 - (-1) = 2 and (-1) - 1 = -2. All other seven combinations of
       signs map to -1, 0, or 1.
   Ị   Insignificant; map each difference d to (-1 ≤ d ≤ 1).
    Ạ  All; return 1 if all differences are insignificant, 0 if not.

1
「増分」とは何ですか?インクリメントされているものとそれは何をしますか?
小麦ウィザード

1
@WheatWizardこれは05AB1Eのデルタ(¥)コマンドに相当すると思います。配列[n0、n1、n2、n3]がポップされ、配列[n1-n0、n2-n1、n3-n2]がプッシュされます。
カルド

10

JavaScript(ES6)、38バイト

ブール値を返します。

a=>a.some(x=n=>x*(x=a<n|-(a>(a=n)))<0)

テストケース

どうやって?

aを使用て、nの以前の値を保存します。我々セットX1であれば、<N -1なら> Nまたは0なら= N。そして、old_x * x <0かどうかをテストします。これは、(old_x = 1 and x = -1)または(old_x = -1 and x = 1)の場合にのみ可能です。

xsome()の匿名コールバック関数に初期化されるため、最初の反復中にNaNに強制され、テストが偽になります。


これは、厳密モードでスローされます。
アルアンハダッド

2
@AluanHaddadまあ、宣言されていない変数のために、JSゴルフコードの99%が厳密モードでスローされます。PPCGとコードレビューはうまく混ざりません。:P
アーナウルド

それは公平です、私はゴルフにはあまり向いていません。
アルアンハダッド

4
それから、なぜそれについてコメントするのか笑
マークC.

8

Haskell、42バイト

any(<0).f(*).f(-)
f a b=zipWith a b$tail b

オンラインでお試しください!

説明

まずf、バイナリ関数とリストを受け取り、リスト内の隣接するすべてのペアにバイナリ関数を適用する関数があります。

次に、メイン関数がf(-)入力リストに適用されます。これにより、差分リストが計算されます。次にf(*)、リストに適用して、隣接するすべてのペアを乗算します。最後に、ペアがゼロより小さいかどうかを尋ねます。

終了リストの数値は、差分リストの負の数と正の数の積である場合にのみ負になります。したがって、負のエントリを生成する(およびtrueを返す)には、元のリストを増加から減少、またはその逆に切り替える必要があります。つまり、バンプが必要です。


空のリストを処理する良い方法です!
ライコニ


5

画像パッケージ付きオクターブ34 32バイト

@StewieGriffinのおかげで2バイト節約!

@(x)0||prod(im2col(diff(x),2))<0

オンラインでお試しください!

説明

連続する差を計算し、それらを長さ2のスライドブロックに配置して、各ブロックの積を取得し、そのような積が負であるかどうかをテストします。


0||prod(...)2バイト節約します。any部品全体をスキップし、デフォルトの真実/偽の定義を使用して5バイト節約することもできます
スティーヴィーグリフィン

5バイトを節約すると、ソリューションが私のソリューションよりも短くなります:(画像パッケージの素晴らしい使用法です。TIOにあったことは知りませんでした。
Stewie Griffin

1
@StewieGriffinチャレンジには2つの一貫した値が必要なので、削除できませんany0||アイデアをありがとう!
ルイスメンドー

4

R、48バイト

function(x)any(apply(embed(diff(x),2),1,prod)<0)

オンラインでお試しください!

例としてc(1,4,1,4)を使用してステップバイステップで動作する方法:

> x=c(1,4,1,4)
> diff(x)
[1]  3 -3  3
> embed(diff(x),2)
     [,1] [,2]
[1,]   -3    3
[2,]    3   -3
> apply(embed(diff(x),2),1,prod)
[1] -9 -9
> any(apply(embed(diff(x),2),1,prod)<0)
[1] TRUE

おまけとして、パッケージを使用した同様の長さとコンセプトのソリューションがありますzoo

function(x)any(zoo::rollapply(diff(x),2,prod)<0)

1
きちんとした!自己への注意:embed存在することを覚えておいてください。これは、ことを残念だrowProdsとはcolProdsR.でエイリアスとして存在していない
ジュゼッペ

1
私は実際に彼らが存在する場合にチェック:)しかし、実際にちょうど絶望のうち@Giuseppe rowSumsrowMeans...
plannapus

1
まあ、少なくともドキュメントを見ると、.colSumsおそらくどこかにゴルフのアプリケーションを持っている追加の入力に基づいて入力を行列に再形成します....今私は1つを見つけなければなりません!
ジュゼッペ

@Guiseppe:matrixStatsパッケージ内の関数をご覧ください。
マイケルM

@MichaelM残念ながら、パッケージ名の長さのため、競合しません(57バイト:)function(x)any(matrixStats::colProds(embed(diff(x),2)))<0。しかし、コードゴルフ以外の場合、このパッケージはまさに宝庫です。
プランナパス


3

Perl 6、39バイト

{so~(.[1..*]Zcmp$_)~~/'re L'|'s M'/}

オンラインでお試しください!

$_この匿名関数のリスト引数です。 .[1..*]は同じリストですが、最初の要素が削除されています。 Zcmp2つのリストをcmp演算子と一緒に圧縮し、Order値のリストを作成します。たとえば、入力リストの場合、1, 2, 2, 2, 1これはlistになりますMore, Same, Same, Less

今、私たちはそのリストが隣接する二つの要素が含まれているかどうかを知る必要がありますMore, LessLess, More。私が使用したトリックは、リストをスペースで区切られた文字列に変換し、~サブストリングre Lまたはのいずれかを含むかどうかをテストすることs Mです。(最初の1つは、「e」で終わるe Lという理由だけではありませんSame。)

スマートマッチ演算子は、Matchオブジェクト(一致が成功したNil場合)または(成功しなかった場合)のいずれかを返すため、それsoが何であれブール値に変換します。



3

ルビー55 46バイト

->a{a.each_cons(3).any?{|x,y,z|(y-x)*(y-z)>0}}

オンラインでお試しください!

配列を受け取り、ブール値を返すラムダ。

-9バイト:元に戻し(x<y&&y>z)||(x>y&&y<z)(y-x)*(y-z)>0(おかげGolfWolf

->a{
  a.each_cons(3)              # Take each consecutive triplet
    .any?{ |x,y,z|            # Destructure to x, y, z
      (y-x)*(y-z) > 0         # Check if y is a bump
    }
}

1
の代わりに使用すると、1バイト節約できると思います。|||
Yytsi


'0 <(Y-X)* Y - = Z'が1バイト保存
GB

3

PostgreSQL 173バイト

SELECT DISTINCT ON(a)a,x>j and x>k OR x<least(j,k)FROM(SELECT a,x,lag(x,1,x)OVER(w)j,lead(x,1,x)OVER(w)k FROM d WINDOW w AS(PARTITION BY rn ORDER BY xn))d ORDER BY 1,2 DESC;
     a     | c 
-----------+---
 {1}       | f
 {1,2}     | f
 {1,2,1}   | t
 {1,2,1,2} | t
 {1,2,2}   | f
 {1,2,2,1} | f
 {1,2,2,3} | f
 {1,2,3}   | f
 {1,3,2}   | t
 {2,2,2}   | f
 {3,1,2}   | t
(11 rows)

こんにちは、サイトへようこそ。私はPostgreSQLに慣れていませんが、使用する空白の量を減らすことができるかもしれません。一般に、ほとんどの言語は、使用するほとんどの種類の間隔を必要としません。
小麦ウィザード

@WheatWizardは、データベースへのサンプルデータであり、無関係です。
エヴァンキャロル

あなたのコードは何ですか?入力の代わりにコードにコードを直接挿入することはできません。ここでそのような場合は、標準メソッドを介して入力を取得するように書き換える必要があります。
小麦ウィザード

@WheatWizardから提供されたリンクcodegolf.meta.stackexchange.com/a/5341/23085
エヴァンキャロル

1
それがあなたが使用している入力フォーマットであるなら、それはそれでいいです。ここでのゴルフの幸運を祈る。あまり一般的ではない言語でゴルフをしている人々を見るのは素晴らしいことです。
小麦ウィザード

3

Java 8、108 104 101 86 84 79 72バイト

a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}

@OlivierGrégoireのおかげで-2バイト。@Nevayの
おかげで-13バイト。

オンラインでお試しください。


1
84バイト。繰り返しの順序を変更(下に行く)し、2つの乗算オペランドを交換して、余分なを削除できました-1
オリヴィエ・グレゴワール

1
79バイト:a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}(戻り-1truthy場合の、3falseyケース用) - 、または、戻り値として55のバイトを例外の存在/不在を使用する場合:a->{for(int i=0;++i>0;)i|=(a[i-1]-a[i])*(a[i]-a[i+1]);}
Nevay

1
72バイト:a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}
Nevay

3

R58 56バイト

function(x)any(abs(diff(sign(diff(c(NA,x)))))>1,na.rm=T)

オンラインでお試しください!

ジュゼッペのおかげで2バイト節約


3
{}-2バイトの括弧を削除できます。
ジュゼッペ

さらに、私が考えていることができますポートStewieグリフィンのためのアプローチ42バイト
ジュゼッペ・

@ Giuseppe、Stewieは私のメソッドを移植したと思いますが、私の場合はテストケースにリストされているように空のベクターを適切に処理できます。Matlabは、Rと比較して空のベクターで少し寛大です。
NofP

c()NULL、整数の空のベクターと同じではありませんどのinteger(0)MATLABでのに対し、[]あるdoubleデフォルトでは、しかし、あなたはそれをこのように保持する場合、それは完全に合理的です。
ジュゼッペ

3

J16 15バイト

FrownyFrogのおかげで-1バイト

1 e.0>2*/\2-/\]

オンラインでお試しください!

オリジナル:16バイト

0>[:<./2*/\2-/\]

2-/\] -隣接する各アイテムの違い

2*/\ -隣接する各アイテムの製品

[:<./ - 最小値の

0> -負ですか?

オンラインでお試しください!


こんにちは !これは、このより単純な明示的な形式0> <./ 2 * / \ 2-/ \(13バイト)に短縮できませんか?
マティアスドリドン

@Mathias Dolidonこれはインタープリターでは機能しますが、PPCGでは、入力があった場合に機能(J動詞)を提供するのが一般的です。動詞が暗黙のものである場合、割り当てf=.バイトはカウントしません。私は比較的新しいユーザーであることに注意してください:)
ガレンイワノフ

私もそうであり、あなたは私のためにルールを明確にしました。ありがとう!:)
マティアスドリドン

1
1 e.0>2*/\2-/\]
FrownyFrog

@ FrownyFrogありがとう!私はめったにeを使用していないようです。:)
ガレンイワノフ



2

アタッシュ、39バイト

Any&:&{_*~?Sum[__]}@Slices&2@Sign@Delta

オンラインでお試しください!

これがどのようになったかにかなり満足しています。

説明

これは、4つの機能の組み合わせです。

Delta
Sign
Slices&2
Any&:&{_*~?Sum[__]}

Delta要素間の違いを取得します。=

次に、Signはそれぞれの差に適用され、1s、0s、および-1s の配列を提供します。=

次に、Slices&2配列から長さ2のすべてのスライスを提供し、差のすべてのペアを提供します。

最後に、Any&:&{_*~?Sum[__]}入力の場合と同等ですx

Any[&{_*~?Sum[__]}, x]
Any[[el] -> { el[0] and not (el[0] + el[1] = 0) }, x]

これにより、合計がゼロになるがゼロではない要素が検索されます。そのような要素のペアが存在する場合、バンプがあります。




2

オクターブ、33バイト

@(x)0||abs(diff(sign(diff(x))))>1

オンラインでお試しください!

説明:

@(x)                           % Anonymous function taking x as input
                  diff(x)       % Takes the difference between consecutive elements
             sign(diff(x))      % The sign of the differences
        diff(sign(diff(x)))     % The difference between the signs
    abs(diff(sign(diff(x)))>1   % Check if the absolute value is 2
@(x)abs(diff(sign(diff(x)))>1   % Output as matrices that are treated truthy or falsy

2

Brachylog、10バイト

s₃.¬≤₁∧¬≥₁

オンラインでお試しください!

true.バンプがある場合は成功()、バンプfalse.がない場合は失敗()。

説明

これはすでにかなり読みやすいです:

s₃.           There is a substring of the input…
  .¬≤₁        …which is not non-decreasing…
      ∧       …and…
       ¬≥₁    …which is not non-increasing

2

05AB1E、7バイト

¥ü‚P0‹Z

オンラインでお試しください!

説明

¥         # calculate delta's
 ü‚       # pair each element with the next element
   P      # product of each pair
    0‹    # check each if less than 0
      Z   # max

0‹基本的に数字の負符号をチェックする1バイトの代替手段はありませんでしたか?
魔法のタコ

@MagicOctopusUrn:dスタックのトップのみが含まれていることを確認するために使用され[0-9]ます。これは、ここで必要なものの反対です。しかし、今ではよりインテリジェントになり、ネガティブ/フロートも数値としてカウントされます。
エミグナ

ああ...誓いanegativeサインを見て真または何かを返しました...しかし、私はあなたが正しいと思う、私はあなたのdトリックを覚えている。
魔法のタコ

2

Brachylog、10バイト

s₃s₂ᶠ-ᵐ×<0

オンラインでお試しください!

@Fatalizeの既存の10バイトの回答ほどきれいでエレガントではありませんが、機能します!

s₃   % There exists a substring of three elements [I,J,K] in the array such that

s₂ᶠ  % When it's split into pairs [[I,J],[J,K]]

-ᵐ   % And each difference is taken [I-J, J-K]

×    % And those differences are multiplied (I-J)*(J-K)
     % (At a bump, one of those will be negative and the other positive. 
     % At other places, both differences will be positive, or both negative, 
     %  or one of them 0 - ultimately resulting in a non-negative product.)

<0   % The product is negative





1

Wolfram言語(Mathematica)37 36バイト

FreeQ[(d=Differences)@Sign@d@#,-2|2]&

テストケースの答えの反対を返します(FalseとTrueが逆転)。を先頭に追加し!て、通常の形式に切り替えます。

または

Abs@(d=Differences)@Sign@d@#~FreeQ~2&

また、出力を反転し、そう置き換えるFreeQMatchQ、通常のフォームのため。

説明:シーケンスの違いのサインを取ります。結果のシーケンスに{1、-1}または{-1,1}が含まれている場合、バンプがあります。{1、-1}または{-1,1}の差の絶対値は、どちらの場合も2です。

絶対値をとる代わりに、最終リストを二乗することにより、別のバイトを削除します。

FreeQ[(d=Differences)@Sign@d@#^2,4]&

オンラインでお試しください!


1

Perl、35バイト

含み+3のために-p

bump.pl

#!/usr/bin/perl -p
s%\S+ %$a*1*($a=$&-$')%eg;$_=/-/

として実行:

bump.pl <<< "3 1 2"

1

ジュリア0.657の 56バイト

l->any(p>c<n||p<c>n for(p,c,n)=zip(l,l[2:end],l[3:end]))

基本的には完全に人間のPythonの答えです。user71546から-1バイト

オンラインでお試しください!

ジュリア0.6、39バイト

f(x,y,z,a...)=x>y<z||x<y>z||f(y,z,a...)

Lispy recursion style、別名Dennisのpython回答。trueバンプが存在する場合に戻り、そうでない場合はエラーをスローします。呼び出し時にスプラッシュする必要があるので、これは多分42バイトでなければなりません。たとえば、a=[1,2,1]として呼び出しますf(a...)f(a)=f(a...)その必要性はなくなりますが、より長くなります。再帰を改善する必要がありますが、エラーをスローするコードを書くのはあまり好きではありません。

オンラインでお試しください!


1
後のスペースforは必要ないようです;)
浅本しえる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.