ランニングで数を制限する


15

自己制限リスト

非負の整数を含む空でないリストLを考えます。実行中のLは長くすることができないに等しい要素の連続したサブリストです。たとえば、[0,0,1,1,3,3,3,2,1,1]の実行[0,0]、[1,1]、[3,3,3]、[2 ]、[1,1]。リストLは、各整数N≥1について、Nの出現回数がN-1の実行回数以下の場合、自己制限的です。上記のリストは1が4回出現しますが、0の実行は1回だけなので、自己制限的ではありません。

自己制限リストの例を次に示します:[0,0,3,4,1,0,2,1,1,0,2,1,0,0,0,1,0]。持っている

  • 5つのラン0と5つの出現1
  • 4回の1回の実行と2回の2回の実行、
  • 2つの実験2との1つの発生3
  • 1回の3回の実行と1回の4回の実行、
  • 4回1回実行、5回は発生しない、
  • 他の整数は発生しません。

タスク

あなたの仕事は、リストが自己制限的であるかどうかを決定することです。より明示的には、入力は負でない整数の空でないリストでなければなりません。リストが自己制限的である場合、出力は真実です。それ以外の場合は、偽造されます。入力と出力は任意の合理的な形式にすることができます。

各プログラミング言語の最小バイト数が勝者です。標準の規則が適用されます。

テストケース

真実のインスタンス:

[0]
[1,0]
[0,1,1,0,2]
[3,1,1,0,0,2,0,0]
[5,0,4,1,3,0,2,2,0,1,1,1,0]
[0,0,1,1,0,0,1,1,0,0,2,2,0,0]
[6,0,0,0,2,2,1,0,5,0,3,4,0,1,1,1]
[5,0,1,0,0,0,0,4,0,3,1,1,1,2,2,0,0,0,0,0]
[4,5,1,3,2,0,5,2,0,3,0,1,0,1,0,0,0,1,0,0,1,0,3,4,4,0,2,6,0,2,6]
[0,4,1,3,10,6,0,1,3,7,9,5,5,0,7,4,2,2,5,0,1,3,8,8,11,0,0,6,2,1,1,2,0,4]

偽のインスタンス:

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

面倒なことではありませんが、真実性はここで頻繁に使用されるいくつかの言語の特性ではないため、真実/偽りの代わりにこのメタ議論のアプローチの1つを使用することを検討してください。
FryAmTheEggman

@LeakyNunはい、そうでなければ条件は、それらのために失敗したNれるN-1が存在しません。
ズガルブ

@ Mr.Xcoderもあり[2]ますが、そのような場合は偽物です。
エリックアウトゴルファー

@FryAmTheEggman私はその議論を見たことはありませんでした、リンクしてくれてありがとう。ただし、ここで説明したアプローチをしばらく処理したいので、この課題はそのままにします。
ズガルブ

確かに、多くの人がそれを見逃しているように感じるので、コメントをそこに残したいと思います。少なくとも私にとって、Retinaのような言語で投稿することは非常に重要です。
FryAmTheEggman

回答:


5

Perl 6バイト

{bag(.grep(?*)X-1)⊆.squish}

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

Perl 6の非常に素晴らしいチャレンジです。Bags(整数の重み付きセット)でサブセット演算子を使用します。説明:

{
    bag(           # Create bag of
        .grep(?*)  # non-zero elements,
        X- 1       # decremented by one.
    )
                  # Subset test.
    .squish        # "squish" removes repeated elements in each run.
                   # The result is implicitly converted to a bag
                   # counting the number of runs.
}

1
綺麗な。Bag + subsetアプローチを見ましたが、比較対象にこだわっています。
フィルH

3

JavaScript(ES6)、92 89バイト

a=>a.map(n=>g(~n,n!=p&&g(p=n)),c=[j=0],p=g=n=>c[n]=-~c[n])&&!c.some((n,i)=>i-j++|n<c[~j])

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

どうやって?

配列c []は、実行回数と整数発生回数の両方を格納するために使用されます。実行は非負のインデックスに格納され、整数のオカレンスは1の補数のインデックスに格納されます(c [-1] = 0の数、c [-2] = 1ののなど)。

負のインデックスは、実際には基になる配列オブジェクトのプロパティとして保存され、.some()はそれらを繰り返し処理しません。

a =>                        // given the input array a[]
  a.map(n =>                // for each value n in a[]:
    g(                      //   update c[]:
      ~n,                   //     increment c[~n] (# of integer occurrences)
      n != p && g(p = n)    //     if n != p, set p to n and increment c[n] (# of runs)
    ),                      //   end of c[] update
    c = [j = 0],            //   start with c = [0] and j = 0 (used later)
    p =                     //   initialize p to a non-numeric value
    g = n => c[n] = -~c[n]  //   g = helper function to increment c[n]
  )                         // end of map()
  && !c.some((n, i) =>      // for each value n at position i in c[]:
    i - j++ |               //   make sure that i == j++
    n < c[~j]               //   and n is greater than or equal to c[~j]
  )                         // end of some()


3

ゼリー、10バイト

œ-ŒgḢ€‘ƊS¬

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

使い方

œ-ŒgḢ€‘ƊS¬  Main link. Argument: A (array)

       Ɗ    Drei; group the three links to the left into a monadic chain.
  Œg          Group consecutive, identical elements of A into subarrays.
    Ḣ€        Head each; pop the first element of each run.
      ‘       Increment the extracted integers.
            The resulting array contains n repeated once for each run of (n-1)'s.
œ-          Perform multiset subtraction, removing one occurrence of n for each
            run of (n-1)'s.
       S    Take the sum. If only 0's remain, the sum will be 0.
        ¬   Take the logical NOT, mapping 0 to 1 and positive integers to 0.





2

スタックス13 9 バイト

デニスは、はるかに優れたアルゴリズムを見つけました。私は恥知らずにそれをスタックに移植しました。

ä╨²@┬↕OR♣

オンラインで実行してデバッグする

開梱されていない、コメントされていない、これはそれがどのように見えるかです。

c   copy input
:g  get run elements
{^m increment each
|-  multiset-subtract from original input
|M! get maximum from result, and apply logical not

これを実行する

古い答え:

║Ä|╤#╫∩▼cëózü

実行してデバッグする

入力を反復処理し、条件を確認します。

  • 要素> 0ですか?
  • ありますかoccurrences(element) >= runs(element - 1)

これらの条件のいずれかが要素に当てはまる場合、その要素は準拠しています。すべての要素が準拠している場合、結果はになり1ます。

以下は、同じプログラムの、アンパックされたコメントなしのコメント付きの表現です。

O           push 1 under the input
F           iterate over the input using the rest of program
  |c        skip this iteration of the value is 0
  x#        number of occurrences of this value in input (a)
  x:g _v#   number of runs of (current-1) in input (b)
  >!        not (a > b); this will be truthy iff this element is compliant
  *         multiply with running result

これを実行する


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