Verificar conjuntos de diferenças cíclicas

14

Um conjunto de diferenças cíclicas é um conjunto de números inteiros positivos com uma propriedade exclusiva:

  1. Let nSer o maior número inteiro no conjunto.
  2. Seja rqualquer número inteiro (não necessariamente no conjunto) maior que 0, mas menor ou igual a n/2.
  3. Seja ko número de soluções para (b - a) % n = ronde ae bquaisquer membros do conjunto. Cada solução é um par ordenado (a,b). (Observe também que esta versão do módulo torna positivos os números negativos, adicionando na ele, ao contrário das implementações em muitos idiomas.)
  4. Por fim, se e somente se este for um conjunto de diferenças cíclicas, o valor de knão depende da sua escolha r. Ou seja, todos os valores de rdão o mesmo número de soluções para a congruência acima.

Isso pode ser ilustrado com o seguinte exemplo:

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)

Cada valor de rtem o mesmo número de soluções, 3 neste caso, portanto, este é um conjunto de diferenças cíclicas.

Entrada

A entrada será uma lista de números inteiros positivos. Como essa é uma propriedade definida, assuma que a entrada não está classificada. Você pode assumir que né pelo menos 2, embora kpossa ser zero.

Resultado

Seu programa / função deve gerar um valor verdadeiro se o conjunto for um conjunto de diferenças cíclicas ou um valor falsey de outra forma.

Casos de teste

Conjuntos de diferenças cíclicas válidos:

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

( fonte de dados , embora a convenção seja diferente)

Conjuntos de diferenças cíclicas inválidos:

1,2,3,4,20
57,3,5,7,17,35,38,49
3,4,5,9
14,10,8
PhiNotPi
fonte
1
Pode ae bé o mesmo membro (não necessariamente a ≠ b)?
Erik the Outgolfer
2
@EriktheOutgolfer se be asão o mesmo número, (b-a)%n = 0mas 0 não é um dos valores que você procura por soluções. Portanto, não há uma proibição explícita de que eles sejam o mesmo número, mas eles nunca serão.
9118 PhiNotPi
1
Eu realmente preferiria se 7 7 7fosse uma entrada inválida. Um conjunto não repita valores
Ton Hospel
1
@TonHospel Feito e pronto. 7 7 7foi solicitado por outro usuário, mas eu o removi porque não é um conjunto.
PhiNotPi
1
Golfe ideia: nós não precisamos obrigado rpor 0 < r <= max(input)/2, mas em vez disso 0 < r < max(input), porque podemos obter r > max(input)/2casos simplesmente girando a subtração de r <= max(input)/2casos.
JungHwan Min

Respostas:

9

Geléia , 14 7 bytes

_þ%ṀṬSE

Experimente online!

Como funciona

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

Casca , 13 bytes

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

Experimente online!

Os três 1s sobrescritos parecem um desperdício ...

Explicação

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

Wolfram Language (Mathematica) , 53 52 bytes

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

Experimente online!

Observe que não precisamos dividir o elemento max por dois devido à simetria (podemos verificar a contagem de todos os módulos 1para max(input) - 1).

Explicação

#~Permutations~{2}

Faça todas as permutações de comprimento 2 da entrada.

#-#2&@@@

Encontre diferenças de cada

Mod[ ... ,Max@#]

Modifique o resultado pelo elemento máximo da entrada.

Counts@

Encontre as frequências de cada elemento.

SameQ@@

Retorne se todos os números são iguais.

JungHwan Min
fonte
4

Python 3 , 86 84 81 bytes

-3 bytes thaks em JungHwan Min

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

Experimente online!

Cajado
fonte
3

JavaScript (ES6), 87 bytes

Retorna 0 ou 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])

Casos de teste

Arnauld
fonte
3

Perl, 68 67 66 bytes

Inclui +2paraap

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

Ruby , 81 bytes

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

Experimente online!

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.
}
benj2240
fonte
2

Haskell, 84 bytes

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 é a função que faz a verificação. Apenas calcula todas as diferenças e contagens.

orgulhoso haskeller
fonte
letem uma proteção de padrão em vez de wheresalvar um byte: Experimente on-line!
Laikoni