私は取るに足らない配列ですか?


40

無意味配列は連続する要素間の絶対差がより全て小さいか等しい正の整数の配列である1

たとえば、次の配列は重要ではありません。

[1, 2, 3, 4, 3, 4, 5, 5, 5, 4]

対応する(絶対)違いは次のとおりです。

[1, 1, 1, 1, 1, 1, 0, 0, 1]

これらはすべて1以下です。


あなたの仕事は、与えられた整数の配列が重要でないかどうかを判断することです。

  • 配列には常に少なくとも2つの要素が含まれると想定できます。
  • 標準の入力および出力ルールが適用されます。任意の妥当な形式で入力(および出力)を取得できます。
  • デフォルトの抜け穴は禁止されています。
  • 真実/偽の値は明確で一貫している必要があります。
  • これはであるため、バイト単位の最短回答が優先されます。

テストケース

入力->出力

[1、2、3、4、3、4、5、5、5、5、4]-> true
[1、2、3、4、5、6、7、8、9、8]-> true
[3、3、3、3、3、3、3、3]-> true
[3、4、4、4、3、3、3、3、4、4、4]-> true
[1、2、3、4]-> true 
[5、4、3、2]-> true 
[1、3、5、7、9、7、5、3、1]-> false
[1、1、1、2、3、4、5、6、19]-> false
[3、4、5、6、7、8、7、5]-> false
[1、2、4、10、18、10、100]-> false
[10、20、30、30、30]-> false

trueとを使用しましたfalse


真実/偽の値は、実際に私たちの選択した言語で真実/偽である必要がありますか、それとも、2つの異なる一貫した値を使用できますか?
マーティンエンダー

1
@MartinEnder任意の2つの異なる一貫した値。PS申し訳ありませんが遅れて応答のために

2
テキストには、整数の配列が与えられると書かれていますが、正の整数の配列のみが重要でない場合があります。負の整数の配列を準備する必要がありますか?
マークS。17年

回答:


24

ゼリー、3バイト

IỊẠ

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

どうやって?

ゼリーにとってまさに完璧な挑戦です。

IỊẠ完全なプログラム。

増分; 連続する要素間の差を取得します。
 重要でない; abs(number)≤1を返します。
  Ạすべて; すべての要素が真実であれば1を返し、そうでなければ0を返します。

2
Pすべての違いが1出力さ1れた場合、0それは機能し0ませんが、そのうちの1つが出力された場合は?そして、もし1つの違いはある5が、1 つの違いが0まだあるとしたら0
タス

1
「正の整数」の要件はどうですか?
3D1T0R

19

JavaScript(ES7)、33 29バイト

@JohanKarlssonのおかげで4バイト節約

a=>!a.some(v=>(a-(a=v))**2>1)

どうやって?

に強制されるとNumber、少なくとも2つの要素の配列がに評価されNaNます。入力aを以前の値を保持する変数として再利用することにより、some()の最初の反復は常に([v0、v1、...]-a [0])** 2 = NaNになります。a [0]の値。したがって、最初のテストは常に虚偽であり、実際の比較は意図したとおりに2回目の反復から開始されます。

テストケース


29バイト:a=>!a.some(v=>(a-(a=v))**2>1)
ヨハンカールソン

@JohanKarlssonああ、入力には少なくとも2つの要素が含まれることが保証されているため、安全です。どうもありがとう!
アーナルド







5

Pyth、6バイト

._MI.+

すべてのテストケースを確認します。


Pyth、8バイト

.A<R2aVt

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

説明

._MI.+   Full program.

    .+   Deltas.
   I     Is invariant under...
._M      Mapping with Sign. 0 if n == 0, -1 if n < 0, 1 if n > 0.

.A<R2aVt    Full program.

      Vt    Vectorize function, applied on the input zipped with the tail of the input.
     a      Absolute difference.
  <R2       For each, check if it is smaller than 2.
.A          All.

私がI#代わりに考えた理由が分からないM
スティーブンH.

5

プロトン、41バイト

a=>all(-2<a[i]-a[i+1]<2for i:0..len(a)-1)

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

Mr. Xcoderのおかげで-16バイト
-2バイト
Mr. Xcoderのおかげで-6バイト



@ Mr.Xcoderのスペースは<2 for省略可能だと思います。
ジョナサンフレッチ

@JonathanFrechそこにスペースはありませんか?
ミスターXcoder

@ Mr.Xcoderそうそう、私はこれらのクレイジーな関数チェーンで私が何を考えていたのか分かりません。ありがとう!:D
HyperNeutrino


5

C#(.NET Core)51 45 44 + 18バイト

Jeppe Stig Nielsenのおかげで-1バイト

a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)

バイト数には以下も含まれます。

using System.Linq;

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

説明:

a =>                      // Take an array of integers as input
    a.Zip(                // Combine each element with corresponding one from:
        a.Skip(1),        //     the input array without first element
        (x, y) => x - y   //     get their difference
    )
    .All(x => x * x < 4)  // Check if all differences are less than 2
                          // (We only care about 0 and 1, and so happens that when they're squared, it works like Abs! Magic!)

3
少し改善:a=>a.Zip(a.Skip(1),(x,y)=>x-y).All(x=>x*x<4)、否定を回避し!ます。
ジェッペスティグニールセン

@JeppeStigNielsen素晴らしい、ありがとう!
フスキ

5

Perl 6、25バイト

{?(2>all(.[]Z-.skip)>-2)}

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

これはかなり読みやすいはずです。ここでそれほど明白ではない唯一のことはZ、短いリストがなくなると(zipオペレーターはリストの最初の要素を削除して)zip 圧縮を停止し、空の添え字.[](Zenスライスと呼ばれる)がリスト全体を提供することです。.skip最初の要素のないリストを返します。


これらの2つのスペースは本当に必要ですか?
ジョナサンフレッチ

@JonathanFrech:正しいものはおそらくない。また、私.rotateはここで必要ないことに気づきました。
ラミリーズ

ちなみに、左のものでも削除できました。...空白が必要な場合、私は本当に理解していない、それがない場合
Ramillies

さらに4バイトを節約する-2<代わりに-1≤<2代わりに書くことができ≤1ます。
ショーン

エラー、誤った方法で2>...>-2解釈を避けるために、実際に比較を逆にする必要があると思います<
ショーン

5

R30 26バイト

cat(all(diff(scan())^2<2))

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


3
function(a)all(diff(a)^2<2)3バイト節約できると思います。
BLT

あなたは、コンソールからの入力を取ることができる:all(diff(scan())^2<2)
flodel

@BLTの良い点!
user2390246

1
@flodel を使用するときに出力を明示的に出力する必要性に関して最近議論がありましたscanが、それでもバイトを節約できます!
user2390246



3

PowerShell、62バイト

param($a)$l=$a[0];($a|?{$_-$l-in1..-1;$l=$_}).count-eq$a.count

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

PowerShellはありません.map.someので、ここで私たちは個々のデルタをチェックしている、または類似のコマンドを。

入力を取得し、最初の要素に等しく$a設定し$lます。次に、ループ処理を繰り返し、差が範囲$a|?{...}ある各要素を取り出します。次に、現在の要素に等しく設定します。これで、前の隣接要素間のデルタが1である要素のコレクションができました。それを使用して、全体として配列のual かどうかを確認します。そうである場合、すべてのデルタは1以下であるため、意味のない配列です。そのブール結果はパイプラインに残り、出力は暗黙的です。$_-$l-in1,0,-1$l.count-eq.count


あなたはPARAMを取り払うと、実行して1つのバイトを保存することができます$l=($a=$args)[0]
briantist

@briantistしかし、それはうまくいきません。例えば。 これは$l、提案の入力配列全体になるように設定されているためです。
AdmBorkBork

TIOで引数を与える方法を変更するだけでよいと思います(各要素を個別に指定する必要があります)。現在の方法では、の最初の要素$args自体が配列全体です。
ブリアンティスト

感じているのcheaty ...
AdmBorkBork

私はそれが実際に使用する正しい方法だと思います$args。スペースで区切られた一連の引数を使用してスクリプトまたは関数を呼び出した場合、それはの個別の要素として入力され$args、TIOの場合はそれをエミュレートします。私は個人的にそれを何度もそのように使用しましたが、それぞれにそれを使用しました:)
briantist



2

MATL6 5バイト

d|2<A

ジュゼッペのおかげで-1バイト

オンラインでお試しください!またはすべてのテストケースを検証する


MATLでは値がゼロの配列は偽であるため、代わりにメタコンセンサスごとに使用できると思いますd|2<
ジュゼッペ

1
またはd|2<A、元の答えに近いものを探します。
ジュゼッペ

1
@Giuseppeいいえ、できません。真実/偽の値は明確で一貫している必要があります。
ミスターXcoder

@ Mr.Xcoder「真実の場合はすべて1の配列」と「偽の場合は少なくとも1つのゼロを含む配列」は明確で一貫性がありませんか?
ジュゼッペ

2
@Giuseppe 真実のためのすべての1の配列」と「偽りのための少なくとも1つのゼロを含む配列」は明確で一貫していませんか?-いいえ、一貫性がないため、受け入れられません。

2

anyfix、9バイト

I€A€2<»/&

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

I€A€2<»/&  Main Link
I          Deltas
 €         For each element
  A        Take its absolute value
   €  »    For each element
    2<     Is it less than two?
       /   Reduce over
        &  Logical AND

anyfixには自動ベクトル化やその他のクールな機能がないため、ひどい場合を除き、これは主に05AB1Eソリューションの移植版です。


2

C、61 56バイト

5バイトを節約してくれた@scottinetに感謝します!

r;f(a,n)int*a;{for(r=1;--n;r=(*a-*++a)/2?0:r);return r;}

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

C(gcc)、47バイト

r;f(a,n)int*a;{for(r=1;--n;r=(*a-*++a)/2?0:r);}

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


そして、それが許可されている場合/そのように感じている場合は、結果を返す代わりに格納することで、さらに9バイト節約できますr。:-)
スコチネット

@scottinet私はそれを検討しましたが、gccで動作する場合でも有効なCではありません。ただし、許可されているため、代替バージョンとして含めるだけです。
Steadybox

2
@scottinet関数の最後に変数を割り当てると、その値が関数の戻りアドレスに設定され、値を返しているように感じられます。ただし、この動作はC仕様の一部ではないため、動作を保証しません。また、特定の最適化コンパイラフラグで破損する可能性があります。
ジョナサンフレッチ

2
@scottinetあ、すみません。合意されたルールに従ってソリューション内の変数を単純に割り当てることはできないため、これは許可されないと思います。例として、関数の引数の代わりにグローバルに定義された変数を使用することも許可されません。あなたの仕事は、完全に機能するプログラム/機能を書くことです。
ジョナサンフレッチ

1
@JonathanFrech言語は、ここでの実装によって定義されるため、一貫した結果を生成するコンパイラーがある場合、正式なUBであっても答えは有効です。
クエンティン

2

Clojure、35バイト

#(every? #{-1 0 1}(map -(rest %)%))

それはどれほどきれいですか?


2

TI-Basic、6 7バイト

