Created
November 22, 2012 21:05
-
-
Save AndreaCrotti/4132917 to your computer and use it in GitHub Desktop.
santa sol
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
# draw things out of a hat | |
from pprint import pprint | |
import re | |
import random | |
NAME_REGEXP = re.compile("(?P<name>\w+) (?P<last>\w+) <(?P<mail>.*?)>") | |
NAMES = [ | |
"luke skywalker <luke@theforce.net>", | |
"leia skywalker <leia@threbellion.org>", | |
"toula portokalos <toula@manhunter.org>", | |
"gus portokalos <gus@wearallfruit.net>", | |
"bruce wayne <bruce@imbatman.com>", | |
"virgil brigman <virgil@rigworkerunion.org>", | |
"lindsley brigman <lindsley@iseealiens.net>" | |
] | |
class Person(object): | |
def __init__(self, name, last, mail): | |
self.name = name | |
self.last = last | |
self.mail = mail | |
def __repr__(self): | |
return str(self) | |
def __str__(self): | |
return "%s %s" % (self.name, self.last) | |
def is_parent(self, other): | |
return self.last == other.last | |
def gen_people(names): | |
people = [] | |
for name in names: | |
match = NAME_REGEXP.match(name) | |
person = Person(**match.groupdict()) | |
people.append(person) | |
random.shuffle(people) | |
return people | |
def santa_select(names): | |
giver_receiver = {} | |
people = gen_people(names) | |
while True: | |
not_givers = set(people) - set(giver_receiver.keys()) | |
if not not_givers: | |
break | |
next = not_givers.pop() | |
is_possible = lambda x: (x != next) and \ | |
not (x.is_parent(next)) and \ | |
x not in giver_receiver.values() | |
possible_receivers = filter(is_possible, people) | |
possible_receivers.sort(key=lambda x: x not in giver_receiver) | |
recv = possible_receivers.pop() | |
giver_receiver[next] = recv | |
print(giver_receiver) | |
return giver_receiver | |
def test_regexp(): | |
match = NAME_REGEXP.match("luke skywalker <luke@theforce.net>") | |
assert match.group('name') == 'luke' | |
if __name__ == '__main__': | |
test_regexp() | |
result = santa_select(NAMES) | |
pprint(result) | |
print(len(result)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment