許容されるシーケンスのテスト


13

エグゼクティブサマリー:整数の入力シーケンスが「許容される」かどうかをテストします。これは、モジュラスのすべての剰余クラスをカバーしないことを意味します。

「許容される」シーケンスとは何ですか?

整数m≥2が与えられた場合、mをとする剰余類は、共通の差mのmの算術級数になります。たとえば、m = 4の場合、4を法とする4つの剰余クラスは

..., -8, -4, 0, 4, 8, 12, ...
..., -7, -3, 1, 5, 9, 13, ...
..., -6, -2, 2, 6, 10, 14, ...
..., -5, -1, 3, 7, 11, 15, ...

k番目の剰余クラスは、mで除算したときの剰余がkに等しいすべての整数で構成されます。(負の整数に対して「剰余」を正しく定義している限り)

整数a1、a2、...、akのシーケンスは、剰余クラスの少なくとも1つと交差しない場合、mを法として許容されます。たとえば、{0、1、2、3}および{-4、5、14、23}は4を法とする許容値ではありませんが、{0、1、2、4}および{0、1、5、9 }および{0、1、2、-3} 4を法として許容されます。また、{0、1、2、3、4}は4を法として許容されませんが、{0、1、2} 4を法として許容されます。

最後に、整数のシーケンスは、すべての整数m≥2に対してモジュロmで許容される場合、単純に許容されます。

チャレンジ

入力として整数のシーケンスを受け取り、シーケンスが許容される場合は(一貫した)Truthy値を返し、シーケンスが許容されない場合は(一貫した)Falsy値を返すプログラムまたは関数を作成します。

整数の入力シーケンスは、任意の妥当な形式にすることができます。入力シーケンスに少なくとも2つの整数があると仮定できます。(必要に応じて入力整数が異なると仮定することもできますが、おそらく役に立ちません。)正および負の整数(および0)を処理できる必要があります。

通常のスコアリング:バイト単位の最短回答が勝ちます。

サンプル入力

次の入力シーケンスは、それぞれTruthy値を提供する必要があります。

0 2
-1 1
-100 -200
0 2 6
0 2 6 8
0 2 6 8 12
0 4 6 10 12
-60 0 60 120 180
0 2 6 8 12 26
11 13 17 19 23 29 31
-11 -13 -17 -19 -23 -29 -31

次の入力シーケンスはそれぞれ、Falsy値を提供する必要があります。

0 1
-1 4
-100 -201
0 2 4
0 2 6 10
0 2 6 8 14
7 11 13 17 19 23 29
-60 0 60 120 180 240 300

チップ

  • 3以下の整数のシーケンスは4を法として自動的に許容されることに注意してください。より一般的には、m> kの場合、長さkのシーケンスはmを法として自動的に許容されます。許容性のテストでは、実際には有限数のmをチェックするだけで済みます。
  • また、2は4を除算し、2を法とする許容可能なシーケンス(つまり、すべて偶数またはすべて奇数)は4を法として自動的に許容されることに注意してください。 nを法として自動的に許容されます。したがって、許容性を確認するには、必要に応じて素数mのみを考慮するだけで十分です。
  • a1、a2、...、akが許容可能なシーケンスである場合、任意の整数c(正または負)に対してa1 + c、a2 + c、...、ak + cも許容されます。

数学的関連性(オプションの読み取り)

a1、a2、...、akを整数のシーケンスとします。n + a1、n + a2、...、n + akがすべて素数であるような整数nが無限にあるとします。それから、a1、a2、...、akが許容可能である必要があることを示すのは簡単です。実際、a1、a2、...、akは許容できないと仮定し、mを、a1、a2、...、akがmを法として許容できないような数とする。次に、どのnを選択しても、数値n + a1、n + a2、...、n + akのいずれかはmの倍数でなければならないため、素数にはなりません。

プライムK-タプル予想は、まだ数論で大きく開いて問題となっているこの文の逆、である:それはA1、A2場合、...、AKは許容シーケンス(またはであることを主張するK-タプル)、そこn + a1、n + a2、...、n + akがすべて素数であるような無限に多くの整数nでなければなりません。たとえば、許容されるシーケンス0、2は、nとn + 2の両方が素数になるように無限に多くの整数nが存在する必要があるというステートメントを生成します。これは双子素数予想です(まだ証明されていません)。


