Era una cálida tarde de verano ...
cuando mi estúpido auto decidió descomponerse en el medio de la carretera al regresar del supermercado. Lo empujé a un lado y decidí caminar a casa. Abrí el maletero para sacar la comida y las cosas restantes. Fue entonces cuando noté que los artículos no estaban empacados de manera uniforme. Algunas bolsas tenían artículos más pesados, mientras que otras tenían pocas cosas más livianas, algunas incluso tenían una mezcla de tales artículos. Para facilitarme el transporte, decidí agrupar todo en dos bolsas y hacer que sus pesos fueran lo más cercanos posible.
Tu meta
es para ayudarme a reorganizar los artículos en dos bolsas de compras de tal manera que la diferencia entre ambas bolsas sea lo más cercana posible a cero.
Matemáticamente:
PESO A LA IZQUIERDA - PESO A LA DERECHA ≈ 0
Ejemplo
Si solo tuviera 2 artículos, pan y mantequilla de maní, y el peso del pan es de 250 gramos y la mantequilla de maní es de 150 gramos, la mejor manera es llevarlos por separado en dos manos.
W LH - W RH = W (PAN) - W (P.BUTTER) 250-150
= 100
La otra posibilidad es:
W (PAN, MANTEQUILLA) - W (mano vacía) = (250 + 150) - 0 = 400
Esto no es mejor que nuestro primer caso, por lo que debe ir con el primero.
Su código debe
- tome entradas de números que indiquen el peso de los artículos en la bolsa de compras. Las unidades no son importantes, pero deberían ser las mismas (idealmente kilogramos o gramos). La entrada se puede hacer uno por uno o todos a la vez. Puede restringir el recuento total a 20 artículos como máximo, si lo desea.
- El formato / tipo de entrada depende de usted para elegir, pero no debe estar presente nada más que los pesos.
- Se permite cualquier idioma, pero se adhieren a las bibliotecas estándar.
- Salida de pantalla. Nuevamente, puedes elegir el formato, pero explica el formato en tu publicación. es decir, cómo podemos saber cuáles son los elementos de la mano izquierda y cuáles son los elementos de la mano derecha.
Puntos
- El código más corto gana.
Insinuación
Los dos algoritmos posibles en los que podría pensar son la diferenciación (más rápido) y las permutaciones / combinaciones (más lento). Puede usar estos o cualquier otro algoritmo que haga el trabajo.
Respuestas:
Pyth, 9 bytes
Entrada, formatos de salida:
Demostración.
Esto funciona porque
y
devuelve los subconjuntos en un orden tal que cada subconjunto y su complemento son equidistantes del centro. Como la suma de un subconjunto y la suma de su complemento siempre serán equidistantes del centro, la siguiente listaosNyQ
también tendrá esta propiedad. Por lo tanto, los dos elementos centralesosNyQ
son complementos y deben tener una división óptima. Extraemos el primero de esos dos elementos y lo imprimimos.fuente
s
que hizo que dejara de funcionar. A la gente no le gustó el cambio, y tu comentario fue el empujón final que necesitaba para cambiarlo.Pyth, 16
Esto toma las entradas como una lista pitónica en STDIN. La salida es una lista de 2 listas, siendo la primera lista los artículos en una bolsa y la segunda lista representa los artículos en la segunda bolsa. Este bruto fuerza todas las combinaciones, por lo que se ejecutará muy lentamente (o se quedará sin memoria) para entradas grandes.
Pruébalo en línea aquí
Para admitir el manejo de una sola entrada, esto sube a 17:
Esto imprimirá los valores que van en una mano.
fuente
[[2], [1], [1]]
, pero creo que funciona, debido exactamente a cómo./
funciona.[[x], []]
?CJam,
1918 bytesEsta es una función anónima que saca una matriz de enteros de la pila y devuelve una matriz de enteros separados por un espacio.
Gracias a @ jimmy23013 por su ingenioso
:*
truco, que ahorró 1 byte.Pruébelo en línea en el intérprete de CJam .
Cómo funciona
Denotar el peso total de las bolsas de compras con W . Luego, si las bolsas en una de las manos pesan W / 2 - D / 2 , las de la otra mano deben pesar y W - (W / 2 - D / 2) = W / 2 + D / 2 .
Estamos tratando de minimizar la diferencia D . Pero (W / 2 - D / 2) (W / 2 + D / 2) = W ^ 2/4 - D ^ 2/4 , que se hace más grande a medida que D se hace más pequeño.
Por lo tanto, el producto máximo corresponde a la diferencia mínima.
fuente
:*
...W=
debería funcionar.Python 2.7,
161, 160código
Algoritmo
Verifique si cada combinación se acerca a la mitad del peso total. Iterar y encontrar el mejor.
entrada
salida
La tupla mostrada va en una mano, las que no se muestran van en la otra (no está en contra de las reglas).
fuente
from itertools import*
JavaScript ( ES6 ) 117
Usar una máscara de bits para probar cada división posible, por lo que se limita a 31 elementos (de acuerdo con las reglas). Al igual que la respuesta de referencia, genera solo una mano. Nota: busco la diferencia mínima> = 0 para evitar Math.abs, ya que para cada min <0 hay otro> 0, simplemente intercambiando manos.
Para probar: ejecute el fragmento en Firefox, ingrese una lista de números separados por comas o espacios.
fuente
Haskell, 73 bytes
Emite una lista de elementos en una mano. Los elementos que faltan van a la otra parte.
Uso:
f [7,7,7,10,11]
->[7,7,7]
Para todas las subsecuencias
s
de la lista de entrada,l
calcule el valor absoluto de la diferencia de peso entres
y los elementos que faltanl
. Encuentra el mínimo.fuente
Haskell, 51 bytes
El formato de salida es que los pesos de la izquierda son positivos y los de la derecha son negativos.
Para generar cada división posible, usamos
mapM(\x->[x,-x])l
para negar cada posible subconjunto de elementos. Luego,((,)=<<abs.sum)
etiqueta cada uno con su suma absoluta ysnd$minimum$((,)=<<abs.sum)
toma el elemento etiquetado más pequeño.No pude obtenerlo sin puntos debido a problemas de verificación de tipo.
fuente
snd.minimum.map((,)=<<abs.sum).mapM(\x->[x,-x])
. Son 47 bytes. (aunque tengo una versión anterior instalada ...)R (234)
Una solución más larga y lenta con R.
Función:
Entrada esperada - vector con los pesos.
Salida esperada: vector con los pesos para una mano.
Ejemplo
Versión de código legible para humanos:
fuente
Axioma, 292 bytes
Una aplicación de fuerza bruta. Esto minimizaría el conjunto
porque si es mínimo
sería mínimo también
donde (reduce (+, a) -reduce (+, r)) y reduce (+, r) son el peso 2 de dos bolsas. (Pero esa última fórmula no me encuentra el mínimo, en la aplicación). Ungolf y resultados
fuente