From e18dd706d7261e897434c7b139d35338597bea6f Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Sat, 5 Feb 2022 13:51:52 +1030 Subject: [PATCH] Rearrange some stuff --- src/main.rs | 83 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/src/main.rs b/src/main.rs index 35611cf..85ef5f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ type Achar = i8; // ASCII char const WORD_LENGTH: usize = 5; const WORD_LENGTH_P: usize = 5; // Padded for SIMD shenanigans -const GUESS_DEPTH: usize = 2; +const GUESS_DEPTH: usize = 5; const A: Achar = 'A' as Achar; const Z: Achar = 'Z' as Achar; @@ -29,6 +29,20 @@ struct Word { type WordCache = HashMap>; + +fn char2bit(c: Achar) -> Charmask { + debug_assert!((A..=Z).contains(&c)); + 1 << (c - A) +} + +fn cm2char(cm: Charmask, offset: i8) -> Achar { + (((31 - cm.lzcnt() as i8) + A + offset) as u8) as Achar +} + +fn letters2str(letters: [Achar; WORD_LENGTH]) -> String { + letters.iter().map(|x| (*x as u8) as char).collect() +} + fn str2word(s: &str) -> Word { let mut word = Word::default(); let mut iter = s.chars(); @@ -42,26 +56,6 @@ fn str2word(s: &str) -> Word { word } -fn load_dictionary(filename: &str) -> Vec { - println!("Loading dictionary at {}", filename); - let rawfile = fs::read_to_string(filename).unwrap(); - let rawwords = rawfile.split('\n'); - let mut words = Vec::new(); - let re = Regex::new(&format!("{}{}{}", r"^[A-Za-z]{", WORD_LENGTH, r"}$")).unwrap(); - for line in rawwords { - if re.is_match(line) { - words.push(line.to_uppercase()); - } - } - words.sort(); - words.dedup(); - words.iter().map(|w| str2word(w)).collect() -} - -fn letters2str(letters: [Achar; WORD_LENGTH]) -> String { - letters.iter().map(|x| (*x as u8) as char).collect() -} - /* fn inc_char(c: char) -> char { (c as u8 + 1) as char } */ @@ -86,14 +80,20 @@ fn letters2str(letters: [Achar; WORD_LENGTH]) -> String { s } */ - -fn char2bit(c: Achar) -> Charmask { - debug_assert!((A..=Z).contains(&c)); - 1 << (c - A) -} - -fn cm2char(cm: Charmask, offset: i8) -> Achar { - (((31 - cm.lzcnt() as i8) + A + offset) as u8) as Achar +fn load_dictionary(filename: &str) -> Vec { + println!("Loading dictionary at {}", filename); + let rawfile = fs::read_to_string(filename).unwrap(); + let rawwords = rawfile.split('\n'); + let mut words = Vec::new(); + let re = Regex::new(&format!("{}{}{}", r"^[A-Za-z]{", WORD_LENGTH, r"}$")).unwrap(); + for line in rawwords { + if re.is_match(line) { + words.push(line.to_uppercase()); + } + } + words.sort(); + words.dedup(); + words.iter().map(|w| str2word(w)).collect() } fn _generate_wordcache_nested(cache: &mut WordCache, subcache: &[Word], key: Charmask, depth: u8) { @@ -168,6 +168,11 @@ fn find_worstcase(word_ids: [usize; GUESS_DEPTH], wordcache: &WordCache) -> (Str (output, worst) } +fn find_word_id_from_str(s: &str, words: &Vec) -> usize { + let w = str2word(s); + words.iter().position(|x| x.letters==w.letters).unwrap() +} + fn main() { fs::write("test.txt", ["test1", "test2", "test3"].join("\n")).expect("Failed to write output"); let words = load_dictionary("words"); @@ -179,12 +184,26 @@ fn main() { //println!("{:?}", sr); //(0..=5).flat_map(|i| (i..=5).map(move |j| (i,j))).map(|(i,j)| print!("{},{}\t", i, j)); - let mut results: Vec<(String, usize)> = - (0..totalwords).into_par_iter().flat_map_iter(|i| (i..totalwords).map(move |j| (i,j))) - .map(|(i, j)| find_worstcase([i, j], &wordcache)).collect(); + + // Depth-2 full + // let mut results: Vec<(String, usize)> = + // (0..totalwords).into_par_iter().flat_map_iter(|i| (i..totalwords).map(move |j| (i,j))) + // .map(|(i, j)| find_worstcase([i, j], &wordcache)).collect(); + + // Depth-1 full // let mut results: Vec<(String, usize)> = // (0..totalwords).into_par_iter() // .map(|i| find_worstcase([i], &wordcache)).collect(); + + // Depth-3 (word1,word2,?) + let i1 = find_word_id_from_str("CARET", &wordcache[&0]); + let i2 = find_word_id_from_str("SOLID", &wordcache[&0]); + let i3 = find_word_id_from_str("NYMPH", &wordcache[&0]); + let i4 = find_word_id_from_str("FIFTH", &wordcache[&0]); + let mut results: Vec<(String, usize)> = + (0..totalwords).into_par_iter() + .map(|i| find_worstcase([i1, i2, i3, i4, i], &wordcache)).collect(); + results.sort_by_key(|r| r.1); let results_strs: Vec = results.iter().map(|r| r.0.clone()).collect(); fs::write("results.txt", results_strs.join("\n")).expect("Failed to write output");