Skip to content

Commit 3679668

Browse files
BjoernAkAManfleios
authored andcommitted
Implemented Stable Marriage in Ruby (#534)
* Implemented Stable Marriage in Ruby * Update stable_marriage.rb
1 parent f269bc2 commit 3679668

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

CONTRIBUTORS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ This file lists everyone, who contributed to this repo and wanted to show up her
4040
- Thijs Raymakers
4141
- crafter312
4242
- Christopher Milan
43-
- Vexatos
43+
- Vexatos
44+
- Björn Heinrichs
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
class Person
2+
def initialize(id, name, prefs)
3+
@id = id
4+
@name = name
5+
@prefs = prefs
6+
@partner = nil
7+
@choices = 0
8+
end
9+
10+
def lonely?
11+
@partner.nil?
12+
end
13+
14+
def propose(partners)
15+
unless self.lonely?
16+
raise '%s is not lonely!' % self.name
17+
end
18+
choice = @prefs[@choices]
19+
partners[choice].onPropose(self)
20+
@choices += 1
21+
end
22+
23+
def to_s
24+
"#{@name.rjust(20)}: #{self.lonely? && "Lonely" || @partner.name}"
25+
end
26+
27+
def self.generate(size, prefix, r)
28+
Array.new(size){|i|
29+
Person.new(
30+
i,
31+
"#{prefix} #{i}",
32+
(0 ... size).to_a.shuffle(random: r)
33+
)
34+
}
35+
end
36+
37+
protected
38+
attr_reader :id, :name
39+
attr_writer :partner
40+
41+
# Acts upon a given Proposal
42+
def onPropose(partner)
43+
unless self.lonely?
44+
offer = score(partner)
45+
current = score(@partner)
46+
return unless offer > current
47+
@partner.partner = nil
48+
end
49+
@partner = partner
50+
partner.partner = self
51+
end
52+
53+
private
54+
# Determines the preference of a given partner
55+
def score(partner)
56+
return 0 if partner.nil?
57+
@prefs.size - @prefs.index(partner.id)
58+
end
59+
end
60+
61+
# Deterministic Output, feel free to change seed
62+
r = Random.new(42)
63+
64+
# Determines Output Columns
65+
men = Person.generate(4, "Man", r)
66+
women = Person.generate(4, "Woman", r)
67+
68+
# Assume no Name is longer than 20 characters
69+
spacer = '-' * (20 * 2 + 2)
70+
71+
# Solve the Problem
72+
1.step do |round|
73+
singles = men.select(&:lonely?)
74+
singles.each do |m|
75+
m.propose(women)
76+
end
77+
78+
break if singles.empty?
79+
80+
puts "Round #{round}"
81+
puts spacer
82+
puts men, women
83+
puts spacer
84+
end

contents/stable_marriage_problem/stable_marriage_problem.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ Here is a video describing the stable marriage problem:
2929
## Example Code
3030

3131
{% method %}
32+
{% sample lang="ruby" %}
33+
[import, lang:"ruby"](code/ruby/stable_marriage.rb)
3234
{% sample lang="jl" %}
3335
[import, lang:"julia"](code/julia/stable_marriage.jl)
3436
{% sample lang="py" %}

0 commit comments

Comments
 (0)