easy-box-packer 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +27 -16
- data/easy-box-packer.rb +8 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d7ee6c881d4342f0daaf9c3a87b838a6094c9e5
|
4
|
+
data.tar.gz: 2edf4d7bda53d69bd0e8f127124cf31619b940a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4720460af7baf0828a12661358cec38e1ec1e4a565295d7604c879043bd268f9a6954bff6fb2d211c05ffef2c7ad8c2dd08a69a14318a6a06285066313f96e5
|
7
|
+
data.tar.gz: 30c42440ccad0c65b874166c523e4d5945250182a3a0cef5b992505772af2493d50a55846c4af72bcfade997a0991b825a7f8aa7de7542c0dfb00046f22b5d23
|
data/README.md
CHANGED
@@ -14,10 +14,12 @@ gem 'easy-box-packer'
|
|
14
14
|
|
15
15
|
## Usage
|
16
16
|
|
17
|
+
### Check all items can be packed in a container
|
18
|
+
|
17
19
|
``` ruby
|
18
20
|
require 'easy-box-packer'
|
19
21
|
|
20
|
-
|
22
|
+
cont = EasyBoxPacker.pack(
|
21
23
|
container: { dimensions: [15, 20, 13], weight_limit: 50 },
|
22
24
|
items: [
|
23
25
|
{ dimensions: [2, 3, 5], weight: 47 },
|
@@ -27,19 +29,28 @@ packings = BoxPacker.pack(
|
|
27
29
|
]
|
28
30
|
)
|
29
31
|
|
30
|
-
packings.length # 3
|
31
|
-
packings[0][:weight] # 47
|
32
|
-
packings[0][:placements].length # 1
|
33
|
-
packings[0][:placements][0][:dimensions] # [2, 3, 5]
|
34
|
-
packings[0][:placements][0][:position] # [0, 0, 0]
|
35
|
-
packings[1][:weight] # 47
|
36
|
-
packings[1][:placements].length # 1
|
37
|
-
packings[1][:placements][0][:dimensions] # [2, 3, 5]
|
38
|
-
packings[1][:placements][0][:position] # [0, 0, 0]
|
39
|
-
packings[2][:weight] # 31
|
40
|
-
packings[2][:placements].length # 2
|
41
|
-
packings[2][:placements][0][:dimensions] # [1, 3, 3]
|
42
|
-
packings[2][:placements][0][:position] # [0, 0, 0]
|
43
|
-
packings[2][:placements][1][:dimensions] # [4, 1, 1]
|
44
|
-
packings[2][:placements][1][:position] # [3, 0, 0]
|
32
|
+
cont[:packings].length # 3
|
33
|
+
cont[:packings][0][:weight] # 47
|
34
|
+
cont[:packings][0][:placements].length # 1
|
35
|
+
cont[:packings][0][:placements][0][:dimensions] # [2, 3, 5]
|
36
|
+
cont[:packings][0][:placements][0][:position] # [0, 0, 0]
|
37
|
+
cont[:packings][1][:weight] # 47
|
38
|
+
cont[:packings][1][:placements].length # 1
|
39
|
+
cont[:packings][1][:placements][0][:dimensions] # [2, 3, 5]
|
40
|
+
cont[:packings][1][:placements][0][:position] # [0, 0, 0]
|
41
|
+
cont[:packings][2][:weight] # 31
|
42
|
+
cont[:packings][2][:placements].length # 2
|
43
|
+
cont[:packings][2][:placements][0][:dimensions] # [1, 3, 3]
|
44
|
+
cont[:packings][2][:placements][0][:position] # [0, 0, 0]
|
45
|
+
cont[:packings][2][:placements][1][:dimensions] # [4, 1, 1]
|
46
|
+
cont[:packings][2][:placements][1][:position] # [3, 0, 0]
|
47
|
+
```
|
48
|
+
|
49
|
+
### Get a reasonable smallest container by given boxes
|
50
|
+
|
51
|
+
```
|
52
|
+
container = EasyBoxPacker.find_smallest_container(
|
53
|
+
items: Array.new(1000) {{ dimensions: [1, 1, 1] }}
|
54
|
+
)
|
55
|
+
container # [10, 10, 10]
|
45
56
|
```
|
data/easy-box-packer.rb
CHANGED
@@ -76,6 +76,10 @@ module EasyBoxPacker
|
|
76
76
|
# base_container = sorted_items.first
|
77
77
|
based_container = sorted_items.first
|
78
78
|
|
79
|
+
if sorted_items.size == 1
|
80
|
+
return based_container[:dimensions]
|
81
|
+
end
|
82
|
+
|
79
83
|
find_possible_container(
|
80
84
|
possible_containers: possible_containers,
|
81
85
|
invalid_containers: invalid_containers,
|
@@ -118,9 +122,9 @@ module EasyBoxPacker
|
|
118
122
|
]
|
119
123
|
|
120
124
|
tmp_possible_containers = []
|
121
|
-
# (1) loops base_container
|
125
|
+
# (1) loops base_container 3 rotations
|
122
126
|
c_permutations.each do |c_perm|
|
123
|
-
# (2) try to puts items to 3 points, then it will create
|
127
|
+
# (2) try to puts items to 3 points, then it will create 3 different possible containers
|
124
128
|
b_permutations.each do |b_perm|
|
125
129
|
tmp_possible_containers << [ c_perm[0] + b_perm[0], [c_perm[1], b_perm[1]].max, [c_perm[2], b_perm[2]].max]
|
126
130
|
tmp_possible_containers << [ [c_perm[0], b_perm[0]].max, c_perm[1] + b_perm[1], [c_perm[2], b_perm[2]].max]
|
@@ -128,13 +132,14 @@ module EasyBoxPacker
|
|
128
132
|
end
|
129
133
|
end
|
130
134
|
removed_tried_container = tmp_possible_containers.map { |a| a.sort }.uniq - possible_containers - invalid_containers
|
135
|
+
|
131
136
|
return unless removed_tried_container.any?
|
132
137
|
# (3) loop all container from smallest spaces to biggest space
|
133
138
|
removed_tried_container.sort_by { |a| [a.inject(&:*), a.inject(&:+)] }.each do |cont|
|
134
139
|
# (4) next unless l * w * h >= minimum_space
|
135
140
|
if cont.inject(&:*) >= min_vol
|
136
141
|
possible_containers << cont
|
137
|
-
else
|
142
|
+
# else
|
138
143
|
# puts "invalid: #{cont}"
|
139
144
|
# invalid_containers << cont
|
140
145
|
# find_possible_container(possible_containers: possible_containers, invalid_containers: invalid_containers, container: cont, items: items, item_index: item_index + 1, min_vol: min_vol)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy-box-packer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aloha Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|