45 lines
976 B
Ruby
45 lines
976 B
Ruby
|
module Tables
|
||
|
class Distribution
|
||
|
attr_reader :tables
|
||
|
|
||
|
def initialize(min_per_table:, max_per_table:)
|
||
|
@min_per_table = min_per_table
|
||
|
@max_per_table = max_per_table
|
||
|
end
|
||
|
|
||
|
def random_distribution(people)
|
||
|
@tables = []
|
||
|
|
||
|
@tables << people.slice!(0..rand(@min_per_table..@max_per_table)) while people.any?
|
||
|
end
|
||
|
|
||
|
def discomfort
|
||
|
@tables.map do |table|
|
||
|
local_discomfort(table)
|
||
|
end.sum
|
||
|
end
|
||
|
|
||
|
def inspect
|
||
|
"#{@tables.count} tables, discomfort: #{discomfort}"
|
||
|
end
|
||
|
|
||
|
def pretty_print
|
||
|
@tables.map.with_index do |table, i|
|
||
|
"Table #{i + 1} (#{table.count} ppl): (#{local_discomfort(table)}) #{table.map(&:full_name).join(', ')}"
|
||
|
end.join("\n")
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def local_discomfort(table)
|
||
|
10 * (number_of_groups(table) - 1)
|
||
|
end
|
||
|
|
||
|
def number_of_groups(table)
|
||
|
table.map do |person|
|
||
|
person.affinity_groups
|
||
|
end.flatten.uniq.count
|
||
|
end
|
||
|
end
|
||
|
end
|