Проверьте циклические разностные множества


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, так что это набор циклических разностей.

вход

На входе будет список положительных чисел. Поскольку это свойство set, предположим, что входные данные не отсортированы. Можно предположить, что 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)?
Эрик Outgolfer

2
@EriktheOutgolfer, если bи aто же число, то (b-a)%n = 0, но 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

Wolfram Language (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])

Контрольные примеры


3

Perl 68 67 66 байт

Включает +2в себяap

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


2

Рубин , 81 байт

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

Попробуйте онлайн!

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.