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

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.

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

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.



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


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"


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

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.


letdi penjaga pola bukannya wheremenyimpan byte: Cobalah secara online!
Laikoni
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.