巡回差分セットの検証


14

循環差分セットは、一意のプロパティを持つ正の整数のセットです。

  1. ましょうnセットで最大の整数になります。
  2. Let rは、0より大きく、以下の任意の整数(セット内にある必要はありません)n/2です。
  3. してみましょうkことが解決策の数にとセットの任意のメンバーです。各ソリューションは順序ペアです。(また、多くの言語での実装とは異なり、このバージョンのモジュロは、追加することで負の数を正にすることに注意してください。)(b - a) % n = rab(a,b)n
  4. 最後に、これが循環差分セットである場合にのみ、の値はのk選択に依存しませんr。つまり、すべての値はr、上記の一致に対して同じ数の解を与えます。

これは、次の例で説明できます。

Cyclic difference set: {4,5,6,8,9,11}
0 < r <= 11/2, so r = 1,2,3,4,5
r=1: (4,5) (5,6) (8,9)
r=2: (4,6) (6,8) (9,11)
r=3: (5,8) (6,9) (8,11)
r=4: (4,8) (5,9) (11,4)  since (4-11)%11=(-7)%11=4
r=5: (4,9) (6,11) (11,5)

の各値にrは同じ数の解(この場合は3)があるため、これは循環差分セットです。

入力

入力は正の整数のリストになります。これは設定プロパティであるため、入力はソートされていないと想定します。n少なくとも2であると仮定できますが、kゼロでもかまいません。

出力

プログラム/関数は、セットが循環差分セットの場合は真偽値を出力し、そうでない場合は偽値を出力する必要があります。

テストケース

有効な循環差分セット:

10,12,17,18,21
7,5,4
57,1,5,7,17,35,38,49
1,24,35,38,40,53,86,108,114,118,135,144,185,210,254,266,273
16,3,19,4,8,10,15,5,6
8,23,11,12,15,2,3,5,7,17,1

データソース、ただし慣例は異なります)

無効な循環差分セット:

1,2,3,4,20
57,3,5,7,17,35,38,49
3,4,5,9
14,10,8

1
することができますaし、b(必ずしも同じメンバーですかa ≠ b)?
エリックアウトゴルファー

2
@EriktheOutgolfer if bとis aが同じ数である場合、、(b-a)%n = 0しかし0は解決策を探している値の1つではありません。したがって、同じ番号であることを明示的に禁止することはありませんが、禁止されることはありません。
PhiNotPi

1
7 7 7入力が無効だった場合、私は本当にそれを好むでしょう。セットが値を繰り返さない
トンホスペル

1
@TonHospel完了しました。 7 7 7は別のユーザーからリクエストされましたが、セットではないため削除しました。
PhiNotPi

1
アイデアをゴルフ:バインドに私たちが必要としないr0 < r <= max(input)/2、その代わりに0 < r < max(input)我々は得ることができますのでr > max(input)/2、単純に引き算をひっくり返すことにより、ケースをr <= max(input)/2例。
ジョンファンミン

回答:


9

ゼリー14 7バイト

_þ%ṀṬSE

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

使い方

_þ%ṀṬSE  Main link. Argument: A (array of unique elements / ordered set)

_þ       Subtract table; yield a 2D array of all possible differences of two
         (not necessarily distinct) elements of A.
  %Ṁ     Take the differences modulo max(A).
    Ṭ    Untruth; map each array of differences modulo max(A) to a Boolean array
         with 1's at the specified indices. Note that all 0's in the index array
         are ignored, since indexing is 1-based in Jelly.
     S   Take the sum of these arrays, counting occurrences.
      E  Test if all resulting counts are equal.

5

、13バイト

Ë#m%▲¹×-¹¹ḣ½▲

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

3つの上付き文字1は無駄に思えます...

説明

Ë#m%▲¹×-¹¹ḣ½▲  Input is a list, say x=[7,5,4]
            ▲  Maximum: 7
           ½   Halve: 3.5
          ḣ    Inclusive range from 1: [1,2,3]
Ë              All elements are equal under this function:
                Argument is a number, say n=2.
      ×-¹¹      Differences of all pairs from x: [0,-2,2,-3,0,3,-1,1,0]
  m%▲¹          Map modulo max(x): [0,5,2,4,0,3,6,1,0]
 #              Count occurrences of n: 1

4

Wolfram言語(Mathematica)53 52バイト

SameQ@@Counts@Mod[#-#2&@@@#~Permutations~{2},Max@#]&

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

注意、我々は(我々はすべてのモジュロの数を確認することが対称性のために2で、最大の要素を分割する必要はありません1max(input) - 1)。

説明

#~Permutations~{2}

入力の長さ2の順列をすべて取得します。

#-#2&@@@

それぞれの違いを見つける

Mod[ ... ,Max@#]

入力の最大要素で結果を調整します。

Counts@

各要素の周波数を見つけます。

SameQ@@

すべての数値が同じかどうかを返します。



3

JavaScript(ES6)、87バイト

0または1を返します。

a=>a.map(b=>a.map(c=>x[c=(c-b+(n=Math.max(...a)))%n-1]=-~x[c]),x=[])|!x.some(v=>v^x[0])

テストケース


3

Perl、68 67 66バイト

含み+2のためにap

perl -apE '\@G[@F];pop@G;s:\d+:$G[$_-$&].=1for@F:eg;$_="@G"=~/^1*( 1*)\1*$/' <<< "4 5 6 8 9 11"


2

Ruby、81バイト

->s{n=s.max
(1..n/2).map{|r|s.permutation(2).count{|a,b|(b-a)%n==r}}.uniq.size<2}

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

ゴルフをしていない:

->s{
  n=s.max
  (1..n/2).map{|r|               # For each choice of r
    s.permutation(2).count{|a,b| # Count the element pairs
      (b-a)%n==r                 #   for which this equality holds
    }
  }.uniq.size<2                  # All counts should be identical.
}

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