Verifikasi Set Perbedaan Cyclic

14

Set perbedaan siklik adalah seperangkat bilangan bulat positif dengan properti unik:

  1. Membiarkan nmenjadi bilangan bulat terbesar di set.
  2. Membiarkan rbilangan bulat apa pun (tidak harus di set) lebih besar dari 0 tetapi kurang dari atau sama dengan n/2.
  3. Membiarkan kmenjadi sejumlah solusi ke (b - a) % n = rmana adan bada anggota set. Setiap solusi adalah pasangan yang dipesan (a,b). (Juga perhatikan bahwa versi modulo ini membuat angka negatif menjadi positif dengan menambahkannya n, tidak seperti implementasi dalam banyak bahasa.)
  4. Akhirnya, jika dan hanya jika ini adalah set perbedaan siklik, nilai ktidak tergantung pada pilihan Anda r. Yaitu, semua nilai rmemberikan jumlah solusi yang sama untuk kongruensi di atas.

Ini dapat diilustrasikan dengan contoh berikut:

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)

Setiap nilai rmemiliki jumlah solusi yang sama, 3 dalam hal ini, jadi ini adalah set perbedaan siklik.

Memasukkan

Input akan menjadi daftar bilangan bulat positif. Karena ini adalah properti yang disetel, anggap bahwa input tidak diurutkan. Anda dapat menganggap itu nsetidaknya 2, meskipun kmungkin nol.

Keluaran

Program / fungsi Anda harus menampilkan nilai kebenaran jika set adalah set perbedaan siklik, atau nilai falsey sebaliknya.

Uji Kasus

Set perbedaan siklik yang valid:

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

( sumber data , meskipun konvensi mereka berbeda)

Set perbedaan siklik tidak valid:

1,2,3,4,20
57,3,5,7,17,35,38,49
3,4,5,9
14,10,8
PhiNotPi
sumber
1
Bisakah adan bmenjadi anggota yang sama (tidak harus a ≠ b)?
Erik the Outgolfer
2
@EriktheOutgolfer jika bdan aadalah angka yang sama (b-a)%n = 0, tetapi 0 bukanlah salah satu nilai yang Anda cari solusi. Jadi tidak ada larangan eksplisit bahwa mereka memiliki nomor yang sama, tetapi mereka tidak akan pernah melakukannya.
PhiNotPi
1
Saya akan sangat suka jika 7 7 7input tidak valid. Satu set tidak mengulangi nilai
Ton Hospel
1
@TonHospel Selesai dan selesai. 7 7 7telah diminta oleh pengguna lain, tetapi saya telah menghapusnya karena itu bukan set.
PhiNotPi
1
Golf ide: kita tidak perlu terikat roleh 0 < r <= max(input)/2, melainkan 0 < r < max(input)karena kita dapat memperoleh r > max(input)/2kasus dengan hanya membalik pengurangan dalam r <= max(input)/2kasus.
JungHwan Min

Jawaban:

9

Jelly , 14 7 byte

_þ%ṀṬSE

Cobalah online!

Bagaimana itu bekerja

_þ%ṀṬ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.
Dennis
sumber
5

Sekam , 13 byte

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

Cobalah online!

Tiga 1 superskrip tampaknya boros ...

Penjelasan

Ë#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
Zgarb
sumber
4

Bahasa Wolfram (Mathematica) , 53 52 byte

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

Cobalah online!

Catatan, kita tidak perlu membagi elemen max dengan dua karena simetri (kita dapat memeriksa jumlah semua modulos 1ke max(input) - 1).

Penjelasan

#~Permutations~{2}

Ambil semua permutasi panjang-2 input.

#-#2&@@@

Temukan perbedaan masing-masing

Mod[ ... ,Max@#]

Mod hasilnya dengan elemen maksimal input.

Counts@

Temukan frekuensi setiap elemen.

SameQ@@

Kembalikan apakah semua angkanya sama.

JungHwan Min
sumber
4

Python 3 , 86 84 81 byte

-3 byte byte ke JungHwan Min

lambda x:len({*map([(b-a)%max(x)for a in x for b in x].count,range(1,max(x)))})<2

Cobalah online!

tongkat
sumber
3

JavaScript (ES6), 87 byte

Mengembalikan 0 atau 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])

Uji kasus

Arnauld
sumber
3

Perl, 68 67 66 byte

Termasuk +2untukap

perl -apE '\@G[@F];pop@G;s:\d+:$G[$_-$&].=1for@F:eg;$_="@G"=~/^1*( 1*)\1*$/' <<< "4 5 6 8 9 11"
Ton Hospel
sumber
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}

Cobalah online!

Tidak Disatukan:

->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.
}
benj2240
sumber
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 adalah fungsi yang melakukan pemeriksaan. Itu hanya menghitung semua perbedaan dan jumlah.

haskeller bangga
sumber
letdi penjaga pola bukannya wheremenyimpan byte: Cobalah secara online!
Laikoni