Last active
December 5, 2020 21:00
-
-
Save andrewtremblay/5fd8829fd965d61c592130dc3695a145 to your computer and use it in GitHub Desktop.
Secret Santa Source Code
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
import csv | |
import random | |
input_spreadsheet_name = 'secret_santas_input.csv' | |
secret_spreadsheet_name = 'secret_santa_assigments.csv' | |
# recursive match making | |
def make_matches(remaining_people, next_santa=None, original_santa=None, processed_people={}): | |
if len(remaining_people) is 0: | |
return processed_people | |
if next_santa is None: | |
next_santa = random.choice(remaining_people) | |
remaining_people.remove(next_santa) | |
if original_santa is None: | |
original_santa = next_santa | |
if len(remaining_people) is 0: | |
processed_people[next_santa] = original_santa | |
return processed_people | |
# randomly select a recipient from remaining pool | |
recipient = random.choice(remaining_people) | |
processed_people[next_santa] = recipient | |
# make the receipient the next santa | |
return make_matches(remaining_people, recipient, original_santa, processed_people) | |
with open(input_spreadsheet_name) as csv_file: | |
csv_reader = csv.reader(csv_file, delimiter=',') | |
line_count = 0 | |
unique_rows = 0 | |
duplicates = [] | |
people = {} | |
for row in csv_reader: | |
if line_count == 0: | |
print(f'processing columns {", ".join(row)}') | |
elif people.get(row[1], None) is not None: | |
duplicates.append(row[1]) | |
else: | |
unique_rows += 1 | |
people[row[1]] = {'email': row[1], 'address': row[2], 'name': row[3] or "Anonymous", 'gender': (row[4] or "none given"), 'interests': ( | |
row[5] or "none given"), 'allergies': (row[6] or "none given")} | |
line_count += 1 | |
# assign one person to another randomly | |
emails = [k for k in people.keys()] | |
processed_emails = [] | |
matches = make_matches(emails) | |
print(f'{line_count} lines in the spreadsheet. {unique_rows} unique emails (duplicates: {duplicates}). matches: {len(matches.keys())}') | |
written_line_count = 0 | |
with open(secret_spreadsheet_name, 'w', newline='') as csvfile: | |
fieldnames = ['santa_email', 'recipient_email', 'recipient_name', 'recipient_gender', | |
'recipient_address', 'recipient_interests', 'recipient_allergies'] | |
writer = csv.DictWriter(csvfile, fieldnames=fieldnames) | |
writer.writeheader() | |
for match in matches.keys(): | |
recipient = people[matches[match]] | |
writer.writerow({'santa_email': match, | |
'recipient_email': recipient['email'], | |
'recipient_name': recipient['name'], | |
'recipient_gender': recipient['gender'], | |
'recipient_address': recipient['address'], | |
'recipient_interests': recipient['interests'], | |
'recipient_allergies': recipient['allergies']}) | |
written_line_count += 1 | |
print(f'{written_line_count} lines written to secret spreadsheet {secret_spreadsheet_name}') |
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
santa_email | recipient_email | recipient_name | recipient_gender | recipient_address | recipient_interests | recipient_allergies | |
---|---|---|---|---|---|---|---|
exampleemail3@gmail.com | exampleemail2@gmail.com | Person 2 | none given | 432 fake street | Many other interests | none given | |
exampleemail2@gmail.com | exampleemail4@gmail.com | Anonymous | Male | 999 fake street | no interests | none given | |
exampleemail4@gmail.com | exampleemail1@gmail.com | Person 1 | none given | 123 fake street | Many interests | none given | |
exampleemail1@gmail.com | exampleemail3@gmail.com | Anonymous | Female | 567 fake street | Many varying interests | none given |
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
Timestamp | Your email | Mailing Address | Your Name | Gender | Interests | Allergies | |
---|---|---|---|---|---|---|---|
11/28/2020 15:29:55 | exampleemail1@gmail.com | 123 fake street | Person 1 | Many interests | |||
11/28/2020 15:29:55 | exampleemail2@gmail.com | 432 fake street | Person 2 | Many other interests | |||
11/28/2020 15:29:55 | exampleemail3@gmail.com | 567 fake street | Female | Many varying interests | |||
11/28/2020 15:29:55 | exampleemail4@gmail.com | 999 fake street | Male | no interests |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment