Решение на Wordle от Кристиян Войнски
Към профила на Кристиян Войнски
Резултати
- 19 точки от тестове
- 0 бонус точки
- 19 точки общо
- 14 успешни тест(а)
- 1 неуспешни тест(а)
Код
use std::fmt;
#[derive(Debug)]
pub enum GameStatus {
InProgress,
Won,
Lost,
}
#[derive(Debug)]
pub enum GameError {
NotInAlphabet(char),
WrongLength { expected: usize, actual: usize },
GameIsOver(GameStatus),
}
#[derive(Debug)]
pub struct Game {
pub status: GameStatus,
pub attempts: u8,
alphabet: String,
word: String,
guesses: Vec<Word>,
}
#[derive(Debug, Clone)]
pub struct Word {
letters: Vec<char>,
letter_state: Vec<LetterState>,
}
#[derive(Debug, Clone, PartialEq)]
enum LetterState {
FullMatch,
PartialMatch,
NoMatch,
}
impl Game {
fn find_letter(alphabet: &str, word: &str) -> Option<char> {
for c in word.chars() {
if alphabet.find(c) == None {
return Some(c);
}
}
return None;
}
pub fn new(alphabet: &str, word: &str) -> Result<Self, GameError> {
if let Some(c) = Self::find_letter(&alphabet, word) {
return Err(GameError::NotInAlphabet(c));
}
return Ok(
Game {
status: GameStatus::InProgress,
attempts: 0,
alphabet: String::from(alphabet),
word: word.to_string(),
guesses: vec![],
});
}
pub fn guess_word(&mut self, guess: &str) -> Result<Word, GameError> {
match self.status {
GameStatus::InProgress => {
if guess.chars().count() != self.word.chars().count() {
return Err(
GameError::WrongLength {
expected: self.word.chars().count(),
actual: guess.chars().count(),
});
}
if let Some(c) = Self::find_letter(&self.alphabet, guess) {
return Err(GameError::NotInAlphabet(c));
}
if guess == &self.word {
self.status = GameStatus::Won;
let guess_word = Word {
letters: guess.chars().collect(),
letter_state: vec![LetterState::FullMatch; guess.chars().count()],
};
self.guesses.push(guess_word);
return Ok(Word {
letters: guess.chars().collect(),
letter_state: vec![LetterState::FullMatch; guess.chars().count()],
});
}
let letters: Vec<char> = guess.chars().collect();
let mut state: Vec<LetterState> = vec![LetterState::NoMatch; guess.chars().count()];
for i in 0..guess.chars().count() {
let word_vec: Vec<char> = self.word.chars().collect();
if word_vec[i] == letters[i] {
state[i] = LetterState::FullMatch;
} else if let None = Self::find_letter(&self.word, &letters[i].to_string()) {
state[i] = LetterState::PartialMatch;
} else {
state[i] = LetterState::NoMatch;
}
}
self.guesses.push(Word {
letters: letters.clone(),
letter_state: state.clone(),
});
if self.attempts == 5 {
return Err(GameError::GameIsOver(GameStatus::Lost));
}
self.attempts += 1;
Ok(Word {
letters,
letter_state: state,
})
}
GameStatus::Won => {
Err(
GameError::GameIsOver(GameStatus::Won)
)
}
GameStatus::Lost => {
Err(
GameError::GameIsOver(GameStatus::Lost)
)
}
}
}
}
impl fmt::Display for Word {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (letter, state) in self.letters.iter().zip(self.letter_state.iter()) {
match state {
LetterState::FullMatch => write!(f, "[{}]", letter.to_uppercase()).ok(),
LetterState::PartialMatch => write!(f, "({})", letter.to_uppercase()).ok(),
LetterState::NoMatch => write!(f, ">{}<", letter.to_uppercase()).ok()
};
}
Ok(())
}
}
impl fmt::Display for Game {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for _ in 0..self.word.chars().count() {
write!(f, "|_|").ok();
}
for guess in &self.guesses {
write!(f, "\n{}", guess).ok();
}
write!(f, "")
}
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20230111-3772066-1j7cosq/solution) Finished test [unoptimized + debuginfo] target(s) in 0.82s Running tests/solution_test.rs (target/debug/deps/solution_test-0edbea2040daef01) running 15 tests test solution_test::test_game_display ... ok test solution_test::test_game_display_cyrillic ... ok test solution_test::test_game_display_german ... ok test solution_test::test_game_state_1 ... ok test solution_test::test_game_state_2 ... FAILED test solution_test::test_game_state_3 ... ok test solution_test::test_word_display ... ok test solution_test::test_word_display_bulgarian ... ok test solution_test::test_word_display_german ... ok test solution_test::test_word_not_in_alphabet_on_construction ... ok test solution_test::test_word_not_in_alphabet_on_construction_cyrrilic ... ok test solution_test::test_word_not_in_alphabet_on_guess ... ok test solution_test::test_word_not_in_alphabet_on_guess_cyrillic ... ok test solution_test::test_wrong_length ... ok test solution_test::test_word_display_with_repetitions ... ok failures: ---- solution_test::test_game_state_2 stdout ---- thread 'solution_test::test_game_state_2' panicked at 'Expression InProgress does not match the pattern "GameStatus::Lost"', tests/solution_test.rs:159:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: solution_test::test_game_state_2 test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass `--test solution_test`