prod(2>abs(ΔList(Ans

または、エラーが有効な戻り値としてカウントされる場合は5バイト(ERR:ARGUMENT重要でない場合は戻り、そうでない場合はERR:DOMAIN

augment(sin⁻¹(ΔList(Ans

1
これにはおそらくがあるはずabs(ΔList(Ansですが、そうでない場合は({5,3,1}やテストケース{3,4,5,6,7,8,7,5}のように)1つ以上低下しません。検出されました。
ミシャラヴロフ

@MishaLavrovありがとう、あなたは正しい!

1

JavaScript(ES6)、37 36バイト

(a,u)=>!a.some(e=>(e-=(u=e))>1|e<-1)

編集:@Arnauldのトリックを盗んで1バイトを保存しました。


カレーを使用することができます:a=>u=>!a.some(e=>(e-=(u=e))>1|e<-1)
バリント

1

Pyth、7バイト

._I#I.+

テストスイート

true / falseを返します。

説明:

     .+ Deltas, returns differences between consecutive values.
._      Signum, returns the sign of a number (1, 0, or -1).  Note that this should
             be equal to the input for insignificant arrays.
  I     Tests if it is equal to the input...
   #    For each in the input, and filter out those that aren't...
    I   And make sure none have been filtered out.

1

Mathematica、34バイト

Differences@#~MatchQ~{(1|0|-1)..}&

説明

                                 & (* Function *)
Differences                        (* which takes the consecutive differences*)
           @#                      (* of the input list *)
             ~MatchQ~              (* and returns whether it matches *)
                     {(1|0|-1)..}  (* a list consisting of one or more 1s, 0s, or -1s *)

1

Java(OpenJDK 8)、60バイト

a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}

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

  • @Nevayのおかげで5バイト!

1
:(60バイト)の代わりに使用する場合r、ループで使用して計算できるの(p-n)は1回のみ、または、または削除できます。>>1/2|+a->{int r=1,p=a[0];for(int i:a)r|=(r=p-(p=i))*r;return r<2;}
ネベイ

乾杯@Nevay、ありがとう!いつものように完璧なゴルフ;-)
オリビエグレゴワール

それがどのように機能するか説明してもらえますか?ありがとうございました!
blurstream

1

Swift 4、52バイト

{!zip($0.dropFirst(),$0).map(-).contains{1<abs($0)}}

テストスイート:

let isInsignificant: (_ array: [Int]) -> Bool = {!zip($0.dropFirst(),$0).map(-).contains{1<abs($0)}}

let testcases: [(input: [Int], expected: Bool)] = [
    (input: [1, 2, 3, 4, 3, 4, 5, 5, 5, 4], expected: true),
    (input: [1, 2, 3, 4, 5, 6, 7, 8, 9, 8], expected: true),
    (input: [3, 3, 3, 3, 3, 3, 3],          expected: true),
    (input: [3, 4, 4, 4, 3, 3, 3, 4, 4, 4], expected: true),
    (input: [1, 2, 3, 4],                   expected: true ),
    (input: [5, 4, 3, 2],                   expected: true ),
    (input: [1, 3, 5, 7, 9, 7, 5, 3, 1],    expected: false),
    (input: [1, 1, 1, 2, 3, 4, 5, 6, 19],   expected: false),
    (input: [3, 4, 5, 6, 7, 8, 7, 5],       expected: false),
    (input: [1, 2, 4, 10, 18, 10, 100],     expected: false),
    (input: [10, 20, 30, 30, 30],           expected: false),
]


for (caseNumber, testcase) in testcases.enumerated() {
    let actual = isInsignificant(testcase.input)
    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \(testcase.input) failed. Got \(actual), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}

1

APL、13バイト

{×/(|2-/⍵)<2}

最初のAPL回答\ o /

注:私はHyper Neutrinoが所有するボットです。私は主にチャットのテストのために存在しています。

説明

{×/(|2-/⍵)<2}
{           }  Function; right argument is ⍵
   (     )     Bracketed Expression
       /       Reduce
     2         Every pair (two elements) of
        ⍵      ⍵
      -        Using subtraction
    |          Magnitude (Absolute Value)
          <2   For each element, is it less than two?
  /            Reduce over
 ×             Multiplication (Product) (All)

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