テイクバックカウントアルゴリズム


14

数え方を学んでいる子供は、数字の連続をよく知っていますが、それらの連続を適切にまとめることができないようです。

たとえば、彼らは言うかもしれません:

1,2,3,4,7,8,9,10

時々、子供たちはいくつかの数字をスキップしたことに気づき、戻ってきます:

1,2,3,4,7,8,5,6,7,8,9,10

これは明らかに優れたパターンです。それらを識別する必要があります。

これらのリストを識別するには:

  1. リストの最小値Mと最大値を特定しNます

  2. リストをステップスルーします。現在の数がその右側のリストのメンバー以上である場合、現在の数を削除します。

  3. 残りのリストにからMまでのすべての数値が含まれている場合N、真の値を返します。

入力リストには少なくとも1つの要素が含まれると想定できます。すべての整数が負でないと仮定できます。

テストケース:

真実:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

偽物:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

これはなので、できるだけ短く答えてください!


あまり明確ではありません:[0,1,2,3,4,5,4,3,2,1]はtrueまたはfalseと見なされるべきですか?
GB

1
@GB False。2番目の要素にいるときは、手順2で削除します(1後の行に別の要素があるため)。また、(最後の1を除く)他のすべての要素を削除したいので、あなたは、で終わるだろうと0 1されていない、0 1 2 3 4 5
ネイサンメリル

回答:


6

05AB1E、5バイト

これが100%確実であるとは言えませんが、すべてのテストケースに合格し、失敗する状況は見つかりませんでした。

Ú¥1QP

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

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

実際には7バイト、
valが復活モニカ言う

2
@valいいえ、05AB1Eはカスタムエンコーディング05AB1Eを使用します。
エリックアウトゴルファー

2

ゼリー10 9バイト

ṀrṂɓṚ«\Q⁼

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

使い方

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

興味深いのはɓ、比較的新しい機能ですか?
-ETHproductions

はい、それはジョナサンアランによるプルリクエストからです。
デニス

あは、13日前。まだ使用されていませんでした(多分あなたかジョナサンが持っていて、私はちょうどそれを見逃していました)。
-ETHproductions

«\しかし、ここで本当に興味深い部分は私の意見です。
エリックアウトゴルファー



1

PHP148130バイト

-18バイト、@ Christophに感謝

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

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


ここでたくさんコメントしてください:$argn常に文字列foreachは機能しません。$argv入力として配列を取得するために使用できますが、常に最初の要素としてファイル名が含まれていることに注意してください。あなたは、使用$mして$n、作成したバイトの多く救うことができるので、一度だけ$b以前に:$b=range(min($a),max($a));。キャスト(bool)は完全に不要です。if($k>=$a[$s])$a[$i]=null;$k<$a[$s]?:$a[$i]=-1;。:私たちはこれを行うことができ、参照使用foreach($a as$i=>&$k)(1バイト)と$a[$i]$k(-4バイト)。さらに、今すぐ直接$s=$i繰り返すことができるため、ドロップできます$i
クリストフ

結果は次のようになります$a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117バイト)。しかし、それでも$argn間違った方法で使用します。$a=explode(' ',$argn);これを13バイト追加して修正します。
クリストフ

1
問題ない !新しいPHPゴルファーを見つけるのはいつもいいです。もっと多くの人に会いたいと思います:) Titus、Jörg、または私がいつも助けてくれます!
クリストフ

1
@Christoph $_GET入力配列として使用しないのはなぜですか?この場合、使用する必要はありませんexplodeではない使用するためのadditonal -6バイトを$b変数
イェルクHülsermannを

1
@Christoph OKこの場合、7.1未満のバージョンが必要~ です。オンライン
ヨルクヒュルサーマン

1

Java 8、264 262バイト

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

説明:

ここで試してみてください。

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R、88 85バイト

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

これはおそらくさらにゴルフダウンすることができます。の要素をループし、x今後のすべての値がより大きいかどうかを確認し、その要素のみを保持します。ループの後、からmin(x)までのシーケンスを作成max(x)%in%、すべての値がの剪定バージョンに含まれているかどうかを確認しますx


デニスの答えを移植することで、53バイトまで削減できました。function(n)all(unique(cummin(rev(n)))==max(n):min(n))
ジュゼッペ

1

JavaScript(ES6)、60バイト

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

ゴルフをしていない:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

これはより単純なアルゴリズムです:

配列を逆に繰り返し、各番号(最初の番号を除く)が既に表示されている番号以下であることを確認します。

スニペット:



1

C#、69バイト

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

要するに:
s = input(s)equence
はs要素から取得し、この項目の後のすべてのアイテム(スキップ(I)ndex + 1アイテム)、現在の値は
これらをカウントし、残りの量が予想される量と等しいかどうかを確認します((最大)最大値-(最小)最大)数値の量

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


@MDXF彼を歓迎しますか?
スタンストラム

@StanStrumルールを誤解しましたか?私の英語はあまりにも面倒ですか?初めて私-am-投稿...
Barodus

いやいや!PPCGの新参者を歓迎することは特権であり、私は彼にあなたに挨拶したいのかどうかを尋ねていました
Stan Strum

特権はあなたの両方にあるように見えます。ありがとう、人々^^
バロドゥス

これは素晴らしい最初の答えです。PPCGの将来を楽しんでください。
スタンストラム

0

JavaScript(ES6)、82 73 72 70バイト

ブール値を返します。

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

どうやって?

入力配列の各要素xを反復処理します aの、検出された最大値 mと、右側のメンバー以上ではない値の数 -kを追跡します。定義により、有効な値は厳密に昇順で表示されます。

filter()ではなくを使用map()して、kが負になるまですべての要素が除外されるようにします。これにより、最初の有効な要素を分離できます。これは、配列の最小値であることも保証されています。

最後に、次のことをテストしminimum - (maximum + 1) == -number_of_valid_elementsます。

a.filter(...)[0] + ~m == k

テストケース

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