周期的に振動しますか?


19

チャレンジ

リストが与えられたら、リストを増加要素と減少要素の実行にグループ化すると、同じサイズのリストのリストになるかどうかを判断します。

つまり、リストの「ターニングポイント」は均等に配置されます。

以下に例を示します。 0, 3, 7, 5, 2, 3, 6

0, 3, 7増加、7, 5, 2減少、2, 3, 6増加します。したがって、これは真実です。

もう一つの例: 1, 4, 6, 8, 5, 3, 5, 7, 9

1, 4, 6, 8増加、8, 5, 3減少、3, 5, 7, 9増加します。したがって、これは偽です。

ルールと仕様

  • 隣接する要素は等しくなりません
  • すべての数字は、あなたの言語の合理的な数字の範囲内にあると仮定することができます
  • あなたが提出物をゴルフするのに役立つなら、あなたはすべての数字が整数であると仮定するかもしれません
  • これはなので、最短の回答が勝ちます
  • 妥当な表現のリストとして入力し、真実/偽の値として出力します。2つの値は一致している必要があります。

テストケース

Input -> Output
1, 3, 5, 8, 6, 4, 2, 3, 5, 7, 6, 4, 2, 5, 7, 9, 6, 4, 2 -> True
1, 3, 5, 7, 6, 4, 5, 7, 9, 8, 6, 4, 2, 3, 5 -> False
2, 3, 6, 4, 2, 3, 7, 5, 3, 4, 6 -> True
3, 6, 4, 8, 5, 7, 3, 5, 2 -> True
8 -> True
1, 3, 5, 7 -> True
4, 5, 7, 6, 8, 9 -> False
6, 4, 2, 3, 5, 4, 2 -> True
8, 5, 3, 2, 4, 6, 5, 3, 2, 5, 7 -> False

:すべての数字が1桁であると想定することはできません(それがすべての言語で処理できる場合を除く)。テストケースは、この方法でケースを入力する方が簡単だからといって、それを反映しています。

1, 5, 10, 19, 15, 13, 8, 13, 18, 23, 19, 18, 14 -> True
15, 14, 17, 16, 19, 18 -> True
12, 16, 19, 15, 18, 19 -> False

最初の実行は常に増加しますか、または入力は減少する実行から開始できますか?
ヨルダン

@Jordanは減少し始めました。そのためのテストケースを追加します。
ハイパーニュートリノ

グループは常に完了していますか?たとえば1, 2, 3, 2、有効な入力になります。その場合、真または偽と見なされますか?その例では、次の値が1であれば真になりますが、3であれば偽になります。
トム・カーペンター

1
@TomCarpenterそれは偽と見なされます。それらはすべて同じ長さでなければなりません(したがって、すべて完全なものでなければなりません)。
ハイパーニュートリノ

回答:


9

MATL10 9バイト

dZS&Y'da~

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

ルイスメンドーのおかげで1バイト節約できました!

説明:

入力は次のように仮定します[0, 3, 7, 5, 2, 3, 6]::

            % Implicit input:                                [0, 3, 7, 5, 2, 3, 6]
d           % Difference between adjacent elements:          [3, 4, -2, -3,  1,  3]
 ZS         % Sign of the differences:                       [1, 1, -1, -1, 1, 1]
   &Y'      % Length of runs of consecutive elements:        [2, 2, 2]
     d      % Difference between the lengths:                [0, 0]
      a     % Any non-zero elements:                         False
       ~    % Negate, to get a truthy value if all are zero: True

8

ゼリー、6 バイト

IṠŒgAE

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

Adnanのおかげで1バイト節約できました!

使い方

IṠŒgAE-完全なプログラム。

I-増分(デルタ)。
 Ṡ-それぞれのサイン。負の場合は-1、nullの場合は0、正の場合は1。
  Œg-隣接する要素の実行をグループ化します。
    A-絶対値。ベクトル化します。これは、-1と1を同じ値にマップします。
     E-すべて平等ですか?

ゴルフ中に、クールで長い代替案を見つけました:IṠŒgL€EIṠŒrṪ€E(代わりにrun-length-encodeを使用します)。


私が思うにIṠŒgḂE、バイトを保存する必要があります
アドナン・

@AdnanはA(絶対値で)代用できますかそれとも私が得られないトリックがありますか?
ミスターXcoder

統合任意の機能1-1同じ番号には十分である
アドナン

7

オクターブ54 50バイト

@(x)nnz(unique(diff(find([diff(diff(x)>0) 1]))))<2

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

説明

@(x)nnz(unique(diff(find([diff(diff(x)>0) 1]))))<2

@(x)                                                % Define anonymous function    
                               diff(x)              % Deltas (consecutive differences)
                                      >0            % Positive? Gives signs
                          diff(         )           % Deltas between signs
                         [                1]        % Append 1 to "close" last group
                    find(                   )       % Indices of nonzeros
               diff(                         )      % Deltas. Gives group lengths
        unique(                               )     % Remove duplicates
    nnz(                                       )    % Number of nonzeros. Gives length
                                                <2  % If 1 or 0: input is periodic

6

Wolfram言語(Mathematica)、38バイト

Equal@@(1^Differences@#~SplitBy~Sign)&

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

説明

Equal@@(1^Differences@#~SplitBy~Sign)&  (* Input:                {3, 6, 4, 8, 5, 7, 3, 5, 2} *)

          Differences@#                 (* Take differences:     {3, -2, 4, -3, 2, -4, 2, -3} *)
                       ~SplitBy~Sign    (* Split by sign:        {{3}, {-2}, {4}, {-3}, {2}, {-4}, {2}, {-3}} *)
        1^                              (* Raise to power of 1:  {{1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}} *)
Equal@@                                 (* Check equal:          True *)

Equal@@(1^Split@Sign@Differences@#)&2バイト短く、Equal@@Im@Split@Sign@Differences@#&それより1バイト短くなります。
ミシャラヴロフ

そして今、私は複素数について考えているので、別のバイトArgSign保存する代わりに使用します。
ミシャラヴロフ


4

C(GCC) 143の 140 138 136 135 132バイト

  • 3バイトを保存しました。を使用してr終了する代わりに、変数を使用して関数の戻り値のブール値を格納しますreturn
  • 2バイトを保存しました。ゴルフint A[]int*A(ポインタ代わりのアレイを使用します)。
  • Steadyboxのおかげで2バイト節約されました。ゴルフをf(int*A,int a)しますf(A,a)int*A;
  • バイトを保存しました。ゴルフをif(d!=...しますif(d-...
  • 3バイトを保存しました。ゴルフを;j++...j+1します;...++j
j,d,e,l,m,r;f(A,a)int*A;{for(d=A[0]>A[1],r=1,j=m=l=0;j-~-a;){l++;if(d-(e=A[j]>A[++j]))d=e,j--,r*=l>=(m=!m?l:m),l=0;}r*=-~l==m||m<1;}

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

fリスト内の最後の要素を除くすべての要素を調べ、リスト内の次の要素に対するこの要素の関係を決定する関数を定義します。関係が最初に反転したときに連続する等しい比較の数が保存されます。保存された長さと長さが異なる最初の実行後の実行は、偽の出力になります。最後に、リストの残りの要素と一致するように、最後から2番目の要素と最後の要素との関係が調べられます。


f(A,a)int*A;代わりに使用できますf(int*A,int a)
-Steadybox


3

パイソン2107 105 103 97 96の 94の 91バイト

lambda l:len({sum(g)**2for k,g in groupby(map(cmp,l[:-1],l[1:]))})<2
from itertools import*

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

Pythonの3102の 100 97バイト

lambda l:len({len([*g])for k,g in groupby(x>y for x,y in zip(l,l[1:]))})<2
from itertools import*

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


あなたが使用することができる{...}代わりに、set(...)3バイト節約するために
ロッド

3

、7バイト

EmLġ±Ẋ-

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

仕組み

EmLġ±Ẋ-〜完全なプログラム。

     Ẋ〜隣接する要素のペアにマップします。
      -〜減算あり(これはデルタを計算します)
   ġ〜等号述語を使用するグループ。
    ±〜サイン。
 mL〜長さを取得します。
E〜すべて等しいですか?

いくつかのかわいい選択肢:

εġLġ±Ẋ-
εüLġ±Ẋ-

2

JavaScript(ES6)、81バイト

これは長すぎるようです。私はおそらくここに何かを見逃しています... trueまたはを返しますundefined

f=(a,p=1)=>a.every((n,i)=>!i|!(1/(y=a[i+1]))|!(i%p)^y>n^a[i-1]>n)||a[p]&&f(a,p+1)

すべての方向の変更がp要素ごとに発生するように、期間0 <p <a.lengthを探します。

テストケース


2

Python 2、96バイト

import re
def f(x):exec"x=map(cmp,x[1:],x[:-1]);"*2;re.match('.([^1]*)(-?1, \\1)*9',`x+[9]`)<0<_

オンラインでお試しください!終了コードを介した出力:crash(1)は偽、clean exit(0)は真実です。

Python 2、106バイト

def f(x):d=map(cmp,x[1:],x[:-1]);l=len(d);s=(d+[0])[0];k=(d+[-s]).index(-s);print((k*[s]+k*[-s])*l)[:l]==d

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


は確かではあり(...)[:l]<dませんが、の逆かもしれません(...)[:l]==d
ジョナサンフレッチ

2

Haskell79 78 77バイト

import Data.List
g s|h:t<-(1<$)<$>group(zipWith(<)s$tail s)=all(==h)t
g _=1<3

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

listを指定するとszipWith(<)s$tail s各要素が後続要素(s=[2,3,6,4,2,3,7,5,3]yieldsなど)よりも小さいかどうかをテストします[True,True,False,False,True,True,False,False]。次にgroup、同じ要素を一緒に実行します[[True,True],[False,False],[True,True],[False,False]]。、すべてのこれらのリストは、同じ長さを持っているかどうかを確認してその要素を交換するには1このヒントを参照)を得た[[1,1],[1,1],[1,1],[1,1]]とテール内のすべての要素かどうかを確認t、このリストのヘッドに等しいですhall(==h)t

このアプローチはシングルトンリストでは機能しませんが、これらは常に真であるため、独自のケースで処理できますg[_]=1<3



1

Japt、15バイト

ä- mg ò¦ mÊä¥ e

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

説明

ä- mg ò¦ mÊä¥ e                                                  [0,3,7,5,2,3,6]
ä-                // Difference between neighboring elements     [-3,-4,2,3,-1,-3]
   mg             // Get the sign of each element                [-1,-1,1,1,-1,-1]
      ò¦          // Partition between different elements        [[-1,-1],[1,1],[-1,-1]]
         mÊ       // Get the length of each element              [2,2,2]
           ä¥     // Check for uniqueness                        [true,true]
              e   // Return true if all elements are truthy      true

1

R、36バイト

function(n)!sd(rle(sign(diff(n)))$l)

diff連続する差を計算し、signそれらを±1まで押しつぶします。rle次に、ランレングスがそれらをエンコードします。この要素はすべてrle同じでなければなりません。つまり、ベクトルの標準偏差はゼロです。!その後、正しい論理出力が生成されます。


1

Haskell(Lambdabot)、59バイト

g(map(1<$).group.ap(zipWith(<))tail->h:t)=all(==h)t;g _=1<3

@Laikoniの回答に基づく


ニース、LamdabotがViewPatternsを有効にしたことを知りませんでした。にスペースがありませんg_=1<3
ライコニ

@Laikoni私も、しかし私は実際に#haskellに行ってテストした
-BlackCap


0

Clojure、70バイト

#({0 1 1 1}(count(set(map count(partition-by pos?(map -(rest %)%))))))

1真理値として返され、nil(別名null)偽物として返されます。


0

Java(OpenJDK 8)、135バイト

a->{Integer i=0,c,d=0,p=0,r=0;for(;++i<a.length;)d+=(i<2|(c=i.signum(a[i-1]-a[i]))<0?d<0:d>0)?c:p==0|p==-d?c-(p=d):1-(r=1);return r<1;}

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

説明

a->{                    // int array
 Integer i=0,c,d=0,p=0,r=0;
                        // variable definitions, use Integer to abuse static calls
 for(;++i<a.length;)    // Loop from 1 till length - 1
  d+=                   // Change d
   (i<2                 // First iteration?
     |(c=i.signum(a[i-1]-a[i]))<0?d<0:d>0
   )                    // Or do c and d have the same sign?
    ?c                  // then increase the magnitude of d.
    :p==0|p==-d         // else we're in a u-turn. Is it the first? Or is the magnitude the same as previously?
     ?c-(p=d)           // assign the new magnitude with sign to p and reset d to -1 (if was positive) or 1 (if was negative)
     :1-(r=1);          // else just do r=1 (technically: "add 1-1=0 to d" as well)
 return r<1;            // return whether there were wrong amplitudes.
}


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.