Last active
December 17, 2015 23:49
-
-
Save kevbuchanan/5692042 to your computer and use it in GitHub Desktop.
From Best of Ruby Quiz by James Edward Gray II.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Randomly assigns secret santas. Will not match up two people with the same last name. | |
class SecretSanta | |
attr_accessor :names | |
def initialize(names_array) | |
@names = names_array.map { |name| name.split(' ') } | |
raise "Odd number of names!" if @names.size.odd? | |
@assignments = {} | |
end | |
def run | |
name_check | |
assign | |
display | |
save | |
end | |
private | |
def name_check | |
last_name_count = {} | |
last_names = @names.map { |name| name[1] } | |
last_names.each { |name| last_name_count[name] ? last_name_count[name] += 1 : last_name_count[name] = 1 } | |
raise "Incompatible last name count!" if last_name_count.values.any? { |x| x > last_names.size / 2 } | |
end | |
def assign | |
santas = @names.shuffle | |
@names.each do |name| | |
santas.shuffle! until santas[-1][1] != name[1] | |
assignment = santas.pop | |
@assignments[name.join(" ")] = assignment.join(" ") | |
end | |
end | |
def display | |
@assignments.each { |name, assignment| puts "#{name} --> #{assignment}" } | |
end | |
def save | |
File.open "secret_santa.txt", 'w' do |f| | |
f.write "Name --> Assignment \n" | |
@assignments.each { |name, assignment| f.write "#{name} --> #{assignment}" + "\n" } | |
end | |
puts "Secret santa list saved as secret_santa.txt" | |
end | |
end | |
names = [] | |
while true | |
name = gets.chomp | |
break if name == '' | |
names << name | |
end | |
list1 = SecretSanta.new(names) | |
list1.run |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The assign function will occasionally go into an endless loop if the shuffle works out such that the only remaining names have the same last name. I need to figure out how to fix this.