Dada uma lista não vazia de números inteiros positivos , seu trabalho é determinar o número de valores exclusivos de ± x ± y ± z ± …
Por exemplo, considere a lista . Existem oito maneiras possíveis de criar somas:
Existem seis somas únicas , então a resposta é 6 .
Casos de teste
[1, 2] => 4
[1, 2, 2] => 6
[s]*n => n+1
[1, 2, 27] => 8
[1, 2, 3, 4, 5, 6, 7] => 29
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] => 45
[1, 7, 2, 8, 3, 1, 6, 8, 10, 9] => 56
[93, 28, 92, 100, 43, 66, 2, 98, 2, 52, 57, 75, 39, 77, 45, 15, 13, 82, 81, 20, 68, 14, 5, 3, 72, 56, 57, 1, 23, 25, 76, 59, 60, 71, 71, 24, 1, 3, 72, 84, 72, 28, 83, 62, 66, 45, 21, 28, 49, 57, 70, 3, 44, 47, 1, 54, 53, 56, 36, 20, 99, 9, 89, 74, 1, 14, 68, 47, 99, 61, 46, 26, 69, 21, 20, 82, 23, 39, 50, 58, 24, 22, 48, 32, 30, 11, 11, 48, 90, 44, 47, 90, 61, 86, 72, 20, 56, 6, 55, 59] => 4728
Solução de referência (otimiza a velocidade e não o tamanho).
Se você não consegue lidar com o último caso porque usa um método de força bruta ou similar, tudo bem.
Pontuação
Isso é código-golfe , então a solução válida mais curta (medida em bytes) vence.
code-golf
math
combinatorics
Esolanging Fruit
fonte
fonte
[2,2,2,2,...]
) a resposta deve ser o comprimento da matriz + 1. Isso ocorre porque, neste caso, a posição dos sinais é irrelevante e apenas o número de cada questãoRespostas:
Wolfram Language (Mathematica) , 27 bytes
Experimente online!
Encontrar o número de somas exclusivas de troca de sinal é equivalente a encontrar o número de somas de subconjuntos exclusivos.
Uma prova envolveria adicionar a soma da entrada a cada uma das somas de troca de sinal e dividir por duas. Então, há uma biografia óbvia.
Explicação
Itere através da entrada, com o valor inicial sendo
{0}
: faça a união entre<current value>
e<current value> + input element
(mapeia em listas).Versão Golfy da
Length
função.fonte
Gelatina , 6 bytes
Experimente online!
fundo
Seja L a lista de entrada e {P, N} uma partição em somas algébricas com sinais positivos e negativos. A especificação de desafio requer o cálculo de s {P, N} = soma (P) - soma (N) .
No entanto, como soma (P) + soma (N) = soma (L) e soma (L) não depende da partição, temos s {P, N} = soma (P) - soma (N) = soma ( P) - (soma (L) - soma (P)) = 2 soma (P) - soma (L) .
Assim, cada valor único da soma (P) corresponde a um valor único de s {P, N} .
Como funciona
fonte
MATL ,
1110 bytesExperimente online! Este é um porto da oitava de Luis Mendo / MATLAB resposta . Ainda estou tentando aprender o MATL e achei que o postaria, juntamente com uma explicação, já que o MATL é o idioma do mês.
Explicação:
Aqui está uma leitura para qualquer pessoa que não esteja familiarizada com a programação baseada em pilha em geral e o MATL em particular.
O vetor de entrada é implicitamente colocado na pilha. Observe que quando uma operação é executada em um elemento da pilha, esse elemento é removido da pilha.
E, em seguida, gera o elemento final na pilha implicitamente.
fonte
Python 2 , 55 bytes
Experimente online!
fonte
Python 2 , 52 bytes
Experimente online!
Usa a representação binária de um número para armazenar as somas do subconjunto alcançável.
fonte
k<<n
adiciona n a cada soma. ORING comk
lojas estas novas somas emk
mantendo todos os anteriores, e duplicados Sims não são registrados05AB1E , 4 bytes
Utiliza a mesma abordagem usada na resposta de Dennis 'Jelly .
Experimente online!
fonte
Haskell, 46 bytes
Experimente online!
Em vez de somar os subconjuntos da lista de entrada, fazemos todas as combinações de manter um número ou substituí-lo
0
, por exemploIsso é dois bytes menor que
subsequences
.fonte
f x=sum[1|i<-[0..sum x],elem i$sum<$>mapM(:[0])x]
fosse mais curto que a importação, mas aparentemente não é.import Data.List;length.foldr((<*>)union.map.(+))[0]
R,
8375 bytes-8 bytes graças a JayCe e Giuseppe
Cria uma matriz de todas as combinações possíveis de (1, -1) para o tamanho do vetor de entrada, multiplica isso pelo vetor original para obter as somas. Então único e encontre a duração do resultado.
function(v)nrow(unique(t(t(expand.grid(rep(list(c(1,-1)),sum(v|1)))))%*%v))
versão anterior:
f=function(v)nrow(unique(as.matrix(expand.grid(rep(list(c(1,-1)),length(v))))%*%v))
Ungolfed com comentários:
fonte
t
: TIOsum(v|1)
é um byte menor quelength(v)
Oitava / MATLAB,
454140 bytesInput é um vetor de coluna (usando
;
como separador).Os erros de código para o último caso de teste devido a restrições de memória.
Isso usa uma idéia da resposta de JungHwan Min (subconjuntos em vez de sinais alternados) para salvar alguns bytes.
Experimente online!
fonte
Pari / GP , 39 bytes
Experimente online!
fonte
Python 3 , 61 bytes
Experimente online!
Abordagem recursiva, acompanhando somas de subconjuntos exclusivos.
A verdadeira diversão é que isso supera
itertools
uma grande margem:76 bytes
Experimente online!
fonte
Pitão , 5 bytes
Utiliza a mesma abordagem usada na resposta de Dennis 'Jelly .
Experimente aqui.
fonte
Anexo , 29 bytes
Experimente online!
Isso funciona dobrando o
±
operador sobre a lista de entrada e, em seguida,±
a lista e contando os átomos exclusivos da matriz.Aqui estão alguns exemplos de como a dobra funciona:
Em seguida, geramos todas as permutações do sinal final aplicando o PlusMinus mais uma vez.
Uma versão mais eficiente, 31 bytes
Experimente online! Isso não atinge o tempo limite no caso de teste final, pois não gera combinações desnecessárias.
fonte
R , 62 bytes
Experimente online!
Portos algoritmo de Dennis. É o mais próximo das respostas do Octave / MATL, pois usa um produto de bitmap e matriz semelhante para inclusão / exclusão de termos.
fonte
APL (Dyalog Classic) ,
1211 bytes-1 graças a H.PWiz
Experimente online!
fonte
-⍨
pode ser⊢
Perl 5
-p
, 39 bytesExperimente online!
fonte
JavaScript (ES6), 63 bytes
Experimente online!
fonte
Casca , 5 bytes
Experimente online!
Resposta da geléia do Porto de Dennis.
Explicação
fonte
Perl 6 , 33 bytes
Experimente online!
fonte
Utilitários Bash + GNU, 49 bytes
Experimente online!
Entrada fornecida como uma lista separada por vírgula na linha de comando.
Explicação
fonte
linguagem de máquina x86_64 para Linux,
3129 bytesExperimente online!
Inspirado pela resposta de @ xnor. Requer uma máquina com as
POPCNT
instruções.fonte
C (gcc) ,
7469 bytesExperimente online!
Porta C da resposta do @ xnor
fonte
APL (Dyalog Classic) ,
343332 bytesExperimente online!
Obrigado a @ngn por -1 byte!
fonte
1-⍨≢⍵
->≢1↓⍵
+.×⍨
->+.×
Limpo , 82 bytes
Experimente online!
Define a função
? :: [Int] -> Int
usandof :: [Int] -> ([Int] -> Int)
como auxiliar para reduzir cada soma possível após uma adição ou subtração.fonte
APL (Dyalog Classic) , 21 bytes
Experimente online!
Explicação
Um trem de função equivalente a
{((⍴⍵)⍴2)⊤⍳(⍴⍵)}
, que gera uma matriz que tem as representações binárias de 0 ao comprimento da entrada como colunasMapas
1
s para-1
s e0
s a1
sMultiplicação de matrizes com a entrada, que fornece uma matriz de todas as somas possíveis
Remova duplicatas e conte
fonte
Java 8,
2078344 bytesPorta da resposta Python 2 do @ xnor .
-39 bytes graças a @Jakob .
Experimente online .
fonte
Long
:s->Long.bitCount(s.reduce(1l,(a,e)->a|a<<e))
..reduce
(e.bitCount
também devo adicionar ..>.>) -39 bytes ali! :)Java 8, 85 bytes
Outra porta Java da resposta do xnor . Como a resposta original, isso usa um bitmap de precisão arbitrária para que não haja limite superior no tamanho de uma soma de subconjunto.
É um lambda de um seqüencial
java.util.stream.Stream<Integer>
paraint
.Experimente Online
Observe que o combinador (o terceiro argumento para
reduce
) não é utilizado, pois o fluxo é seqüencial. A função que eu escolhi é arbitrária.fonte
Julia 0.6 ,
5452 bytesExperimente online!
( -2 bytes substituindo
¬
por~
, graças a Jo King )Funciona para todos os casos de teste. Faz uso da transmissão para coletar todas as somas possíveis e as conta.
Explicação:
Solução mais antiga:
Julia 0,6 , 64 bytes
Experimente online!
Funciona para matrizes de entrada com comprimento até 63 (portanto, não funciona para o último caso de teste, o que é bom de acordo com o OP).
Explicação:
fonte
JavaScript (Nó Babel) , 64 bytes
Experimente online!
Isso não funcionará no último caso de teste.
Solução mais eficaz (funciona no último caso de teste):
JavaScript (Nó Babel) , 71 bytes
Experimente online!
Isso não funcionará em um navegador real devido a
Array#smoosh
.Graças ao Bubbler,
[x+f,x-f]
->[x+f,x]
economiza 2 bytes.fonte
[x+f,x]
no lugar de[x+f,x-f]
( prova de JungHwan Min ).F=([f,...r],s=[0])=>f?F(r,[...s,...s.map(x=>x+f)]):new Set(s).size
[...s,...s.map(x=>x+f)]
,s.concat(s.map(x=>x+f))
e,s,s.map(x=>s.push(x+f))
share mesmo comprimento ...Vermelho , 73 bytes
Resposta do Python 2 do porto de Dennis. Não lida com o último caso de teste.
Experimente online!
fonte