Um conjunto é livre de soma se não houver dois elementos (não necessariamente distintos) quando adicionados juntos fizerem parte do próprio conjunto.
Por exemplo, {1, 5, 7}
é livre de soma, porque todos os membros são ímpares e dois números ímpares quando somados são sempre pares. Por outro lado, {2, 4, 9, 13}
não é livre de soma, como um 2 + 2 = 4
ou 4 + 9 = 13
adicionado a um membro do conjunto.
Escreva um programa ou função que aceite um conjunto como entrada e emita um valor Truthy se o conjunto estiver sem soma e Falsy caso contrário.
Exemplos:
Sum-free:
{}
{4}
{1, 5, 7}
{16, 1, 4, 9}
Not sum-free:
{0}
{1, 4, 5, 7}
{3, 0}
{16, 1, 4, 8}
Respostas:
Pitão -
85 bytesObrigado a @FryAmTheEggman por me salvar 3 bytes.
Conjunto de Teste .
fonte
2 + 2 = 4
do OP. Minha resposta antes do golfe de.C
FryAmTheEggman usava ombreiras com substituição por causa disso.Python 2, 41 bytes
s
deve ser um conjunto Python.Curiosidade:
sum-free
é um anagrama do meu nome.fonte
lambda s:not{a+b for a in s for b in s}&s
tem o mesmo comprimento. Infelizmente, não consigo encontrar uma maneira de diminuir a negação.Gelatina , 5 bytes
Experimente online!
Como funciona
fonte
JavaScript,
864241 bytesObrigado Cᴏɴᴏʀ O'Bʀɪᴇɴ por me salvar uma tonelada de bytes entre parênteses / colchetes. Agradecemos também a Neil por apontar que a função estava retornando o valor booleano oposto ao que deveria.
Tentei reduzir os bytes redefinindo,
n.some
mas isso não funciona porque, infelizmente, é uma função de protótipo. Pode haver uma solução melhorArray.prototype.map
no JS, mas a função some é realmente divertida.Agora estou me perguntando se existe uma maneira mais curta do que
.includes
usar algo como .indexOf e adicionar 1 (o que daria um valor verdadeiro se contiver o número).Teste:
fonte
n=>n.some(m=>n.some(o=>n.some(p=>m+o==p)))
n.contains(o+p)
que economiza 2 bytes acima do mais internosome
.includes
(originalmente seria chamado,contains
mas algumas bibliotecas têm uma definição conflitante).MATL, 5 bytes
Isso gera uma matriz que é verdadeira se todas as entradas forem
1
e falsey de outra forma. Aqui está uma demonstração para mostrar vários valores de verdade / falsey no MATL .Experimente Online
Explicação
fonte
Mathematica, 23 bytes
fonte
∩
por⋂
(U-22C2). O código agora não é copypastable no Mathematica.Haskell,
32, 30 bytesSolução simples:
Dois bytes salvos por @Lynn
fonte
f x=and[a+b/=c|a<-x,b<-x,c<-x]
por 30 bytes.Julia, 18 bytes
Experimente online!
fonte
J,
18108 bytes8 bytes economizados graças a milhas e 2 graças ao FrownyFrog!
Corresponde à lista original com a diferença definida de somas tabuladas. Isso é equivalente a:
para entrada
y
. Isso se traduz em:+/~
retorna uma tabela de somas usandoy
. Poisy =: 16 1 4 9
, isso fornece:Então, usamos
-.
, que produz uma lista que consiste em todos os elementos quey
não estão nesta tabela. Se a lista estiver sem soma, isso produzirá a mesma lista. Em seguida,-:
verifica a igualdade de listas, o que produz a saída desejada.Antigo, 18 bytes
+/~
cria uma tabela dos valores do conjunto adicionado a si próprio ee.
verifica se esses membros estão no conjunto original. O restante disso está negando o elemento máximo.fonte
-:]-.&,+/~
para 10 bytes usando diferença de conjunto-.
e lista de correspondência-:
-.
já trabalha com células de y.Retina ,
4544 bytesEntrada é uma lista decimal de números separados por vírgula. A saída é
0
(falsy) ou1
(truthy).Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Explicação
Etapa 1: Substituição
Isso converte todos os elementos da entrada em unários e os envolve
<...>
. O objetivo dos colchetes angulares é distinguir uma lista que contém apenas0
uma lista vazia (já que a representação unária de0
é a própria vazia).Etapa 2: Substituição
Repetimos a string 3 vezes, acrescentando-a duas vezes no final.
Etapa 3: partida
Agora, tentamos encontrar três números no resultado, de modo que os dois primeiros sejam o terceiro. Essas correspondências são contadas (na verdade, isso não conta todas as tuplas, porque as correspondências não podem se sobrepor, mas se essa tupla existir, será encontrada). Portanto, obtemos
0
conjuntos sem soma e algo positivo de outra forma.Etapa 4: partida
Desde a etapa anterior deu o oposto do que queremos, nós negamos o resultado contando os jogos de
^0
que é1
para a entrada0
e0
para tudo o resto.fonte
Oitava,
292125 bytesGraças a Suever ! Retorna uma matriz. Eu adicionei
0
no final para[]
tornar-se livre de soma. Para verificar verdade e falsidade no Octave, você pode fazer o seguinte:Uma alternativa que retorna 0 ou 1 é:
fonte
@(s)~ismember(s+s',s)
desde matrizes pode ser truthy / FalseyClojure,
4737 bytessolução bastante simples. usa compreensão de lista para encontrar todos os elementos cuja soma é igual a outro elemento.
Variante de 38 bytes:
fonte
#(=(for[a % b % :when(%(+ a b))]a)[])
que pode economizar 10 bytesPerl 6 ,
24 21 2019 bytesEntrada é qualquer valor posicional como uma lista .
(um Conjunto é uma Associativa, portanto você precisaria chamá
.keys
-lo.)Teste:
fonte
Mathematica
63 6242 bytesEsta versão mais curta se beneficiou da submissão de A Simmons. Nenhum elemento precisa ser removido da lista antes de
IntegerPartitions
ser aplicado.Se um elemento não puder ser particionado em dois números inteiros (cada um da lista), ele será
IntegerPartitions[#,{2},#]=={}
retido.And
verifica se isso é válido para todos os elementos da lista. Nesse caso, a lista é livre de soma.Exemplos
Falso
Verdade
Existe um 2, mas não há números ímpares que diferem por 2.
Verdade
fonte
a
definiu outro lugar na sua pasta de trabalho? Essas expressões não fornecem a saída desejada quando eu as avalio.a
deveria ter sido a#
. Corrigi e removi um supérfluo@
.Ruby, 36 bytes
Constrói um produto cartesiano do conjunto contra si mesmo e encontra a soma de todos os elementos, depois verifica a interseção com o conjunto original. A entrada é arrays, mas no Ruby eles têm operações de conjunto suficientes para fazê-lo funcionar de qualquer maneira.
-1 byte sobre a minha solução original (usada em
&
vez de-
e comparada com[]
) por causa da inspiração do @feersumExperimente aqui!
fonte
Python, 40 bytes
^
= diferença simétrica, novo conjunto com elementos nos dois conjuntos, mas não nos dois>
Verdadeiro se o conjunto esquerdo for um superconjunto do conjunto direito.fonte
A is sum-free if the equation a + b = c has no solution with a, b, c ∈ A
. Com essa definição, o conjunto vazio não é gratuito, e minha resposta está correta. Mas eu posso ser tendencioso.Braquilog , 13 bytes
Explicação
fonte
[2:2]
um subconjunto de 2 elementos de[2:4:9]
?[2:4:9]
.R,
3936 bytesChame como
w(s)
, ondes
está o conjunto (na verdade vetor) de valores. Aqui está a saída para alguns casos de teste:Onde
c()
está a função de concatenação que pega um monte de valores e o torna um vetor.EDIT: Tornando uma função anônima para salvar 3 bytes, graças a @MickyT.
fonte
function(s)!any(outer(s,s,'+')%in%s)
Raquete, 58 bytes
Explicação:
fonte
05AB1E ,
95 bytesEconomizou 4 bytes graças ao Magic Octopus Urn
Experimente online!
Explicação
fonte
APL, 8 bytes
Explicação:
Teste:
fonte
Haskell, 30 bytes
Acho que existe uma solução mais curta que é mais interessante, mas ainda não a encontrei.
Estes são 33 e 34 bytes:
fonte
s
e se livrar da última parte da compreensão funciona?f s=and[notElem(x+y)s|x<-s,y<-s]
, isso é 32. Há tambémf s=all(`notElem`s)$(+)<$>s<*>s
para 31.Na verdade , 7 bytes
Experimente online!
fonte
♂
)TSQL, 47 bytes
Nota: Isso será executado apenas uma vez, e a tabela precisará ser excluída ou descartada para ser executada novamente. O editor de violino não permite a criação de tabelas. Portanto, o violino incluído na minha resposta usa 2 bytes extras para compensar isso - a versão do violino não requer limpeza.
Violino
fonte
Perl, 46 bytes
Código de 45 bytes + linha de comando de 1 byte (-p)
Usa uma única correspondência de regex com o suporte do Perl para 'expressões de código' dentro da regex para permitir a avaliação dentro de uma correspondência.
Para contornar o requisito de que a entrada não seja classificada, repetimos a sequência de entrada três vezes. Isso garante que o resultado seja após os dois operandos e permite que o mesmo dígito seja correspondido novamente (por exemplo, no caso de entrada
2 4
).Exemplo de uso:
fonte
Fator, 47 bytes
∩ { } =
é equivalente a, mas menor queintersects?
.Σ
é mais curto do que mas equivalente asum
.Obrigado, math.unicode !
código de teste:
Só estou confiante que os dois primeiros estão corretos. Não está claro da pergunta qual deve ser o resto, então acho que está bom por enquanto.
fonte
PHP, 73 bytes
+8 para transformar o trecho em um programa, -8 em variáveis obsoletas, graças a insertusernamehere
gravuras
1
paratrue
, saída vazia parafalse
uso:
php <filename> <value1> <value2> ...
função qualificada para teste (
9486): retornos1
ou nadatestes
fonte
$i
e$j
você pode descartar$i=>
, bem como$j=>
e salvar 8 bytes . Infelizmente, os trechos de código não são respostas válidas. Crie uma função ou um programa completo e inclua isso na sua contagem de bytes e você estará pronto para começar. :)Java, 67 bytes
Entrada é a
Set<Integer>
. Testes:Saída:
fonte
Clojure, 34 bytes
Eu escrevi isso antes de perceber a solução anterior do Clojure. De qualquer forma, este é mais compacto, pois usa o conjunto de entrada como uma
pred
funçãonot-any?
.fonte
Prolog (SWI) ,
665649 bytesExperimente online!
fonte