验证循环差异集


14

循环差集是一组具有唯一属性的正整数:

  1. 令其n为集合中的最大整数。
  2. r是(在该组不是必需的)的任何整数大于0但小于或等于n/2
  3. k解决方案的数量(b - a) % n = r这里ab是一组的任何成员。每个解决方案都是有序对(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,因此这是一个循环差集。

输入值

输入将是一个正整数列表。由于这是一个set属性,因此假设输入排序。您可以假定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)吗?
Erik the Outgolfer

2
@EriktheOutgolfer如果ba是相同的数字,(b-a)%n = 0则为,但是0并不是您要寻找解决方案的值之一。因此,并没有明确禁止它们相同的数字,但永远不会如此。
PhiNotPi

1
如果7 7 7输入无效,我真的很喜欢。一组不会重复值
Ton Hospel '18年

1
@TonHospel完成并完成。 7 7 7是另一个用户的请求,但我将其删除,因为它不是一个集合。
PhiNotPi

1
高尔夫的想法:我们不需要你来约束r0 < r <= max(input)/2,而是0 < r < max(input)因为我们能够获得r > max(input)/2通过简单地翻转减法案件r <= max(input)/2的情况。
JungHwan Min

Answers:


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%▲¹×-¹¹ḣ½▲

在线尝试!

三个上标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@#]&

在线尝试!

注意,由于对称性,我们不需要将max元素除以2(我们可以检查所有模数的1max(input) - 1)。

说明

#~Permutations~{2}

接受输入的所有length-2排列。

#-#2&@@@

找出每个的差异

Mod[ ... ,Max@#]

通过输入的最大元素修改结果。

Counts@

找到每个元素的频率。

SameQ@@

返回所有数字是否相同。



3

JavaScript(ES6),87个字节

返回01

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

红宝石,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.
}

2

Haskell,84个字节

l s=all((g 1==).g)[1..t-1]where t=maximum s;g j=[1|x<-s>>=(`map`s).(-),x==j||x+t==j]

l是执行检查的功能。它只是计算所有差异和计数。


let在模式保护程序中而不是where节省字节:在线尝试!
Laikoni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.