Skip to content

Commit 54f4a9b

Browse files
committed
Slightly changed Galey-Shapely Py implementation
1 parent ed3ec56 commit 54f4a9b

File tree

2 files changed

+48
-39
lines changed

2 files changed

+48
-39
lines changed

CONTRIBUTORS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ This file lists everyone, who contributed to this repo and wanted to show up her
4848
- dovisutu
4949
- Antetokounpo
5050
- Akash Dhiman
51+
- Amaras
Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,30 @@
11
# Submitted by Marius Becker
2+
# Updated by Amaras
23

34
import sys
45
from random import shuffle
56
from copy import copy
6-
from string import ascii_uppercase
7+
from string import ascii_uppercase, ascii_lowercase
8+
79

810
def main():
911
# Set this to however many men and women you want
10-
if len(sys.argv) > 1:
12+
try:
1113
num_pairs = int(sys.argv[1])
12-
else:
14+
except (IndexError, ValueError):
15+
# If you either did not set how many pairs you wanted or you
16+
# did not set it as a number, use default value of 5
1317
num_pairs = 5
1418

15-
# There are only 26 possible names
16-
if num_pairs > 13:
17-
print('You can\' have more than 13 pairs.')
19+
20+
# There are only 26 possible names for each sex
21+
if num_pairs > 26:
22+
print("You can't have more than 26 pairs.")
1823
return
1924

2025
# Create all Person objects
21-
men = [ Person(name) for name in ascii_uppercase[0:num_pairs] ]
22-
women = [ Person(name) for name in ascii_uppercase[num_pairs:num_pairs*2] ]
26+
men = [Person(name) for name in ascii_uppercase[:num_pairs]]
27+
women = [Person(name) for name in ascii_lowercase[:num_pairs]]
2328

2429
# Set everyone's preferences
2530
for man in men:
@@ -35,49 +40,46 @@ def main():
3540

3641
# Print preferences and the result
3742
for man in men:
38-
print('{}: {}'.format(man.name, ', '.join([ p.name for p in man.preference ])))
43+
print(f"{man.name}: {', '.join((p.name for p in man.preference))}")
44+
45+
print('')
3946

4047
for woman in women:
41-
print('{}: {}'.format(woman.name, ', '.join([ p.name for p in woman.preference ])))
48+
print(f"{woman.name}: {', '.join((p.name for p in woman.preference))}")
4249

43-
print('')
50+
print('\n')
4451

4552
for man in men:
46-
print('{} + {}'.format(man.name, man.partner.name))
53+
print(f'{man.name} + {man.partner.name}')
4754

4855
def resolve(men, women):
4956
"""Finds pairs with stable marriages"""
50-
cont = True
51-
while cont:
57+
58+
while True:
5259
# Let every man without a partner propose to a woman
5360
for man in men:
54-
if not man.has_partner():
61+
if not man.has_partner:
5562
man.propose_to_next()
5663

5764
# Let the women pick their favorites
5865
for woman in women:
5966
woman.pick_preferred()
6067

6168
# Continue only when someone is still left without a partner
62-
cont = False
63-
for man in men:
64-
if not man.has_partner():
65-
cont = True
66-
break
69+
if all((man.has_partner for man in men)):
70+
return
71+
6772

6873
class Person:
69-
name = None
70-
preference = None
71-
pref_index = 0
72-
candidates = None
73-
partner = None
7474

7575
def __init__(self, name):
7676
self.name = name
7777
self.preference = []
7878
self.candidates = []
79+
self.pref_index = 0
80+
self._partner = None
7981

80-
def get_next_choice(self):
82+
def next_choice(self):
8183
"""Return the next person in the own preference list"""
8284
if self.pref_index >= len(self.preference):
8385
return None
@@ -86,7 +88,7 @@ def get_next_choice(self):
8688

8789
def propose_to_next(self):
8890
"""Propose to the next person in the own preference list"""
89-
person = self.get_next_choice()
91+
person = self.next_choice()
9092
person.candidates.append(self)
9193
self.pref_index += 1
9294

@@ -99,33 +101,39 @@ def pick_preferred(self):
99101
if person == self.partner:
100102
break
101103
elif person in self.candidates:
102-
self.set_partner(person)
104+
self.partner = person
103105
break
104106

105107
# Rejected candidates don't get a second chance. :(
106108
self.candidates.clear()
107109

108-
def get_partner(self):
109-
"""Return the current partner"""
110-
return self.partner
110+
@property
111+
def partner(self):
112+
return self._partner
113+
114+
# This allows one to change both self.partner and person.partner
115+
# with the simple call: "self.partner = person"
116+
@partner.setter
117+
def partner(self, person):
118+
"""Set a person as the new partner and sets the partner of that
119+
person as well"""
111120

112-
def set_partner(self, person):
113-
"""Set a person as the new partner and run set_partner() on that person
114-
as well"""
115121
# Do nothing if nothing would change
116122
if person != self.partner:
117123
# Remove self from current partner
118124
if self.partner is not None:
119-
self.partner.partner = None
125+
self._partner._partner = None
120126

121127
# Set own and the other person's partner
122-
self.partner = person
128+
self._partner = person
123129
if self.partner is not None:
124-
self.partner.partner = self
130+
self._partner._partner = self
125131

132+
# This allows use of self.has_parnter instead of self.has_partner()
133+
@property
126134
def has_partner(self):
127-
"""Determine whether this person currently has a partner or not"""
128-
return self.partner != None
135+
"""Determine whether this person currently has a partner or not."""
136+
return self.partner is not None
129137

130138
if __name__ == '__main__':
131139
main()

0 commit comments

Comments
 (0)