주기적 차이 집합 확인


14

순환 차이 집합 은 고유 한 속성을 가진 양의 정수 집합입니다.

  1. 하자 n세트의 가장 큰 정수.
  2. 하자 r0보다 큰 미만 (설정에서 반드시)의 정수를 수거나 같음 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같은 수의 솔루션 을 갖습니다.

입력

입력은 양의 정수 목록입니다. 이 속성은 설정 속성이므로 입력이 정렬 되지 않았다고 가정합니다 . 0 일 수도 있지만 n적어도 이라고 가정 할 수 있습니다.2k

산출

세트가 주기적 차이 세트이면 프로그램 / 함수는 정확한 값을, 그렇지 않으면 거짓 값을 출력해야합니다.

테스트 사례

유효한 순환 차이 세트 :

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아닐까요?
Outgolfer Erik

2
@EriktheOutgolfer 경우 ba다음, 같은 수 있습니다 (b-a)%n = 0, 그러나 공은 솔루션을 찾고있는 값 중 하나가 아닙니다. 따라서 같은 숫자라는 명백한 금지는 없지만 결코 그렇게 할 수는 없습니다.
PhiNotPi

1
7 7 7유효하지 않은 입력 이라면 정말 선호합니다 . 세트는 값을 반복하지 않습니다
Ton Hospel

1
@TonHospel 완료했습니다. 7 7 7다른 사용자가 요청했지만 세트가 아니기 때문에 제거했습니다.
PhiNotPi

1
골프 아이디어 :에 구속 r될 필요는 없지만 0 < r <= max(input)/2, 대신 에 빼기를 뒤집기 만하면 케이스를 0 < r < max(input)얻을 수 있기 때문 입니다. r > max(input)/2r <= max(input)/2
JungHwan Min 2019

답변:


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 Language (Mathematica) , 53 52 바이트

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

온라인으로 사용해보십시오!

참고, 우리는 (우리가 modulos의 수를 확인할 수 있습니다 인해 대칭으로 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

펄, 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.
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.