首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证循环差集

验证循环差集
EN

Code Golf用户
提问于 2018-02-09 16:04:41
回答 5查看 950关注 0票数 14

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

  1. n是集合中最大的整数。
  2. r是大于0但小于或等于n/2的任何整数(不一定在集合中)。
  3. k(b - a) % n = r的解决方案的数量,其中ab是集合的任何成员。每个解都是一个有序对(a,b)。(还请注意,这个版本的模通过向其添加n使负数变为正数,这与许多语言的实现不同。)
  4. 最后,当且仅当这是一个循环差集时,k的值不取决于您对r的选择。也就是说,对于上述同余,r的所有值都给出了相同数目的解。

可以用以下示例说明这一点:

代码语言:javascript
复制
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可能为零。

输出

如果程序/函数是循环差集,则程序/函数应该输出一个真实值,否则输出falsey值。

测试用例

有效循环差集:

代码语言:javascript
复制
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

(数据源,尽管他们的惯例不同)

无效循环差集:

代码语言:javascript
复制
1,2,3,4,20
57,3,5,7,17,35,38,49
3,4,5,9
14,10,8
EN

回答 5

Code Golf用户

发布于 2018-02-09 19:23:34

外壳,13字节

代码语言:javascript
复制
Ë#m%▲¹×-¹¹ḣ½▲

在网上试试!

三个上标1似乎很浪费..。

解释

代码语言:javascript
复制
Ë#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
票数 5
EN

Code Golf用户

发布于 2018-02-09 17:27:03

JavaScript (ES6),87字节

返回0或1。

代码语言:javascript
复制
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])

测试用例

代码语言:javascript
复制
let f =

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])

console.log('[Truthy]')
console.log(f([10,12,17,18,21]))
console.log(f([7,5,4]))
console.log(f([57,1,5,7,17,35,38,49]))
console.log(f([1,24,35,38,40,53,86,108,114,118,135,144,185,210,254,266,273]))
console.log(f([16,3,19,4,8,10,15,5,6]))
console.log(f([8,23,11,12,15,2,3,5,7,17,1]))

console.log('[Falsy]')
console.log(f([1,2,3,4,20]))
console.log(f([57,3,5,7,17,35,38,49]))
console.log(f([3,4,5,9]))
console.log(f([14,10,8]))
票数 3
EN

Code Golf用户

发布于 2018-02-10 03:31:41

Python 3,74字节

代码语言:javascript
复制
lambda x:len({sum(1+(a+r)%max(x)in x for a in x)for r in range(max(x))})<3

在网上试试!

票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/155366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档