Döngüsel Fark Setlerini Doğrulayın


14

Döngüsel fark kümesi , benzersiz bir özelliğe sahip bir dizi pozitif tamsayıdır:

  1. Izin vermek nkümedeki en büyük tamsayı olmak.
  2. Izin rvermek herhangi bir tamsayı (kümede mutlaka) 0'dan büyük ama eşit veya daha küçük olsun n/2.
  3. Izin kolmak çözümlerin sayısı için (b - a) % n = rnerede ave bsetin herhangi üyeleridir. Her çözüm sıralı bir çifttir (a,b). (Modulo'nun bu sürümünün, nbirçok dilde yapılan uygulamaların aksine, ekleyerek negatif sayıları pozitif hale getirdiğini unutmayın .)
  4. Son olarak, eğer sadece bu döngüsel bir fark kümesi ise, değeri kseçiminize bağlı değildir r. Yani, tüm değerler ryukarıdaki uyum için aynı sayıda çözüm sunar.

Bu, aşağıdaki örnekle gösterilebilir:

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)

Her değerinin raynı sayıda çözümü vardır, bu durumda 3, bu yüzden bu döngüsel bir fark kümesidir.

Giriş

Girdi, pozitif tamsayıların bir listesi olacaktır. Bu bir dizi özellik olduğundan, bu giriş varsayıyorum değil sıralanmış. Sıfır olsa da n, en azından bunun olduğunu varsayabilirsiniz .2k

Çıktı

Set döngüsel bir fark kümesi ise programınız / fonksiyonunuz doğruluk değeri veya aksi takdirde bir falsey değeri vermelidir.

Test Durumları

Geçerli döngüsel fark setleri:

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

( kuralları farklı olmasına rağmen veri kaynağı )

Geçersiz döngüsel fark setleri:

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

1
Can ave baynı üyeyi (ille olmak a ≠ b)?
Outgolfer Erik

2
@EriktheOutgolfer ise bve aaynı sayı ise (b-a)%n = 0, ancak 0, çözüm aradığınız değerlerden biri değildir. Dolayısıyla, aynı sayıda olmaları konusunda açık bir yasak yok, ama asla olmayacaklar.
PhiNotPi

1
7 7 7Geçersiz giriş olsaydı gerçekten tercih ederim . Bir set değerleri tekrarlamaz
Ton Hospel

1
@TonHospel Bitti ve bitti. 7 7 7başka bir kullanıcı tarafından istendi, ancak bir küme olmadığı için kaldırdım.
PhiNotPi

1
Fikri Golf: bağlı için ihtiyacımız yok rtarafından 0 < r <= max(input)/2, bunun yerine 0 < r < max(input)biz elde edebilirsiniz, çünkü r > max(input)/2basitçe çıkarma çevirerek davaları r <= max(input)/2durumlarda.
JungHwan Min

Yanıtlar:


9

Jöle , 14 7 bayt

_þ%ṀṬSE

Çevrimiçi deneyin!

Nasıl çalışır

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

Kabuk , 13 bayt

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

Çevrimiçi deneyin!

Üç üst simge 1 israf gibi görünüyor ...

açıklama

Ë#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 Dili (Mathematica) , 53 52 bayt

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

Çevrimiçi deneyin!

Not, simetri nedeniyle max öğesini ikiye bölmemize 1gerek yoktur (tüm modüllerin sayısını kontrol edebiliriz max(input) - 1).

açıklama

#~Permutations~{2}

Girişin tüm uzunluk-2 permütasyonlarını alın.

#-#2&@@@

Her birinin farkını bulun

Mod[ ... ,Max@#]

Sonucu, girişin maksimum öğesi ile değiştirin.

Counts@

Her bir elemanın frekanslarını bulun.

SameQ@@

Tüm numaraların aynı olup olmadığını döndürün.



3

JavaScript (ES6), 87 bayt

0 veya 1 değerini döndürür .

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

Test senaryoları


3

Perl, 68 67 66 bayt

içerir +2içinap

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 bayt

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

Çevrimiçi deneyin!

Ungolfed:

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

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 kontrolü yapan işlevdir. Sadece tüm farklılıkları ve sayıları hesaplar.


letwherebayt tasarrufu yerine bir model koruyucusunda : Çevrimiçi deneyin!
Laikoni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.