Перевірка наборів циклічної різниці


14

Набір циклічної різниці - це набір натуральних чисел з унікальною властивістю:

  1. Нехай nбуде найбільшим цілим числом у наборі.
  2. Нехай rбудь-яке ціле число (не обов'язково в наборі) більше 0, але менше або дорівнює n/2.
  3. Нехай kбуде безліч рішень для , (b - a) % n = rде aі bякі елементи набору. Кожне рішення - це впорядкована пара (a,b). (Також зауважте, що ця версія модуля робить негативні числа позитивними, додаючи nдо них, на відміну від реалізацій на багатьох мовах.)
  4. Нарешті, якщо і лише якщо це циклічна різниця, значення значення kне залежить від вашого вибору r. Тобто всі значення rдають однакову кількість рішень вищезгаданої конгруентності.

Це можна проілюструвати наступним прикладом:

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)

Кожне значення rмає однакову кількість рішень, 3 у цьому випадку, тому це циклічна різниця.

Вхідні дані

Введенням буде список натуральних чисел. Оскільки це властивість множини, припустимо, що введення не сортується. Можна припустити, що nце принаймні 2, хоча kможе бути і нуль.

Вихідні дані

Ваша програма / функція повинна виводити триєдне значення, якщо набір є циклічним набором різниці, або значення фальси в іншому випадку.

Випробування

Дійсні набори циклічних різниць:

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

( джерело даних , хоча їхня умова відрізняється)

Недійсні циклічні набори різниці:

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

1
Може бути aі bбути тим самим членом (не обов’язково a ≠ b)?
Ерік Аутгольфер

2
@EriktheOutgolfer якщо bі aє однаковим числом, то (b-a)%n = 00, але 0 не є одним із значень, для яких ви шукаєте рішення. Тож немає явної заборони, щоб вони були однаковими, але їх ніколи не буде.
PhiNotPi

1
Я дійсно вважаю за краще, якби 7 7 7недійсний ввід. Набір не повторює значення
Тон Євангелія,

1
@TonHospel Готово. 7 7 7був запитом іншого користувача, але я його видалив, оскільки це не набір.
PhiNotPi

1
Гра в гольф ідеї: ми не повинні пов'язані rз 0 < r <= max(input)/2, але замість цього , 0 < r < max(input)тому що ми можемо отримати r > max(input)/2випадки, просто перевернувши віднімання в r <= max(input)/2випадках.
JungHwan Мін

Відповіді:


9

Желе , 14 7 байт

_þ%ṀṬSE

Спробуйте в Інтернеті!

Як це працює

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

Лушпиння , 13 байт

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

Спробуйте в Інтернеті!

Три вершини 1 здаються марними ...

Пояснення

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

Мова Вольфрама (Mathematica) , 53 52 байти

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

Спробуйте в Інтернеті!

Зауважте, нам не потрібно ділити максимальний елемент на два через симетрію (ми можемо перевірити кількість усіх модулів 1до max(input) - 1).

Пояснення

#~Permutations~{2}

Візьміть усі перестановки довжини-2 на вході.

#-#2&@@@

Знайдіть відмінності кожного

Mod[ ... ,Max@#]

Змініть результат максимальним елементом вводу.

Counts@

Знайдіть частоти кожного елемента.

SameQ@@

Поверніть, чи всі номери однакові.



3

JavaScript (ES6), 87 байт

Повертає 0 або 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])

Тестові справи




2

Рубін , 81 байт

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

Спробуйте в Інтернеті!

Безголівки:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.