Skip to content

Instantly share code, notes, and snippets.

@RockyGitHub
Created March 27, 2025 17:28
Show Gist options
  • Save RockyGitHub/9c2060ab65a6dea2b2dc33683f31ec86 to your computer and use it in GitHub Desktop.
Save RockyGitHub/9c2060ab65a6dea2b2dc33683f31ec86 to your computer and use it in GitHub Desktop.
Dragon hoard question answer
#[derive(Debug, PartialEq, Eq, Hash, Clone)]
enum TreasureType {
// ...
}
#[derive(Debug, Clone)]
struct Treasure {
// ...
}
impl DragonHoard {
fn new(name: &str) -> Self {
DragonHoard {
dragon_name: name.to_string(),
treasures: Vec::new(),
}
}
fn add_treasure(&mut self, treasure: Treasure) {
self.treasures.push(treasure);
}
fn total_value(&self) -> u32 {
self.treasures.iter().map(|t| t.value).sum()
}
fn rarest_treasures(&self, n: usize) -> Vec<&Treasure> {
let mut treasures = self.treasures.iter().collect::<Vec<&Treasure>>();
treasures.sort_by(|a, b| b.rarity.cmp(&a.rarity));
treasures.truncate(n);
treasures
}
fn value_by_type(&self) -> HashMap<TreasureType, u32> {
let mut result = HashMap::new();
for treasure in &self.treasures {
*result.entry(treasure.treasure_type.clone()).or_insert(0) += treasure.value;
}
result
}
fn trade_treasure(&mut self, treasure_name: &str, other_dragon: &mut DragonHoard) -> Result<(), &'static str> {
let pos = self.treasures.iter().position(|t| t.name == treasure_name)
.ok_or("Treasure not found in hoard")?;
let treasure = self.treasures.remove(pos);
other_dragon.add_treasure(treasure);
Ok(())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment