Stable marriage problem: Difference between revisions
Content added Content deleted
m (→{{header|Python}}: Shortened lines) |
|||
Line 678: | Line 678: | ||
<lang python>import copy |
<lang python>import copy |
||
from collections import defaultdict |
from collections import defaultdict |
||
guys = 'abe bob col dan ed fred gav hal ian jon'.strip().split() |
|||
gals = 'abi bea cath dee eve fay gay hope ivy jan'.strip().split() |
|||
guyprefers = { |
guyprefers = { |
||
'abe': ['abi', 'eve', 'cath', 'ivy', 'jan', 'dee', 'fay', 'bea', 'hope', 'gay'], |
'abe': ['abi', 'eve', 'cath', 'ivy', 'jan', 'dee', 'fay', 'bea', 'hope', 'gay'], |
||
Line 704: | Line 701: | ||
'ivy': ['ian', 'col', 'hal', 'gav', 'fred', 'bob', 'abe', 'ed', 'jon', 'dan'], |
'ivy': ['ian', 'col', 'hal', 'gav', 'fred', 'bob', 'abe', 'ed', 'jon', 'dan'], |
||
'jan': ['ed', 'hal', 'gav', 'abe', 'bob', 'jon', 'col', 'ian', 'fred', 'dan']} |
'jan': ['ed', 'hal', 'gav', 'abe', 'bob', 'jon', 'col', 'ian', 'fred', 'dan']} |
||
guys = sorted(guyprefers.keys()) |
|||
gals = sorted(galprefers.keys()) |
|||
def check(engaged): |
def check(engaged): |
||
inverseengaged = dict((v,k) for k,v in engaged.items()) |
inverseengaged = dict((v,k) for k,v in engaged.items()) |
||
for she, he in engaged.items(): |
for she, he in engaged.items(): |
||
shelikes = galprefers[she] |
shelikes = galprefers[she] |
||
shelikesbetter = shelikes[ |
shelikesbetter = shelikes[:shelikes.index(he)] |
||
helikes = guyprefers[he] |
helikes = guyprefers[he] |
||
helikesbetter = helikes[ |
helikesbetter = helikes[:helikes.index(she)] |
||
for guy in shelikesbetter: |
for guy in shelikesbetter: |
||
guysgirl = inverseengaged[guy] |
guysgirl = inverseengaged[guy] |
||
Line 730: | Line 730: | ||
return False |
return False |
||
return True |
return True |
||
def matchmaker(): |
def matchmaker(): |
||
guysfree = guys[:] |
guysfree = guys[:] |
||
Line 756: | Line 756: | ||
guysfree.append(fiance) |
guysfree.append(fiance) |
||
else: |
else: |
||
# She is |
# She is faithful to old fiance |
||
if guyslist: |
if guyslist: |
||
# Look again |
# Look again |
||
guysfree.append(guy) |
guysfree.append(guy) |
||
return engaged |
return engaged |
||
print('\nEngagements:') |
print('\nEngagements:') |
||
engaged = matchmaker() |
engaged = matchmaker() |
||
print('\nCouples:') |
print('\nCouples:') |
||
print(' ' + ',\n '.join('%s is engaged to %s' % couple |
print(' ' + ',\n '.join('%s is engaged to %s' % couple |
||
Line 772: | Line 772: | ||
print('Engagement stability check PASSED' |
print('Engagement stability check PASSED' |
||
if check(engaged) else 'Engagement stability check FAILED') |
if check(engaged) else 'Engagement stability check FAILED') |
||
print('\n\nSwapping two fiances to introduce an error') |
print('\n\nSwapping two fiances to introduce an error') |
||
engaged[gals[0]], engaged[gals[1]] = engaged[gals[1]], engaged[gals[0]] |
engaged[gals[0]], engaged[gals[1]] = engaged[gals[1]], engaged[gals[0]] |