3
[_60:0:60:120:180]私に真実を与えています。確かに、すべてのmfrom 2から5包括的で少なくとも1つのクラスと交差しません。さらに、mfromから2to 5までのすべてで1つのクラスのみと交差します。
リーキー修道女

1
[-60、0、60、120、180]についても@LeakyNunと同じですが、これは許容されるはずです。
カールナップ

-60 0 60 120 180 240 3007を法とするすべての残基クラスと交差するため、許容されません。
グレッグマーティン

より長いテストケースを作成できますか?
リーキー修道女

@LeakyNun:任意のmについて、mより大きい最初のm個の素数が許容されるシーケンスを形成します。(最後から2番目のTruthyテストケースは、m = 7の例です。)偽のテストケースは、整数1、...、mで開始し、k≤mを選択し、 kから開始整数1、...、mのいずれかまたはすべてまで。
グレッグマーティン

回答:



7

Brachylog25 24 19バイト

Karl Napfのおかげで5バイト。

lybb '(eM-yA、?:[M] z:%aodA)
l:2'(eM-yA、?:[M] z:%aodA)
l:2 '(eMg:?rz:%adlM)

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

すべてのテストケースを確認してください!

l:2'(eMg:?rz:%adlM)
l:2                  Temp = [2:length(input)]
   '(             )  true if the following cannot be proven:
     eM                  M is an element of the interval
                         indicated by Temp, i.e. from 2
                         to the length of input inclusive,
       g:?rz:%adlM       every element of input modulo M
                         de-duplicated has length M.

4

Python、 61 60バイト

q=lambda l,d=2:d>len(l)or q(l,d+1)&(len({v%d for v in l})<d)

イデオンのすべてのテストケース

編集:1バイトを節約するために論理的およびビット単位の&に置き換え


2

JavaScript(ES6)、59バイト

a=>a.every((_,i)=>!i++|new Set(a.map(e=>(e%i+i)%i)).size<i)

@KarlNapfの剰余セットのトリックを使用します。


1
まあ、それはトリックではなく、単なる数学
です;

2

Python、67 64バイト

名前のないラムダとして:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • EDIT1:交換しset(){}
  • Edit2:ジェネレーターの周りに角括弧は必要ありません all(...)
  • 編集3:ジョナサン・アランが指摘したrangeように、len(N)+1

関数としての古いコード(96バイト):

def f(N):
 for m in range(2,len(N)+1):
    if len(set(i%m for i in N))==m:return False
 return True

1
これにより、5バイト節約したアプローチの功績を称えます。
リーキー修道女

@LeakyNunどういたしまして!
カールナップ


2

MATL、11バイト

"X@QGy\un>v

Truthyは、すべてを含む配列(列ベクトル)です。Falsyは、少なくとも1つのゼロを含む配列です。これらの定義は次を使用して確認できます。このリンクてます。

オンラインでお試しください!または、すべてのテストケースを確認します。 truthyfalsy(コードを少し修正し、各ケースは明確にするために水平ベクトルを生成します)。

説明

"       % Take input array. For each; i.e. repeat n times, where n is arrray size
  X@Q   %   Push iteration index plus 1, say k. So k is 2 in the first iteration,
        %   3 in the second, ... n+1 in the last. Actually we only need 2, ..., n;
        %   but the final n+1 doesn't hurt
  G     %   Push input again
  y     %   Duplicate k onto the top of the stack
  \     %   Modulo. Gives vector of remainders of input when divided by k
  un    %   Number of distinct elements
  >     %   True if that number is smaller than k
  v     %   Vertically concatenate with previous results
        % End for each. Implicitly display 

私はまだこのサイトを志向しているので、これがよく尋ねられるタイプの質問であればおaびしますが、真実/偽の値は「atを含む配列」などのパターンではなく、実際の定数でなければなりません少なくとも1つのゼロ」。最後に定数に到達するために(この場合はビット単位のANDを使用して)配列を処理すべきではありませんか?
グレッグマーティン

@GregMartinそれは非常に良い質問です。その答えについてはかなり堅実なコンセンサスがあります。ここを
ルイスメンドー

1
わかった、そして今、私はあなたの最初のリンクのポイントを見る。説明してくれてありがとう!
グレッグマーティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.