Sprawdź zestawy różnic cyklicznych

14

Zestaw różnic cyklicznych to zbiór liczb całkowitych dodatnich o unikalnej właściwości:

  1. Niech nbędzie największą liczbą całkowitą w zestawie.
  2. Niech rbędzie liczbą całkowitą (niekoniecznie w zestawie) większą niż 0, ale mniejszą lub równą n/2.
  3. Pozwolić kbyć liczba rozwiązań do (b - a) % n = rgdzie ai bsą jakieś członkowie zestawu. Każde rozwiązanie jest uporządkowaną parą (a,b). (Należy również pamiętać, że ta wersja modulo sprawia, że ​​liczby ujemne są dodatnie poprzez dodanie ndo niej, w przeciwieństwie do implementacji w wielu językach.)
  4. Wreszcie, jeśli i tylko jeśli jest to zestaw różnic cyklicznych, wartość knie zależy od twojego wyboru r. Oznacza to, że wszystkie wartości rdają taką samą liczbę rozwiązań powyższej zgodności.

Można to zilustrować następującym przykładem:

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)

Każda wartość rma taką samą liczbę rozwiązań, w tym przypadku 3, więc jest to zestaw różnic cyklicznych.

Wejście

Dane wejściowe będą listą liczb całkowitych dodatnich. Ponieważ jest to właściwość set, załóż, że dane wejściowe nie są sortowane. Możesz założyć, że njest co najmniej 2, chociaż kmoże wynosić zero.

Wynik

Twój program / funkcja powinna wypisywać prawdziwą wartość, jeśli zbiór jest zbiorem różnic cyklicznych lub w przeciwnym razie wartością falsey.

Przypadki testowe

Prawidłowe zestawy różnic cyklicznych:

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

( źródło danych , chociaż ich konwencja jest inna)

Nieprawidłowe zestawy różnic cyklicznych:

1,2,3,4,20
57,3,5,7,17,35,38,49
3,4,5,9
14,10,8
PhiNotPi
źródło
1
Może ai bbędzie ten sam element (niekoniecznie a ≠ b)?
Erik the Outgolfer
2
@EriktheOutgolfer, jeśli bi amają ten sam numer, to (b-a)%n = 00, ale 0 nie jest jedną z wartości, dla której szukasz rozwiązań. Więc nie ma wyraźnego zakazu, aby były one tym samym numerem, ale nigdy nie będą.
PhiNotPi
1
Naprawdę wolałbym, gdyby 7 7 7były niepoprawne. Zestaw nie powtarza wartości
Ton Hospel
1
@TonHospel Gotowe i gotowe. 7 7 7został zgłoszony przez innego użytkownika, ale usunąłem go, ponieważ nie jest to zestaw.
PhiNotPi
1
Gra w golfa pomysł: nie musimy się związany rprzez 0 < r <= max(input)/2, lecz 0 < r < max(input)dlatego, że możemy uzyskać r > max(input)/2przypadków po prostu przerzucanie odejmowanie w r <= max(input)/2przypadkach.
JungHwan Min

Odpowiedzi:

9

Galaretka , 14 7 bajtów

_þ%ṀṬSE

Wypróbuj online!

Jak to działa

_þ%ṀṬ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
źródło
5

Łuska , 13 bajtów

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

Wypróbuj online!

Trzy indeksy górne 1 wydają się marnotrawstwem ...

Wyjaśnienie

Ë#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
źródło
4

Wolfram Language (Mathematica) , 53 52 bajty

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

Wypróbuj online!

Uwaga: nie musimy dzielić elementu max przez dwa ze względu na symetrię (możemy sprawdzić liczbę wszystkich modułów 1do max(input) - 1).

Wyjaśnienie

#~Permutations~{2}

Weź wszystkie permutacje długości 2 danych wejściowych.

#-#2&@@@

Znajdź różnice między nimi

Mod[ ... ,Max@#]

Zmodyfikuj wynik o maksymalny element wejściowy.

Counts@

Znajdź częstotliwości każdego elementu.

SameQ@@

Zwróć, czy wszystkie liczby są takie same.

JungHwan Min
źródło
4

Python 3 , 86 84 81 bajtów

-3 bajty thaks do JungHwan Min

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

Wypróbuj online!

Pręt
źródło
3

JavaScript (ES6), 87 bajtów

Zwraca 0 lub 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])

Przypadki testowe

Arnauld
źródło
3

Perl, 68 67 66 bajtów

Obejmuje +2dlaap

perl -apE '\@G[@F];pop@G;s:\d+:$G[$_-$&].=1for@F:eg;$_="@G"=~/^1*( 1*)\1*$/' <<< "4 5 6 8 9 11"
Ton Hospel
źródło
2

Ruby , 81 bajtów

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

Wypróbuj online!

Nie golfowany:

->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
źródło
2

Haskell, 84 bajty

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 jest funkcją, która sprawdza. Po prostu oblicza wszystkie różnice i się liczy.

dumny haskeller
źródło
letw osłonie wzorów zamiast whereoszczędzać bajt: Wypróbuj online!
Laikoni