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 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