diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2298de7b5..d46d8fdf7 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -50,3 +50,4 @@ This file lists everyone, who contributed to this repo and wanted to show up her - Akash Dhiman - Vincent Zalzal - Jonathan D B Van Schenck +- Ishaan Verma diff --git a/contents/stable_marriage_problem/code/rust/stable_marriage.rs b/contents/stable_marriage_problem/code/rust/stable_marriage.rs new file mode 100644 index 000000000..72063aa1f --- /dev/null +++ b/contents/stable_marriage_problem/code/rust/stable_marriage.rs @@ -0,0 +1,107 @@ +use std::vec::Vec; +use std::collections::HashMap; +use std::fmt; + +#[derive(Hash, Eq, PartialEq, Copy, Clone)] +struct PersonId(pub char); + +impl fmt::Display for PersonId { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +#[derive(Clone)] +struct Person { + id: PersonId, + partner: Option, + preferences: Vec, +} + +fn gale_shapley(people: Vec) -> HashMap { + let mut stable_matching: HashMap = HashMap::new(); + + for person in people { + let partner = stable_matching + .get(&person.id) + .or_else(|| // execute this if person doesn't have partner + person.preferences + .iter() + // skip all preferences which already have a pair + .skip_while(|id| stable_matching.contains_key(id)) + .next() + ) + .map(|&id| id); + + if let Some(partner) = partner { // set partner + stable_matching.insert(person.id, partner); + stable_matching.insert(partner, person.id); + } + } + stable_matching +} + +fn main() { + // create men vector + let men: Vec = vec![ + ('A', vec!['E', 'G', 'F', 'H']), + ('B', vec!['F', 'H', 'E', 'F']), + ('C', vec!['F', 'E', 'H', 'G']), + ('D', vec!['E', 'H', 'F', 'G']) + ] + .into_iter() + .map(|(id, pref)| + Person { + id: PersonId(id), + partner: None, + preferences: pref.into_iter().map(PersonId).collect(), + } + ).collect(); + + // create women vector + let women: Vec = vec![ + ('E', vec!['A', 'D', 'C', 'B']), + ('F', vec!['D', 'B', 'A', 'C']), + ('G', vec!['D', 'A', 'C', 'B']), + ('H', vec!['B', 'A', 'D', 'C']) + ] + .into_iter() + .map(|(id, pref)| + Person { + id: PersonId(id), + partner: None, + preferences: pref.into_iter().map(PersonId).collect(), + } + ).collect(); + + let people: Vec = men.iter().cloned().chain( + women.iter().cloned()).collect(); + + println!("Men: \n"); + for man in &men { + println!("\t{}: {:?}", man.id, man.preferences.clone() + // convert men.preference to vector of chars + .into_iter() + .map(|person| person.0) + .collect::>()); + } + println!("Women: \n"); + for woman in &women { + println!("\t{}: {:?}", woman.id, woman.preferences.clone() + // convert women.preference to vector of chars + .into_iter() + .map(|person| person.0) + .collect::>()); + } + + let stable_matching: HashMap = gale_shapley(people); + + // display stable matches + for man in men { + let partner_id = stable_matching.get(&man.id); + match partner_id { + Some(p) => println!("{} + {}", man.id, p), + None => () + } + } +} diff --git a/contents/stable_marriage_problem/stable_marriage_problem.md b/contents/stable_marriage_problem/stable_marriage_problem.md index 3121c6478..8c3822514 100644 --- a/contents/stable_marriage_problem/stable_marriage_problem.md +++ b/contents/stable_marriage_problem/stable_marriage_problem.md @@ -58,6 +58,8 @@ Here is a video describing the stable marriage problem: [import, lang:"php"](code/php/stable_marriage.php) {% sample lang="scala" %} [import, lang:"scala"](code/scala/stable_marriage.scala) +{% sample lang="rust" %} +[import, lang:"rust"](code/rust/stable_marriage.rs) {% endmethod %}