Dada una lista no vacía de enteros positivos , su trabajo es determinar el número de valores únicos de± x ± y ± z ± ...
Por ejemplo, considere la lista . Hay ocho formas posibles de crear sumas:
Hay seis sumas únicas , por lo que la respuesta es .6
Casos de prueba
[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
Solución de referencia (optimiza la velocidad y no el tamaño).
Si no puede manejar el último caso porque usa un método de fuerza bruta o similar, está bien.
Tanteo
Este es el código de golf , por lo que gana la solución válida más corta (medida en bytes).
code-golf
math
combinatorics
Fruta Esolanging
fuente
fuente
[2,2,2,2,...]
) la respuesta debería ser la longitud de la matriz + 1. Esto se debe a que en este caso la posición de los signos es irrelevante y solo el número de cada asuntoRespuestas:
Wolfram Language (Mathematica) , 27 bytes
Pruébalo en línea!
Encontrar el número de sumas únicas de intercambio de signos es equivalente a encontrar el número de sumas de subconjuntos únicos.
Una prueba implicaría agregar la suma de la entrada a cada una de las sumas de intercambio de signos y dividir por dos. Entonces, hay una biyección obvia.
Explicación
Itere a través de la entrada, siendo el valor inicial
{0}
: tome la unión entre<current value>
y<current value> + input element
(asigna en listas).Versión de golf de la
Length
función.fuente
Jalea , 6 bytes
Pruébalo en línea!
Fondo
Sea L la lista de entrada y {P, N} una partición en sumandos algebraicos con signos positivos y negativos. La especificación de desafío requiere calcular s {P, N} = sum (P) - sum (N) .
Sin embargo, dado que sum (P) + sum (N) = sum (L) y sum (L) no dependen de la partición, tenemos s {P, N} = sum (P) - sum (N) = sum ( P) - (suma (L) - suma (P)) = 2sum (P) - suma (L) .
Por lo tanto, cada valor único de suma (P) corresponde a un valor único de s {P, N} .
Cómo funciona
fuente
MATL ,
1110 bytesPruébalo en línea! Este es un puerto de la respuesta Octave / MATLAB de Luis Mendo . Todavía estoy tratando de aprender MATL, y pensé que lo publicaría, junto con una explicación, ya que MATL es el idioma del mes.
Explicación:
Aquí hay una lectura para cualquiera que no esté familiarizado con la programación basada en pila en general, y MATL en particular.
El vector de entrada se coloca implícitamente en la pila. Tenga en cuenta que cuando se realiza una operación en un elemento de la pila, ese elemento se elimina de la pila.
Y luego genera el elemento final en la pila implícitamente.
fuente
Python 2 , 55 bytes
Pruébalo en línea!
fuente
Python 2 , 52 bytes
Pruébalo en línea!
Utiliza la representación binaria de un número para almacenar las sumas de subconjuntos alcanzables.
fuente
k<<n
agrega n a cada suma. Orándose con lask
tiendas estas nuevas sumask
mientras se mantienen todas las anteriores, y los Sims duplicados no se registran05AB1E , 4 bytes
Utiliza el mismo enfoque utilizado en la respuesta de Dennis 'Jelly .
Pruébalo en línea!
fuente
Haskell, 46 bytes
Pruébalo en línea!
En lugar de sumar los subconjuntos de la lista de entrada, hacemos todas las combinaciones de mantener un número o reemplazarlo
0
, p. Ej.Esto es dos bytes más corto que
subsequences
.fuente
f x=sum[1|i<-[0..sum x],elem i$sum<$>mapM(:[0])x]
fuera más corto que la importación, pero aparentemente, no lo es.import Data.List;length.foldr((<*>)union.map.(+))[0]
R,
8375 bytes-8 bytes gracias a JayCe y Giuseppe
Crea una matriz de todas las combinaciones posibles de (1, -1) para el tamaño del vector de entrada, multiplica esto por el vector original para obtener las sumas. Luego único y encuentra la longitud del resultado.
function(v)nrow(unique(t(t(expand.grid(rep(list(c(1,-1)),sum(v|1)))))%*%v))
versión previa:
f=function(v)nrow(unique(as.matrix(expand.grid(rep(list(c(1,-1)),length(v))))%*%v))
Ungolfed con comentarios:
fuente
t
: TIOsum(v|1)
es un byte más corto quelength(v)
Octava / MATLAB,
454140 bytesLa entrada es un vector de columna (que se usa
;
como separador).Los errores de código para el último caso de prueba debido a restricciones de memoria.
Esto utiliza una idea de la respuesta de JungHwan Min (subconjuntos en lugar de signos alternativos) para guardar algunos bytes.
Pruébalo en línea!
fuente
Pari / GP , 39 bytes
Pruébalo en línea!
fuente
Python 3 , 61 bytes
Pruébalo en línea!
Enfoque recursivo, seguimiento de sumas de subconjuntos únicos.
La verdadera diversión es que esto supera
itertools
por un gran margen:76 bytes
Pruébalo en línea!
fuente
Pyth , 5 bytes
Utiliza el mismo enfoque utilizado en la respuesta de Dennis 'Jelly .
Pruébalo aquí
fuente
Adjunto , 29 bytes
Pruébalo en línea!
Esto funciona doblando el
±
operador sobre la lista de entrada, luego tomando±
esa lista y contando los átomos únicos de la matriz.Aquí hay algunos ejemplos de cómo funciona el plegado:
Luego generamos todas las permutaciones del signo final aplicando PlusMinus una vez más.
Una versión más eficiente, 31 bytes.
Pruébalo en línea! Esto no agota el tiempo en el caso de prueba final, ya que no genera combinaciones innecesarias.
fuente
R , 62 bytes
Pruébalo en línea!
Puertos Dennis 'algoritmo. Es más cercano a las respuestas de Octave / MATL, ya que utiliza un mapa de bits similar y un producto de matriz para la inclusión / exclusión de términos.
fuente
APL (Dyalog Classic) ,
1211 bytes-1 gracias a H.PWiz
Pruébalo en línea!
fuente
-⍨
puede ser⊢
Perl 5
-p
, 39 bytesPruébalo en línea!
fuente
JavaScript (ES6), 63 bytes
Pruébalo en línea!
fuente
Casco , 5 bytes
Pruébalo en línea!
Respuesta de Port of Dennis 'Jelly.
Explicación
fuente
Perl 6 , 33 bytes
Pruébalo en línea!
fuente
Bash + utilidades GNU, 49 bytes
Pruébalo en línea!
Entrada dada como una lista separada por comas en la línea de comandos.
Explicación
fuente
lenguaje de máquina x86_64 para Linux,
3129 bytesPruébalo en línea!
Inspirado por la respuesta de @ xnor. Requiere una máquina con las
POPCNT
instrucciones.fuente
C (gcc) ,
7469 bytesPruébalo en línea!
C port de la respuesta de @ xnor
fuente
APL (Dyalog Classic) ,
343332 bytesPruébalo en línea!
¡Gracias a @ngn por -1 byte!
fuente
1-⍨≢⍵
->≢1↓⍵
+.×⍨
->+.×
Limpio , 82 bytes
Pruébalo en línea!
Define la función
? :: [Int] -> Int
usandof :: [Int] -> ([Int] -> Int)
como ayuda para reducir cada suma posible después de una suma o resta.fuente
APL (Dyalog Classic) , 21 bytes
Pruébalo en línea!
Explicación
Un tren de funciones equivalente a
{((⍴⍵)⍴2)⊤⍳(⍴⍵)}
, que genera una matriz que tiene las representaciones binarias de 0 a la longitud de la entrada como columnasMapas
1
s a-1
sy0
s a1
sMultiplicación matricial con la entrada, que proporciona una matriz de todas las sumas posibles
Eliminar duplicados, luego contar
fuente
Java 8,
2078344 bytesPuerto de la respuesta de @ xnor's Python 2 .
-39 bytes gracias a @Jakob .
Pruébalo en línea .
fuente
Long
:s->Long.bitCount(s.reduce(1l,(a,e)->a|a<<e))
..reduce
(y.bitCount
también podría agregar ..>.>) -39 bytes allí mismo. :)Java 8, 85 bytes
Otro puerto de Java de XNOR respuesta 's . Al igual que la respuesta original, utiliza un mapa de bits de precisión arbitraria para que no haya un límite superior en el tamaño de una suma de subconjuntos.
Es una lambda de secuencial
java.util.stream.Stream<Integer>
aint
.Pruébalo en línea
Tenga en cuenta que el combinador (el tercer argumento para
reduce
) no se utiliza, ya que la secuencia es secuencial. La función que elegí es arbitraria.fuente
Julia 0.6 ,
5452 bytesPruébalo en línea!
( -2 bytes reemplazando
¬
con~
, gracias a Jo King )Funciona para todos los casos de prueba. Utiliza la transmisión para recolectar todas las sumas posibles, luego las cuenta.
Explicación:
Solución anterior:
Julia 0.6 , 64 bytes
Pruébalo en línea!
Funciona para matrices de entrada con una longitud de hasta 63 (por lo que no funciona para el último caso de prueba, que está bien según OP).
Explicación:
fuente
JavaScript (nodo de Babel) , 64 bytes
Pruébalo en línea!
Esto no funcionará para el último caso de prueba.
Solución más efectiva (funciona en el último caso de prueba):
JavaScript (nodo de Babel) , 71 bytes
Pruébalo en línea!
Esto no funcionará en un navegador real debido a
Array#smoosh
.Gracias a Bubbler,
[x+f,x-f]
->[x+f,x]
ahorra 2 bytes.fuente
[x+f,x]
en lugar de[x+f,x-f]
( prueba 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))
ys,s.map(x=>s.push(x+f))
comparten la misma duración ...Rojo , 73 bytes
Puerto de Dennis 'Python 2 respuesta. No maneja el último caso de prueba.
Pruébalo en línea!
fuente