Xác minh bộ khác biệt theo chu kỳ


14

Tập khác biệt theo chu kỳ là một tập hợp các số nguyên dương có thuộc tính duy nhất:

  1. Hãy nlà số nguyên lớn nhất trong tập hợp.
  2. Đặt rbất kỳ số nguyên nào (không nhất thiết trong tập hợp) lớn hơn 0 nhưng nhỏ hơn hoặc bằng n/2.
  3. Hãy ksố giải pháp để (b - a) % n = rnơi abbất kỳ thành viên của bộ này. Mỗi giải pháp là một cặp theo thứ tự (a,b). (Cũng lưu ý rằng phiên bản modulo này làm cho số âm trở nên tích cực bằng cách thêm nvào nó, không giống như việc triển khai bằng nhiều ngôn ngữ.)
  4. Cuối cùng, nếu và chỉ khi đây là một bộ khác biệt theo chu kỳ, giá trị của kkhông phụ thuộc vào sự lựa chọn của bạn r. Đó là, tất cả các giá trị rđưa ra cùng một số giải pháp cho sự phù hợp ở trên.

Điều này có thể được minh họa bằng ví dụ sau:

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)

Mỗi giá trị của rcó cùng số lượng giải pháp, 3 trong trường hợp này, vì vậy đây là một tập hợp chênh lệch theo chu kỳ.

Đầu vào

Đầu vào sẽ là một danh sách các số nguyên dương. Vì đây là thuộc tính được đặt, giả sử rằng đầu vào không được sắp xếp. Bạn có thể cho rằng đó nlà ít nhất 2, mặc dù kcó thể bằng không.

Đầu ra

Chương trình / hàm của bạn sẽ xuất ra một giá trị trung thực nếu tập hợp là tập khác biệt theo chu kỳ hoặc giá trị falsey khác.

Các trường hợp thử nghiệm

Bộ khác biệt tuần hoàn hợp lệ:

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

( nguồn dữ liệu , mặc dù quy ước của họ là khác nhau)

Bộ khác biệt theo chu kỳ không hợp lệ:

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

1
Có thể ablà cùng một thành viên (không nhất thiết a ≠ b)?
Erik the Outgolfer 9/2/18

2
@EriktheOutgolfer nếu balà cùng một số, (b-a)%n = 0nhưng 0 không phải là một trong những giá trị mà bạn đang tìm giải pháp. Vì vậy, không có sự cấm đoán rõ ràng đối với họ là cùng một số, nhưng họ sẽ không bao giờ.
PhiNotPi

1
Tôi thực sự thích nó nếu 7 7 7đầu vào không hợp lệ. Một tập hợp không lặp lại các giá trị
TonMedel

1
@TonH rửa Xong và xong. 7 7 7là một yêu cầu của người dùng khác, nhưng tôi đã xóa nó vì nó không phải là một bộ.
PhiNotPi

1
Ý tưởng chơi gôn: chúng ta không cần bị ràng buộc rbởi 0 < r <= max(input)/2, nhưng thay vào đó 0 < r < max(input)bởi vì chúng ta có thể có được r > max(input)/2các trường hợp bằng cách đơn giản là trừ đi các phép trừ trong r <= max(input)/2các trường hợp.
JungHwan Min

Câu trả lời:


9

Thạch , 14 7 byte

_þ%ṀṬSE

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

_þ%ṀṬ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

Husk , 13 byte

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

Hãy thử trực tuyến!

Ba siêu ký tự 1 dường như lãng phí ...

Giải trình

Ë#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

Ngôn ngữ Wolfram (Mathicala) , 53 52 byte

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

Hãy thử trực tuyến!

Lưu ý, chúng ta không cần phải phân chia các yếu tố tối đa bởi hai do đối xứng (chúng tôi có thể kiểm tra số lượng của tất cả các modulos 1đến max(input) - 1).

Giải trình

#~Permutations~{2}

Lấy tất cả các hoán vị dài 2 của đầu vào.

#-#2&@@@

Tìm sự khác biệt của từng

Mod[ ... ,Max@#]

Mod kết quả bằng phần tử tối đa của đầu vào.

Counts@

Tìm tần số của từng phần tử.

SameQ@@

Trả về cho dù tất cả các số là như nhau.



3

JavaScript (ES6), 87 byte

Trả về 0 hoặc 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])

Các trường hợp thử nghiệm


3

Perl, 68 67 66 byte

Bao gồm +2choap

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 byte

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

Hãy thử trực tuyến!

Ung dung:

->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 byte

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 là hàm thực hiện kiểm tra. Nó chỉ tính toán tất cả sự khác biệt và tính.


lettrong một mẫu bảo vệ thay vì wherelưu một byte: Hãy thử trực tuyến!
Laikoni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.