group_mixer 0.5.0 → 0.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9751efce09d105cce6e127118fa18817407890d
4
- data.tar.gz: 263d704111169002f26c3421232fdf3cd2b32db3
3
+ metadata.gz: d2244487635816f4daae27506f6b62e81ca7b5a3
4
+ data.tar.gz: b62def8bd28c31908672da97c710e2d5b87b691a
5
5
  SHA512:
6
- metadata.gz: f8afd0d15766ad527e6080af957baa84fda1ad4c5d1a0e26a5328c5d5f186fa586b799ce76f72fe251f73c6bae17efa121f9a9fd4743c496d2e156a9ca35001f
7
- data.tar.gz: d317036037330b80d355c8a054d23065e851b1aaf929e62af8c79fbfbcdb29052934b2033e8a0753e3e8faee9f48ce14cbf26fef7fb7bcfaf0bc24e1a5cd0bf2
6
+ metadata.gz: 55434fcb65417df5efa89add82b5ffce947e591ca2b1d0058d8f8921687aa79dfc4aebc45a3601960c5d68ef882389feaa62b56640e6c95e7685e9ba2d40ebba
7
+ data.tar.gz: c52c9e9aacdc9733370fc64937793604d390c0f6b68f474e094a76d868292de0c0aec6128a2cb4bf843c41f90242d2715e590195f05856a2388ff8266245ac19
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- group_mixer (0.5.0)
4
+ group_mixer (0.5.1)
5
5
  thor
6
6
 
7
7
  GEM
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
- Mixer.new(people, past_set, group_size, is_separate_reminders).execute
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
- group_size = (people.size / max_member_size.to_f).ceil
18
- Mixer.new(people, past_set, group_size, is_separate_reminders).execute
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
@@ -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, group_size, is_separate_reminders)
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|
@@ -1,3 +1,3 @@
1
1
  module GroupMixer
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
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.0
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-17 00:00:00.000000000 Z
11
+ date: 2018-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor