Initial commit
This commit is contained in:
commit
cf5dbf3d2a
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clue_solver"
|
||||||
|
version = "0.1.0"
|
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
name = "clue_solver"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
110
src/main.rs
Normal file
110
src/main.rs
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
use std::collections::BTreeSet;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct Guess {
|
||||||
|
room: Room,
|
||||||
|
suspect: Suspect,
|
||||||
|
weapon: Weapon,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum Clue {
|
||||||
|
Room(Room),
|
||||||
|
Suspect(Suspect),
|
||||||
|
Weapon(Weapon),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum Room {
|
||||||
|
Library,
|
||||||
|
Kitchen,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum Suspect {
|
||||||
|
Green,
|
||||||
|
White,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum Weapon {
|
||||||
|
Rope,
|
||||||
|
LeadPipe,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
pub struct Solver {
|
||||||
|
rooms: BTreeSet<Room>,
|
||||||
|
suspects: BTreeSet<Suspect>,
|
||||||
|
weapons: BTreeSet<Weapon>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Solver {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let mut rooms = BTreeSet::new();
|
||||||
|
|
||||||
|
rooms.insert(Room::Library);
|
||||||
|
rooms.insert(Room::Kitchen);
|
||||||
|
|
||||||
|
let mut suspects = BTreeSet::new();
|
||||||
|
|
||||||
|
suspects.insert(Suspect::Green);
|
||||||
|
suspects.insert(Suspect::White);
|
||||||
|
|
||||||
|
let mut weapons = BTreeSet::new();
|
||||||
|
|
||||||
|
weapons.insert(Weapon::Rope);
|
||||||
|
weapons.insert(Weapon::LeadPipe);
|
||||||
|
|
||||||
|
Self {
|
||||||
|
rooms,
|
||||||
|
suspects,
|
||||||
|
weapons,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn guess(&self) -> Guess {
|
||||||
|
Guess {
|
||||||
|
room: *self.rooms.first().unwrap(),
|
||||||
|
suspect: *self.suspects.first().unwrap(),
|
||||||
|
weapon: *self.weapons.first().unwrap(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn eliminate(&mut self, clue: Clue) -> Result<(), String> {
|
||||||
|
match clue {
|
||||||
|
Clue::Room(room_clue) => self.rooms.remove(&room_clue),
|
||||||
|
Clue::Suspect(suspect_clue) => self.suspects.remove(&suspect_clue),
|
||||||
|
Clue::Weapon(weapon_clue) => self.weapons.remove(&weapon_clue),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("Hello, world!");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn solve() {
|
||||||
|
let mut solver = Solver::new();
|
||||||
|
|
||||||
|
solver.eliminate(Clue::Room(Room::Library)).unwrap();
|
||||||
|
solver.eliminate(Clue::Suspect(Suspect::Green)).unwrap();
|
||||||
|
solver.eliminate(Clue::Weapon(Weapon::Rope)).unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
solver.guess(),
|
||||||
|
Guess {
|
||||||
|
room: Room::Kitchen,
|
||||||
|
suspect: Suspect::White,
|
||||||
|
weapon: Weapon::LeadPipe
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user