add interactive solver #4

Merged
cscherrNT merged 29 commits from feat/interactive-solver into devel 2024-07-25 15:19:54 +02:00
4 changed files with 8 additions and 11 deletions
Showing only changes of commit b159cb4439 - Show all commits

View File

@ -2,10 +2,9 @@ use core::panic;
use std::fmt::Display; use std::fmt::Display;
use crate::error::*; use crate::error::*;
use crate::wlist::word::{ManyWordsRef, Word, WordData}; use crate::wlist::word::{Word, WordData, WordDataRef};
use crate::wlist::WordList; use crate::wlist::WordList;
use libpt::cli::console::StyledObject;
use libpt::log::{debug, trace}; use libpt::log::{debug, trace};
pub mod response; pub mod response;
@ -174,7 +173,7 @@ impl<'wl, WL: WordList> Game<'wl, WL> {
self.wordlist self.wordlist
} }
pub(crate) fn made_guesses(&self) -> ManyWordsRef { pub(crate) fn made_guesses(&self) -> Vec<&Word> {
self.responses.iter().map(|r| r.guess()).collect() self.responses.iter().map(|r| r.guess()).collect()
} }
} }

View File

@ -1,7 +1,7 @@
use libpt::log::{info, trace}; use libpt::log::{info, trace};
use crate::error::{Error, SolverError, WResult}; use crate::error::{SolverError, WResult};
use crate::wlist::word::{ManyWordDatas, Word}; use crate::wlist::word::{Word, WordData};
use crate::wlist::WordList; use crate::wlist::WordList;
use super::{AnyBuiltinSolver, Solver, Status}; use super::{AnyBuiltinSolver, Solver, Status};
@ -37,7 +37,7 @@ impl<'wl, WL: WordList> Solver<'wl, WL> for NaiveSolver<'wl, WL> {
} }
} }
trace!("other chars: {:?}", other_chars); trace!("other chars: {:?}", other_chars);
let matches: ManyWordDatas = game let matches: Vec<WordData> = game
.wordlist() .wordlist()
.get_words_matching(pattern) .get_words_matching(pattern)
.expect("the solution does not exist in the wordlist") .expect("the solution does not exist in the wordlist")

View File

@ -16,7 +16,7 @@ use crate::error::WResult;
pub type AnyWordlist = Box<dyn WordList>; pub type AnyWordlist = Box<dyn WordList>;
pub trait WordList: Clone + std::fmt::Debug + Default + Sync + Display { pub trait WordList: Clone + std::fmt::Debug + Default + Sync + Display {
fn solutions(&self) -> ManyWordDatas { fn solutions(&self) -> Vec<WordData> {
let wmap = self.wordmap().clone(); let wmap = self.wordmap().clone();
let threshold = wmap.threshold(); let threshold = wmap.threshold();
wmap.iter() wmap.iter()
@ -88,11 +88,11 @@ pub trait WordList: Clone + std::fmt::Debug + Default + Sync + Display {
} }
buf buf
} }
fn get_words_matching(&self, pattern: String) -> WResult<ManyWordDatas> { fn get_words_matching(&self, pattern: String) -> WResult<Vec<WordData>> {
let pattern = Regex::new(&pattern)?; let pattern = Regex::new(&pattern)?;
let hay = self.raw_wordlist(); let hay = self.raw_wordlist();
let keys = pattern.captures_iter(&hay); let keys = pattern.captures_iter(&hay);
let mut buf = ManyWordDatas::new(); let mut buf = Vec::new();
for k in keys { for k in keys {
let w: WordData = self.wordmap().get(&k[0]).unwrap(); let w: WordData = self.wordmap().get(&k[0]).unwrap();
buf.push(w) buf.push(w)

View File

@ -11,8 +11,6 @@ pub type Frequency = f64;
pub type Word = String; pub type Word = String;
pub type WordData = (Word, Frequency); pub type WordData = (Word, Frequency);
pub type WordDataRef<'wl> = (&'wl Word, &'wl Frequency); pub type WordDataRef<'wl> = (&'wl Word, &'wl Frequency);
pub type ManyWordsRef<'a> = Vec<&'a Word>;
pub type ManyWordDatas = Vec<(Word, Frequency)>;
#[derive(Clone)] #[derive(Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]