Skip to content

Instantly share code, notes, and snippets.

@klebervirgilio
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save klebervirgilio/9977be537efb40d8e837 to your computer and use it in GitHub Desktop.
Save klebervirgilio/9977be537efb40d8e837 to your computer and use it in GitHub Desktop.
# [altura, largura, comprimento, peso]
products = [
[28.0, 44.0, 33.0, 4],
[29.0, 44.0, 33.0, 17],
[50.0, 100.0, 50.0, 10],
[106, 40 , 20, 4],
[70, 70, 70, 20],
[66.65, 66.65, 66.65, 6.6],
[10, 1, 1, 7.5]
]
def create_package(products)
# Seleciona somente products que tenham todas as mediadas menore ou igual a 105 e tambem a soma das medidas nao ultrapassem 200.
products.select! {|product|
peso, *medidas = product.reverse
medidas.reduce(:+) <= 200 &&
medidas.all? {|medida| medida <= 105} &&
(1..30).cover?(peso)
}
(altura, largura, comprimento, peso), *products = products
packages = [{amax: altura, lmax: largura, cmax: comprimento, pmax: peso, products: [[altura, largura, comprimento, peso]]}]
products.reduce(packages) do |packages, product|
altura, largura, comprimento, peso = product
package = packages.select {|package|
sum = package.values_at(:amax, :lmax, :cmax).reduce(:+) + altura + largura + comprimento
sum <= 200 &&
package[:amax] + altura <= 105 &&
package[:lmax] + largura <= 105 &&
package[:cmax] + comprimento <= 105 &&
package[:pmax] + peso <= 30
}.first
if package
package[:amax] += altura
package[:lmax] += largura
package[:cmax] += comprimento
package[:pmax] += peso
package[:products] << product
else
packages << {amax: altura, lmax: largura, cmax: comprimento, pmax: peso, products: [product]}
end
packages
end
end
p create_package(products) == [{:amax=>38.0, :lmax=>45.0, :cmax=>34.0, :pmax=>11.5, :products=>[[28.0, 44.0, 33.0, 4], [10, 1, 1, 7.5]]}, {:amax=>29.0, :lmax=>44.0, :cmax=>33.0, :pmax=>17, :products=>[[29.0, 44.0, 33.0, 17]]}, {:amax=>50.0, :lmax=>100.0, :cmax=>50.0, :pmax=>10, :products=>[[50.0, 100.0, 50.0, 10]]}, {:amax=>66.65, :lmax=>66.65, :cmax=>66.65, :pmax=>6.6, :products=>[[66.65, 66.65, 66.65, 6.6]]}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment