You've already forked book-exercises
closures
- try to implement a quick and dirty solution for listing 13-1 myself
This commit is contained in:
6
closures/Cargo.toml
Normal file
6
closures/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "closures"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
162
closures/src/main.rs
Normal file
162
closures/src/main.rs
Normal file
@@ -0,0 +1,162 @@
|
||||
// giveaway tshirts to users
|
||||
// if someone has a favorite colour they get that
|
||||
// else they get whatever colour we currently have the most of
|
||||
|
||||
#[derive(Debug, PartialEq, Eq, Clone, Copy, Ord, PartialOrd)]
|
||||
enum ShirtColor {
|
||||
Red,
|
||||
Blue,
|
||||
Green,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Inventory {
|
||||
shirts: Vec<ShirtColor>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct User {
|
||||
shirt_preference: Option<ShirtColor>,
|
||||
}
|
||||
|
||||
impl Inventory {
|
||||
fn giveaway(current_inventory: &mut Self, user: &User) -> ShirtColor {
|
||||
let pref = user.shirt_preference;
|
||||
if pref == None {
|
||||
let current_max = Self::current_max(current_inventory);
|
||||
Self::update_inventory(current_inventory, current_max);
|
||||
return current_max;
|
||||
} else {
|
||||
Self::update_inventory(current_inventory, pref.unwrap());
|
||||
return pref.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
fn update_inventory(current_inventory: &mut Self, current_max: ShirtColor) {
|
||||
let mut temp_inventory = current_inventory.shirts.clone();
|
||||
temp_inventory.sort();
|
||||
|
||||
let mut i = 0;
|
||||
for color in temp_inventory {
|
||||
if color == current_max {
|
||||
current_inventory.shirts.swap_remove(i);
|
||||
return;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
||||
fn current_max(current_inventory: &mut Self) -> ShirtColor {
|
||||
let mut green = 0;
|
||||
let mut blue = 0;
|
||||
let mut red = 0;
|
||||
|
||||
let tmp_inventory = current_inventory.shirts.clone();
|
||||
for color in tmp_inventory {
|
||||
match color {
|
||||
ShirtColor::Red => red += 1,
|
||||
ShirtColor::Blue => blue += 1,
|
||||
ShirtColor::Green => green += 1,
|
||||
}
|
||||
}
|
||||
|
||||
if blue > green && blue > red {
|
||||
return ShirtColor::Blue;
|
||||
};
|
||||
|
||||
if green > blue && green > red {
|
||||
return ShirtColor::Green;
|
||||
};
|
||||
|
||||
if red > blue && red > green {
|
||||
return ShirtColor::Red;
|
||||
};
|
||||
|
||||
if blue == red && blue == green {
|
||||
return ShirtColor::Blue;
|
||||
};
|
||||
|
||||
if blue == red && blue < green {
|
||||
return ShirtColor::Green;
|
||||
};
|
||||
|
||||
if blue == red && blue > green {
|
||||
return ShirtColor::Blue;
|
||||
};
|
||||
|
||||
if green == blue && green > red {
|
||||
return ShirtColor::Blue;
|
||||
};
|
||||
|
||||
if green == blue && green < red {
|
||||
return ShirtColor::Red;
|
||||
};
|
||||
|
||||
if red == green && green > blue {
|
||||
return ShirtColor::Green;
|
||||
};
|
||||
|
||||
if red == green && green < blue {
|
||||
return ShirtColor::Blue;
|
||||
} else {
|
||||
return ShirtColor::Green;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut current_inventory = Inventory {
|
||||
shirts: vec![
|
||||
ShirtColor::Red,
|
||||
ShirtColor::Red,
|
||||
ShirtColor::Green,
|
||||
ShirtColor::Green,
|
||||
ShirtColor::Green,
|
||||
ShirtColor::Blue,
|
||||
ShirtColor::Blue,
|
||||
ShirtColor::Blue,
|
||||
ShirtColor::Blue,
|
||||
],
|
||||
};
|
||||
|
||||
let user_red = User {
|
||||
shirt_preference: Some(ShirtColor::Red),
|
||||
};
|
||||
let user_green = User {
|
||||
shirt_preference: Some(ShirtColor::Green),
|
||||
};
|
||||
let user_none = User {
|
||||
shirt_preference: None,
|
||||
};
|
||||
|
||||
println!("DEBUG: inventory: {:?}", current_inventory);
|
||||
println!("--------------------");
|
||||
|
||||
println!(
|
||||
"DEBUG: giveaway {:?} to {:?}",
|
||||
Inventory::giveaway(&mut current_inventory, &user_red),
|
||||
user_red
|
||||
);
|
||||
|
||||
println!("DEBUG: current inventory: {:?}", current_inventory);
|
||||
|
||||
println!("--------------------");
|
||||
|
||||
println!(
|
||||
"DEBUG: giveaway {:?} to {:?}",
|
||||
Inventory::giveaway(&mut current_inventory, &user_green),
|
||||
user_green
|
||||
);
|
||||
|
||||
println!("DEBUG: current inventory: {:?}", current_inventory);
|
||||
println!("--------------------");
|
||||
|
||||
println!(
|
||||
"DEBUG: giveaway {:?} to {:?}",
|
||||
Inventory::giveaway(&mut current_inventory, &user_none),
|
||||
user_none
|
||||
);
|
||||
|
||||
println!("DEBUG: current inventory: {:?}", current_inventory);
|
||||
println!("--------------------");
|
||||
}
|
||||
Reference in New Issue
Block a user