Skip to content

Instantly share code, notes, and snippets.

@AndreaCrotti
Created November 22, 2012 21:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AndreaCrotti/4132917 to your computer and use it in GitHub Desktop.
Save AndreaCrotti/4132917 to your computer and use it in GitHub Desktop.
santa sol
# 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