Lembre-se de que um conjunto não é ordenado sem duplicatas.
Definição Um conjunto N- aditivo exclusivo S, cujo comprimento é K, é um conjunto tal que todos os subconjuntos de comprimento N em S somam números diferentes. Em outras palavras, as somas de todos os subconjuntos de comprimento N de S são todas distintas.
Objetivo Dado um array / conjunto como entrada e um número N
para uma função ou para um programa completo em qualquer formato razoável, encontre e retorne ou produza um valor de verdade ou falsey (errar para falsey é bom) indicando se a entrada é N ou não - exclusivamente aditivo.
Você pode supor que cada elemento apareça apenas no máximo uma vez e que cada número esteja dentro do tipo de dados nativo do seu idioma. Se necessário, você também pode assumir que a entrada está classificada. Por último, você pode assumir isso 0 < N <= K
.
Exemplos
Vamos considerar o conjunto S = {1, 2, 3, 5}
e N = 2
. Aqui estão todas as somas de todos os pares únicos S
(pois os únicos são os únicos de interesse para somas):
1 + 2 = 3
1 + 3 = 4
1 + 5 = 6
2 + 3 = 5
2 + 5 = 7
3 + 5 = 8
Podemos ver que não há duplicatas na saída, então S é 2-exclusivamente aditivo.
Vamos agora considerar o conjunto T = {12, 17, 44, 80, 82, 90}
e N = 4
. Aqui estão todas as somas possíveis de comprimento quatro:
12 + 17 + 44 + 80 = 153
12 + 17 + 44 + 82 = 155
12 + 17 + 44 + 90 = 163
12 + 17 + 80 + 82 = 191
12 + 17 + 80 + 90 = 199
12 + 17 + 82 + 90 = 201
12 + 44 + 80 + 82 = 218
12 + 44 + 80 + 90 = 226
12 + 44 + 82 + 90 = 228
12 + 80 + 82 + 90 = 264
17 + 44 + 80 + 82 = 223
17 + 44 + 80 + 90 = 231
17 + 44 + 82 + 90 = 233
17 + 80 + 82 + 90 = 269
44 + 80 + 82 + 90 = 296
Eles são todos únicos e, portanto, T é um aditivo exclusivo de 4.
Casos de teste
[members], N => output
[1, 4, 8], 1 => true
[1, 10, 42], 1 => true ; all sets trivially satisfy N = 1
[1, 2, 3, 4], 3 => true
[1, 2, 3, 4, 5], 5 => true
[1, 2, 3, 5, 8], 3 => true
[1, 2, 3, 4, 5], 2 => false ; 1 + 4 = 5 = 2 + 3
[-2, -1, 0, 1, 2], 3 => false ; -2 + -1 + 2 = -1 = -2 + 0 + 1
[1, 2, 3, 5, 8, 13], 3 => false ; 1 + 2 + 13 = 16 = 3 + 5 + 8
[1, 2, 4, 8, 16, 32], 3 => true
[1, 2, 4, 8, 16, 32], 4 => true
[1, 2, 4, 8, 16, 32], 5 => true
[1, 2, 4, 8, 16, 32], 6 => true
[3, 4, 7, 9, 12, 16, 18], 6 => true
[3, 4, 7, 9, 12, 16, 18], 3 => false ; 3 + 4 + 12 = 19 = 3 + 7 + 9
fonte
N <= K
?falsey
?Respostas:
MATL , 7 bytes
Experimente online!
Retorna
true
(exibido como1
) oufalse
(exibido como0
).fonte
Geléia, 7 bytes
Experimente online!
Retorna um número positivo para truthy e zero para falsey.
fonte
Matlab, 78 bytes
Esta função retorna um valor positivo (na verdade
n
) para truthy e retorna um erro como um Falsey resposta (de acordo válido para este comentário )Explicação:
fonte
k
. PS: O destaque da sintaxe do Matlab finalmente funciona !!!n
!Pitão, 8 bytes
Suíte de teste.
fonte
splat
significa isso ?Q
no final.Haskell, 69 bytes
Exemplo de uso:
6 # [3,4,7,9,12,16,18]
->True
.Implementação direta da definição: faça uma lista de somas de todas as subsequências de comprimento n e verifique se é igual a duplicatas removidas.
fonte
JavaScript (ES6), 132 bytes
Constrói as listas de aditivos de 1 a ne verifica a última quanto à exclusividade.
fonte
Braquilog , 20 bytes
Espera uma lista contendo a lista e, em seguida, o número inteiro como Entrada, e sem Saída, por exemplo
run_from_atom(':{[L:I]hs.lI}f:+aLdL', [[1:2:3:5]:2]).
.Explicação
Predicado Principal
Predicado 1: encontre todos os subconjuntos ordenados de comprimento fixo de uma lista
fonte
Julia,
4641 bytesExperimente online!
Como funciona
Isso (re) define o operador binário
\
para os argumentos Array / Int.combinations(x,n)
retorna todas as matrizes de exatamente n elementos diferentes de x . Mapeamossum
sobre essas matrizes e armazenar o resultado em t .t∪t
realiza a união do conjunto t com ele próprio, que funciona como o mais longounique
neste caso.Por fim, comparamos t com deduplicado t , retornando
true
se e somente se todas as somas forem diferentes.fonte
Python, 89 bytes
Teste em Ideone .
Como funciona
c(s,n)
lista todas as n combinações de s , ou seja, todas as listas de n elementos diferentes de s . Mapeamossum
as listas resultantes, calculando assim todas as somas possíveis de sublistas de comprimento n .Após as alas, usamos
c(...,2)
para criar todos os pares das somas resultantes. Se quaisquer duas somas x e y forem iguais,x^y
retornará 0 eall
retornará False . Por outro lado, se todas as somas forem únicas,x^y
sempreany
serão verdadeiras e retornarão True .fonte
J, 34 bytes
Abordagem direta, requer apenas o
stats
complemento para acomb
função. Retorna0
para false e1
true.Como alternativa ao uso
comb
interno, existe uma solução de 38 bytes que gera o conjunto de energia e escolhe os subconjuntos de tamanho n .Uso
fonte
stats
módulo. Muito agradável!Ruby , 50 bytes
Experimente online!
Se todos os elementos forem exclusivos,
uniq!
retornaránil
. Negar esse resultado, como!(...).uniq!
faz um bom teste de exclusividade.Esta questão foi publicada algumas semanas antes do Ruby 2.4.0-preview1, que foi introduzido
Enumerable#sum
, o que salvaria 9 bytes aqui.41 bytes (Ruby 2.4 ou superior)
Experimente online!
fonte
R , 41 bytes
Soma todos os subconjuntos n de comprimento de se verifica se todos os valores em uma tabela de contingência dessas somas são 1 (todas as somas são únicas).
Experimente online!
fonte