group_mixer 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/group_mixer.rb +66 -3
- data/lib/group_mixer/mixer.rb +2 -23
- data/lib/group_mixer/version.rb +1 -1
- 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: d2244487635816f4daae27506f6b62e81ca7b5a3
|
4
|
+
data.tar.gz: b62def8bd28c31908672da97c710e2d5b87b691a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55434fcb65417df5efa89add82b5ffce947e591ca2b1d0058d8f8921687aa79dfc4aebc45a3601960c5d68ef882389feaa62b56640e6c95e7685e9ba2d40ebba
|
7
|
+
data.tar.gz: c52c9e9aacdc9733370fc64937793604d390c0f6b68f474e094a76d868292de0c0aec6128a2cb4bf843c41f90242d2715e590195f05856a2388ff8266245ac19
|
data/Gemfile.lock
CHANGED
data/lib/group_mixer.rb
CHANGED
@@ -7,14 +7,77 @@ module GroupMixer
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.by_group_size(people, past_set, group_size, is_separate_reminders = false)
|
10
|
-
|
10
|
+
if group_size.zero?
|
11
|
+
raise ZeroGroupSize, 'group_size must be a number greater than 1'
|
12
|
+
end
|
13
|
+
max_member_size = (people.size.to_f / group_size).ceil
|
14
|
+
rest = people.size % max_member_size
|
15
|
+
groups = make_groups(rest, group_size, max_member_size, is_separate_reminders)
|
16
|
+
Mixer.new(people, past_set, groups, is_separate_reminders).execute
|
11
17
|
end
|
12
18
|
|
13
19
|
def self.by_member_size(people, past_set, max_member_size, is_separate_reminders = false)
|
14
20
|
if max_member_size.to_f < 1
|
15
21
|
raise ZeroMaxMemberSize, 'max_member_size must be a number greater than 1'
|
16
22
|
end
|
17
|
-
|
18
|
-
|
23
|
+
rest = people.size % max_member_size
|
24
|
+
group_size = (people.size.to_f / max_member_size).ceil
|
25
|
+
groups = make_groups(rest, group_size, max_member_size, is_separate_reminders)
|
26
|
+
Mixer.new(people, past_set, groups, is_separate_reminders).execute
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def self.make_groups_hoge(group_size_set)
|
32
|
+
group_size_set.map { |s| Group.new(s) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.make_groups_by_group_size(people_size, group_size, is_separate_reminders)
|
36
|
+
max_mem = (people_size.to_f / group_size).ceil
|
37
|
+
if is_separate_reminders
|
38
|
+
rest = people_size % max_mem
|
39
|
+
if rest.zero?
|
40
|
+
Array.new(group_size) { max_mem }
|
41
|
+
else
|
42
|
+
Array.new(group_size - 1) { max_mem } + [rest]
|
43
|
+
end
|
44
|
+
else
|
45
|
+
rest = people_size % group_size
|
46
|
+
if rest.zero?
|
47
|
+
Array.new(group_size) { max_mem }
|
48
|
+
else
|
49
|
+
Array.new(rest) { max_mem } + Array.new(group_size - rest) { max_mem - 1 }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.make_groups_by_member_size(people_size, member_size, is_separate_reminders)
|
55
|
+
group_size = (people_size.to_f / member_size).ceil
|
56
|
+
if is_separate_reminders
|
57
|
+
rest = people_size % member_size
|
58
|
+
return Array.new(group_size) { member_size } if rest.zero?
|
59
|
+
|
60
|
+
Array.new(group_size - 1) { member_size } + [rest]
|
61
|
+
else
|
62
|
+
rest = people_size % group_size
|
63
|
+
if rest.zero?
|
64
|
+
msize = (people_size < group_size * member_size) ? member_size - 1 : member_size
|
65
|
+
Array.new(group_size) { msize }
|
66
|
+
else
|
67
|
+
Array.new(rest) { member_size } + Array.new(group_size - rest) { member_size - 1 }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.make_groups(rest, group_size, max_member_size, is_separate_reminders)
|
73
|
+
return Array.new(group_size) { Group.new(max_member_size) } if rest.zero?
|
74
|
+
|
75
|
+
if is_separate_reminders
|
76
|
+
Array.new(group_size - 1) { Group.new(max_member_size) } + [Group.new(rest)]
|
77
|
+
else
|
78
|
+
min_group_size = max_member_size - rest
|
79
|
+
Array.new(group_size - min_group_size) { Group.new(max_member_size) } +
|
80
|
+
Array.new(min_group_size) { Group.new(max_member_size - 1) }
|
81
|
+
end
|
19
82
|
end
|
20
83
|
end
|
data/lib/group_mixer/mixer.rb
CHANGED
@@ -5,14 +5,10 @@ module GroupMixer
|
|
5
5
|
class Mixer
|
6
6
|
MAX_AMOUNT = 2 ** ([42].pack('i').size * 16 - 2) - 1
|
7
7
|
|
8
|
-
def initialize(people, past_set,
|
8
|
+
def initialize(people, past_set, groups, is_separate_reminders)
|
9
9
|
@people = people.shuffle
|
10
|
+
@groups = groups
|
10
11
|
@past_groups = past_set.to_a.map { |s| s.is_a?(WeightedGroup) ? s : WeightedGroup.new(s) }
|
11
|
-
group_size = group_size.to_i
|
12
|
-
if group_size.zero?
|
13
|
-
raise ZeroGroupSize, 'group_size must be a number greater than 1'
|
14
|
-
end
|
15
|
-
@groups = make_groups(is_separate_reminders, group_size)
|
16
12
|
end
|
17
13
|
|
18
14
|
def execute
|
@@ -28,23 +24,6 @@ module GroupMixer
|
|
28
24
|
|
29
25
|
private
|
30
26
|
|
31
|
-
def make_groups(is_separate_reminders, group_size)
|
32
|
-
ps = @people.size
|
33
|
-
is_separate_reminders ? separate_groups(group_size, ps) : flatting_groups(group_size, ps)
|
34
|
-
end
|
35
|
-
|
36
|
-
def flatting_groups(group_size, people_size)
|
37
|
-
min_member_size, max_group_size = people_size.divmod group_size
|
38
|
-
max_group_size.times.map { |n| Group.new(min_member_size + 1) } +
|
39
|
-
(group_size - max_group_size).times.map { |n| Group.new(min_member_size) }
|
40
|
-
end
|
41
|
-
|
42
|
-
def separate_groups(group_size, people_size)
|
43
|
-
member_size = people_size / (group_size - 1)
|
44
|
-
(group_size - 1).times.map { Group.new(member_size) } +
|
45
|
-
[Group.new(people_size % (group_size - 1))]
|
46
|
-
end
|
47
|
-
|
48
27
|
def make_heuristic_from_past(people, past_set)
|
49
28
|
past_set.each_with_object(Hash.new(0)) { |past, pheromone|
|
50
29
|
past.members.to_a.combination(2).each do |pair|
|
data/lib/group_mixer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: group_mixer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iwtn
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|