Skip to content

Instantly share code, notes, and snippets.

@robertomiranda
Last active June 9, 2016 15:50
Show Gist options
  • Save robertomiranda/a5b6e250fa0ad355b277dfe2bed7e267 to your computer and use it in GitHub Desktop.
Save robertomiranda/a5b6e250fa0ad355b277dfe2bed7e267 to your computer and use it in GitHub Desktop.
require 'active_support/all'
def balance_group(members)
group1, group2 = members.in_groups(2)
mean1, mean2 = (group1.sum/group1.size.to_f), (group2.sum/group2.size.to_f)
if mean1.to_i == mean2.to_i
return [{mean: mean1, group: group1}, {mean: mean2, group: group2}]
else
balance_group(members.shuffle)
end
end
members = Array.new(10) { rand(5...10) }
# => [5, 6, 6, 8, 9, 7, 9, 7, 7, 9]
balance_group(members)
# => [{:mean=>7.6, :group=>[8, 7, 9, 7, 7]}, {:mean=>7.0, :group=>[6, 6, 5, 9, 9]}]
balance_group(members)
# => [{:mean=>7.4, :group=>[9, 7, 5, 9, 7]}, {:mean=>7.2, :group=>[8, 7, 6, 6, 9]}]
require 'active_support/all'
def balance_group(members, size = 2)
return unless members.size % size == 0
groups = members.in_groups(size)
means = groups.map{|group| {group: group, mean: (group.sum/group.size.to_f).to_i} }
if means.map{|x| x[:mean]}.uniq.size <= 1
return means
else
balance_group(members.shuffle, size)
end
end
# members = Array.new(15) { rand(5...10) }
# => [8, 5, 5, 9, 6, 6, 6, 5, 9, 9, 5, 9, 6, 9, 8]
# balance_group(members,3)
# => [{:group=>[5, 9, 9, 6, 6], :mean=>7}, {:group=>[5, 9, 5, 8, 8], :mean=>7}, {:group=>[9, 5, 9, 6, 6], :mean=>7}]
@robertomiranda
Copy link
Author

robertomiranda commented May 5, 2016

Todo: Improve conditional statement (if mean1.to_i == mean2.to_i), in order to have more accurate results

@horozco
Copy link

horozco commented May 12, 2016

I'm getting an issue in some cases, you can reproduce it by using the next array.

a = [5, 4, 5, 3, 5, 5, 2, 6, 9, 5]
balance_group(a)

The issue is:

SystemStackError: stack level too deep

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment